nmarshall commited on
Commit
546209f
·
1 Parent(s): 4a30d96

gameplay: port assistance target acquisition

Browse files
crates/urt-gameplay/src/assistance.rs ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //! Recovered assistance policy with explicit captured event/native effects.
2
+ use crate::native_policy::Error;
3
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
4
+ pub struct HelperState {
5
+ pub flags: u32,
6
+ pub active: u32,
7
+ pub target: Option<usize>,
8
+ pub last: u32,
9
+ }
10
+ #[derive(Clone, Debug, PartialEq, Eq)]
11
+ pub enum AssistEffect {
12
+ Publish { slot: i32, event: u32, param: u32 },
13
+ Log { format: Vec<u8>, slots: Vec<i32> },
14
+ Nested(crate::move_callbacks::CallbackEffect),
15
+ }
16
+ fn indices(slot: i32, target: usize) -> Result<(), Error> {
17
+ if !(0..64).contains(&slot) || target >= 64 {
18
+ return Err(Error::InvalidIndex);
19
+ }
20
+ Ok(())
21
+ }
22
+ /// Original153177 acquisition fragment. Caller already selected a near protected
23
+ /// target. An active flagged owner cannot switch; stale unflagged state can.
24
+ pub fn acquire_assistance(
25
+ state: &mut HelperState,
26
+ slot: i32,
27
+ target: usize,
28
+ target_id: u32,
29
+ tick: u32,
30
+ ) -> Result<Vec<AssistEffect>, Error> {
31
+ indices(slot, target)?;
32
+ if state.flags & 8192 != 0 && state.active != 0 && state.target != Some(target) {
33
+ return Ok(vec![]);
34
+ }
35
+ state.flags |= 8192;
36
+ state.active = 1;
37
+ state.target = Some(target);
38
+ state.last = tick;
39
+ Ok(vec![
40
+ AssistEffect::Publish {
41
+ slot,
42
+ event: 104,
43
+ param: target_id,
44
+ },
45
+ AssistEffect::Log {
46
+ format: b"ThawOutStarted: %i %i: %s started thawing out %s\n".to_vec(),
47
+ slots: vec![slot, target as i32],
48
+ },
49
+ ])
50
+ }
51
+ #[cfg(test)]
52
+ mod acquire_tests {
53
+ use super::*;
54
+ #[test]
55
+ fn flagged_owner_cannot_switch_but_stale_state_can() {
56
+ let mut s = HelperState {
57
+ flags: 0x80002002,
58
+ active: 1,
59
+ target: Some(0),
60
+ last: 7,
61
+ };
62
+ let old = s;
63
+ assert!(acquire_assistance(&mut s, 2, 3, 9, 100).unwrap().is_empty());
64
+ assert_eq!(s, old);
65
+ s.active = 0;
66
+ let e = acquire_assistance(&mut s, 2, 3, 9, u32::MAX).unwrap();
67
+ assert_eq!(s.target, Some(3));
68
+ assert_eq!(s.flags, 0x80002002);
69
+ assert_eq!(s.last, u32::MAX);
70
+ assert!(matches!(
71
+ &e[..],
72
+ [
73
+ AssistEffect::Publish { event: 104, .. },
74
+ AssistEffect::Log { .. }
75
+ ]
76
+ ));
77
+ }
78
+ #[test]
79
+ fn invalid_target_is_atomic() {
80
+ let mut s = HelperState {
81
+ flags: 0,
82
+ active: 0,
83
+ target: None,
84
+ last: 7,
85
+ };
86
+ let old = s;
87
+ assert!(acquire_assistance(&mut s, 2, 64, 9, 100).is_err());
88
+ assert_eq!(s, old);
89
+ }
90
+ }
crates/urt-gameplay/src/bin/urt-assistance.rs ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use urt_gameplay::assistance::*;
2
+ fn list(v: &[u32]) -> String {
3
+ format!(
4
+ "[{}]",
5
+ v.iter()
6
+ .map(|v| v.to_string())
7
+ .collect::<Vec<_>>()
8
+ .join(",")
9
+ )
10
+ }
11
+ fn hex(v: &[u8]) -> String {
12
+ v.iter().map(|v| format!("{v:02x}")).collect()
13
+ }
14
+ fn nested(e: &urt_gameplay::move_callbacks::CallbackEffect) -> String {
15
+ use urt_gameplay::move_callbacks::CallbackEffect::*;
16
+ match e {
17
+ Teleport { slot } => format!(r#"{{"op":"teleport","slot":{slot}}}"#),
18
+ Reset { slot } => format!(r#"{{"op":"reset","slot":{slot}}}"#),
19
+ Event { event } => format!(r#"{{"op":"event","event":{event}}}"#),
20
+ Log { format, slots } => format!(
21
+ r#"{{"op":"log","format":"{}","slots":{}}}"#,
22
+ hex(format),
23
+ list(&slots.iter().map(|v| *v as u32).collect::<Vec<_>>())
24
+ ),
25
+ }
26
+ }
27
+ fn events(v: &[AssistEffect]) -> String {
28
+ v.iter()
29
+ .map(|e| match e {
30
+ AssistEffect::Publish { slot, event, param } => {
31
+ format!(r#"{{"op":"publish","slot":{slot},"event":{event},"param":{param}}}"#)
32
+ }
33
+ AssistEffect::Log { format, slots } => format!(
34
+ r#"{{"op":"log","format":"{}","slots":{}}}"#,
35
+ hex(format),
36
+ list(&slots.iter().map(|v| *v as u32).collect::<Vec<_>>())
37
+ ),
38
+ AssistEffect::Nested(e) => nested(e),
39
+ })
40
+ .collect::<Vec<_>>()
41
+ .join(",")
42
+ }
43
+ fn helper(w: &[u32]) -> HelperState {
44
+ HelperState {
45
+ flags: w[0],
46
+ active: w[1],
47
+ target: if w[2] == u32::MAX {
48
+ None
49
+ } else {
50
+ Some(w[2] as usize)
51
+ },
52
+ last: w[4],
53
+ }
54
+ }
55
+ fn fields(s: HelperState, e: &[AssistEffect]) -> String {
56
+ format!(
57
+ r#""flags":{},"active":{},"target":{},"last":{},"events":[{}]"#,
58
+ s.flags,
59
+ s.active,
60
+ s.target.map(|v| v.to_string()).unwrap_or("null".into()),
61
+ s.last,
62
+ events(e)
63
+ )
64
+ }
65
+ fn main() {
66
+ let mut args = std::env::args().skip(1);
67
+ let kind = args.next().unwrap();
68
+ let w: Vec<u32> = args.map(|v| v.parse().unwrap()).collect();
69
+ match kind.as_str() {
70
+ "acquire" => {
71
+ assert_eq!(w.len(), 5);
72
+ let mut s = helper(&w);
73
+ let e = acquire_assistance(&mut s, 2, 3, 0x87654321, w[3]).unwrap();
74
+ println!("{{{}}}", fields(s, &e));
75
+ }
76
+ _ => panic!("unknown policy"),
77
+ }
78
+ }
crates/urt-gameplay/src/lib.rs CHANGED
@@ -195,3 +195,5 @@ pub mod client_processing;
195
  pub mod client_move_context;
196
 
197
  pub mod move_callbacks;
 
 
 
195
  pub mod client_move_context;
196
 
197
  pub mod move_callbacks;
198
+
199
+ pub mod assistance;
docs/FINDINGS.md CHANGED
@@ -1945,3 +1945,5 @@ RE-1003: Rust replaces supplied mode10 feedback with recovered assistance cleanu
1945
  RE-994–1003 batch validation passed:1,938 Python tests,299 Rust tests,121 deterministic affected report producers and579 documentation files. All ten tasks have separate commits and focused checks. [Batch evidence and remaining callback/runtime work](research/QVM_MOVE_CALLBACK_BATCH.md).
1946
 
1947
  RE-1004: Thirty-six original-QVM cases recover assistance acquisition after near/protected-target routing. A helper already holding mask8192 and nonzero active6316 cannot switch away from a different target6320. Otherwise acquisition sets mask8192, active1, target and clock6328, then requests event104 with target entity word0 followed by the source thaw-start log. Raw high bits and wrapped tick values survive; event/log bodies and preceding distance/admission gates are excluded. [Evidence](research/QVM_ASSIST_ACQUIRE.md).
 
 
 
1945
  RE-994–1003 batch validation passed:1,938 Python tests,299 Rust tests,121 deterministic affected report producers and579 documentation files. All ten tasks have separate commits and focused checks. [Batch evidence and remaining callback/runtime work](research/QVM_MOVE_CALLBACK_BATCH.md).
1946
 
1947
  RE-1004: Thirty-six original-QVM cases recover assistance acquisition after near/protected-target routing. A helper already holding mask8192 and nonzero active6316 cannot switch away from a different target6320. Otherwise acquisition sets mask8192, active1, target and clock6328, then requests event104 with target entity word0 followed by the source thaw-start log. Raw high bits and wrapped tick values survive; event/log bodies and preceding distance/admission gates are excluded. [Evidence](research/QVM_ASSIST_ACQUIRE.md).
1948
+
1949
+ RE-1005: Rust ports the conditional assistance ownership lock across36 source cases. Typed target indices preserve stale-state behavior, raw flag bits and wrapped clocks. Event104 precedes the original source log; both remain plans. Unit tests cover locked switching, inactive stale-target replacement, event ordering and atomic invalid-target rejection. Caller admission and proximity selection remain separate. [Evidence](research/RUST_ASSIST_ACQUIRE.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -2003,3 +2003,5 @@ RE-974–983 completed routing, command rewrite, inactivity, movement-parameter
2003
  - [ ] RE-1004 recover nonempty assistance proximity search, mode8 objective transitions and nested native callback feedback ([scope](research/QVM_MOVE_CALLBACK_BATCH.md#next-work-re-1004)).
2004
 
2005
  - [x] RE-1004 Recover assistance acquisition and target ownership ([evidence](research/QVM_ASSIST_ACQUIRE.md)).
 
 
 
2003
  - [ ] RE-1004 recover nonempty assistance proximity search, mode8 objective transitions and nested native callback feedback ([scope](research/QVM_MOVE_CALLBACK_BATCH.md#next-work-re-1004)).
2004
 
2005
  - [x] RE-1004 Recover assistance acquisition and target ownership ([evidence](research/QVM_ASSIST_ACQUIRE.md)).
2006
+
2007
+ - [x] RE-1005 Port assistance acquisition and ownership guard ([evidence](research/RUST_ASSIST_ACQUIRE.md)).
docs/RESEARCH_LEDGER.md CHANGED
@@ -2691,3 +2691,7 @@ Rust replaces supplied mode10 feedback with recovered assistance cleanup and tim
2691
  ## 2026-10-29 — RE-1004 Recover assistance acquisition and target ownership
2692
 
2693
  Thirty-six original-QVM cases recover assistance acquisition after near/protected-target routing. A helper already holding mask8192 and nonzero active6316 cannot switch away from a different target6320. Otherwise acquisition sets mask8192, active1, target and clock6328, then requests event104 with target entity word0 followed by the source thaw-start log. Raw high bits and wrapped tick values survive; event/log bodies and preceding distance/admission gates are excluded. Focused `cargo xtask test-group qvm-assist-acquire` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
 
 
 
 
 
2691
  ## 2026-10-29 — RE-1004 Recover assistance acquisition and target ownership
2692
 
2693
  Thirty-six original-QVM cases recover assistance acquisition after near/protected-target routing. A helper already holding mask8192 and nonzero active6316 cannot switch away from a different target6320. Otherwise acquisition sets mask8192, active1, target and clock6328, then requests event104 with target entity word0 followed by the source thaw-start log. Raw high bits and wrapped tick values survive; event/log bodies and preceding distance/admission gates are excluded. Focused `cargo xtask test-group qvm-assist-acquire` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
2694
+
2695
+ ## 2026-10-29 — RE-1005 Port assistance acquisition and ownership guard
2696
+
2697
+ Rust ports the conditional assistance ownership lock across36 source cases. Typed target indices preserve stale-state behavior, raw flag bits and wrapped clocks. Event104 precedes the original source log; both remain plans. Unit tests cover locked switching, inactive stale-target replacement, event ordering and atomic invalid-target rejection. Caller admission and proximity selection remain separate. Focused `cargo xtask test-group rust-assist-acquire` 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
@@ -2040,3 +2040,5 @@ RE-974–983 recover routing, command rewriting, inactivity and composed setup t
2040
  - [ ] RE-1004 recover nonempty assistance proximity search, mode8 objective transitions and nested native callback feedback ([scope](research/QVM_MOVE_CALLBACK_BATCH.md#next-work-re-1004)).
2041
 
2042
  - [x] RE-1004 Recover assistance acquisition and target ownership ([evidence](research/QVM_ASSIST_ACQUIRE.md)).
 
 
 
2040
  - [ ] RE-1004 recover nonempty assistance proximity search, mode8 objective transitions and nested native callback feedback ([scope](research/QVM_MOVE_CALLBACK_BATCH.md#next-work-re-1004)).
2041
 
2042
  - [x] RE-1004 Recover assistance acquisition and target ownership ([evidence](research/QVM_ASSIST_ACQUIRE.md)).
2043
+
2044
+ - [x] RE-1005 Port assistance acquisition and ownership guard ([evidence](research/RUST_ASSIST_ACQUIRE.md)).
docs/research/README.md CHANGED
@@ -1573,3 +1573,5 @@ The extension collector adds five focused tests for native tail calls, command-r
1573
  - [Movement callbacks: RE-994–1003](QVM_MOVE_CALLBACK_BATCH.md).
1574
 
1575
  - [RE-1004: Recover assistance acquisition and target ownership](QVM_ASSIST_ACQUIRE.md).
 
 
 
1573
  - [Movement callbacks: RE-994–1003](QVM_MOVE_CALLBACK_BATCH.md).
1574
 
1575
  - [RE-1004: Recover assistance acquisition and target ownership](QVM_ASSIST_ACQUIRE.md).
1576
+
1577
+ - [RE-1005: Port assistance acquisition and ownership guard](RUST_ASSIST_ACQUIRE.md).
docs/research/RUST_ASSIST_ACQUIRE.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Port assistance acquisition and ownership guard
2
+
3
+ RE-1005. Focused validation: `cargo xtask test-group rust-assist-acquire`. [Machine report](rust-assist-acquire.json).
4
+
5
+ Rust ports the conditional assistance ownership lock across36 source cases. Typed target indices preserve stale-state behavior, raw flag bits and wrapped clocks. Event104 precedes the original source log; both remain plans. Unit tests cover locked switching, inactive stale-target replacement, event ordering and atomic invalid-target rejection. Caller admission and proximity selection remain separate.
docs/research/rust-assist-acquire.json ADDED
@@ -0,0 +1,1423 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Finite source/Rust contract parity; native time/file/network replies remain supplied or captured.",
3
+ "probes": [
4
+ {
5
+ "rust": {
6
+ "active": 1,
7
+ "events": [
8
+ {
9
+ "event": 104,
10
+ "op": "publish",
11
+ "param": 2271560481,
12
+ "slot": 2
13
+ },
14
+ {
15
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
16
+ "op": "log",
17
+ "slots": [
18
+ 2,
19
+ 3
20
+ ]
21
+ }
22
+ ],
23
+ "flags": 8192,
24
+ "last": 10000,
25
+ "target": 3
26
+ },
27
+ "source": {
28
+ "active": 1,
29
+ "events": [
30
+ {
31
+ "event": 104,
32
+ "op": "publish",
33
+ "param": 2271560481,
34
+ "slot": 2
35
+ },
36
+ {
37
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
38
+ "op": "log",
39
+ "slots": [
40
+ 2,
41
+ 3
42
+ ]
43
+ }
44
+ ],
45
+ "flags": 8192,
46
+ "last": 10000,
47
+ "target": 3
48
+ }
49
+ },
50
+ {
51
+ "rust": {
52
+ "active": 1,
53
+ "events": [
54
+ {
55
+ "event": 104,
56
+ "op": "publish",
57
+ "param": 2271560481,
58
+ "slot": 2
59
+ },
60
+ {
61
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
62
+ "op": "log",
63
+ "slots": [
64
+ 2,
65
+ 3
66
+ ]
67
+ }
68
+ ],
69
+ "flags": 8192,
70
+ "last": 4294967295,
71
+ "target": 3
72
+ },
73
+ "source": {
74
+ "active": 1,
75
+ "events": [
76
+ {
77
+ "event": 104,
78
+ "op": "publish",
79
+ "param": 2271560481,
80
+ "slot": 2
81
+ },
82
+ {
83
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
84
+ "op": "log",
85
+ "slots": [
86
+ 2,
87
+ 3
88
+ ]
89
+ }
90
+ ],
91
+ "flags": 8192,
92
+ "last": 4294967295,
93
+ "target": 3
94
+ }
95
+ },
96
+ {
97
+ "rust": {
98
+ "active": 1,
99
+ "events": [
100
+ {
101
+ "event": 104,
102
+ "op": "publish",
103
+ "param": 2271560481,
104
+ "slot": 2
105
+ },
106
+ {
107
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
108
+ "op": "log",
109
+ "slots": [
110
+ 2,
111
+ 3
112
+ ]
113
+ }
114
+ ],
115
+ "flags": 8192,
116
+ "last": 10000,
117
+ "target": 3
118
+ },
119
+ "source": {
120
+ "active": 1,
121
+ "events": [
122
+ {
123
+ "event": 104,
124
+ "op": "publish",
125
+ "param": 2271560481,
126
+ "slot": 2
127
+ },
128
+ {
129
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
130
+ "op": "log",
131
+ "slots": [
132
+ 2,
133
+ 3
134
+ ]
135
+ }
136
+ ],
137
+ "flags": 8192,
138
+ "last": 10000,
139
+ "target": 3
140
+ }
141
+ },
142
+ {
143
+ "rust": {
144
+ "active": 1,
145
+ "events": [
146
+ {
147
+ "event": 104,
148
+ "op": "publish",
149
+ "param": 2271560481,
150
+ "slot": 2
151
+ },
152
+ {
153
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
154
+ "op": "log",
155
+ "slots": [
156
+ 2,
157
+ 3
158
+ ]
159
+ }
160
+ ],
161
+ "flags": 8192,
162
+ "last": 4294967295,
163
+ "target": 3
164
+ },
165
+ "source": {
166
+ "active": 1,
167
+ "events": [
168
+ {
169
+ "event": 104,
170
+ "op": "publish",
171
+ "param": 2271560481,
172
+ "slot": 2
173
+ },
174
+ {
175
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
176
+ "op": "log",
177
+ "slots": [
178
+ 2,
179
+ 3
180
+ ]
181
+ }
182
+ ],
183
+ "flags": 8192,
184
+ "last": 4294967295,
185
+ "target": 3
186
+ }
187
+ },
188
+ {
189
+ "rust": {
190
+ "active": 1,
191
+ "events": [
192
+ {
193
+ "event": 104,
194
+ "op": "publish",
195
+ "param": 2271560481,
196
+ "slot": 2
197
+ },
198
+ {
199
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
200
+ "op": "log",
201
+ "slots": [
202
+ 2,
203
+ 3
204
+ ]
205
+ }
206
+ ],
207
+ "flags": 8192,
208
+ "last": 10000,
209
+ "target": 3
210
+ },
211
+ "source": {
212
+ "active": 1,
213
+ "events": [
214
+ {
215
+ "event": 104,
216
+ "op": "publish",
217
+ "param": 2271560481,
218
+ "slot": 2
219
+ },
220
+ {
221
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
222
+ "op": "log",
223
+ "slots": [
224
+ 2,
225
+ 3
226
+ ]
227
+ }
228
+ ],
229
+ "flags": 8192,
230
+ "last": 10000,
231
+ "target": 3
232
+ }
233
+ },
234
+ {
235
+ "rust": {
236
+ "active": 1,
237
+ "events": [
238
+ {
239
+ "event": 104,
240
+ "op": "publish",
241
+ "param": 2271560481,
242
+ "slot": 2
243
+ },
244
+ {
245
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
246
+ "op": "log",
247
+ "slots": [
248
+ 2,
249
+ 3
250
+ ]
251
+ }
252
+ ],
253
+ "flags": 8192,
254
+ "last": 4294967295,
255
+ "target": 3
256
+ },
257
+ "source": {
258
+ "active": 1,
259
+ "events": [
260
+ {
261
+ "event": 104,
262
+ "op": "publish",
263
+ "param": 2271560481,
264
+ "slot": 2
265
+ },
266
+ {
267
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
268
+ "op": "log",
269
+ "slots": [
270
+ 2,
271
+ 3
272
+ ]
273
+ }
274
+ ],
275
+ "flags": 8192,
276
+ "last": 4294967295,
277
+ "target": 3
278
+ }
279
+ },
280
+ {
281
+ "rust": {
282
+ "active": 1,
283
+ "events": [
284
+ {
285
+ "event": 104,
286
+ "op": "publish",
287
+ "param": 2271560481,
288
+ "slot": 2
289
+ },
290
+ {
291
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
292
+ "op": "log",
293
+ "slots": [
294
+ 2,
295
+ 3
296
+ ]
297
+ }
298
+ ],
299
+ "flags": 8192,
300
+ "last": 10000,
301
+ "target": 3
302
+ },
303
+ "source": {
304
+ "active": 1,
305
+ "events": [
306
+ {
307
+ "event": 104,
308
+ "op": "publish",
309
+ "param": 2271560481,
310
+ "slot": 2
311
+ },
312
+ {
313
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
314
+ "op": "log",
315
+ "slots": [
316
+ 2,
317
+ 3
318
+ ]
319
+ }
320
+ ],
321
+ "flags": 8192,
322
+ "last": 10000,
323
+ "target": 3
324
+ }
325
+ },
326
+ {
327
+ "rust": {
328
+ "active": 1,
329
+ "events": [
330
+ {
331
+ "event": 104,
332
+ "op": "publish",
333
+ "param": 2271560481,
334
+ "slot": 2
335
+ },
336
+ {
337
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
338
+ "op": "log",
339
+ "slots": [
340
+ 2,
341
+ 3
342
+ ]
343
+ }
344
+ ],
345
+ "flags": 8192,
346
+ "last": 4294967295,
347
+ "target": 3
348
+ },
349
+ "source": {
350
+ "active": 1,
351
+ "events": [
352
+ {
353
+ "event": 104,
354
+ "op": "publish",
355
+ "param": 2271560481,
356
+ "slot": 2
357
+ },
358
+ {
359
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
360
+ "op": "log",
361
+ "slots": [
362
+ 2,
363
+ 3
364
+ ]
365
+ }
366
+ ],
367
+ "flags": 8192,
368
+ "last": 4294967295,
369
+ "target": 3
370
+ }
371
+ },
372
+ {
373
+ "rust": {
374
+ "active": 1,
375
+ "events": [
376
+ {
377
+ "event": 104,
378
+ "op": "publish",
379
+ "param": 2271560481,
380
+ "slot": 2
381
+ },
382
+ {
383
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
384
+ "op": "log",
385
+ "slots": [
386
+ 2,
387
+ 3
388
+ ]
389
+ }
390
+ ],
391
+ "flags": 8192,
392
+ "last": 10000,
393
+ "target": 3
394
+ },
395
+ "source": {
396
+ "active": 1,
397
+ "events": [
398
+ {
399
+ "event": 104,
400
+ "op": "publish",
401
+ "param": 2271560481,
402
+ "slot": 2
403
+ },
404
+ {
405
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
406
+ "op": "log",
407
+ "slots": [
408
+ 2,
409
+ 3
410
+ ]
411
+ }
412
+ ],
413
+ "flags": 8192,
414
+ "last": 10000,
415
+ "target": 3
416
+ }
417
+ },
418
+ {
419
+ "rust": {
420
+ "active": 1,
421
+ "events": [
422
+ {
423
+ "event": 104,
424
+ "op": "publish",
425
+ "param": 2271560481,
426
+ "slot": 2
427
+ },
428
+ {
429
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
430
+ "op": "log",
431
+ "slots": [
432
+ 2,
433
+ 3
434
+ ]
435
+ }
436
+ ],
437
+ "flags": 8192,
438
+ "last": 4294967295,
439
+ "target": 3
440
+ },
441
+ "source": {
442
+ "active": 1,
443
+ "events": [
444
+ {
445
+ "event": 104,
446
+ "op": "publish",
447
+ "param": 2271560481,
448
+ "slot": 2
449
+ },
450
+ {
451
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
452
+ "op": "log",
453
+ "slots": [
454
+ 2,
455
+ 3
456
+ ]
457
+ }
458
+ ],
459
+ "flags": 8192,
460
+ "last": 4294967295,
461
+ "target": 3
462
+ }
463
+ },
464
+ {
465
+ "rust": {
466
+ "active": 1,
467
+ "events": [
468
+ {
469
+ "event": 104,
470
+ "op": "publish",
471
+ "param": 2271560481,
472
+ "slot": 2
473
+ },
474
+ {
475
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
476
+ "op": "log",
477
+ "slots": [
478
+ 2,
479
+ 3
480
+ ]
481
+ }
482
+ ],
483
+ "flags": 8192,
484
+ "last": 10000,
485
+ "target": 3
486
+ },
487
+ "source": {
488
+ "active": 1,
489
+ "events": [
490
+ {
491
+ "event": 104,
492
+ "op": "publish",
493
+ "param": 2271560481,
494
+ "slot": 2
495
+ },
496
+ {
497
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
498
+ "op": "log",
499
+ "slots": [
500
+ 2,
501
+ 3
502
+ ]
503
+ }
504
+ ],
505
+ "flags": 8192,
506
+ "last": 10000,
507
+ "target": 3
508
+ }
509
+ },
510
+ {
511
+ "rust": {
512
+ "active": 1,
513
+ "events": [
514
+ {
515
+ "event": 104,
516
+ "op": "publish",
517
+ "param": 2271560481,
518
+ "slot": 2
519
+ },
520
+ {
521
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
522
+ "op": "log",
523
+ "slots": [
524
+ 2,
525
+ 3
526
+ ]
527
+ }
528
+ ],
529
+ "flags": 8192,
530
+ "last": 4294967295,
531
+ "target": 3
532
+ },
533
+ "source": {
534
+ "active": 1,
535
+ "events": [
536
+ {
537
+ "event": 104,
538
+ "op": "publish",
539
+ "param": 2271560481,
540
+ "slot": 2
541
+ },
542
+ {
543
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
544
+ "op": "log",
545
+ "slots": [
546
+ 2,
547
+ 3
548
+ ]
549
+ }
550
+ ],
551
+ "flags": 8192,
552
+ "last": 4294967295,
553
+ "target": 3
554
+ }
555
+ },
556
+ {
557
+ "rust": {
558
+ "active": 1,
559
+ "events": [
560
+ {
561
+ "event": 104,
562
+ "op": "publish",
563
+ "param": 2271560481,
564
+ "slot": 2
565
+ },
566
+ {
567
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
568
+ "op": "log",
569
+ "slots": [
570
+ 2,
571
+ 3
572
+ ]
573
+ }
574
+ ],
575
+ "flags": 8192,
576
+ "last": 10000,
577
+ "target": 3
578
+ },
579
+ "source": {
580
+ "active": 1,
581
+ "events": [
582
+ {
583
+ "event": 104,
584
+ "op": "publish",
585
+ "param": 2271560481,
586
+ "slot": 2
587
+ },
588
+ {
589
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
590
+ "op": "log",
591
+ "slots": [
592
+ 2,
593
+ 3
594
+ ]
595
+ }
596
+ ],
597
+ "flags": 8192,
598
+ "last": 10000,
599
+ "target": 3
600
+ }
601
+ },
602
+ {
603
+ "rust": {
604
+ "active": 1,
605
+ "events": [
606
+ {
607
+ "event": 104,
608
+ "op": "publish",
609
+ "param": 2271560481,
610
+ "slot": 2
611
+ },
612
+ {
613
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
614
+ "op": "log",
615
+ "slots": [
616
+ 2,
617
+ 3
618
+ ]
619
+ }
620
+ ],
621
+ "flags": 8192,
622
+ "last": 4294967295,
623
+ "target": 3
624
+ },
625
+ "source": {
626
+ "active": 1,
627
+ "events": [
628
+ {
629
+ "event": 104,
630
+ "op": "publish",
631
+ "param": 2271560481,
632
+ "slot": 2
633
+ },
634
+ {
635
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
636
+ "op": "log",
637
+ "slots": [
638
+ 2,
639
+ 3
640
+ ]
641
+ }
642
+ ],
643
+ "flags": 8192,
644
+ "last": 4294967295,
645
+ "target": 3
646
+ }
647
+ },
648
+ {
649
+ "rust": {
650
+ "active": 1,
651
+ "events": [
652
+ {
653
+ "event": 104,
654
+ "op": "publish",
655
+ "param": 2271560481,
656
+ "slot": 2
657
+ },
658
+ {
659
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
660
+ "op": "log",
661
+ "slots": [
662
+ 2,
663
+ 3
664
+ ]
665
+ }
666
+ ],
667
+ "flags": 8192,
668
+ "last": 10000,
669
+ "target": 3
670
+ },
671
+ "source": {
672
+ "active": 1,
673
+ "events": [
674
+ {
675
+ "event": 104,
676
+ "op": "publish",
677
+ "param": 2271560481,
678
+ "slot": 2
679
+ },
680
+ {
681
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
682
+ "op": "log",
683
+ "slots": [
684
+ 2,
685
+ 3
686
+ ]
687
+ }
688
+ ],
689
+ "flags": 8192,
690
+ "last": 10000,
691
+ "target": 3
692
+ }
693
+ },
694
+ {
695
+ "rust": {
696
+ "active": 1,
697
+ "events": [
698
+ {
699
+ "event": 104,
700
+ "op": "publish",
701
+ "param": 2271560481,
702
+ "slot": 2
703
+ },
704
+ {
705
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
706
+ "op": "log",
707
+ "slots": [
708
+ 2,
709
+ 3
710
+ ]
711
+ }
712
+ ],
713
+ "flags": 8192,
714
+ "last": 4294967295,
715
+ "target": 3
716
+ },
717
+ "source": {
718
+ "active": 1,
719
+ "events": [
720
+ {
721
+ "event": 104,
722
+ "op": "publish",
723
+ "param": 2271560481,
724
+ "slot": 2
725
+ },
726
+ {
727
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
728
+ "op": "log",
729
+ "slots": [
730
+ 2,
731
+ 3
732
+ ]
733
+ }
734
+ ],
735
+ "flags": 8192,
736
+ "last": 4294967295,
737
+ "target": 3
738
+ }
739
+ },
740
+ {
741
+ "rust": {
742
+ "active": 1,
743
+ "events": [
744
+ {
745
+ "event": 104,
746
+ "op": "publish",
747
+ "param": 2271560481,
748
+ "slot": 2
749
+ },
750
+ {
751
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
752
+ "op": "log",
753
+ "slots": [
754
+ 2,
755
+ 3
756
+ ]
757
+ }
758
+ ],
759
+ "flags": 8192,
760
+ "last": 10000,
761
+ "target": 3
762
+ },
763
+ "source": {
764
+ "active": 1,
765
+ "events": [
766
+ {
767
+ "event": 104,
768
+ "op": "publish",
769
+ "param": 2271560481,
770
+ "slot": 2
771
+ },
772
+ {
773
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
774
+ "op": "log",
775
+ "slots": [
776
+ 2,
777
+ 3
778
+ ]
779
+ }
780
+ ],
781
+ "flags": 8192,
782
+ "last": 10000,
783
+ "target": 3
784
+ }
785
+ },
786
+ {
787
+ "rust": {
788
+ "active": 1,
789
+ "events": [
790
+ {
791
+ "event": 104,
792
+ "op": "publish",
793
+ "param": 2271560481,
794
+ "slot": 2
795
+ },
796
+ {
797
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
798
+ "op": "log",
799
+ "slots": [
800
+ 2,
801
+ 3
802
+ ]
803
+ }
804
+ ],
805
+ "flags": 8192,
806
+ "last": 4294967295,
807
+ "target": 3
808
+ },
809
+ "source": {
810
+ "active": 1,
811
+ "events": [
812
+ {
813
+ "event": 104,
814
+ "op": "publish",
815
+ "param": 2271560481,
816
+ "slot": 2
817
+ },
818
+ {
819
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
820
+ "op": "log",
821
+ "slots": [
822
+ 2,
823
+ 3
824
+ ]
825
+ }
826
+ ],
827
+ "flags": 8192,
828
+ "last": 4294967295,
829
+ "target": 3
830
+ }
831
+ },
832
+ {
833
+ "rust": {
834
+ "active": 1,
835
+ "events": [],
836
+ "flags": 8192,
837
+ "last": 1234,
838
+ "target": null
839
+ },
840
+ "source": {
841
+ "active": 1,
842
+ "events": [],
843
+ "flags": 8192,
844
+ "last": 1234,
845
+ "target": null
846
+ }
847
+ },
848
+ {
849
+ "rust": {
850
+ "active": 1,
851
+ "events": [],
852
+ "flags": 8192,
853
+ "last": 1234,
854
+ "target": null
855
+ },
856
+ "source": {
857
+ "active": 1,
858
+ "events": [],
859
+ "flags": 8192,
860
+ "last": 1234,
861
+ "target": null
862
+ }
863
+ },
864
+ {
865
+ "rust": {
866
+ "active": 1,
867
+ "events": [],
868
+ "flags": 8192,
869
+ "last": 1234,
870
+ "target": 0
871
+ },
872
+ "source": {
873
+ "active": 1,
874
+ "events": [],
875
+ "flags": 8192,
876
+ "last": 1234,
877
+ "target": 0
878
+ }
879
+ },
880
+ {
881
+ "rust": {
882
+ "active": 1,
883
+ "events": [],
884
+ "flags": 8192,
885
+ "last": 1234,
886
+ "target": 0
887
+ },
888
+ "source": {
889
+ "active": 1,
890
+ "events": [],
891
+ "flags": 8192,
892
+ "last": 1234,
893
+ "target": 0
894
+ }
895
+ },
896
+ {
897
+ "rust": {
898
+ "active": 1,
899
+ "events": [
900
+ {
901
+ "event": 104,
902
+ "op": "publish",
903
+ "param": 2271560481,
904
+ "slot": 2
905
+ },
906
+ {
907
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
908
+ "op": "log",
909
+ "slots": [
910
+ 2,
911
+ 3
912
+ ]
913
+ }
914
+ ],
915
+ "flags": 8192,
916
+ "last": 10000,
917
+ "target": 3
918
+ },
919
+ "source": {
920
+ "active": 1,
921
+ "events": [
922
+ {
923
+ "event": 104,
924
+ "op": "publish",
925
+ "param": 2271560481,
926
+ "slot": 2
927
+ },
928
+ {
929
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
930
+ "op": "log",
931
+ "slots": [
932
+ 2,
933
+ 3
934
+ ]
935
+ }
936
+ ],
937
+ "flags": 8192,
938
+ "last": 10000,
939
+ "target": 3
940
+ }
941
+ },
942
+ {
943
+ "rust": {
944
+ "active": 1,
945
+ "events": [
946
+ {
947
+ "event": 104,
948
+ "op": "publish",
949
+ "param": 2271560481,
950
+ "slot": 2
951
+ },
952
+ {
953
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
954
+ "op": "log",
955
+ "slots": [
956
+ 2,
957
+ 3
958
+ ]
959
+ }
960
+ ],
961
+ "flags": 8192,
962
+ "last": 4294967295,
963
+ "target": 3
964
+ },
965
+ "source": {
966
+ "active": 1,
967
+ "events": [
968
+ {
969
+ "event": 104,
970
+ "op": "publish",
971
+ "param": 2271560481,
972
+ "slot": 2
973
+ },
974
+ {
975
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
976
+ "op": "log",
977
+ "slots": [
978
+ 2,
979
+ 3
980
+ ]
981
+ }
982
+ ],
983
+ "flags": 8192,
984
+ "last": 4294967295,
985
+ "target": 3
986
+ }
987
+ },
988
+ {
989
+ "rust": {
990
+ "active": 1,
991
+ "events": [
992
+ {
993
+ "event": 104,
994
+ "op": "publish",
995
+ "param": 2271560481,
996
+ "slot": 2
997
+ },
998
+ {
999
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1000
+ "op": "log",
1001
+ "slots": [
1002
+ 2,
1003
+ 3
1004
+ ]
1005
+ }
1006
+ ],
1007
+ "flags": 2147491842,
1008
+ "last": 10000,
1009
+ "target": 3
1010
+ },
1011
+ "source": {
1012
+ "active": 1,
1013
+ "events": [
1014
+ {
1015
+ "event": 104,
1016
+ "op": "publish",
1017
+ "param": 2271560481,
1018
+ "slot": 2
1019
+ },
1020
+ {
1021
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1022
+ "op": "log",
1023
+ "slots": [
1024
+ 2,
1025
+ 3
1026
+ ]
1027
+ }
1028
+ ],
1029
+ "flags": 2147491842,
1030
+ "last": 10000,
1031
+ "target": 3
1032
+ }
1033
+ },
1034
+ {
1035
+ "rust": {
1036
+ "active": 1,
1037
+ "events": [
1038
+ {
1039
+ "event": 104,
1040
+ "op": "publish",
1041
+ "param": 2271560481,
1042
+ "slot": 2
1043
+ },
1044
+ {
1045
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1046
+ "op": "log",
1047
+ "slots": [
1048
+ 2,
1049
+ 3
1050
+ ]
1051
+ }
1052
+ ],
1053
+ "flags": 2147491842,
1054
+ "last": 4294967295,
1055
+ "target": 3
1056
+ },
1057
+ "source": {
1058
+ "active": 1,
1059
+ "events": [
1060
+ {
1061
+ "event": 104,
1062
+ "op": "publish",
1063
+ "param": 2271560481,
1064
+ "slot": 2
1065
+ },
1066
+ {
1067
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1068
+ "op": "log",
1069
+ "slots": [
1070
+ 2,
1071
+ 3
1072
+ ]
1073
+ }
1074
+ ],
1075
+ "flags": 2147491842,
1076
+ "last": 4294967295,
1077
+ "target": 3
1078
+ }
1079
+ },
1080
+ {
1081
+ "rust": {
1082
+ "active": 1,
1083
+ "events": [
1084
+ {
1085
+ "event": 104,
1086
+ "op": "publish",
1087
+ "param": 2271560481,
1088
+ "slot": 2
1089
+ },
1090
+ {
1091
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1092
+ "op": "log",
1093
+ "slots": [
1094
+ 2,
1095
+ 3
1096
+ ]
1097
+ }
1098
+ ],
1099
+ "flags": 2147491842,
1100
+ "last": 10000,
1101
+ "target": 3
1102
+ },
1103
+ "source": {
1104
+ "active": 1,
1105
+ "events": [
1106
+ {
1107
+ "event": 104,
1108
+ "op": "publish",
1109
+ "param": 2271560481,
1110
+ "slot": 2
1111
+ },
1112
+ {
1113
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1114
+ "op": "log",
1115
+ "slots": [
1116
+ 2,
1117
+ 3
1118
+ ]
1119
+ }
1120
+ ],
1121
+ "flags": 2147491842,
1122
+ "last": 10000,
1123
+ "target": 3
1124
+ }
1125
+ },
1126
+ {
1127
+ "rust": {
1128
+ "active": 1,
1129
+ "events": [
1130
+ {
1131
+ "event": 104,
1132
+ "op": "publish",
1133
+ "param": 2271560481,
1134
+ "slot": 2
1135
+ },
1136
+ {
1137
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1138
+ "op": "log",
1139
+ "slots": [
1140
+ 2,
1141
+ 3
1142
+ ]
1143
+ }
1144
+ ],
1145
+ "flags": 2147491842,
1146
+ "last": 4294967295,
1147
+ "target": 3
1148
+ },
1149
+ "source": {
1150
+ "active": 1,
1151
+ "events": [
1152
+ {
1153
+ "event": 104,
1154
+ "op": "publish",
1155
+ "param": 2271560481,
1156
+ "slot": 2
1157
+ },
1158
+ {
1159
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1160
+ "op": "log",
1161
+ "slots": [
1162
+ 2,
1163
+ 3
1164
+ ]
1165
+ }
1166
+ ],
1167
+ "flags": 2147491842,
1168
+ "last": 4294967295,
1169
+ "target": 3
1170
+ }
1171
+ },
1172
+ {
1173
+ "rust": {
1174
+ "active": 1,
1175
+ "events": [
1176
+ {
1177
+ "event": 104,
1178
+ "op": "publish",
1179
+ "param": 2271560481,
1180
+ "slot": 2
1181
+ },
1182
+ {
1183
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1184
+ "op": "log",
1185
+ "slots": [
1186
+ 2,
1187
+ 3
1188
+ ]
1189
+ }
1190
+ ],
1191
+ "flags": 2147491842,
1192
+ "last": 10000,
1193
+ "target": 3
1194
+ },
1195
+ "source": {
1196
+ "active": 1,
1197
+ "events": [
1198
+ {
1199
+ "event": 104,
1200
+ "op": "publish",
1201
+ "param": 2271560481,
1202
+ "slot": 2
1203
+ },
1204
+ {
1205
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1206
+ "op": "log",
1207
+ "slots": [
1208
+ 2,
1209
+ 3
1210
+ ]
1211
+ }
1212
+ ],
1213
+ "flags": 2147491842,
1214
+ "last": 10000,
1215
+ "target": 3
1216
+ }
1217
+ },
1218
+ {
1219
+ "rust": {
1220
+ "active": 1,
1221
+ "events": [
1222
+ {
1223
+ "event": 104,
1224
+ "op": "publish",
1225
+ "param": 2271560481,
1226
+ "slot": 2
1227
+ },
1228
+ {
1229
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1230
+ "op": "log",
1231
+ "slots": [
1232
+ 2,
1233
+ 3
1234
+ ]
1235
+ }
1236
+ ],
1237
+ "flags": 2147491842,
1238
+ "last": 4294967295,
1239
+ "target": 3
1240
+ },
1241
+ "source": {
1242
+ "active": 1,
1243
+ "events": [
1244
+ {
1245
+ "event": 104,
1246
+ "op": "publish",
1247
+ "param": 2271560481,
1248
+ "slot": 2
1249
+ },
1250
+ {
1251
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1252
+ "op": "log",
1253
+ "slots": [
1254
+ 2,
1255
+ 3
1256
+ ]
1257
+ }
1258
+ ],
1259
+ "flags": 2147491842,
1260
+ "last": 4294967295,
1261
+ "target": 3
1262
+ }
1263
+ },
1264
+ {
1265
+ "rust": {
1266
+ "active": 1,
1267
+ "events": [],
1268
+ "flags": 2147491842,
1269
+ "last": 1234,
1270
+ "target": null
1271
+ },
1272
+ "source": {
1273
+ "active": 1,
1274
+ "events": [],
1275
+ "flags": 2147491842,
1276
+ "last": 1234,
1277
+ "target": null
1278
+ }
1279
+ },
1280
+ {
1281
+ "rust": {
1282
+ "active": 1,
1283
+ "events": [],
1284
+ "flags": 2147491842,
1285
+ "last": 1234,
1286
+ "target": null
1287
+ },
1288
+ "source": {
1289
+ "active": 1,
1290
+ "events": [],
1291
+ "flags": 2147491842,
1292
+ "last": 1234,
1293
+ "target": null
1294
+ }
1295
+ },
1296
+ {
1297
+ "rust": {
1298
+ "active": 1,
1299
+ "events": [],
1300
+ "flags": 2147491842,
1301
+ "last": 1234,
1302
+ "target": 0
1303
+ },
1304
+ "source": {
1305
+ "active": 1,
1306
+ "events": [],
1307
+ "flags": 2147491842,
1308
+ "last": 1234,
1309
+ "target": 0
1310
+ }
1311
+ },
1312
+ {
1313
+ "rust": {
1314
+ "active": 1,
1315
+ "events": [],
1316
+ "flags": 2147491842,
1317
+ "last": 1234,
1318
+ "target": 0
1319
+ },
1320
+ "source": {
1321
+ "active": 1,
1322
+ "events": [],
1323
+ "flags": 2147491842,
1324
+ "last": 1234,
1325
+ "target": 0
1326
+ }
1327
+ },
1328
+ {
1329
+ "rust": {
1330
+ "active": 1,
1331
+ "events": [
1332
+ {
1333
+ "event": 104,
1334
+ "op": "publish",
1335
+ "param": 2271560481,
1336
+ "slot": 2
1337
+ },
1338
+ {
1339
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1340
+ "op": "log",
1341
+ "slots": [
1342
+ 2,
1343
+ 3
1344
+ ]
1345
+ }
1346
+ ],
1347
+ "flags": 2147491842,
1348
+ "last": 10000,
1349
+ "target": 3
1350
+ },
1351
+ "source": {
1352
+ "active": 1,
1353
+ "events": [
1354
+ {
1355
+ "event": 104,
1356
+ "op": "publish",
1357
+ "param": 2271560481,
1358
+ "slot": 2
1359
+ },
1360
+ {
1361
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1362
+ "op": "log",
1363
+ "slots": [
1364
+ 2,
1365
+ 3
1366
+ ]
1367
+ }
1368
+ ],
1369
+ "flags": 2147491842,
1370
+ "last": 10000,
1371
+ "target": 3
1372
+ }
1373
+ },
1374
+ {
1375
+ "rust": {
1376
+ "active": 1,
1377
+ "events": [
1378
+ {
1379
+ "event": 104,
1380
+ "op": "publish",
1381
+ "param": 2271560481,
1382
+ "slot": 2
1383
+ },
1384
+ {
1385
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1386
+ "op": "log",
1387
+ "slots": [
1388
+ 2,
1389
+ 3
1390
+ ]
1391
+ }
1392
+ ],
1393
+ "flags": 2147491842,
1394
+ "last": 4294967295,
1395
+ "target": 3
1396
+ },
1397
+ "source": {
1398
+ "active": 1,
1399
+ "events": [
1400
+ {
1401
+ "event": 104,
1402
+ "op": "publish",
1403
+ "param": 2271560481,
1404
+ "slot": 2
1405
+ },
1406
+ {
1407
+ "format": "546861774f7574537461727465643a2025692025693a20257320737461727465642074686177696e67206f75742025730a",
1408
+ "op": "log",
1409
+ "slots": [
1410
+ 2,
1411
+ 3
1412
+ ]
1413
+ }
1414
+ ],
1415
+ "flags": 2147491842,
1416
+ "last": 4294967295,
1417
+ "target": 3
1418
+ }
1419
+ }
1420
+ ],
1421
+ "source_report": "docs/research/qvm-assist-acquire.json",
1422
+ "source_report_sha256": "8de7af5d68151eb5f856e3a7f4b511d502372e722f96e08137cdca9daccdb2f8"
1423
+ }
docs/research/rust-health-impulse.json CHANGED
@@ -2985,7 +2985,7 @@
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
- "rust_unit_tests": 259,
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": 261,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
scripts/analyze_rust_assist_acquire.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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-assistance'],check=True,capture_output=True)
9
+ binary=Path(os.environ.get('CARGO_TARGET_DIR','target'))/'debug'/'urt-assistance'
10
+ path=Path('docs/research/qvm-assist-acquire.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 ['flags', 'active', 'target', 'last', 'events']},rust=result(binary,'acquire',encode(p['input']))))
13
+ write_json(Path('docs/research/rust-assist-acquire.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):return [a['flags'],a['active'],0xffffffff if a['target'] is None else a['target'],a['tick'],a['last']]
16
+ if __name__=='__main__':main()
scripts/test_rust_assist_acquire.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-assist-acquire.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-assist-acquire.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
@@ -3969,3 +3969,34 @@ report scripts/analyze_qvm_assist_acquire.py docs/research/qvm-assist-acquire.js
3969
  edge docs/research/qvm-assist-acquire.json scripts/test_qvm_assist_acquire.py
3970
  group qvm-assist-acquire scripts/analyze_qvm_assist_acquire.py
3971
  edge scripts/analyze_qvm_assist_acquire.py scripts/analyze_qvm_resumer_audit.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3969
  edge docs/research/qvm-assist-acquire.json scripts/test_qvm_assist_acquire.py
3970
  group qvm-assist-acquire scripts/analyze_qvm_assist_acquire.py
3971
  edge scripts/analyze_qvm_assist_acquire.py scripts/analyze_qvm_resumer_audit.py
3972
+ report scripts/analyze_rust_assist_acquire.py docs/research/rust-assist-acquire.json
3973
+ edge docs/research/rust-assist-acquire.json scripts/test_rust_assist_acquire.py
3974
+ group rust-assist-acquire scripts/analyze_rust_assist_acquire.py
3975
+ edge scripts/analyze_rust_assist_acquire.py scripts/analyze_qvm_resumer_audit.py
3976
+ edge Cargo.toml scripts/analyze_rust_assist_acquire.py
3977
+ edge Cargo.lock scripts/analyze_rust_assist_acquire.py
3978
+ edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_assist_acquire.py
3979
+ edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_assist_acquire.py
3980
+ edge crates/urt-gameplay/src/filter_loading.rs scripts/analyze_rust_assist_acquire.py
3981
+ edge crates/urt-gameplay/src/filter_lifecycle.rs scripts/analyze_rust_assist_acquire.py
3982
+ edge crates/urt-gameplay/src/native_policy.rs scripts/analyze_rust_assist_acquire.py
3983
+ edge crates/urt-gameplay/src/bin/urt-filter-loading.rs scripts/analyze_rust_assist_acquire.py
3984
+ edge crates/urt-gameplay/src/qvm_format.rs scripts/analyze_rust_assist_acquire.py
3985
+ edge docs/research/qvm-assist-acquire.json scripts/analyze_rust_assist_acquire.py
3986
+ group rust-assist-acquire scripts/analyze_rust_health_impulse.py
3987
+ group gameplay scripts/analyze_rust_assist_acquire.py
3988
+ edge crates/urt-gameplay/src/filter_commands.rs scripts/analyze_rust_assist_acquire.py
3989
+ edge crates/urt-gameplay/src/bin/urt-filter-commands.rs scripts/analyze_rust_assist_acquire.py
3990
+ edge crates/urt-gameplay/src/client_timer.rs scripts/analyze_rust_assist_acquire.py
3991
+ edge crates/urt-gameplay/src/bin/urt-client-timer.rs scripts/analyze_rust_assist_acquire.py
3992
+ edge crates/urt-gameplay/src/client_processing.rs scripts/analyze_rust_assist_acquire.py
3993
+ edge crates/urt-gameplay/src/bin/urt-client-processing.rs scripts/analyze_rust_assist_acquire.py
3994
+ edge crates/urt-gameplay/src/client_move_context.rs scripts/analyze_rust_assist_acquire.py
3995
+ edge crates/urt-gameplay/src/bin/urt-client-move-context.rs scripts/analyze_rust_assist_acquire.py
3996
+ edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_assist_acquire.py
3997
+ edge crates/urt-gameplay/src/bin/urt-move-callbacks.rs scripts/analyze_rust_assist_acquire.py
3998
+ edge crates/urt-gameplay/src/assistance.rs scripts/analyze_rust_assist_acquire.py
3999
+ edge crates/urt-gameplay/src/bin/urt-assistance.rs scripts/analyze_rust_assist_acquire.py
4000
+ edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_assist_acquire.py
4001
+ edge crates/urt-gameplay/src/assistance.rs scripts/analyze_rust_health_impulse.py
4002
+ edge crates/urt-gameplay/src/bin/urt-assistance.rs scripts/analyze_rust_health_impulse.py
xtask/src/lib.rs CHANGED
@@ -1142,6 +1142,8 @@ mod integration_tests {
1142
  ("move_callbacks", "move_mode8_eligibility"),
1143
  ("move_callbacks", "move_resolved_self"),
1144
  ("client_move_context", "move_resolved_self"),
 
 
1145
  ("client_move_context", "client_move_scratch"),
1146
  ("client_processing", "client_routing"),
1147
  ("client_timer", "client_routing"),
@@ -1365,6 +1367,7 @@ mod integration_tests {
1365
  ("qvm-move-assist-cleanup", "move_assist_cleanup"),
1366
  ("qvm-move-mode8-eligibility", "move_mode8_eligibility"),
1367
  ("qvm-move-resolved-self", "move_resolved_self"),
 
1368
  ("qvm-client-move-scratch", "client_move_scratch"),
1369
  ("qvm-client-routing", "client_routing"),
1370
  ("qvm-client-command-rewrite", "client_command_rewrite"),
 
1142
  ("move_callbacks", "move_mode8_eligibility"),
1143
  ("move_callbacks", "move_resolved_self"),
1144
  ("client_move_context", "move_resolved_self"),
1145
+ ("assistance", "assist_acquire"),
1146
+ ("move_callbacks", "assist_acquire"),
1147
  ("client_move_context", "client_move_scratch"),
1148
  ("client_processing", "client_routing"),
1149
  ("client_timer", "client_routing"),
 
1367
  ("qvm-move-assist-cleanup", "move_assist_cleanup"),
1368
  ("qvm-move-mode8-eligibility", "move_mode8_eligibility"),
1369
  ("qvm-move-resolved-self", "move_resolved_self"),
1370
+ ("qvm-assist-acquire", "assist_acquire"),
1371
  ("qvm-client-move-scratch", "client_move_scratch"),
1372
  ("qvm-client-routing", "client_routing"),
1373
  ("qvm-client-command-rewrite", "client_command_rewrite"),