nmarshall commited on
Commit
243d687
·
1 Parent(s): aee92ff

gameplay: port ranked tie predicate

Browse files
crates/urt-gameplay/src/bin/urt-intermission.rs ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use urt_gameplay::intermission::*;
2
+ fn run() -> Result<String, String> {
3
+ let args = std::env::args().skip(1).collect::<Vec<_>>();
4
+ let kind = args.first().ok_or("missing command")?;
5
+ let w = args[1..]
6
+ .iter()
7
+ .map(|s| s.parse::<u32>().map_err(|_| "invalid word".to_string()))
8
+ .collect::<Result<Vec<_>, _>>()?;
9
+ if w.len() < 15 {
10
+ return Err("missing header".into());
11
+ }
12
+ let n = w[13] as usize;
13
+ let nr = w[14] as usize;
14
+ if n > 64 || nr > 64 || w.len() != 15 + 11 * n + nr {
15
+ return Err("invalid record count".into());
16
+ }
17
+ let mut state = State {
18
+ blocked: w[0] as i32,
19
+ now: w[1] as i32,
20
+ slow: w[2] as i32,
21
+ waiting: w[3] as i32,
22
+ wait_start: w[4] as i32,
23
+ pending: w[5] as i32,
24
+ mode: w[6] as i32,
25
+ playing: w[7] as i32,
26
+ enabled: w[8] as i32,
27
+ scores: [w[9] as i32, w[10] as i32],
28
+ max_clients: w[11] as usize,
29
+ client_count: w[12] as usize,
30
+ };
31
+ let mut clients = w[15..15 + 11 * n]
32
+ .chunks_exact(11)
33
+ .map(|v| Client {
34
+ connection: v[0] as i32,
35
+ id: v[1] as i32,
36
+ fallback_id: v[2] as i32,
37
+ score: v[3] as i32,
38
+ ping: v[4] as i32,
39
+ team: v[5] as i32,
40
+ class: v[6] as i32,
41
+ field308: v[7] as i32,
42
+ ready: v[8] as i32,
43
+ entity_flags: v[9],
44
+ field4324: v[10] as i32,
45
+ })
46
+ .collect::<Vec<_>>();
47
+ let rank = w[15 + 11 * n..]
48
+ .iter()
49
+ .map(|v| *v as usize)
50
+ .collect::<Vec<_>>();
51
+ match kind.as_str() {
52
+ "tie" => Ok(format!(
53
+ "{{\"tied\":{}}}",
54
+ tied(&state, &clients, &rank).map_err(|e| format!("{e:?}"))?
55
+ )),
56
+ _ => Err("unknown command".into()),
57
+ }
58
+ }
59
+ fn main() {
60
+ match run() {
61
+ Ok(s) => println!("{s}"),
62
+ Err(e) => {
63
+ eprintln!("{e}");
64
+ std::process::exit(2);
65
+ }
66
+ }
67
+ }
crates/urt-gameplay/src/intermission.rs ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //! Recovered bounded intermission policies. Native effects remain explicit intentions.
2
+ #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
3
+ pub struct Client {
4
+ pub connection: i32,
5
+ pub id: i32,
6
+ pub fallback_id: i32,
7
+ pub score: i32,
8
+ pub ping: i32,
9
+ pub team: i32,
10
+ pub class: i32,
11
+ pub field308: i32,
12
+ pub ready: i32,
13
+ pub entity_flags: u32,
14
+ pub field4324: i32,
15
+ }
16
+ #[derive(Clone, Debug, Default, PartialEq, Eq)]
17
+ pub struct State {
18
+ pub blocked: i32,
19
+ pub now: i32,
20
+ pub slow: i32,
21
+ pub waiting: i32,
22
+ pub wait_start: i32,
23
+ pub pending: i32,
24
+ pub mode: i32,
25
+ pub playing: i32,
26
+ pub enabled: i32,
27
+ pub scores: [i32; 2],
28
+ pub max_clients: usize,
29
+ pub client_count: usize,
30
+ }
31
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
32
+ pub enum Error {
33
+ InvalidCount,
34
+ InvalidRank,
35
+ }
36
+ fn count(clients: &[Client], n: usize) -> Result<(), Error> {
37
+ if clients.len() > 64 || n > clients.len() {
38
+ Err(Error::InvalidCount)
39
+ } else {
40
+ Ok(())
41
+ }
42
+ }
43
+ pub fn team_mode(mode: i32) -> bool {
44
+ mode >= 3 && mode != 9 && mode != 11
45
+ }
46
+ pub fn tied(state: &State, clients: &[Client], rank: &[usize]) -> Result<bool, Error> {
47
+ if state.playing < 2 || state.enabled == 0 {
48
+ return Ok(false);
49
+ }
50
+ if team_mode(state.mode) {
51
+ return Ok(state.scores[0] == state.scores[1]);
52
+ }
53
+ if clients.len() > 64 || rank.len() < 2 {
54
+ return Err(Error::InvalidRank);
55
+ }
56
+ let field = |id: usize| -> Result<i32, Error> {
57
+ let c = clients.get(id).ok_or(Error::InvalidRank)?;
58
+ Ok(match state.mode {
59
+ 9 => c.field308,
60
+ 11 => c.class,
61
+ _ => c.score,
62
+ })
63
+ };
64
+ Ok(field(rank[0])? == field(rank[1])?)
65
+ }
66
+ #[cfg(test)]
67
+ mod tests {
68
+ use super::*;
69
+ #[test]
70
+ fn tie_fields_and_gates() {
71
+ let mut s = State {
72
+ playing: 2,
73
+ enabled: 1,
74
+ ..State::default()
75
+ };
76
+ let c = [
77
+ Client {
78
+ score: 4,
79
+ field308: 2,
80
+ class: 3,
81
+ ..Client::default()
82
+ },
83
+ Client {
84
+ score: 4,
85
+ field308: 1,
86
+ class: 3,
87
+ ..Client::default()
88
+ },
89
+ ];
90
+ assert_eq!(tied(&s, &c, &[0, 1]), Ok(true));
91
+ s.mode = 9;
92
+ assert_eq!(tied(&s, &c, &[0, 1]), Ok(false));
93
+ s.mode = 11;
94
+ assert_eq!(tied(&s, &c, &[0, 1]), Ok(true));
95
+ s.playing = 1;
96
+ assert_eq!(tied(&s, &[], &[]), Ok(false));
97
+ }
98
+ #[test]
99
+ fn invalid_ranks_and_signed_classifier() {
100
+ let s = State {
101
+ playing: 2,
102
+ enabled: 1,
103
+ ..State::default()
104
+ };
105
+ assert_eq!(tied(&s, &[], &[]), Err(Error::InvalidRank));
106
+ for m in [-1, 0, 1, 2, 9, 11] {
107
+ assert!(!team_mode(m));
108
+ }
109
+ for m in [3, 8, 10, 12, i32::MAX] {
110
+ assert!(team_mode(m));
111
+ }
112
+ }
113
+ }
crates/urt-gameplay/src/lib.rs CHANGED
@@ -171,3 +171,5 @@ pub mod qvm_format;
171
  pub mod exit_prefix;
172
 
173
  pub mod exit_rules;
 
 
 
171
  pub mod exit_prefix;
172
 
173
  pub mod exit_rules;
174
+
175
+ pub mod intermission;
docs/FINDINGS.md CHANGED
@@ -1502,3 +1502,6 @@ RE-813–822 replaces the scoreboard decimal assumption with actual37914 executi
1502
 
1503
 
1504
  **RE-834:** Actual 7662 and child 33715 execute across 168 cases. Playing count and the enabled global gate ties; team-classified modes compare global scores, mode9 uses ranked field308, mode11 field696, and other modes field248. Raw numeric names remain conservative; ranked pointer legality and native execution remain open. [Evidence](research/QVM_EXIT_PREDICATE.md).
 
 
 
 
1502
 
1503
 
1504
  **RE-834:** Actual 7662 and child 33715 execute across 168 cases. Playing count and the enabled global gate ties; team-classified modes compare global scores, mode9 uses ranked field308, mode11 field696, and other modes field248. Raw numeric names remain conservative; ranked pointer legality and native execution remain open. [Evidence](research/QVM_EXIT_PREDICATE.md).
1505
+
1506
+
1507
+ **RE-835:** Rust matches all 168 source cases with typed signed mode classification, global-score and ranked-field selection, early gate handling and safe rank rejection. A separate scoped intermission adapter avoids rebuilding unrelated lifecycle fixtures; original runtime remains open. [Evidence](research/RUST_EXIT_PREDICATE.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -1518,3 +1518,6 @@ RE-833: Rust now composes the full recovered7805 priority and matches438 continu
1518
 
1519
 
1520
  RE-834: Actual 7662 and child 33715 execute across 168 cases. Playing count and the enabled global gate ties; team-classified modes compare global scores, mode9 uses ranked field308, mode11 field696, and other modes field248. Raw numeric names remain conservative; ranked pointer legality and native execution remain open. Full runtime completion remains open. [Evidence](research/QVM_EXIT_PREDICATE.md).
 
 
 
 
1518
 
1519
 
1520
  RE-834: Actual 7662 and child 33715 execute across 168 cases. Playing count and the enabled global gate ties; team-classified modes compare global scores, mode9 uses ranked field308, mode11 field696, and other modes field248. Raw numeric names remain conservative; ranked pointer legality and native execution remain open. Full runtime completion remains open. [Evidence](research/QVM_EXIT_PREDICATE.md).
1521
+
1522
+
1523
+ RE-835: Rust matches all 168 source cases with typed signed mode classification, global-score and ranked-field selection, early gate handling and safe rank rejection. A separate scoped intermission adapter avoids rebuilding unrelated lifecycle fixtures; original runtime remains open. Full runtime completion remains open. [Evidence](research/RUST_EXIT_PREDICATE.md).
docs/RESEARCH_LEDGER.md CHANGED
@@ -1844,3 +1844,8 @@ Batch RE-824–833 boundary: the single `cargo xtask test-full --since 1ed43d40`
1844
  ## 2026-10-27 — RE-834 Original exit tie predicate and mode classifier
1845
 
1846
  Actual 7662 and child 33715 execute across 168 cases. Playing count and the enabled global gate ties; team-classified modes compare global scores, mode9 uses ranked field308, mode11 field696, and other modes field248. Raw numeric names remain conservative; ranked pointer legality and native execution remain open. Focused `cargo xtask test-group exit-predicate` 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.
 
 
 
 
 
 
1844
  ## 2026-10-27 — RE-834 Original exit tie predicate and mode classifier
1845
 
1846
  Actual 7662 and child 33715 execute across 168 cases. Playing count and the enabled global gate ties; team-classified modes compare global scores, mode9 uses ranked field308, mode11 field696, and other modes field248. Raw numeric names remain conservative; ranked pointer legality and native execution remain open. Focused `cargo xtask test-group exit-predicate` 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.
1847
+
1848
+
1849
+ ## 2026-10-27 — RE-835 Rust ranked exit tie predicate
1850
+
1851
+ Rust matches all 168 source cases with typed signed mode classification, global-score and ranked-field selection, early gate handling and safe rank rejection. A separate scoped intermission adapter avoids rebuilding unrelated lifecycle fixtures; original runtime remains open. Focused `cargo xtask test-group rust-exit-predicate` passes (9 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
@@ -1555,3 +1555,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
1555
 
1556
 
1557
  - [x] RE-834 Original exit tie predicate and mode classifier ([evidence](research/QVM_EXIT_PREDICATE.md)).
 
 
 
 
1555
 
1556
 
1557
  - [x] RE-834 Original exit tie predicate and mode classifier ([evidence](research/QVM_EXIT_PREDICATE.md)).
1558
+
1559
+
1560
+ - [x] RE-835 Rust ranked exit tie predicate ([evidence](research/RUST_EXIT_PREDICATE.md)).
docs/research/README.md CHANGED
@@ -1094,3 +1094,6 @@ The extension collector adds five focused tests for native tail calls, command-r
1094
 
1095
 
1096
  [RE-834: Original exit tie predicate and mode classifier](QVM_EXIT_PREDICATE.md).
 
 
 
 
1094
 
1095
 
1096
  [RE-834: Original exit tie predicate and mode classifier](QVM_EXIT_PREDICATE.md).
1097
+
1098
+
1099
+ [RE-835: Rust ranked exit tie predicate](RUST_EXIT_PREDICATE.md).
docs/research/RUST_EXIT_PREDICATE.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Rust ranked exit tie predicate
2
+
3
+ RE-835. Reproduce with `python3 scripts/analyze_rust_exit_predicate.py`; focused validation: `cargo xtask test-group rust-exit-predicate`. [Machine report](rust-exit-predicate.json).
4
+
5
+ Rust matches all 168 source cases with typed signed mode classification, global-score and ranked-field selection, early gate handling and safe rank rejection. A separate scoped intermission adapter avoids rebuilding unrelated lifecycle fixtures; original runtime remains open.
6
+
7
+ Original executable/native runtime and complete Linux/macOS Rust/Bevy/Solari acceptance remain unverified.
docs/research/rust-exit-predicate.json ADDED
@@ -0,0 +1,1351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Typed tie policy over168 original source cases. Bounded ranks; native runtime remains open.",
3
+ "probes": [
4
+ {
5
+ "rust": {
6
+ "tied": false
7
+ },
8
+ "source": {
9
+ "tied": false
10
+ }
11
+ },
12
+ {
13
+ "rust": {
14
+ "tied": false
15
+ },
16
+ "source": {
17
+ "tied": false
18
+ }
19
+ },
20
+ {
21
+ "rust": {
22
+ "tied": false
23
+ },
24
+ "source": {
25
+ "tied": false
26
+ }
27
+ },
28
+ {
29
+ "rust": {
30
+ "tied": false
31
+ },
32
+ "source": {
33
+ "tied": false
34
+ }
35
+ },
36
+ {
37
+ "rust": {
38
+ "tied": false
39
+ },
40
+ "source": {
41
+ "tied": false
42
+ }
43
+ },
44
+ {
45
+ "rust": {
46
+ "tied": false
47
+ },
48
+ "source": {
49
+ "tied": false
50
+ }
51
+ },
52
+ {
53
+ "rust": {
54
+ "tied": false
55
+ },
56
+ "source": {
57
+ "tied": false
58
+ }
59
+ },
60
+ {
61
+ "rust": {
62
+ "tied": false
63
+ },
64
+ "source": {
65
+ "tied": false
66
+ }
67
+ },
68
+ {
69
+ "rust": {
70
+ "tied": false
71
+ },
72
+ "source": {
73
+ "tied": false
74
+ }
75
+ },
76
+ {
77
+ "rust": {
78
+ "tied": false
79
+ },
80
+ "source": {
81
+ "tied": false
82
+ }
83
+ },
84
+ {
85
+ "rust": {
86
+ "tied": false
87
+ },
88
+ "source": {
89
+ "tied": false
90
+ }
91
+ },
92
+ {
93
+ "rust": {
94
+ "tied": false
95
+ },
96
+ "source": {
97
+ "tied": false
98
+ }
99
+ },
100
+ {
101
+ "rust": {
102
+ "tied": false
103
+ },
104
+ "source": {
105
+ "tied": false
106
+ }
107
+ },
108
+ {
109
+ "rust": {
110
+ "tied": false
111
+ },
112
+ "source": {
113
+ "tied": false
114
+ }
115
+ },
116
+ {
117
+ "rust": {
118
+ "tied": false
119
+ },
120
+ "source": {
121
+ "tied": false
122
+ }
123
+ },
124
+ {
125
+ "rust": {
126
+ "tied": false
127
+ },
128
+ "source": {
129
+ "tied": false
130
+ }
131
+ },
132
+ {
133
+ "rust": {
134
+ "tied": false
135
+ },
136
+ "source": {
137
+ "tied": false
138
+ }
139
+ },
140
+ {
141
+ "rust": {
142
+ "tied": false
143
+ },
144
+ "source": {
145
+ "tied": false
146
+ }
147
+ },
148
+ {
149
+ "rust": {
150
+ "tied": false
151
+ },
152
+ "source": {
153
+ "tied": false
154
+ }
155
+ },
156
+ {
157
+ "rust": {
158
+ "tied": false
159
+ },
160
+ "source": {
161
+ "tied": false
162
+ }
163
+ },
164
+ {
165
+ "rust": {
166
+ "tied": false
167
+ },
168
+ "source": {
169
+ "tied": false
170
+ }
171
+ },
172
+ {
173
+ "rust": {
174
+ "tied": false
175
+ },
176
+ "source": {
177
+ "tied": false
178
+ }
179
+ },
180
+ {
181
+ "rust": {
182
+ "tied": false
183
+ },
184
+ "source": {
185
+ "tied": false
186
+ }
187
+ },
188
+ {
189
+ "rust": {
190
+ "tied": false
191
+ },
192
+ "source": {
193
+ "tied": false
194
+ }
195
+ },
196
+ {
197
+ "rust": {
198
+ "tied": false
199
+ },
200
+ "source": {
201
+ "tied": false
202
+ }
203
+ },
204
+ {
205
+ "rust": {
206
+ "tied": false
207
+ },
208
+ "source": {
209
+ "tied": false
210
+ }
211
+ },
212
+ {
213
+ "rust": {
214
+ "tied": false
215
+ },
216
+ "source": {
217
+ "tied": false
218
+ }
219
+ },
220
+ {
221
+ "rust": {
222
+ "tied": false
223
+ },
224
+ "source": {
225
+ "tied": false
226
+ }
227
+ },
228
+ {
229
+ "rust": {
230
+ "tied": false
231
+ },
232
+ "source": {
233
+ "tied": false
234
+ }
235
+ },
236
+ {
237
+ "rust": {
238
+ "tied": false
239
+ },
240
+ "source": {
241
+ "tied": false
242
+ }
243
+ },
244
+ {
245
+ "rust": {
246
+ "tied": false
247
+ },
248
+ "source": {
249
+ "tied": false
250
+ }
251
+ },
252
+ {
253
+ "rust": {
254
+ "tied": false
255
+ },
256
+ "source": {
257
+ "tied": false
258
+ }
259
+ },
260
+ {
261
+ "rust": {
262
+ "tied": false
263
+ },
264
+ "source": {
265
+ "tied": false
266
+ }
267
+ },
268
+ {
269
+ "rust": {
270
+ "tied": false
271
+ },
272
+ "source": {
273
+ "tied": false
274
+ }
275
+ },
276
+ {
277
+ "rust": {
278
+ "tied": false
279
+ },
280
+ "source": {
281
+ "tied": false
282
+ }
283
+ },
284
+ {
285
+ "rust": {
286
+ "tied": false
287
+ },
288
+ "source": {
289
+ "tied": false
290
+ }
291
+ },
292
+ {
293
+ "rust": {
294
+ "tied": false
295
+ },
296
+ "source": {
297
+ "tied": false
298
+ }
299
+ },
300
+ {
301
+ "rust": {
302
+ "tied": false
303
+ },
304
+ "source": {
305
+ "tied": false
306
+ }
307
+ },
308
+ {
309
+ "rust": {
310
+ "tied": false
311
+ },
312
+ "source": {
313
+ "tied": false
314
+ }
315
+ },
316
+ {
317
+ "rust": {
318
+ "tied": false
319
+ },
320
+ "source": {
321
+ "tied": false
322
+ }
323
+ },
324
+ {
325
+ "rust": {
326
+ "tied": false
327
+ },
328
+ "source": {
329
+ "tied": false
330
+ }
331
+ },
332
+ {
333
+ "rust": {
334
+ "tied": false
335
+ },
336
+ "source": {
337
+ "tied": false
338
+ }
339
+ },
340
+ {
341
+ "rust": {
342
+ "tied": false
343
+ },
344
+ "source": {
345
+ "tied": false
346
+ }
347
+ },
348
+ {
349
+ "rust": {
350
+ "tied": false
351
+ },
352
+ "source": {
353
+ "tied": false
354
+ }
355
+ },
356
+ {
357
+ "rust": {
358
+ "tied": false
359
+ },
360
+ "source": {
361
+ "tied": false
362
+ }
363
+ },
364
+ {
365
+ "rust": {
366
+ "tied": false
367
+ },
368
+ "source": {
369
+ "tied": false
370
+ }
371
+ },
372
+ {
373
+ "rust": {
374
+ "tied": false
375
+ },
376
+ "source": {
377
+ "tied": false
378
+ }
379
+ },
380
+ {
381
+ "rust": {
382
+ "tied": false
383
+ },
384
+ "source": {
385
+ "tied": false
386
+ }
387
+ },
388
+ {
389
+ "rust": {
390
+ "tied": false
391
+ },
392
+ "source": {
393
+ "tied": false
394
+ }
395
+ },
396
+ {
397
+ "rust": {
398
+ "tied": false
399
+ },
400
+ "source": {
401
+ "tied": false
402
+ }
403
+ },
404
+ {
405
+ "rust": {
406
+ "tied": false
407
+ },
408
+ "source": {
409
+ "tied": false
410
+ }
411
+ },
412
+ {
413
+ "rust": {
414
+ "tied": false
415
+ },
416
+ "source": {
417
+ "tied": false
418
+ }
419
+ },
420
+ {
421
+ "rust": {
422
+ "tied": false
423
+ },
424
+ "source": {
425
+ "tied": false
426
+ }
427
+ },
428
+ {
429
+ "rust": {
430
+ "tied": false
431
+ },
432
+ "source": {
433
+ "tied": false
434
+ }
435
+ },
436
+ {
437
+ "rust": {
438
+ "tied": false
439
+ },
440
+ "source": {
441
+ "tied": false
442
+ }
443
+ },
444
+ {
445
+ "rust": {
446
+ "tied": false
447
+ },
448
+ "source": {
449
+ "tied": false
450
+ }
451
+ },
452
+ {
453
+ "rust": {
454
+ "tied": false
455
+ },
456
+ "source": {
457
+ "tied": false
458
+ }
459
+ },
460
+ {
461
+ "rust": {
462
+ "tied": false
463
+ },
464
+ "source": {
465
+ "tied": false
466
+ }
467
+ },
468
+ {
469
+ "rust": {
470
+ "tied": false
471
+ },
472
+ "source": {
473
+ "tied": false
474
+ }
475
+ },
476
+ {
477
+ "rust": {
478
+ "tied": false
479
+ },
480
+ "source": {
481
+ "tied": false
482
+ }
483
+ },
484
+ {
485
+ "rust": {
486
+ "tied": false
487
+ },
488
+ "source": {
489
+ "tied": false
490
+ }
491
+ },
492
+ {
493
+ "rust": {
494
+ "tied": false
495
+ },
496
+ "source": {
497
+ "tied": false
498
+ }
499
+ },
500
+ {
501
+ "rust": {
502
+ "tied": false
503
+ },
504
+ "source": {
505
+ "tied": false
506
+ }
507
+ },
508
+ {
509
+ "rust": {
510
+ "tied": false
511
+ },
512
+ "source": {
513
+ "tied": false
514
+ }
515
+ },
516
+ {
517
+ "rust": {
518
+ "tied": false
519
+ },
520
+ "source": {
521
+ "tied": false
522
+ }
523
+ },
524
+ {
525
+ "rust": {
526
+ "tied": false
527
+ },
528
+ "source": {
529
+ "tied": false
530
+ }
531
+ },
532
+ {
533
+ "rust": {
534
+ "tied": false
535
+ },
536
+ "source": {
537
+ "tied": false
538
+ }
539
+ },
540
+ {
541
+ "rust": {
542
+ "tied": false
543
+ },
544
+ "source": {
545
+ "tied": false
546
+ }
547
+ },
548
+ {
549
+ "rust": {
550
+ "tied": false
551
+ },
552
+ "source": {
553
+ "tied": false
554
+ }
555
+ },
556
+ {
557
+ "rust": {
558
+ "tied": false
559
+ },
560
+ "source": {
561
+ "tied": false
562
+ }
563
+ },
564
+ {
565
+ "rust": {
566
+ "tied": false
567
+ },
568
+ "source": {
569
+ "tied": false
570
+ }
571
+ },
572
+ {
573
+ "rust": {
574
+ "tied": false
575
+ },
576
+ "source": {
577
+ "tied": false
578
+ }
579
+ },
580
+ {
581
+ "rust": {
582
+ "tied": false
583
+ },
584
+ "source": {
585
+ "tied": false
586
+ }
587
+ },
588
+ {
589
+ "rust": {
590
+ "tied": false
591
+ },
592
+ "source": {
593
+ "tied": false
594
+ }
595
+ },
596
+ {
597
+ "rust": {
598
+ "tied": false
599
+ },
600
+ "source": {
601
+ "tied": false
602
+ }
603
+ },
604
+ {
605
+ "rust": {
606
+ "tied": false
607
+ },
608
+ "source": {
609
+ "tied": false
610
+ }
611
+ },
612
+ {
613
+ "rust": {
614
+ "tied": false
615
+ },
616
+ "source": {
617
+ "tied": false
618
+ }
619
+ },
620
+ {
621
+ "rust": {
622
+ "tied": false
623
+ },
624
+ "source": {
625
+ "tied": false
626
+ }
627
+ },
628
+ {
629
+ "rust": {
630
+ "tied": false
631
+ },
632
+ "source": {
633
+ "tied": false
634
+ }
635
+ },
636
+ {
637
+ "rust": {
638
+ "tied": false
639
+ },
640
+ "source": {
641
+ "tied": false
642
+ }
643
+ },
644
+ {
645
+ "rust": {
646
+ "tied": false
647
+ },
648
+ "source": {
649
+ "tied": false
650
+ }
651
+ },
652
+ {
653
+ "rust": {
654
+ "tied": false
655
+ },
656
+ "source": {
657
+ "tied": false
658
+ }
659
+ },
660
+ {
661
+ "rust": {
662
+ "tied": false
663
+ },
664
+ "source": {
665
+ "tied": false
666
+ }
667
+ },
668
+ {
669
+ "rust": {
670
+ "tied": false
671
+ },
672
+ "source": {
673
+ "tied": false
674
+ }
675
+ },
676
+ {
677
+ "rust": {
678
+ "tied": false
679
+ },
680
+ "source": {
681
+ "tied": false
682
+ }
683
+ },
684
+ {
685
+ "rust": {
686
+ "tied": false
687
+ },
688
+ "source": {
689
+ "tied": false
690
+ }
691
+ },
692
+ {
693
+ "rust": {
694
+ "tied": false
695
+ },
696
+ "source": {
697
+ "tied": false
698
+ }
699
+ },
700
+ {
701
+ "rust": {
702
+ "tied": false
703
+ },
704
+ "source": {
705
+ "tied": false
706
+ }
707
+ },
708
+ {
709
+ "rust": {
710
+ "tied": false
711
+ },
712
+ "source": {
713
+ "tied": false
714
+ }
715
+ },
716
+ {
717
+ "rust": {
718
+ "tied": false
719
+ },
720
+ "source": {
721
+ "tied": false
722
+ }
723
+ },
724
+ {
725
+ "rust": {
726
+ "tied": false
727
+ },
728
+ "source": {
729
+ "tied": false
730
+ }
731
+ },
732
+ {
733
+ "rust": {
734
+ "tied": false
735
+ },
736
+ "source": {
737
+ "tied": false
738
+ }
739
+ },
740
+ {
741
+ "rust": {
742
+ "tied": false
743
+ },
744
+ "source": {
745
+ "tied": false
746
+ }
747
+ },
748
+ {
749
+ "rust": {
750
+ "tied": false
751
+ },
752
+ "source": {
753
+ "tied": false
754
+ }
755
+ },
756
+ {
757
+ "rust": {
758
+ "tied": false
759
+ },
760
+ "source": {
761
+ "tied": false
762
+ }
763
+ },
764
+ {
765
+ "rust": {
766
+ "tied": false
767
+ },
768
+ "source": {
769
+ "tied": false
770
+ }
771
+ },
772
+ {
773
+ "rust": {
774
+ "tied": false
775
+ },
776
+ "source": {
777
+ "tied": false
778
+ }
779
+ },
780
+ {
781
+ "rust": {
782
+ "tied": false
783
+ },
784
+ "source": {
785
+ "tied": false
786
+ }
787
+ },
788
+ {
789
+ "rust": {
790
+ "tied": false
791
+ },
792
+ "source": {
793
+ "tied": false
794
+ }
795
+ },
796
+ {
797
+ "rust": {
798
+ "tied": false
799
+ },
800
+ "source": {
801
+ "tied": false
802
+ }
803
+ },
804
+ {
805
+ "rust": {
806
+ "tied": false
807
+ },
808
+ "source": {
809
+ "tied": false
810
+ }
811
+ },
812
+ {
813
+ "rust": {
814
+ "tied": false
815
+ },
816
+ "source": {
817
+ "tied": false
818
+ }
819
+ },
820
+ {
821
+ "rust": {
822
+ "tied": false
823
+ },
824
+ "source": {
825
+ "tied": false
826
+ }
827
+ },
828
+ {
829
+ "rust": {
830
+ "tied": false
831
+ },
832
+ "source": {
833
+ "tied": false
834
+ }
835
+ },
836
+ {
837
+ "rust": {
838
+ "tied": false
839
+ },
840
+ "source": {
841
+ "tied": false
842
+ }
843
+ },
844
+ {
845
+ "rust": {
846
+ "tied": false
847
+ },
848
+ "source": {
849
+ "tied": false
850
+ }
851
+ },
852
+ {
853
+ "rust": {
854
+ "tied": false
855
+ },
856
+ "source": {
857
+ "tied": false
858
+ }
859
+ },
860
+ {
861
+ "rust": {
862
+ "tied": false
863
+ },
864
+ "source": {
865
+ "tied": false
866
+ }
867
+ },
868
+ {
869
+ "rust": {
870
+ "tied": false
871
+ },
872
+ "source": {
873
+ "tied": false
874
+ }
875
+ },
876
+ {
877
+ "rust": {
878
+ "tied": false
879
+ },
880
+ "source": {
881
+ "tied": false
882
+ }
883
+ },
884
+ {
885
+ "rust": {
886
+ "tied": false
887
+ },
888
+ "source": {
889
+ "tied": false
890
+ }
891
+ },
892
+ {
893
+ "rust": {
894
+ "tied": false
895
+ },
896
+ "source": {
897
+ "tied": false
898
+ }
899
+ },
900
+ {
901
+ "rust": {
902
+ "tied": false
903
+ },
904
+ "source": {
905
+ "tied": false
906
+ }
907
+ },
908
+ {
909
+ "rust": {
910
+ "tied": false
911
+ },
912
+ "source": {
913
+ "tied": false
914
+ }
915
+ },
916
+ {
917
+ "rust": {
918
+ "tied": false
919
+ },
920
+ "source": {
921
+ "tied": false
922
+ }
923
+ },
924
+ {
925
+ "rust": {
926
+ "tied": false
927
+ },
928
+ "source": {
929
+ "tied": false
930
+ }
931
+ },
932
+ {
933
+ "rust": {
934
+ "tied": false
935
+ },
936
+ "source": {
937
+ "tied": false
938
+ }
939
+ },
940
+ {
941
+ "rust": {
942
+ "tied": false
943
+ },
944
+ "source": {
945
+ "tied": false
946
+ }
947
+ },
948
+ {
949
+ "rust": {
950
+ "tied": false
951
+ },
952
+ "source": {
953
+ "tied": false
954
+ }
955
+ },
956
+ {
957
+ "rust": {
958
+ "tied": false
959
+ },
960
+ "source": {
961
+ "tied": false
962
+ }
963
+ },
964
+ {
965
+ "rust": {
966
+ "tied": false
967
+ },
968
+ "source": {
969
+ "tied": false
970
+ }
971
+ },
972
+ {
973
+ "rust": {
974
+ "tied": false
975
+ },
976
+ "source": {
977
+ "tied": false
978
+ }
979
+ },
980
+ {
981
+ "rust": {
982
+ "tied": false
983
+ },
984
+ "source": {
985
+ "tied": false
986
+ }
987
+ },
988
+ {
989
+ "rust": {
990
+ "tied": false
991
+ },
992
+ "source": {
993
+ "tied": false
994
+ }
995
+ },
996
+ {
997
+ "rust": {
998
+ "tied": false
999
+ },
1000
+ "source": {
1001
+ "tied": false
1002
+ }
1003
+ },
1004
+ {
1005
+ "rust": {
1006
+ "tied": false
1007
+ },
1008
+ "source": {
1009
+ "tied": false
1010
+ }
1011
+ },
1012
+ {
1013
+ "rust": {
1014
+ "tied": true
1015
+ },
1016
+ "source": {
1017
+ "tied": true
1018
+ }
1019
+ },
1020
+ {
1021
+ "rust": {
1022
+ "tied": true
1023
+ },
1024
+ "source": {
1025
+ "tied": true
1026
+ }
1027
+ },
1028
+ {
1029
+ "rust": {
1030
+ "tied": false
1031
+ },
1032
+ "source": {
1033
+ "tied": false
1034
+ }
1035
+ },
1036
+ {
1037
+ "rust": {
1038
+ "tied": false
1039
+ },
1040
+ "source": {
1041
+ "tied": false
1042
+ }
1043
+ },
1044
+ {
1045
+ "rust": {
1046
+ "tied": true
1047
+ },
1048
+ "source": {
1049
+ "tied": true
1050
+ }
1051
+ },
1052
+ {
1053
+ "rust": {
1054
+ "tied": true
1055
+ },
1056
+ "source": {
1057
+ "tied": true
1058
+ }
1059
+ },
1060
+ {
1061
+ "rust": {
1062
+ "tied": true
1063
+ },
1064
+ "source": {
1065
+ "tied": true
1066
+ }
1067
+ },
1068
+ {
1069
+ "rust": {
1070
+ "tied": true
1071
+ },
1072
+ "source": {
1073
+ "tied": true
1074
+ }
1075
+ },
1076
+ {
1077
+ "rust": {
1078
+ "tied": false
1079
+ },
1080
+ "source": {
1081
+ "tied": false
1082
+ }
1083
+ },
1084
+ {
1085
+ "rust": {
1086
+ "tied": false
1087
+ },
1088
+ "source": {
1089
+ "tied": false
1090
+ }
1091
+ },
1092
+ {
1093
+ "rust": {
1094
+ "tied": true
1095
+ },
1096
+ "source": {
1097
+ "tied": true
1098
+ }
1099
+ },
1100
+ {
1101
+ "rust": {
1102
+ "tied": true
1103
+ },
1104
+ "source": {
1105
+ "tied": true
1106
+ }
1107
+ },
1108
+ {
1109
+ "rust": {
1110
+ "tied": true
1111
+ },
1112
+ "source": {
1113
+ "tied": true
1114
+ }
1115
+ },
1116
+ {
1117
+ "rust": {
1118
+ "tied": true
1119
+ },
1120
+ "source": {
1121
+ "tied": true
1122
+ }
1123
+ },
1124
+ {
1125
+ "rust": {
1126
+ "tied": false
1127
+ },
1128
+ "source": {
1129
+ "tied": false
1130
+ }
1131
+ },
1132
+ {
1133
+ "rust": {
1134
+ "tied": false
1135
+ },
1136
+ "source": {
1137
+ "tied": false
1138
+ }
1139
+ },
1140
+ {
1141
+ "rust": {
1142
+ "tied": true
1143
+ },
1144
+ "source": {
1145
+ "tied": true
1146
+ }
1147
+ },
1148
+ {
1149
+ "rust": {
1150
+ "tied": true
1151
+ },
1152
+ "source": {
1153
+ "tied": true
1154
+ }
1155
+ },
1156
+ {
1157
+ "rust": {
1158
+ "tied": true
1159
+ },
1160
+ "source": {
1161
+ "tied": true
1162
+ }
1163
+ },
1164
+ {
1165
+ "rust": {
1166
+ "tied": true
1167
+ },
1168
+ "source": {
1169
+ "tied": true
1170
+ }
1171
+ },
1172
+ {
1173
+ "rust": {
1174
+ "tied": false
1175
+ },
1176
+ "source": {
1177
+ "tied": false
1178
+ }
1179
+ },
1180
+ {
1181
+ "rust": {
1182
+ "tied": false
1183
+ },
1184
+ "source": {
1185
+ "tied": false
1186
+ }
1187
+ },
1188
+ {
1189
+ "rust": {
1190
+ "tied": true
1191
+ },
1192
+ "source": {
1193
+ "tied": true
1194
+ }
1195
+ },
1196
+ {
1197
+ "rust": {
1198
+ "tied": true
1199
+ },
1200
+ "source": {
1201
+ "tied": true
1202
+ }
1203
+ },
1204
+ {
1205
+ "rust": {
1206
+ "tied": true
1207
+ },
1208
+ "source": {
1209
+ "tied": true
1210
+ }
1211
+ },
1212
+ {
1213
+ "rust": {
1214
+ "tied": true
1215
+ },
1216
+ "source": {
1217
+ "tied": true
1218
+ }
1219
+ },
1220
+ {
1221
+ "rust": {
1222
+ "tied": false
1223
+ },
1224
+ "source": {
1225
+ "tied": false
1226
+ }
1227
+ },
1228
+ {
1229
+ "rust": {
1230
+ "tied": false
1231
+ },
1232
+ "source": {
1233
+ "tied": false
1234
+ }
1235
+ },
1236
+ {
1237
+ "rust": {
1238
+ "tied": true
1239
+ },
1240
+ "source": {
1241
+ "tied": true
1242
+ }
1243
+ },
1244
+ {
1245
+ "rust": {
1246
+ "tied": true
1247
+ },
1248
+ "source": {
1249
+ "tied": true
1250
+ }
1251
+ },
1252
+ {
1253
+ "rust": {
1254
+ "tied": true
1255
+ },
1256
+ "source": {
1257
+ "tied": true
1258
+ }
1259
+ },
1260
+ {
1261
+ "rust": {
1262
+ "tied": true
1263
+ },
1264
+ "source": {
1265
+ "tied": true
1266
+ }
1267
+ },
1268
+ {
1269
+ "rust": {
1270
+ "tied": false
1271
+ },
1272
+ "source": {
1273
+ "tied": false
1274
+ }
1275
+ },
1276
+ {
1277
+ "rust": {
1278
+ "tied": false
1279
+ },
1280
+ "source": {
1281
+ "tied": false
1282
+ }
1283
+ },
1284
+ {
1285
+ "rust": {
1286
+ "tied": true
1287
+ },
1288
+ "source": {
1289
+ "tied": true
1290
+ }
1291
+ },
1292
+ {
1293
+ "rust": {
1294
+ "tied": true
1295
+ },
1296
+ "source": {
1297
+ "tied": true
1298
+ }
1299
+ },
1300
+ {
1301
+ "rust": {
1302
+ "tied": true
1303
+ },
1304
+ "source": {
1305
+ "tied": true
1306
+ }
1307
+ },
1308
+ {
1309
+ "rust": {
1310
+ "tied": true
1311
+ },
1312
+ "source": {
1313
+ "tied": true
1314
+ }
1315
+ },
1316
+ {
1317
+ "rust": {
1318
+ "tied": false
1319
+ },
1320
+ "source": {
1321
+ "tied": false
1322
+ }
1323
+ },
1324
+ {
1325
+ "rust": {
1326
+ "tied": false
1327
+ },
1328
+ "source": {
1329
+ "tied": false
1330
+ }
1331
+ },
1332
+ {
1333
+ "rust": {
1334
+ "tied": true
1335
+ },
1336
+ "source": {
1337
+ "tied": true
1338
+ }
1339
+ },
1340
+ {
1341
+ "rust": {
1342
+ "tied": true
1343
+ },
1344
+ "source": {
1345
+ "tied": true
1346
+ }
1347
+ }
1348
+ ],
1349
+ "source_report": "docs/research/qvm-exit-predicate.json",
1350
+ "source_report_sha256": "806a738609de74d6f425ecc4a9a2ad42e06eecb6ce53f285fb79daeab3d7c126"
1351
+ }
docs/research/rust-health-impulse.json CHANGED
@@ -2985,7 +2985,7 @@
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
- "rust_unit_tests": 89,
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": 91,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
scripts/analyze_rust_exit_predicate.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ import hashlib,json
3
+ from pathlib import Path
4
+ from rust_intermission_support import binary,encode,result
5
+ from analyze_qvm import write_json
6
+ def main():
7
+ b=binary();p=Path('docs/research/qvm-exit-predicate.json');data=p.read_bytes();rows=[]
8
+ for s in json.loads(data)['probes']:rows.append({'source':{'tied':bool(s['return'])},'rust':result(b,'tie',encode(s['input'],s['clients']))})
9
+ write_json(Path('docs/research/rust-exit-predicate.json'),{'source_report':str(p),'source_report_sha256':hashlib.sha256(data).hexdigest(),'probes':rows,'limits':'Typed tie policy over168 original source cases. Bounded ranks; native runtime remains open.'})
10
+ if __name__=='__main__':main()
scripts/rust_intermission_support.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Scoped intermission binary; no full workspace test invocation."""
2
+ import os,subprocess
3
+ from pathlib import Path
4
+ from rust_lifecycle_support import result
5
+ FIELDS=[468,140,6156,248,452,3096,696,308,4036,'entity_flags',4324]
6
+ def binary():
7
+ subprocess.run(['cargo','build','--offline','--package','urt-gameplay','--bin','urt-intermission'],capture_output=True,text=True,check=True)
8
+ return Path(os.environ.get('CARGO_TARGET_DIR','target'))/'debug'/'urt-intermission'
9
+ def encode(a,clients):
10
+ order=a.get('order',list(range(len(clients))))
11
+ defaults={'enabled':1,'max_clients':len(clients),'client_count':len(clients)}
12
+ return [a.get(k,defaults.get(k,0)) for k in ['blocked','now','slow','waiting','wait_start','pending','mode','playing','enabled','first_score','second_score','max_clients','client_count']]+[len(clients),len(order),*[c.get(str(o),c.get(o,2 if o==468 else j if o==140 else 0)) for j,c in enumerate(clients) for o in FIELDS],*order]
scripts/test_rust_exit_predicate.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import hashlib,json,unittest
2
+ from pathlib import Path
3
+ class RustPredicateTests(unittest.TestCase):
4
+ def test_all_source_cases(self):
5
+ r=json.loads(Path('docs/research/rust-exit-predicate.json').read_text());self.assertEqual(len(r['probes']),168)
6
+ for p in r['probes']:self.assertEqual(p['rust'],p['source'])
7
+ def test_source_identity(self):
8
+ r=json.loads(Path('docs/research/rust-exit-predicate.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
@@ -2159,3 +2159,18 @@ edge docs/research/qvm-exit-predicate.json scripts/test_qvm_exit_predicate.py
2159
  group exit-predicate scripts/analyze_qvm_exit_predicate.py
2160
  edge scripts/analyze_qvm_exit_predicate.py scripts/analyze_qvm_resumer_audit.py
2161
  edge scripts/qvm_intermission_support.py scripts/analyze_qvm_resumer_audit.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2159
  group exit-predicate scripts/analyze_qvm_exit_predicate.py
2160
  edge scripts/analyze_qvm_exit_predicate.py scripts/analyze_qvm_resumer_audit.py
2161
  edge scripts/qvm_intermission_support.py scripts/analyze_qvm_resumer_audit.py
2162
+ edge Cargo.toml scripts/analyze_rust_exit_predicate.py
2163
+ edge Cargo.lock scripts/analyze_rust_exit_predicate.py
2164
+ edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_exit_predicate.py
2165
+ edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_exit_predicate.py
2166
+ edge crates/urt-gameplay/src/intermission.rs scripts/analyze_rust_exit_predicate.py
2167
+ edge crates/urt-gameplay/src/bin/urt-intermission.rs scripts/analyze_rust_exit_predicate.py
2168
+ edge docs/research/qvm-exit-predicate.json scripts/analyze_rust_exit_predicate.py
2169
+ edge crates/urt-gameplay/src/intermission.rs scripts/analyze_rust_health_impulse.py
2170
+ group rust-exit-predicate scripts/analyze_rust_health_impulse.py
2171
+ group gameplay scripts/analyze_rust_exit_predicate.py
2172
+ report scripts/analyze_rust_exit_predicate.py docs/research/rust-exit-predicate.json
2173
+ edge docs/research/rust-exit-predicate.json scripts/test_rust_exit_predicate.py
2174
+ group rust-exit-predicate scripts/analyze_rust_exit_predicate.py
2175
+ edge scripts/analyze_rust_exit_predicate.py scripts/analyze_qvm_resumer_audit.py
2176
+ edge scripts/rust_intermission_support.py scripts/analyze_qvm_resumer_audit.py