nmarshall commited on
Commit
8d00a05
·
1 Parent(s): fc23200

gameplay: broadcast stateful scoreboard packets

Browse files
crates/urt-gameplay/src/bin/urt-lifecycle.rs CHANGED
@@ -394,6 +394,36 @@ fn run() -> Result<(), String> {
394
  second.cached_ping as u32
395
  );
396
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
397
  "scoreboard-packet" if w.len() >= 6 && w[4] <= 64 && w[5] <= 64 => {
398
  let n = w[4] as usize;
399
  let count = w[5] as usize;
 
394
  second.cached_ping as u32
395
  );
396
  }
397
+ "scoreboard-stream" if w.len() >= 6 && w[4] <= 64 && w[5] <= 64 => {
398
+ let n = w[4] as usize;
399
+ let count = w[5] as usize;
400
+ if w.len() < 6 + count {
401
+ return Err("missing scoreboard order".into());
402
+ }
403
+ let order: Vec<_> = w[6..6 + count].iter().map(|v| *v as usize).collect();
404
+ let (mut clients, names) = scoreboard_clients(&w[6 + count..], n)?;
405
+ let mut counter = w[3];
406
+ let packets = urt_gameplay::scoreboard_wire::broadcast(
407
+ &mut clients,
408
+ &names,
409
+ &order,
410
+ w[0] as i32,
411
+ [w[1] as i32, w[2] as i32],
412
+ &mut counter,
413
+ )
414
+ .map_err(|e| format!("unsupported input: {e:?}"))?;
415
+ let values:Vec<_>=packets.iter().map(|t|format!("{{\"recipient\":{},\"accepted\":{},\"attempted\":{},\"payload_length\":{},\"cstring_hex\":\"{}\",\"buffer_index\":{},\"counter\":{}}}",t.recipient,t.packet.accepted,t.packet.attempted,t.packet.payload_length,t.packet.cstring.iter().map(|v|format!("{v:02x}")).collect::<String>(),t.packet.buffer_index,t.counter)).collect();
416
+ println!(
417
+ "{{\"packets\":[{}],\"counter\":{},\"cached\":[{}]}}",
418
+ values.join(","),
419
+ counter,
420
+ clients
421
+ .iter()
422
+ .map(|c| (c.cached_ping as u32).to_string())
423
+ .collect::<Vec<_>>()
424
+ .join(",")
425
+ );
426
+ }
427
  "scoreboard-packet" if w.len() >= 6 && w[4] <= 64 && w[5] <= 64 => {
428
  let n = w[4] as usize;
429
  let count = w[5] as usize;
crates/urt-gameplay/src/scoreboard_wire.rs CHANGED
@@ -48,16 +48,7 @@ pub fn prepare(
48
  scores: [i32; 2],
49
  counter: &mut u32,
50
  ) -> Result<Packet, Error> {
51
- if clients.len() > 64 || names.len() != clients.len() || order.len() > 64 {
52
- return Err(Error::InvalidOrder);
53
- }
54
- let mut seen = vec![false; clients.len()];
55
- for &id in order {
56
- if id >= clients.len() || seen[id] {
57
- return Err(Error::InvalidOrder);
58
- }
59
- seen[id] = true;
60
- }
61
  let mut payload = vec![];
62
  let mut accepted = 0;
63
  let mut attempted = 0;
@@ -92,6 +83,50 @@ pub fn prepare(
92
  buffer_index,
93
  })
94
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  #[cfg(test)]
96
  mod tests {
97
  use super::*;
@@ -118,6 +153,45 @@ mod tests {
118
  }
119
  }
120
  #[test]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  fn exact_capacity_and_rejected_candidate_cache_effect() {
122
  let mut c = client();
123
  c.packed = 0;
 
48
  scores: [i32; 2],
49
  counter: &mut u32,
50
  ) -> Result<Packet, Error> {
51
+ validate(clients, names, order)?;
 
 
 
 
 
 
 
 
 
52
  let mut payload = vec![];
53
  let mut accepted = 0;
54
  let mut attempted = 0;
 
83
  buffer_index,
84
  })
85
  }
86
+ fn validate(clients: &[Client], names: &[Vec<u8>], order: &[usize]) -> Result<(), Error> {
87
+ if clients.len() > 64 || names.len() != clients.len() || order.len() > 64 {
88
+ return Err(Error::InvalidOrder);
89
+ }
90
+ let mut seen = vec![false; clients.len()];
91
+ for &id in order {
92
+ if id >= clients.len() || seen[id] {
93
+ return Err(Error::InvalidOrder);
94
+ }
95
+ seen[id] = true;
96
+ }
97
+ Ok(())
98
+ }
99
+ #[derive(Clone, Debug, PartialEq, Eq)]
100
+ pub struct Transmission {
101
+ pub recipient: usize,
102
+ pub packet: Packet,
103
+ pub counter: u32,
104
+ }
105
+ /// Source6328 scan with actual179363 contract effects between recipients.
106
+ /// Native sends are represented as transmissions and do not change connections.
107
+ pub fn broadcast(
108
+ clients: &mut [Client],
109
+ names: &[Vec<u8>],
110
+ order: &[usize],
111
+ now: i32,
112
+ scores: [i32; 2],
113
+ counter: &mut u32,
114
+ ) -> Result<Vec<Transmission>, Error> {
115
+ validate(clients, names, order)?;
116
+ let mut packets = vec![];
117
+ for recipient in 0..clients.len() {
118
+ if clients[recipient].connection != 2 {
119
+ continue;
120
+ }
121
+ let packet = prepare(clients, names, order, now, scores, counter)?;
122
+ packets.push(Transmission {
123
+ recipient,
124
+ packet,
125
+ counter: *counter,
126
+ });
127
+ }
128
+ Ok(packets)
129
+ }
130
  #[cfg(test)]
131
  mod tests {
132
  use super::*;
 
153
  }
154
  }
155
  #[test]
156
+ fn broadcast_reuses_cache_ring_and_recipient_scan_order() {
157
+ let mut c = client();
158
+ c.connection = 2;
159
+ c.ping = 7;
160
+ let mut clients = [c, c];
161
+ let mut counter = u32::MAX;
162
+ let p = broadcast(
163
+ &mut clients,
164
+ &[vec![], vec![255, 254]],
165
+ &[1, 0],
166
+ 0,
167
+ [1, 2],
168
+ &mut counter,
169
+ )
170
+ .unwrap();
171
+ assert_eq!(p.iter().map(|p| p.recipient).collect::<Vec<_>>(), [0, 1]);
172
+ assert_eq!(
173
+ (p[0].packet.buffer_index, p[1].packet.buffer_index, counter),
174
+ (1, 0, 1)
175
+ );
176
+ assert!(clients.iter().all(|c| c.cached_ping == 7));
177
+ assert_eq!(p[0].packet.cstring, p[1].packet.cstring);
178
+ }
179
+ #[test]
180
+ fn no_recipients_preserve_counter_but_malformed_input_rejects() {
181
+ let mut clients = [client()];
182
+ let mut counter = 77;
183
+ assert_eq!(
184
+ broadcast(&mut clients, &[vec![]], &[0], 0, [0, 0], &mut counter).unwrap(),
185
+ []
186
+ );
187
+ assert_eq!(counter, 77);
188
+ assert_eq!(
189
+ broadcast(&mut clients, &[vec![]], &[0, 0], 0, [0, 0], &mut counter),
190
+ Err(Error::InvalidOrder)
191
+ );
192
+ assert_eq!(counter, 77);
193
+ }
194
+ #[test]
195
  fn exact_capacity_and_rejected_candidate_cache_effect() {
196
  let mut c = client();
197
  c.packed = 0;
docs/FINDINGS.md CHANGED
@@ -1427,3 +1427,6 @@ RE-791–800 adds exact Rust source-sort/ranking parity, mixed count/prefix sema
1427
 
1428
 
1429
  **RE-809:** 6328 now composes actual scoreboard bodies for successive recipients, preserving cache mutations, refreshed frame arguments and alternating output pointers. [Evidence](research/QVM_SCOREBOARD_STREAM.md).
 
 
 
 
1427
 
1428
 
1429
  **RE-809:** 6328 now composes actual scoreboard bodies for successive recipients, preserving cache mutations, refreshed frame arguments and alternating output pointers. [Evidence](research/QVM_SCOREBOARD_STREAM.md).
1430
+
1431
+
1432
+ **RE-810:** Rust now matches successive source scoreboard packets with shared cache and ring state, rather than producing isolated per-recipient projections. [Evidence](research/RUST_SCOREBOARD_STREAM.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -1434,3 +1434,6 @@ RE-808: Rust matches exact modeled scoreboard bytes, accepted/attempted counts,
1434
 
1435
 
1436
  RE-809: 6328 now composes actual scoreboard bodies for successive recipients, preserving cache mutations, refreshed frame arguments and alternating output pointers. Full runtime completion remains open. [Evidence](research/QVM_SCOREBOARD_STREAM.md).
 
 
 
 
1434
 
1435
 
1436
  RE-809: 6328 now composes actual scoreboard bodies for successive recipients, preserving cache mutations, refreshed frame arguments and alternating output pointers. Full runtime completion remains open. [Evidence](research/QVM_SCOREBOARD_STREAM.md).
1437
+
1438
+
1439
+ RE-810: Rust now matches successive source scoreboard packets with shared cache and ring state, rather than producing isolated per-recipient projections. Full runtime completion remains open. [Evidence](research/RUST_SCOREBOARD_STREAM.md).
docs/RESEARCH_LEDGER.md CHANGED
@@ -1711,3 +1711,8 @@ Rust matches exact modeled scoreboard bytes, accepted/attempted counts, rejected
1711
  ## 2026-10-26 — RE-809 Source scoreboard broadcast with shared packet and cache state
1712
 
1713
  6328 now composes actual scoreboard bodies for successive recipients, preserving cache mutations, refreshed frame arguments and alternating output pointers. Focused `cargo xtask test-group scoreboard-stream` passes (5 Python tests); selected reports regenerate twice deterministically, with storage, documentation links and whitespace guards. Full suite deferred to task ten. Original assets unchanged; source fixtures do not establish complete native/runtime parity.
 
 
 
 
 
 
1711
  ## 2026-10-26 — RE-809 Source scoreboard broadcast with shared packet and cache state
1712
 
1713
  6328 now composes actual scoreboard bodies for successive recipients, preserving cache mutations, refreshed frame arguments and alternating output pointers. Focused `cargo xtask test-group scoreboard-stream` passes (5 Python tests); selected reports regenerate twice deterministically, with storage, documentation links and whitespace guards. Full suite deferred to task ten. Original assets unchanged; source fixtures do not establish complete native/runtime parity.
1714
+
1715
+
1716
+ ## 2026-10-26 — RE-810 Rust stateful scoreboard broadcast transmission contract
1717
+
1718
+ Rust now matches successive source scoreboard packets with shared cache and ring state, rather than producing isolated per-recipient projections. Focused `cargo xtask test-group rust-scoreboard-stream` passes (11 Python tests); selected reports regenerate twice deterministically, with storage, documentation links and whitespace guards. Full suite deferred to task ten. Original assets unchanged; source fixtures do not establish complete native/runtime parity.
docs/REVERSE_ENGINEERING_TODO.md CHANGED
@@ -1477,3 +1477,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
1477
 
1478
 
1479
  - [x] RE-809 Source scoreboard broadcast with shared packet and cache state ([evidence](research/QVM_SCOREBOARD_STREAM.md)).
 
 
 
 
1477
 
1478
 
1479
  - [x] RE-809 Source scoreboard broadcast with shared packet and cache state ([evidence](research/QVM_SCOREBOARD_STREAM.md)).
1480
+
1481
+
1482
+ - [x] RE-810 Rust stateful scoreboard broadcast transmission contract ([evidence](research/RUST_SCOREBOARD_STREAM.md)).
docs/research/README.md CHANGED
@@ -1017,3 +1017,6 @@ The extension collector adds five focused tests for native tail calls, command-r
1017
 
1018
 
1019
  [RE-809: Source scoreboard broadcast with shared packet and cache state](QVM_SCOREBOARD_STREAM.md).
 
 
 
 
1017
 
1018
 
1019
  [RE-809: Source scoreboard broadcast with shared packet and cache state](QVM_SCOREBOARD_STREAM.md).
1020
+
1021
+
1022
+ [RE-810: Rust stateful scoreboard broadcast transmission contract](RUST_SCOREBOARD_STREAM.md).
docs/research/RUST_SCOREBOARD_STREAM.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Rust stateful scoreboard broadcast transmission contract
2
+
3
+ RE-810. Reproduce with `python3 scripts/analyze_rust_scoreboard_stream.py`; focused validation: `cargo xtask test-group rust-scoreboard-stream`. [Machine report](rust-scoreboard-stream.json).
4
+
5
+ The broadcast API scans state2 clients in original order and runs packet preparation between recipients. Input shape validates before mutations, even when no recipients qualify; no-recipient broadcasts preserve the ring counter. Ten original-control-flow fixtures match every transmission byte and metadata plus final cache/counter state. Native send and exit-rule state changes remain outside this pure transmission contract.
6
+
7
+ Original executable/native runtime and complete Linux/macOS Rust/Bevy/Solari acceptance remain unverified.
docs/research/rust-health-impulse.json CHANGED
@@ -2985,7 +2985,7 @@
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
- "rust_unit_tests": 69,
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": 71,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
docs/research/rust-scoreboard-stream.json ADDED
@@ -0,0 +1,587 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Rust source6328/179363 modeled stream parity over10 shared-state fixtures, with cache/ring carry and byte-exact transmissions. No native37914/strncpy/send/exit-rule side effects or full game runtime execution.",
3
+ "probes": [
4
+ {
5
+ "rust": {
6
+ "cached": [],
7
+ "counter": 0,
8
+ "packets": []
9
+ },
10
+ "source": {
11
+ "cached": [],
12
+ "counter": 0,
13
+ "packets": []
14
+ }
15
+ },
16
+ {
17
+ "rust": {
18
+ "cached": [],
19
+ "counter": 4294967295,
20
+ "packets": []
21
+ },
22
+ "source": {
23
+ "cached": [],
24
+ "counter": 4294967295,
25
+ "packets": []
26
+ }
27
+ },
28
+ {
29
+ "rust": {
30
+ "cached": [
31
+ 50
32
+ ],
33
+ "counter": 1,
34
+ "packets": [
35
+ {
36
+ "accepted": 1,
37
+ "attempted": 1,
38
+ "buffer_index": 0,
39
+ "counter": 1,
40
+ "cstring_hex": "73636f72657320312032203120302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
41
+ "payload_length": 40,
42
+ "recipient": 0
43
+ }
44
+ ]
45
+ },
46
+ "source": {
47
+ "cached": [
48
+ 50
49
+ ],
50
+ "counter": 1,
51
+ "packets": [
52
+ {
53
+ "accepted": 1,
54
+ "attempted": 1,
55
+ "buffer_index": 0,
56
+ "counter": 1,
57
+ "cstring_hex": "73636f72657320312032203120302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
58
+ "payload_length": 40,
59
+ "recipient": 0
60
+ }
61
+ ]
62
+ }
63
+ },
64
+ {
65
+ "rust": {
66
+ "cached": [
67
+ 50
68
+ ],
69
+ "counter": 0,
70
+ "packets": [
71
+ {
72
+ "accepted": 1,
73
+ "attempted": 1,
74
+ "buffer_index": 1,
75
+ "counter": 0,
76
+ "cstring_hex": "73636f72657320312032203120302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
77
+ "payload_length": 40,
78
+ "recipient": 0
79
+ }
80
+ ]
81
+ },
82
+ "source": {
83
+ "cached": [
84
+ 50
85
+ ],
86
+ "counter": 0,
87
+ "packets": [
88
+ {
89
+ "accepted": 1,
90
+ "attempted": 1,
91
+ "buffer_index": 1,
92
+ "counter": 0,
93
+ "cstring_hex": "73636f72657320312032203120302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
94
+ "payload_length": 40,
95
+ "recipient": 0
96
+ }
97
+ ]
98
+ }
99
+ },
100
+ {
101
+ "rust": {
102
+ "cached": [
103
+ 50,
104
+ 101,
105
+ 52
106
+ ],
107
+ "counter": 2,
108
+ "packets": [
109
+ {
110
+ "accepted": 3,
111
+ "attempted": 3,
112
+ "buffer_index": 0,
113
+ "counter": 1,
114
+ "cstring_hex": "73636f72657320332032203120322037203532203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
115
+ "payload_length": 129,
116
+ "recipient": 0
117
+ },
118
+ {
119
+ "accepted": 3,
120
+ "attempted": 3,
121
+ "buffer_index": 1,
122
+ "counter": 2,
123
+ "cstring_hex": "73636f72657320332032203120322037203532203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
124
+ "payload_length": 129,
125
+ "recipient": 2
126
+ }
127
+ ]
128
+ },
129
+ "source": {
130
+ "cached": [
131
+ 50,
132
+ 101,
133
+ 52
134
+ ],
135
+ "counter": 2,
136
+ "packets": [
137
+ {
138
+ "accepted": 3,
139
+ "attempted": 3,
140
+ "buffer_index": 0,
141
+ "counter": 1,
142
+ "cstring_hex": "73636f72657320332032203120322037203532203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
143
+ "payload_length": 129,
144
+ "recipient": 0
145
+ },
146
+ {
147
+ "accepted": 3,
148
+ "attempted": 3,
149
+ "buffer_index": 1,
150
+ "counter": 2,
151
+ "cstring_hex": "73636f72657320332032203120322037203532203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
152
+ "payload_length": 129,
153
+ "recipient": 2
154
+ }
155
+ ]
156
+ }
157
+ },
158
+ {
159
+ "rust": {
160
+ "cached": [
161
+ 50,
162
+ 101,
163
+ 52
164
+ ],
165
+ "counter": 1,
166
+ "packets": [
167
+ {
168
+ "accepted": 3,
169
+ "attempted": 3,
170
+ "buffer_index": 1,
171
+ "counter": 0,
172
+ "cstring_hex": "73636f72657320332032203120322037203532203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
173
+ "payload_length": 129,
174
+ "recipient": 0
175
+ },
176
+ {
177
+ "accepted": 3,
178
+ "attempted": 3,
179
+ "buffer_index": 0,
180
+ "counter": 1,
181
+ "cstring_hex": "73636f72657320332032203120322037203532203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
182
+ "payload_length": 129,
183
+ "recipient": 2
184
+ }
185
+ ]
186
+ },
187
+ "source": {
188
+ "cached": [
189
+ 50,
190
+ 101,
191
+ 52
192
+ ],
193
+ "counter": 1,
194
+ "packets": [
195
+ {
196
+ "accepted": 3,
197
+ "attempted": 3,
198
+ "buffer_index": 1,
199
+ "counter": 0,
200
+ "cstring_hex": "73636f72657320332032203120322037203532203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
201
+ "payload_length": 129,
202
+ "recipient": 0
203
+ },
204
+ {
205
+ "accepted": 3,
206
+ "attempted": 3,
207
+ "buffer_index": 0,
208
+ "counter": 1,
209
+ "cstring_hex": "73636f72657320332032203120322037203532203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
210
+ "payload_length": 129,
211
+ "recipient": 2
212
+ }
213
+ ]
214
+ }
215
+ },
216
+ {
217
+ "rust": {
218
+ "cached": [
219
+ 50,
220
+ 101,
221
+ 999,
222
+ 103,
223
+ 999,
224
+ 105,
225
+ 999,
226
+ 107
227
+ ],
228
+ "counter": 2,
229
+ "packets": [
230
+ {
231
+ "accepted": 8,
232
+ "attempted": 8,
233
+ "buffer_index": 0,
234
+ "counter": 1,
235
+ "cstring_hex": "73636f7265732038203220312037203720313037203320312033203920323535202d38333838363037203137203420313420fffe20362037202d31203320302033203920323535202d383338383630372031372034203135206c6f6e67202573206e616d652035203720313035203320312033203920323535202d3833383836303720313720342031362041422034203720393939203320302033203920323535202d383338383630372031372034203137202d2d2d20332037202d31203320312033203920323535202d38333838363037203137203420313820fffe2032203720393939203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
236
+ "payload_length": 339,
237
+ "recipient": 0
238
+ },
239
+ {
240
+ "accepted": 8,
241
+ "attempted": 8,
242
+ "buffer_index": 1,
243
+ "counter": 2,
244
+ "cstring_hex": "73636f7265732038203220312037203720313037203320312033203920323535202d38333838363037203137203420313420fffe20362037202d31203320302033203920323535202d383338383630372031372034203135206c6f6e67202573206e616d652035203720313035203320312033203920323535202d3833383836303720313720342031362041422034203720393939203320302033203920323535202d383338383630372031372034203137202d2d2d20332037202d31203320312033203920323535202d38333838363037203137203420313820fffe2032203720393939203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
245
+ "payload_length": 339,
246
+ "recipient": 7
247
+ }
248
+ ]
249
+ },
250
+ "source": {
251
+ "cached": [
252
+ 50,
253
+ 101,
254
+ 999,
255
+ 103,
256
+ 999,
257
+ 105,
258
+ 999,
259
+ 107
260
+ ],
261
+ "counter": 2,
262
+ "packets": [
263
+ {
264
+ "accepted": 8,
265
+ "attempted": 8,
266
+ "buffer_index": 0,
267
+ "counter": 1,
268
+ "cstring_hex": "73636f7265732038203220312037203720313037203320312033203920323535202d38333838363037203137203420313420fffe20362037202d31203320302033203920323535202d383338383630372031372034203135206c6f6e67202573206e616d652035203720313035203320312033203920323535202d3833383836303720313720342031362041422034203720393939203320302033203920323535202d383338383630372031372034203137202d2d2d20332037202d31203320312033203920323535202d38333838363037203137203420313820fffe2032203720393939203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
269
+ "payload_length": 339,
270
+ "recipient": 0
271
+ },
272
+ {
273
+ "accepted": 8,
274
+ "attempted": 8,
275
+ "buffer_index": 1,
276
+ "counter": 2,
277
+ "cstring_hex": "73636f7265732038203220312037203720313037203320312033203920323535202d38333838363037203137203420313420fffe20362037202d31203320302033203920323535202d383338383630372031372034203135206c6f6e67202573206e616d652035203720313035203320312033203920323535202d3833383836303720313720342031362041422034203720393939203320302033203920323535202d383338383630372031372034203137202d2d2d20332037202d31203320312033203920323535202d38333838363037203137203420313820fffe2032203720393939203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
278
+ "payload_length": 339,
279
+ "recipient": 7
280
+ }
281
+ ]
282
+ }
283
+ },
284
+ {
285
+ "rust": {
286
+ "cached": [
287
+ 50,
288
+ 101,
289
+ 999,
290
+ 103,
291
+ 999,
292
+ 105,
293
+ 999,
294
+ 107
295
+ ],
296
+ "counter": 1,
297
+ "packets": [
298
+ {
299
+ "accepted": 8,
300
+ "attempted": 8,
301
+ "buffer_index": 1,
302
+ "counter": 0,
303
+ "cstring_hex": "73636f7265732038203220312037203720313037203320312033203920323535202d38333838363037203137203420313420fffe20362037202d31203320302033203920323535202d383338383630372031372034203135206c6f6e67202573206e616d652035203720313035203320312033203920323535202d3833383836303720313720342031362041422034203720393939203320302033203920323535202d383338383630372031372034203137202d2d2d20332037202d31203320312033203920323535202d38333838363037203137203420313820fffe2032203720393939203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
304
+ "payload_length": 339,
305
+ "recipient": 0
306
+ },
307
+ {
308
+ "accepted": 8,
309
+ "attempted": 8,
310
+ "buffer_index": 0,
311
+ "counter": 1,
312
+ "cstring_hex": "73636f7265732038203220312037203720313037203320312033203920323535202d38333838363037203137203420313420fffe20362037202d31203320302033203920323535202d383338383630372031372034203135206c6f6e67202573206e616d652035203720313035203320312033203920323535202d3833383836303720313720342031362041422034203720393939203320302033203920323535202d383338383630372031372034203137202d2d2d20332037202d31203320312033203920323535202d38333838363037203137203420313820fffe2032203720393939203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
313
+ "payload_length": 339,
314
+ "recipient": 7
315
+ }
316
+ ]
317
+ },
318
+ "source": {
319
+ "cached": [
320
+ 50,
321
+ 101,
322
+ 999,
323
+ 103,
324
+ 999,
325
+ 105,
326
+ 999,
327
+ 107
328
+ ],
329
+ "counter": 1,
330
+ "packets": [
331
+ {
332
+ "accepted": 8,
333
+ "attempted": 8,
334
+ "buffer_index": 1,
335
+ "counter": 0,
336
+ "cstring_hex": "73636f7265732038203220312037203720313037203320312033203920323535202d38333838363037203137203420313420fffe20362037202d31203320302033203920323535202d383338383630372031372034203135206c6f6e67202573206e616d652035203720313035203320312033203920323535202d3833383836303720313720342031362041422034203720393939203320302033203920323535202d383338383630372031372034203137202d2d2d20332037202d31203320312033203920323535202d38333838363037203137203420313820fffe2032203720393939203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
337
+ "payload_length": 339,
338
+ "recipient": 0
339
+ },
340
+ {
341
+ "accepted": 8,
342
+ "attempted": 8,
343
+ "buffer_index": 0,
344
+ "counter": 1,
345
+ "cstring_hex": "73636f7265732038203220312037203720313037203320312033203920323535202d38333838363037203137203420313420fffe20362037202d31203320302033203920323535202d383338383630372031372034203135206c6f6e67202573206e616d652035203720313035203320312033203920323535202d3833383836303720313720342031362041422034203720393939203320302033203920323535202d383338383630372031372034203137202d2d2d20332037202d31203320312033203920323535202d38333838363037203137203420313820fffe2032203720393939203320302033203920323535202d383338383630372031372034203139206c6f6e67202573206e616d652031203720313031203320312033203920323535202d38333838363037203137203420323020414220302037202d31203320302033203920323535202d383338383630372031372034203231202d2d2d00",
346
+ "payload_length": 339,
347
+ "recipient": 7
348
+ }
349
+ ]
350
+ }
351
+ },
352
+ {
353
+ "rust": {
354
+ "cached": [
355
+ 100,
356
+ 101,
357
+ 102,
358
+ 103,
359
+ 104,
360
+ 105,
361
+ 106,
362
+ 107,
363
+ 999,
364
+ 109,
365
+ 999,
366
+ 111,
367
+ 999,
368
+ 113,
369
+ 999,
370
+ 115,
371
+ 999,
372
+ 117,
373
+ 999,
374
+ 119,
375
+ 999,
376
+ 121,
377
+ 999,
378
+ 123,
379
+ 999,
380
+ 125,
381
+ 999,
382
+ 127,
383
+ 999,
384
+ 129,
385
+ 999,
386
+ 131
387
+ ],
388
+ "counter": 2,
389
+ "packets": [
390
+ {
391
+ "accepted": 23,
392
+ "attempted": 24,
393
+ "buffer_index": 0,
394
+ "counter": 1,
395
+ "cstring_hex": "73636f72657320323320322031203331203720313331203320312033203920323535202d383338383630372031372034202d313020fffe2033302037202d31203320302033203920323535202d383338383630372031372034202d39206c6f6e67202573206e616d65203239203720313239203320312033203920323535202d383338383630372031372034202d38204142203238203720393939203320302033203920323535202d383338383630372031372034202d37202d2d2d2032372037202d31203320312033203920323535202d383338383630372031372034202d3620fffe203236203720393939203320302033203920323535202d383338383630372031372034202d35206c6f6e67202573206e616d65203235203720313235203320312033203920323535202d383338383630372031372034202d342041422032342037202d31203320302033203920323535202d383338383630372031372034202d33202d2d2d203233203720313233203320312033203920323535202d383338383630372031372034202d3220fffe203232203720393939203320302033203920323535202d383338383630372031372034202d31206c6f6e67202573206e616d652032312037202d31203320312033203920323535202d3833383836303720313720342030204142203230203720393939203320302033203920323535202d3833383836303720313720342031202d2d2d203139203720313139203320312033203920323535202d383338383630372031372034203220fffe2031382037202d31203320302033203920323535202d3833383836303720313720342033206c6f6e67202573206e616d65203137203720313137203320312033203920323535202d3833383836303720313720342034204142203136203720393939203320302033203920323535202d3833383836303720313720342035202d2d2d2031352037202d31203320312033203920323535202d383338383630372031372034203620fffe203134203720393939203320302033203920323535202d3833383836303720313720342037206c6f6e67202573206e616d65203133203720313133203320312033203920323535202d38333838363037203137203420382041422031322037202d31203320302033203920323535202d3833383836303720313720342039202d2d2d203131203720313131203320312033203920323535202d38333838363037203137203420313020fffe203130203720393939203320302033203920323535202d383338383630372031372034203131206c6f6e67202573206e616d6520392037202d31203320312033203920323535202d38333838363037203137203420313220414200",
396
+ "payload_length": 990,
397
+ "recipient": 0
398
+ },
399
+ {
400
+ "accepted": 23,
401
+ "attempted": 24,
402
+ "buffer_index": 1,
403
+ "counter": 2,
404
+ "cstring_hex": "73636f72657320323320322031203331203720313331203320312033203920323535202d383338383630372031372034202d313020fffe2033302037202d31203320302033203920323535202d383338383630372031372034202d39206c6f6e67202573206e616d65203239203720313239203320312033203920323535202d383338383630372031372034202d38204142203238203720393939203320302033203920323535202d383338383630372031372034202d37202d2d2d2032372037202d31203320312033203920323535202d383338383630372031372034202d3620fffe203236203720393939203320302033203920323535202d383338383630372031372034202d35206c6f6e67202573206e616d65203235203720313235203320312033203920323535202d383338383630372031372034202d342041422032342037202d31203320302033203920323535202d383338383630372031372034202d33202d2d2d203233203720313233203320312033203920323535202d383338383630372031372034202d3220fffe203232203720393939203320302033203920323535202d383338383630372031372034202d31206c6f6e67202573206e616d652032312037202d31203320312033203920323535202d3833383836303720313720342030204142203230203720393939203320302033203920323535202d3833383836303720313720342031202d2d2d203139203720313139203320312033203920323535202d383338383630372031372034203220fffe2031382037202d31203320302033203920323535202d3833383836303720313720342033206c6f6e67202573206e616d65203137203720313137203320312033203920323535202d3833383836303720313720342034204142203136203720393939203320302033203920323535202d3833383836303720313720342035202d2d2d2031352037202d31203320312033203920323535202d383338383630372031372034203620fffe203134203720393939203320302033203920323535202d3833383836303720313720342037206c6f6e67202573206e616d65203133203720313133203320312033203920323535202d38333838363037203137203420382041422031322037202d31203320302033203920323535202d3833383836303720313720342039202d2d2d203131203720313131203320312033203920323535202d38333838363037203137203420313020fffe203130203720393939203320302033203920323535202d383338383630372031372034203131206c6f6e67202573206e616d6520392037202d31203320312033203920323535202d38333838363037203137203420313220414200",
405
+ "payload_length": 990,
406
+ "recipient": 31
407
+ }
408
+ ]
409
+ },
410
+ "source": {
411
+ "cached": [
412
+ 100,
413
+ 101,
414
+ 102,
415
+ 103,
416
+ 104,
417
+ 105,
418
+ 106,
419
+ 107,
420
+ 999,
421
+ 109,
422
+ 999,
423
+ 111,
424
+ 999,
425
+ 113,
426
+ 999,
427
+ 115,
428
+ 999,
429
+ 117,
430
+ 999,
431
+ 119,
432
+ 999,
433
+ 121,
434
+ 999,
435
+ 123,
436
+ 999,
437
+ 125,
438
+ 999,
439
+ 127,
440
+ 999,
441
+ 129,
442
+ 999,
443
+ 131
444
+ ],
445
+ "counter": 2,
446
+ "packets": [
447
+ {
448
+ "accepted": 23,
449
+ "attempted": 24,
450
+ "buffer_index": 0,
451
+ "counter": 1,
452
+ "cstring_hex": "73636f72657320323320322031203331203720313331203320312033203920323535202d383338383630372031372034202d313020fffe2033302037202d31203320302033203920323535202d383338383630372031372034202d39206c6f6e67202573206e616d65203239203720313239203320312033203920323535202d383338383630372031372034202d38204142203238203720393939203320302033203920323535202d383338383630372031372034202d37202d2d2d2032372037202d31203320312033203920323535202d383338383630372031372034202d3620fffe203236203720393939203320302033203920323535202d383338383630372031372034202d35206c6f6e67202573206e616d65203235203720313235203320312033203920323535202d383338383630372031372034202d342041422032342037202d31203320302033203920323535202d383338383630372031372034202d33202d2d2d203233203720313233203320312033203920323535202d383338383630372031372034202d3220fffe203232203720393939203320302033203920323535202d383338383630372031372034202d31206c6f6e67202573206e616d652032312037202d31203320312033203920323535202d3833383836303720313720342030204142203230203720393939203320302033203920323535202d3833383836303720313720342031202d2d2d203139203720313139203320312033203920323535202d383338383630372031372034203220fffe2031382037202d31203320302033203920323535202d3833383836303720313720342033206c6f6e67202573206e616d65203137203720313137203320312033203920323535202d3833383836303720313720342034204142203136203720393939203320302033203920323535202d3833383836303720313720342035202d2d2d2031352037202d31203320312033203920323535202d383338383630372031372034203620fffe203134203720393939203320302033203920323535202d3833383836303720313720342037206c6f6e67202573206e616d65203133203720313133203320312033203920323535202d38333838363037203137203420382041422031322037202d31203320302033203920323535202d3833383836303720313720342039202d2d2d203131203720313131203320312033203920323535202d38333838363037203137203420313020fffe203130203720393939203320302033203920323535202d383338383630372031372034203131206c6f6e67202573206e616d6520392037202d31203320312033203920323535202d38333838363037203137203420313220414200",
453
+ "payload_length": 990,
454
+ "recipient": 0
455
+ },
456
+ {
457
+ "accepted": 23,
458
+ "attempted": 24,
459
+ "buffer_index": 1,
460
+ "counter": 2,
461
+ "cstring_hex": "73636f72657320323320322031203331203720313331203320312033203920323535202d383338383630372031372034202d313020fffe2033302037202d31203320302033203920323535202d383338383630372031372034202d39206c6f6e67202573206e616d65203239203720313239203320312033203920323535202d383338383630372031372034202d38204142203238203720393939203320302033203920323535202d383338383630372031372034202d37202d2d2d2032372037202d31203320312033203920323535202d383338383630372031372034202d3620fffe203236203720393939203320302033203920323535202d383338383630372031372034202d35206c6f6e67202573206e616d65203235203720313235203320312033203920323535202d383338383630372031372034202d342041422032342037202d31203320302033203920323535202d383338383630372031372034202d33202d2d2d203233203720313233203320312033203920323535202d383338383630372031372034202d3220fffe203232203720393939203320302033203920323535202d383338383630372031372034202d31206c6f6e67202573206e616d652032312037202d31203320312033203920323535202d3833383836303720313720342030204142203230203720393939203320302033203920323535202d3833383836303720313720342031202d2d2d203139203720313139203320312033203920323535202d383338383630372031372034203220fffe2031382037202d31203320302033203920323535202d3833383836303720313720342033206c6f6e67202573206e616d65203137203720313137203320312033203920323535202d3833383836303720313720342034204142203136203720393939203320302033203920323535202d3833383836303720313720342035202d2d2d2031352037202d31203320312033203920323535202d383338383630372031372034203620fffe203134203720393939203320302033203920323535202d3833383836303720313720342037206c6f6e67202573206e616d65203133203720313133203320312033203920323535202d38333838363037203137203420382041422031322037202d31203320302033203920323535202d3833383836303720313720342039202d2d2d203131203720313131203320312033203920323535202d38333838363037203137203420313020fffe203130203720393939203320302033203920323535202d383338383630372031372034203131206c6f6e67202573206e616d6520392037202d31203320312033203920323535202d38333838363037203137203420313220414200",
462
+ "payload_length": 990,
463
+ "recipient": 31
464
+ }
465
+ ]
466
+ }
467
+ },
468
+ {
469
+ "rust": {
470
+ "cached": [
471
+ 100,
472
+ 101,
473
+ 102,
474
+ 103,
475
+ 104,
476
+ 105,
477
+ 106,
478
+ 107,
479
+ 999,
480
+ 109,
481
+ 999,
482
+ 111,
483
+ 999,
484
+ 113,
485
+ 999,
486
+ 115,
487
+ 999,
488
+ 117,
489
+ 999,
490
+ 119,
491
+ 999,
492
+ 121,
493
+ 999,
494
+ 123,
495
+ 999,
496
+ 125,
497
+ 999,
498
+ 127,
499
+ 999,
500
+ 129,
501
+ 999,
502
+ 131
503
+ ],
504
+ "counter": 1,
505
+ "packets": [
506
+ {
507
+ "accepted": 23,
508
+ "attempted": 24,
509
+ "buffer_index": 1,
510
+ "counter": 0,
511
+ "cstring_hex": "73636f72657320323320322031203331203720313331203320312033203920323535202d383338383630372031372034202d313020fffe2033302037202d31203320302033203920323535202d383338383630372031372034202d39206c6f6e67202573206e616d65203239203720313239203320312033203920323535202d383338383630372031372034202d38204142203238203720393939203320302033203920323535202d383338383630372031372034202d37202d2d2d2032372037202d31203320312033203920323535202d383338383630372031372034202d3620fffe203236203720393939203320302033203920323535202d383338383630372031372034202d35206c6f6e67202573206e616d65203235203720313235203320312033203920323535202d383338383630372031372034202d342041422032342037202d31203320302033203920323535202d383338383630372031372034202d33202d2d2d203233203720313233203320312033203920323535202d383338383630372031372034202d3220fffe203232203720393939203320302033203920323535202d383338383630372031372034202d31206c6f6e67202573206e616d652032312037202d31203320312033203920323535202d3833383836303720313720342030204142203230203720393939203320302033203920323535202d3833383836303720313720342031202d2d2d203139203720313139203320312033203920323535202d383338383630372031372034203220fffe2031382037202d31203320302033203920323535202d3833383836303720313720342033206c6f6e67202573206e616d65203137203720313137203320312033203920323535202d3833383836303720313720342034204142203136203720393939203320302033203920323535202d3833383836303720313720342035202d2d2d2031352037202d31203320312033203920323535202d383338383630372031372034203620fffe203134203720393939203320302033203920323535202d3833383836303720313720342037206c6f6e67202573206e616d65203133203720313133203320312033203920323535202d38333838363037203137203420382041422031322037202d31203320302033203920323535202d3833383836303720313720342039202d2d2d203131203720313131203320312033203920323535202d38333838363037203137203420313020fffe203130203720393939203320302033203920323535202d383338383630372031372034203131206c6f6e67202573206e616d6520392037202d31203320312033203920323535202d38333838363037203137203420313220414200",
512
+ "payload_length": 990,
513
+ "recipient": 0
514
+ },
515
+ {
516
+ "accepted": 23,
517
+ "attempted": 24,
518
+ "buffer_index": 0,
519
+ "counter": 1,
520
+ "cstring_hex": "73636f72657320323320322031203331203720313331203320312033203920323535202d383338383630372031372034202d313020fffe2033302037202d31203320302033203920323535202d383338383630372031372034202d39206c6f6e67202573206e616d65203239203720313239203320312033203920323535202d383338383630372031372034202d38204142203238203720393939203320302033203920323535202d383338383630372031372034202d37202d2d2d2032372037202d31203320312033203920323535202d383338383630372031372034202d3620fffe203236203720393939203320302033203920323535202d383338383630372031372034202d35206c6f6e67202573206e616d65203235203720313235203320312033203920323535202d383338383630372031372034202d342041422032342037202d31203320302033203920323535202d383338383630372031372034202d33202d2d2d203233203720313233203320312033203920323535202d383338383630372031372034202d3220fffe203232203720393939203320302033203920323535202d383338383630372031372034202d31206c6f6e67202573206e616d652032312037202d31203320312033203920323535202d3833383836303720313720342030204142203230203720393939203320302033203920323535202d3833383836303720313720342031202d2d2d203139203720313139203320312033203920323535202d383338383630372031372034203220fffe2031382037202d31203320302033203920323535202d3833383836303720313720342033206c6f6e67202573206e616d65203137203720313137203320312033203920323535202d3833383836303720313720342034204142203136203720393939203320302033203920323535202d3833383836303720313720342035202d2d2d2031352037202d31203320312033203920323535202d383338383630372031372034203620fffe203134203720393939203320302033203920323535202d3833383836303720313720342037206c6f6e67202573206e616d65203133203720313133203320312033203920323535202d38333838363037203137203420382041422031322037202d31203320302033203920323535202d3833383836303720313720342039202d2d2d203131203720313131203320312033203920323535202d38333838363037203137203420313020fffe203130203720393939203320302033203920323535202d383338383630372031372034203131206c6f6e67202573206e616d6520392037202d31203320312033203920323535202d38333838363037203137203420313220414200",
521
+ "payload_length": 990,
522
+ "recipient": 31
523
+ }
524
+ ]
525
+ },
526
+ "source": {
527
+ "cached": [
528
+ 100,
529
+ 101,
530
+ 102,
531
+ 103,
532
+ 104,
533
+ 105,
534
+ 106,
535
+ 107,
536
+ 999,
537
+ 109,
538
+ 999,
539
+ 111,
540
+ 999,
541
+ 113,
542
+ 999,
543
+ 115,
544
+ 999,
545
+ 117,
546
+ 999,
547
+ 119,
548
+ 999,
549
+ 121,
550
+ 999,
551
+ 123,
552
+ 999,
553
+ 125,
554
+ 999,
555
+ 127,
556
+ 999,
557
+ 129,
558
+ 999,
559
+ 131
560
+ ],
561
+ "counter": 1,
562
+ "packets": [
563
+ {
564
+ "accepted": 23,
565
+ "attempted": 24,
566
+ "buffer_index": 1,
567
+ "counter": 0,
568
+ "cstring_hex": "73636f72657320323320322031203331203720313331203320312033203920323535202d383338383630372031372034202d313020fffe2033302037202d31203320302033203920323535202d383338383630372031372034202d39206c6f6e67202573206e616d65203239203720313239203320312033203920323535202d383338383630372031372034202d38204142203238203720393939203320302033203920323535202d383338383630372031372034202d37202d2d2d2032372037202d31203320312033203920323535202d383338383630372031372034202d3620fffe203236203720393939203320302033203920323535202d383338383630372031372034202d35206c6f6e67202573206e616d65203235203720313235203320312033203920323535202d383338383630372031372034202d342041422032342037202d31203320302033203920323535202d383338383630372031372034202d33202d2d2d203233203720313233203320312033203920323535202d383338383630372031372034202d3220fffe203232203720393939203320302033203920323535202d383338383630372031372034202d31206c6f6e67202573206e616d652032312037202d31203320312033203920323535202d3833383836303720313720342030204142203230203720393939203320302033203920323535202d3833383836303720313720342031202d2d2d203139203720313139203320312033203920323535202d383338383630372031372034203220fffe2031382037202d31203320302033203920323535202d3833383836303720313720342033206c6f6e67202573206e616d65203137203720313137203320312033203920323535202d3833383836303720313720342034204142203136203720393939203320302033203920323535202d3833383836303720313720342035202d2d2d2031352037202d31203320312033203920323535202d383338383630372031372034203620fffe203134203720393939203320302033203920323535202d3833383836303720313720342037206c6f6e67202573206e616d65203133203720313133203320312033203920323535202d38333838363037203137203420382041422031322037202d31203320302033203920323535202d3833383836303720313720342039202d2d2d203131203720313131203320312033203920323535202d38333838363037203137203420313020fffe203130203720393939203320302033203920323535202d383338383630372031372034203131206c6f6e67202573206e616d6520392037202d31203320312033203920323535202d38333838363037203137203420313220414200",
569
+ "payload_length": 990,
570
+ "recipient": 0
571
+ },
572
+ {
573
+ "accepted": 23,
574
+ "attempted": 24,
575
+ "buffer_index": 0,
576
+ "counter": 1,
577
+ "cstring_hex": "73636f72657320323320322031203331203720313331203320312033203920323535202d383338383630372031372034202d313020fffe2033302037202d31203320302033203920323535202d383338383630372031372034202d39206c6f6e67202573206e616d65203239203720313239203320312033203920323535202d383338383630372031372034202d38204142203238203720393939203320302033203920323535202d383338383630372031372034202d37202d2d2d2032372037202d31203320312033203920323535202d383338383630372031372034202d3620fffe203236203720393939203320302033203920323535202d383338383630372031372034202d35206c6f6e67202573206e616d65203235203720313235203320312033203920323535202d383338383630372031372034202d342041422032342037202d31203320302033203920323535202d383338383630372031372034202d33202d2d2d203233203720313233203320312033203920323535202d383338383630372031372034202d3220fffe203232203720393939203320302033203920323535202d383338383630372031372034202d31206c6f6e67202573206e616d652032312037202d31203320312033203920323535202d3833383836303720313720342030204142203230203720393939203320302033203920323535202d3833383836303720313720342031202d2d2d203139203720313139203320312033203920323535202d383338383630372031372034203220fffe2031382037202d31203320302033203920323535202d3833383836303720313720342033206c6f6e67202573206e616d65203137203720313137203320312033203920323535202d3833383836303720313720342034204142203136203720393939203320302033203920323535202d3833383836303720313720342035202d2d2d2031352037202d31203320312033203920323535202d383338383630372031372034203620fffe203134203720393939203320302033203920323535202d3833383836303720313720342037206c6f6e67202573206e616d65203133203720313133203320312033203920323535202d38333838363037203137203420382041422031322037202d31203320302033203920323535202d3833383836303720313720342039202d2d2d203131203720313131203320312033203920323535202d38333838363037203137203420313020fffe203130203720393939203320302033203920323535202d383338383630372031372034203131206c6f6e67202573206e616d6520392037202d31203320312033203920323535202d38333838363037203137203420313220414200",
578
+ "payload_length": 990,
579
+ "recipient": 31
580
+ }
581
+ ]
582
+ }
583
+ }
584
+ ],
585
+ "source_report": "docs/research/qvm-scoreboard-stream.json",
586
+ "source_report_sha256": "a39dbbd006e0ee080fe046921881da6d7eac9ec939511286bbcce049b0c75a00"
587
+ }
scripts/analyze_rust_scoreboard_stream.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ import hashlib,json
3
+ from pathlib import Path
4
+ from analyze_rust_scoreboard_packet import client_words
5
+ from rust_lifecycle_support import binary,result
6
+ from analyze_qvm import write_json
7
+
8
+ def main():
9
+ b=binary();p=Path('docs/research/qvm-scoreboard-stream.json');data=p.read_bytes();rows=[]
10
+ for s in json.loads(data)['probes']:
11
+ c=s['clients'];r=result(b,'scoreboard-stream',[s['now'],*s['scores'],s['ring_before'],len(c),len(s['order']),*s['order'],*client_words(c)]);packets=[]
12
+ for packet in s['packets']:
13
+ send=packet['sends'][0];packets.append({'recipient':send['recipient'],'accepted':packet['accepted'],'attempted':len(packet['rows']),'payload_length':packet['payload_length'],'cstring_hex':send['cstring_hex'],'buffer_index':int(send['pointer']!=35032232),'counter':packet['ring_counter']})
14
+ rows.append({'source':{'packets':packets,'counter':s['ring_after'],'cached':s['final_cache']},'rust':r})
15
+ write_json(Path('docs/research/rust-scoreboard-stream.json'),{'source_report':str(p),'source_report_sha256':hashlib.sha256(data).hexdigest(),'probes':rows,'limits':'Rust source6328/179363 modeled stream parity over10 shared-state fixtures, with cache/ring carry and byte-exact transmissions. No native37914/strncpy/send/exit-rule side effects or full game runtime execution.'})
16
+ if __name__=='__main__':main()
scripts/test_rust_scoreboard_stream.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import hashlib,json,unittest
2
+ from pathlib import Path
3
+ class RustScoreboardStreamTests(unittest.TestCase):
4
+ def test_exact_stateful_source_outputs(self):
5
+ r=json.loads(Path('docs/research/rust-scoreboard-stream.json').read_text());self.assertEqual(len(r['probes']),10)
6
+ for p in r['probes']:self.assertEqual(p['rust'],p['source'])
7
+ def test_identity_and_multiple_recipient_wrap_coverage(self):
8
+ r=json.loads(Path('docs/research/rust-scoreboard-stream.json').read_text());self.assertEqual(hashlib.sha256(Path(r['source_report']).read_bytes()).hexdigest(),r['source_report_sha256']);self.assertTrue(any(len(p['rust']['packets'])==2 and p['rust']['packets'][0]['counter']==0 for p in r['probes']))
9
+ if __name__=='__main__':unittest.main()
xtask/checks.tsv CHANGED
@@ -1948,3 +1948,18 @@ report scripts/analyze_qvm_scoreboard_stream.py docs/research/qvm-scoreboard-str
1948
  edge docs/research/qvm-scoreboard-stream.json scripts/test_qvm_scoreboard_stream.py
1949
  group scoreboard-stream scripts/analyze_qvm_scoreboard_stream.py
1950
  edge scripts/analyze_qvm_scoreboard_stream.py scripts/analyze_qvm_resumer_audit.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1948
  edge docs/research/qvm-scoreboard-stream.json scripts/test_qvm_scoreboard_stream.py
1949
  group scoreboard-stream scripts/analyze_qvm_scoreboard_stream.py
1950
  edge scripts/analyze_qvm_scoreboard_stream.py scripts/analyze_qvm_resumer_audit.py
1951
+ edge Cargo.toml scripts/analyze_rust_scoreboard_stream.py
1952
+ edge Cargo.lock scripts/analyze_rust_scoreboard_stream.py
1953
+ edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_scoreboard_stream.py
1954
+ edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_scoreboard_stream.py
1955
+ edge crates/urt-gameplay/src/bin/urt-lifecycle.rs scripts/analyze_rust_scoreboard_stream.py
1956
+ edge crates/urt-gameplay/src/scoreboard_wire.rs scripts/analyze_rust_scoreboard_stream.py
1957
+ edge crates/urt-gameplay/src/recipient_wire.rs scripts/analyze_rust_scoreboard_stream.py
1958
+ edge crates/urt-gameplay/src/recipient_payload.rs scripts/analyze_rust_scoreboard_stream.py
1959
+ group gameplay scripts/analyze_rust_scoreboard_stream.py
1960
+ group rust-scoreboard-stream scripts/analyze_rust_health_impulse.py
1961
+ group rust-scoreboard-stream scripts/analyze_rust_scoreboard_packet.py
1962
+ report scripts/analyze_rust_scoreboard_stream.py docs/research/rust-scoreboard-stream.json
1963
+ edge docs/research/rust-scoreboard-stream.json scripts/test_rust_scoreboard_stream.py
1964
+ group rust-scoreboard-stream scripts/analyze_rust_scoreboard_stream.py
1965
+ edge scripts/analyze_rust_scoreboard_stream.py scripts/analyze_qvm_resumer_audit.py