gameplay: port bomb defuse replay snapshots
Browse files- crates/urt-gameplay/src/bin/urt-defuse.rs +34 -0
- crates/urt-gameplay/src/defuse.rs +167 -0
- docs/FINDINGS.md +4 -0
- docs/PROVISIONAL_TODO.md +5 -0
- docs/RESEARCH_LEDGER.md +4 -0
- docs/REVERSE_ENGINEERING_TODO.md +5 -0
- docs/TESTING.md +2 -0
- docs/research/QVM_ASSISTANCE_BATCH.md +3 -1
- docs/research/QVM_DEFUSE_BATCH.md +65 -0
- docs/research/README.md +4 -0
- docs/research/RUST_DEFUSE_SEQUENCE.md +5 -0
- docs/research/rust-defuse-sequence.json +0 -0
- docs/research/rust-health-impulse.json +1 -1
- scripts/analyze_rust_defuse_sequence.py +17 -0
- scripts/test_rust_defuse_sequence.py +9 -0
- xtask/checks.tsv +32 -0
- xtask/src/lib.rs +3 -0
crates/urt-gameplay/src/bin/urt-defuse.rs
CHANGED
|
@@ -85,6 +85,7 @@ fn main() {
|
|
| 85 |
println!("{{{}}}", fields(s, &e));
|
| 86 |
}
|
| 87 |
"full" => println!("{}", full(&w)),
|
|
|
|
| 88 |
_ => panic!("unknown policy"),
|
| 89 |
}
|
| 90 |
}
|
|
@@ -180,3 +181,36 @@ fn full(w: &[u32]) -> String {
|
|
| 180 |
let o = process_defuse(&mut world, i).unwrap();
|
| 181 |
format!("{{{}}}", full_fields(world.state, &o))
|
| 182 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 85 |
println!("{{{}}}", fields(s, &e));
|
| 86 |
}
|
| 87 |
"full" => println!("{}", full(&w)),
|
| 88 |
+
"sequence" => println!("{}", sequence(&w)),
|
| 89 |
_ => panic!("unknown policy"),
|
| 90 |
}
|
| 91 |
}
|
|
|
|
| 181 |
let o = process_defuse(&mut world, i).unwrap();
|
| 182 |
format!("{{{}}}", full_fields(world.state, &o))
|
| 183 |
}
|
| 184 |
+
|
| 185 |
+
fn sequence(w: &[u32]) -> String {
|
| 186 |
+
assert_eq!(w.len(), 32);
|
| 187 |
+
let (mut world, i) = decode_full(&w[..31]);
|
| 188 |
+
let profile = w[31];
|
| 189 |
+
let steps = [0, 1000, 2000, 5000, 6000]
|
| 190 |
+
.into_iter()
|
| 191 |
+
.enumerate()
|
| 192 |
+
.map(|(j, offset)| DefuseReplayStep {
|
| 193 |
+
tick: i.base.tick.wrapping_add(offset),
|
| 194 |
+
bomb_move: if j == 1 && profile == 3 {
|
| 195 |
+
Some((4, [10f32.to_bits(), 0, 0]))
|
| 196 |
+
} else {
|
| 197 |
+
None
|
| 198 |
+
},
|
| 199 |
+
press_button: j == 1 && profile == 5,
|
| 200 |
+
release_teammate: if j == 1 && profile == 16 {
|
| 201 |
+
Some(w[26] as usize)
|
| 202 |
+
} else {
|
| 203 |
+
None
|
| 204 |
+
},
|
| 205 |
+
})
|
| 206 |
+
.collect::<Vec<_>>();
|
| 207 |
+
let frames = replay_defuse(&mut world, i, &steps).unwrap();
|
| 208 |
+
format!(
|
| 209 |
+
r#"{{"frames":[{}]}}"#,
|
| 210 |
+
frames
|
| 211 |
+
.iter()
|
| 212 |
+
.map(|f| format!("{{{}}}", full_fields(f.world.state, &f.outcome)))
|
| 213 |
+
.collect::<Vec<_>>()
|
| 214 |
+
.join(",")
|
| 215 |
+
)
|
| 216 |
+
}
|
crates/urt-gameplay/src/defuse.rs
CHANGED
|
@@ -518,3 +518,170 @@ mod full_tests {
|
|
| 518 |
assert_eq!(w, old);
|
| 519 |
}
|
| 520 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 518 |
assert_eq!(w, old);
|
| 519 |
}
|
| 520 |
}
|
| 521 |
+
|
| 522 |
+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
| 523 |
+
pub struct DefuseReplayStep {
|
| 524 |
+
pub tick: u32,
|
| 525 |
+
pub bomb_move: Option<(usize, [u32; 3])>,
|
| 526 |
+
pub press_button: bool,
|
| 527 |
+
pub release_teammate: Option<usize>,
|
| 528 |
+
}
|
| 529 |
+
#[derive(Clone, Debug, PartialEq, Eq)]
|
| 530 |
+
pub struct DefuseFrame {
|
| 531 |
+
pub world: DefuseWorld,
|
| 532 |
+
pub outcome: DefuseOutcome,
|
| 533 |
+
}
|
| 534 |
+
/// Bounded research replay with scripted external inputs. Missing-bomb boundary
|
| 535 |
+
/// ends replay, matching the source fatal boundary rather than inventing a return.
|
| 536 |
+
/// Typed replay errors roll back the batch; native effect plans perform no IO.
|
| 537 |
+
pub fn replay_defuse(
|
| 538 |
+
world: &mut DefuseWorld,
|
| 539 |
+
input: FullDefuseInput,
|
| 540 |
+
steps: &[DefuseReplayStep],
|
| 541 |
+
) -> Result<Vec<DefuseFrame>, Error> {
|
| 542 |
+
if steps.len() > 256 {
|
| 543 |
+
return Err(Error::InvalidCount);
|
| 544 |
+
}
|
| 545 |
+
let mut next = world.clone();
|
| 546 |
+
let mut frames = vec![];
|
| 547 |
+
for step in steps {
|
| 548 |
+
if let Some((index, point)) = step.bomb_move {
|
| 549 |
+
next.bombs.get_mut(index).ok_or(Error::InvalidIndex)?.point = point;
|
| 550 |
+
}
|
| 551 |
+
if step.press_button {
|
| 552 |
+
next.state.flags |= 32768;
|
| 553 |
+
}
|
| 554 |
+
if let Some(index) = step.release_teammate {
|
| 555 |
+
next.clients.get_mut(index).ok_or(Error::InvalidIndex)?.busy = 0;
|
| 556 |
+
}
|
| 557 |
+
let outcome = process_defuse(
|
| 558 |
+
&mut next,
|
| 559 |
+
FullDefuseInput {
|
| 560 |
+
base: DefuseInput {
|
| 561 |
+
tick: step.tick,
|
| 562 |
+
..input.base
|
| 563 |
+
},
|
| 564 |
+
..input
|
| 565 |
+
},
|
| 566 |
+
)?;
|
| 567 |
+
let stop = outcome.missing;
|
| 568 |
+
frames.push(DefuseFrame {
|
| 569 |
+
world: next.clone(),
|
| 570 |
+
outcome,
|
| 571 |
+
});
|
| 572 |
+
if stop {
|
| 573 |
+
break;
|
| 574 |
+
}
|
| 575 |
+
}
|
| 576 |
+
*world = next;
|
| 577 |
+
Ok(frames)
|
| 578 |
+
}
|
| 579 |
+
#[cfg(test)]
|
| 580 |
+
mod replay_tests {
|
| 581 |
+
use super::*;
|
| 582 |
+
use crate::move_callbacks::ObjectiveClient;
|
| 583 |
+
fn world() -> DefuseWorld {
|
| 584 |
+
DefuseWorld {
|
| 585 |
+
state: DefuseState {
|
| 586 |
+
flags: 32768,
|
| 587 |
+
flags104: 0,
|
| 588 |
+
busy: 0,
|
| 589 |
+
clock: 0,
|
| 590 |
+
complete: 0,
|
| 591 |
+
animation: 99,
|
| 592 |
+
weapon: 11,
|
| 593 |
+
event: [7, 1],
|
| 594 |
+
},
|
| 595 |
+
clients: vec![
|
| 596 |
+
ObjectiveClient {
|
| 597 |
+
connection: 2,
|
| 598 |
+
health: 1,
|
| 599 |
+
follow: 0,
|
| 600 |
+
team: 1,
|
| 601 |
+
busy: 0
|
| 602 |
+
};
|
| 603 |
+
3
|
| 604 |
+
],
|
| 605 |
+
bombs: vec![DefuseBomb {
|
| 606 |
+
in_use: true,
|
| 607 |
+
has_class: true,
|
| 608 |
+
hash: BOMB_CLASS_HASH,
|
| 609 |
+
point: [0; 3],
|
| 610 |
+
}],
|
| 611 |
+
actor_point: [0; 3],
|
| 612 |
+
}
|
| 613 |
+
}
|
| 614 |
+
fn input() -> FullDefuseInput {
|
| 615 |
+
FullDefuseInput {
|
| 616 |
+
base: DefuseInput {
|
| 617 |
+
tick: 10000,
|
| 618 |
+
duration: 5,
|
| 619 |
+
index: 3,
|
| 620 |
+
slot: 2,
|
| 621 |
+
},
|
| 622 |
+
entity: true,
|
| 623 |
+
client: true,
|
| 624 |
+
enabled_a: 1,
|
| 625 |
+
enabled_b: 1,
|
| 626 |
+
start: 8000,
|
| 627 |
+
delay: 1,
|
| 628 |
+
selector: 0,
|
| 629 |
+
count: 3,
|
| 630 |
+
}
|
| 631 |
+
}
|
| 632 |
+
fn step(tick: u32) -> DefuseReplayStep {
|
| 633 |
+
DefuseReplayStep {
|
| 634 |
+
tick,
|
| 635 |
+
bomb_move: None,
|
| 636 |
+
press_button: false,
|
| 637 |
+
release_teammate: None,
|
| 638 |
+
}
|
| 639 |
+
}
|
| 640 |
+
#[test]
|
| 641 |
+
fn completion_latch_prevents_duplicate_reward() {
|
| 642 |
+
let mut w = world();
|
| 643 |
+
let steps = [10000, 11000, 12000, 15000, 16000].map(step);
|
| 644 |
+
let f = replay_defuse(&mut w, input(), &steps).unwrap();
|
| 645 |
+
assert_eq!(
|
| 646 |
+
f.iter()
|
| 647 |
+
.map(|f| f.outcome.effects.len())
|
| 648 |
+
.collect::<Vec<_>>(),
|
| 649 |
+
[2, 0, 0, 4, 0]
|
| 650 |
+
);
|
| 651 |
+
assert_eq!(w.state.complete, 1);
|
| 652 |
+
assert_eq!(f[3].world.state.event, [1, 33]);
|
| 653 |
+
assert!(f[4].outcome.lookups.is_empty());
|
| 654 |
+
assert_eq!(
|
| 655 |
+
f.iter()
|
| 656 |
+
.flat_map(|f| &f.outcome.effects)
|
| 657 |
+
.filter(|e| matches!(e, DefuseEffect::Award { .. }))
|
| 658 |
+
.count(),
|
| 659 |
+
1
|
| 660 |
+
);
|
| 661 |
+
}
|
| 662 |
+
#[test]
|
| 663 |
+
fn missing_bomb_stops_and_late_script_error_rolls_back() {
|
| 664 |
+
let mut w = world();
|
| 665 |
+
w.bombs.clear();
|
| 666 |
+
let f = replay_defuse(&mut w, input(), &[step(10000), step(11000)]).unwrap();
|
| 667 |
+
assert_eq!(f.len(), 1);
|
| 668 |
+
assert!(f[0].outcome.missing);
|
| 669 |
+
let mut w = world();
|
| 670 |
+
let old = w.clone();
|
| 671 |
+
assert!(
|
| 672 |
+
replay_defuse(
|
| 673 |
+
&mut w,
|
| 674 |
+
input(),
|
| 675 |
+
&[
|
| 676 |
+
step(10000),
|
| 677 |
+
DefuseReplayStep {
|
| 678 |
+
bomb_move: Some((99, [0; 3])),
|
| 679 |
+
..step(11000)
|
| 680 |
+
}
|
| 681 |
+
]
|
| 682 |
+
)
|
| 683 |
+
.is_err()
|
| 684 |
+
);
|
| 685 |
+
assert_eq!(w, old);
|
| 686 |
+
}
|
| 687 |
+
}
|
docs/FINDINGS.md
CHANGED
|
@@ -1983,3 +1983,7 @@ RE-1020: Ninety-six source scenarios connect original admission/teammate scan to
|
|
| 1983 |
RE-1021: Rust composes verified eligibility, first eligible bomb hash lookup, finite f32 distance and start/cancel/finish across96 source cases. Missing bomb returns the source fatal boundary diagnostic without inventing subsequent behavior. Radius equality does not start defusing; decoy identity and selector semantics match source. State and effect plans stage before commit, with missing/invalid geometry unit tests preserving prior state. Native effects remain captured plans. [Evidence](research/RUST_DEFUSE_COMPLETE.md).
|
| 1984 |
|
| 1985 |
RE-1022: Thirty coherent source scenarios replay up to five complete callbacks, producing138 snapshots. Scripted motion, held-button changes and teammate release test cancellation/restart; shared state persists through waiting and exact completion. Completed latch prevents repeated allocation/log/award. Missing-bomb boundary stops after one call. Actual lookup/distance bodies execute, while native effect feedback and scheduling remain modeled/captured inputs. [Evidence](research/QVM_DEFUSE_SEQUENCE.md).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1983 |
RE-1021: Rust composes verified eligibility, first eligible bomb hash lookup, finite f32 distance and start/cancel/finish across96 source cases. Missing bomb returns the source fatal boundary diagnostic without inventing subsequent behavior. Radius equality does not start defusing; decoy identity and selector semantics match source. State and effect plans stage before commit, with missing/invalid geometry unit tests preserving prior state. Native effects remain captured plans. [Evidence](research/RUST_DEFUSE_COMPLETE.md).
|
| 1984 |
|
| 1985 |
RE-1022: Thirty coherent source scenarios replay up to five complete callbacks, producing138 snapshots. Scripted motion, held-button changes and teammate release test cancellation/restart; shared state persists through waiting and exact completion. Completed latch prevents repeated allocation/log/award. Missing-bomb boundary stops after one call. Actual lookup/distance bodies execute, while native effect feedback and scheduling remain modeled/captured inputs. [Evidence](research/QVM_DEFUSE_SEQUENCE.md).
|
| 1986 |
+
|
| 1987 |
+
RE-1023: Rust matches138 source snapshots across30 scripted sequences. Motion/button/teammate inputs apply before each call, while clock/flags/event state persist. Completion latch suppresses duplicate reward requests and missing-bomb diagnostic ends replay. Bounded typed replay stages all updates and snapshots on errors; tests verify exactly one reward, fatal-boundary stop and rollback after a prior successful start. Native effects and frame scheduling remain outside scope. [Evidence](research/RUST_DEFUSE_SEQUENCE.md).
|
| 1988 |
+
|
| 1989 |
+
RE-1014–1023 batch validation passed:1,978 Python tests,319 Rust tests,131 deterministic affected producers and601 documentation files. All ten tasks have separate commits and focused checks. [Defuse evidence and next work](research/QVM_DEFUSE_BATCH.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -2042,3 +2042,8 @@ RE-974–983 completed routing, command rewrite, inactivity, movement-parameter
|
|
| 2042 |
- [x] RE-1021 Port complete bomb-defuse lookup and state policy ([evidence](research/RUST_DEFUSE_COMPLETE.md)).
|
| 2043 |
|
| 2044 |
- [x] RE-1022 Recover bomb-defuse sequences and completion latching ([evidence](research/QVM_DEFUSE_SEQUENCE.md)).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2042 |
- [x] RE-1021 Port complete bomb-defuse lookup and state policy ([evidence](research/RUST_DEFUSE_COMPLETE.md)).
|
| 2043 |
|
| 2044 |
- [x] RE-1022 Recover bomb-defuse sequences and completion latching ([evidence](research/QVM_DEFUSE_SEQUENCE.md)).
|
| 2045 |
+
|
| 2046 |
+
- [x] RE-1023 Port bomb-defuse replay and fatal/completion boundaries ([evidence](research/RUST_DEFUSE_SEQUENCE.md)).
|
| 2047 |
+
|
| 2048 |
+
- [x] RE-1014–1023 bomb-defuse batch:278 paired scenarios, including138 repeated-call snapshots ([evidence](research/QVM_DEFUSE_BATCH.md)).
|
| 2049 |
+
- [ ] RE-1024 recover objective/native effect feedback and compose defusing with full client preparation/movement/timer execution ([scope](research/QVM_DEFUSE_BATCH.md#next-work-re-1024)).
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -2763,3 +2763,7 @@ Rust composes verified eligibility, first eligible bomb hash lookup, finite f32
|
|
| 2763 |
## 2026-10-29 — RE-1022 Recover bomb-defuse sequences and completion latching
|
| 2764 |
|
| 2765 |
Thirty coherent source scenarios replay up to five complete callbacks, producing138 snapshots. Scripted motion, held-button changes and teammate release test cancellation/restart; shared state persists through waiting and exact completion. Completed latch prevents repeated allocation/log/award. Missing-bomb boundary stops after one call. Actual lookup/distance bodies execute, while native effect feedback and scheduling remain modeled/captured inputs. Focused `cargo xtask test-group qvm-defuse-sequence` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2763 |
## 2026-10-29 — RE-1022 Recover bomb-defuse sequences and completion latching
|
| 2764 |
|
| 2765 |
Thirty coherent source scenarios replay up to five complete callbacks, producing138 snapshots. Scripted motion, held-button changes and teammate release test cancellation/restart; shared state persists through waiting and exact completion. Completed latch prevents repeated allocation/log/award. Missing-bomb boundary stops after one call. Actual lookup/distance bodies execute, while native effect feedback and scheduling remain modeled/captured inputs. Focused `cargo xtask test-group qvm-defuse-sequence` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
|
| 2766 |
+
|
| 2767 |
+
## 2026-10-29 — RE-1023 Port bomb-defuse replay and fatal/completion boundaries
|
| 2768 |
+
|
| 2769 |
+
Rust matches138 source snapshots across30 scripted sequences. Motion/button/teammate inputs apply before each call, while clock/flags/event state persist. Completion latch suppresses duplicate reward requests and missing-bomb diagnostic ends replay. Bounded typed replay stages all updates and snapshots on errors; tests verify exactly one reward, fatal-boundary stop and rollback after a prior successful start. Native effects and frame scheduling remain outside scope. Focused `cargo xtask test-group rust-defuse-sequence` passes with deterministic report regeneration and selected regressions. The single `cargo xtask test-full --since 26cfc686` run at the tenth-commit boundary passed: **1,978 Python tests** across539 modules, **319 Rust tests** (assets10, gameplay279, xtask30), **131 deterministic affected report producers**, storage policy, links across **601 documentation files** and whitespace guards. Regeneration left no changes. Focused dependency-registry regression passed. Validation notes are amended into task ten, preserving ten commits. Original assets unchanged; Python uses the flake-declared Nix runtime.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -2079,3 +2079,8 @@ RE-974–983 recover routing, command rewriting, inactivity and composed setup t
|
|
| 2079 |
- [x] RE-1021 Port complete bomb-defuse lookup and state policy ([evidence](research/RUST_DEFUSE_COMPLETE.md)).
|
| 2080 |
|
| 2081 |
- [x] RE-1022 Recover bomb-defuse sequences and completion latching ([evidence](research/QVM_DEFUSE_SEQUENCE.md)).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2079 |
- [x] RE-1021 Port complete bomb-defuse lookup and state policy ([evidence](research/RUST_DEFUSE_COMPLETE.md)).
|
| 2080 |
|
| 2081 |
- [x] RE-1022 Recover bomb-defuse sequences and completion latching ([evidence](research/QVM_DEFUSE_SEQUENCE.md)).
|
| 2082 |
+
|
| 2083 |
+
- [x] RE-1023 Port bomb-defuse replay and fatal/completion boundaries ([evidence](research/RUST_DEFUSE_SEQUENCE.md)).
|
| 2084 |
+
|
| 2085 |
+
- [x] RE-1014–1023 bomb-defuse batch:278 paired scenarios, including138 repeated-call snapshots ([evidence](research/QVM_DEFUSE_BATCH.md)).
|
| 2086 |
+
- [ ] RE-1024 recover objective/native effect feedback and compose defusing with full client preparation/movement/timer execution ([scope](research/QVM_DEFUSE_BATCH.md#next-work-re-1024)).
|
docs/TESTING.md
CHANGED
|
@@ -191,3 +191,5 @@ Movement-context focused pairs: `qvm-client-move-scratch`/`rust-client-move-scra
|
|
| 191 |
Movement-callback focused pairs: `qvm-move-meter`/`rust-move-meter`, `qvm-move-self-recovery`/`rust-move-self-recovery`, `qvm-move-assist-cleanup`/`rust-move-assist-cleanup`, `qvm-move-mode8-eligibility`/`rust-move-mode8-eligibility`, and `qvm-move-resolved-self`/`rust-move-resolved-self`. Use one group per invocation. Shared callback module/CLI changes select their Rust producers and gameplay test-count metadata; movement-context changes also select resolved self composition. One full check follows the tenth task: `cargo xtask test-full --since ad83778f`. [Evidence and boundaries](research/QVM_MOVE_CALLBACK_BATCH.md).
|
| 192 |
|
| 193 |
Assistance focused pairs: `qvm-assist-acquire`/`rust-assist-acquire`, `qvm-assist-cancel`/`rust-assist-cancel`, `qvm-assist-progress`/`rust-assist-progress`, `qvm-assist-complete`/`rust-assist-complete`, and `qvm-assist-sequence`/`rust-assist-sequence`. Use one group per invocation. Assistance module/CLI and recovered meter/cleanup inputs select affected Rust reports plus gameplay test-count metadata. Complete/replay probes execute actual152792/65655/152386 with modeled sqrt and captured/supplied native effects. The batch full check is `cargo xtask test-full --since 19fce7e8` after ten tasks. [Evidence and limits](research/QVM_ASSISTANCE_BATCH.md).
|
|
|
|
|
|
|
|
|
| 191 |
Movement-callback focused pairs: `qvm-move-meter`/`rust-move-meter`, `qvm-move-self-recovery`/`rust-move-self-recovery`, `qvm-move-assist-cleanup`/`rust-move-assist-cleanup`, `qvm-move-mode8-eligibility`/`rust-move-mode8-eligibility`, and `qvm-move-resolved-self`/`rust-move-resolved-self`. Use one group per invocation. Shared callback module/CLI changes select their Rust producers and gameplay test-count metadata; movement-context changes also select resolved self composition. One full check follows the tenth task: `cargo xtask test-full --since ad83778f`. [Evidence and boundaries](research/QVM_MOVE_CALLBACK_BATCH.md).
|
| 192 |
|
| 193 |
Assistance focused pairs: `qvm-assist-acquire`/`rust-assist-acquire`, `qvm-assist-cancel`/`rust-assist-cancel`, `qvm-assist-progress`/`rust-assist-progress`, `qvm-assist-complete`/`rust-assist-complete`, and `qvm-assist-sequence`/`rust-assist-sequence`. Use one group per invocation. Assistance module/CLI and recovered meter/cleanup inputs select affected Rust reports plus gameplay test-count metadata. Complete/replay probes execute actual152792/65655/152386 with modeled sqrt and captured/supplied native effects. The batch full check is `cargo xtask test-full --since 19fce7e8` after ten tasks. [Evidence and limits](research/QVM_ASSISTANCE_BATCH.md).
|
| 194 |
+
|
| 195 |
+
Defuse focused pairs: `qvm-defuse-begin`/`rust-defuse-begin`, `qvm-defuse-cancel`/`rust-defuse-cancel`, `qvm-defuse-finish`/`rust-defuse-finish`, `qvm-defuse-complete`/`rust-defuse-complete`, and `qvm-defuse-sequence`/`rust-defuse-sequence`. Run one group per invocation. Defuse module/CLI and eligibility inputs select affected Rust producers plus gameplay test-count metadata. Full/replay source checks execute actual153419/276433/65655 with modeled sqrt and supplied/captured native effects; missing lookup stops before fatal2319. Batch-wide validation after task ten is `cargo xtask test-full --since 26cfc686`. [Evidence and boundaries](research/QVM_DEFUSE_BATCH.md).
|
docs/research/QVM_ASSISTANCE_BATCH.md
CHANGED
|
@@ -58,7 +58,9 @@ Event publication278003, logs7259, teleport205260 and reset6369 remain captured
|
|
| 58 |
|
| 59 |
The single `cargo xtask test-full --since 19fce7e8` run at the tenth-commit boundary passed: **1,958 Python tests** across529 modules, **309 Rust tests** (assets10, gameplay269, xtask30), **126 deterministic affected report producers**, storage policy, links across **590 documentation files** and whitespace guards. Regeneration left no changes. Focused dependency-registry regression passed. Validation notes are amended into task ten, preserving ten commits.
|
| 60 |
|
| 61 |
-
##
|
|
|
|
|
|
|
| 62 |
|
| 63 |
- [ ] Recover153596 onward mode8 objective lookup, distance/progress/clock transitions, weapon/animation changes and completion effects.
|
| 64 |
- [ ] Resolve actual event publication278003, teleport205260, reset6369 and allocation277695 for assistance consumers; replace captured native feedback and verify field ownership.
|
|
|
|
| 58 |
|
| 59 |
The single `cargo xtask test-full --since 19fce7e8` run at the tenth-commit boundary passed: **1,958 Python tests** across529 modules, **309 Rust tests** (assets10, gameplay269, xtask30), **126 deterministic affected report producers**, storage policy, links across **590 documentation files** and whitespace guards. Regeneration left no changes. Focused dependency-registry regression passed. Validation notes are amended into task ten, preserving ten commits.
|
| 60 |
|
| 61 |
+
## Follow-up from RE-1014
|
| 62 |
+
|
| 63 |
+
The [RE-1014–1023 defuse batch](QVM_DEFUSE_BATCH.md) now covers mode8 objective transitions, actual hash/distance lookup and coherent replay. Native effect feedback and full client/physics integration remain open. The original follow-up scope was:
|
| 64 |
|
| 65 |
- [ ] Recover153596 onward mode8 objective lookup, distance/progress/clock transitions, weapon/animation changes and completion effects.
|
| 66 |
- [ ] Resolve actual event publication278003, teleport205260, reset6369 and allocation277695 for assistance consumers; replace captured native feedback and verify field ownership.
|
docs/research/QVM_DEFUSE_BATCH.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Bomb-defuse transitions and replay: RE-1014–1023
|
| 2 |
+
|
| 3 |
+
Ten tasks recover five source/Rust contracts across **278 paired scenarios**, including138 repeated-call snapshots. They extend the [assistance batch](QVM_ASSISTANCE_BATCH.md) through the mode8 bomb-defuse callback153419. Every task has a separate commit and focused validation. Native nested effect bodies, actual frame scheduling and full game/platform acceptance remain outside this evidence.
|
| 4 |
+
|
| 5 |
+
| Tasks | Contract | Paired scenarios |
|
| 6 |
+
| --- | --- | ---: |
|
| 7 |
+
| RE-1014 / RE-1015 | [Source start](QVM_DEFUSE_BEGIN.md) / [Rust start](RUST_DEFUSE_BEGIN.md) | 72 |
|
| 8 |
+
| RE-1016 / RE-1017 | [Source cancellation](QVM_DEFUSE_CANCEL.md) / [Rust cancellation](RUST_DEFUSE_CANCEL.md) | 48 |
|
| 9 |
+
| RE-1018 / RE-1019 | [Source completion](QVM_DEFUSE_FINISH.md) / [Rust completion](RUST_DEFUSE_FINISH.md) | 32 |
|
| 10 |
+
| RE-1020 / RE-1021 | [Complete source callback](QVM_DEFUSE_COMPLETE.md) / [Rust callback](RUST_DEFUSE_COMPLETE.md) | 96 |
|
| 11 |
+
| RE-1022 / RE-1023 | [Source sequences](QVM_DEFUSE_SEQUENCE.md) / [Rust replay](RUST_DEFUSE_SEQUENCE.md) | 30 |
|
| 12 |
+
|
| 13 |
+
## Starting a defuse
|
| 14 |
+
|
| 15 |
+
The153774 fragment assumes prior eligibility, near distance, mask32768 and inactive busy state. It reads a low-byte kind from the current weapon-table word at client312+4×client144. If client220 mask32 is set, it clears masks32/64 and writes animation148=2. The tested kinds11/13/other have the same projected outcome; the temporary selected kind does not alter the stored weapon word.
|
| 16 |
+
|
| 17 |
+
Start then stores the current tick into shared clock35000484, busy6164=1, client220 mask4 and client104 mask16. Event83 is allocated at the selected bomb origin24, its parameter184 receives configured duration34080132, and its entity424 gains mask32. Sound helper193620 is requested with sound7 and the acting entity after event setup.
|
| 18 |
+
|
| 19 |
+
Seventy-two source cases exercise raw masks, weapon low bytes, zero/positive/negative duration words and high-bit ticks. Source event-field sentinels on both sides of parameter184 survive. Rust typed arrays own the corresponding copy boundaries and reject unsupported weapon/client indices before mutation. Direct fragment cases are synthetic selected-branch inputs; complete callback cases separately establish routing.
|
| 20 |
+
|
| 21 |
+
## Cancelling
|
| 22 |
+
|
| 23 |
+
Both153927 unflagged and154008 far-target branches check only whether busy6164 is nonzero. Active cancellation clears shared clock35000484, busy6164, client220 mask4 and client104 mask16. It allocates event84 with parameter0 and event mask32. Weapon, animation, completion latch and unrelated bits remain unchanged.
|
| 24 |
+
|
| 25 |
+
If busy is zero, cancellation preserves stale clocks and flags and requests no event. Forty-eight cases compare both branches, nonzero high-bit busy words and stale inactive state. Rust cancellation is idempotent and does not evaluate unused weapon/client inputs on an inactive exit.
|
| 26 |
+
|
| 27 |
+
## Completion and timing
|
| 28 |
+
|
| 29 |
+
The active153644 path compares signed wrapped elapsed tick minus clock against signed wrapped duration×1000. Unlike the initial eligibility delay, completion accepts equality. Waiting retains all state and emits no effects. Thirty-two cases cover equality, immediately before the threshold, negative elapsed, wrapping ticks, negative duration and multiplication overflow.
|
| 30 |
+
|
| 31 |
+
Completion requests the original bomb-defused log, sets completion35000396=1, clears clock/busy and the owned masks, allocates event84 with parameter1 and mask32, then requests teleport205260 and award283463 value5. The source order is log, allocation, teleport, award. Weapon and animation remain unchanged. Rust keeps this order as an effect plan and rejects ready invalid client input before mutation; waiting does not evaluate unused indices.
|
| 32 |
+
|
| 33 |
+
## Complete153419 callback
|
| 34 |
+
|
| 35 |
+
Ninety-six scenarios execute admission, teammate exclusion, actual class lookup276433, actual distance65655 and the defuse transitions through154087. Both initial enables and the strict admission delay must pass. Completion must be zero; self must be connected/live/non-following and on the selected team. Selector exactly1 chooses team2; other values choose team1. A live connected non-following same-team client with nonzero6164 blocks entry; self is excluded from that scan.
|
| 36 |
+
|
| 37 |
+
Lookup uses the original precomputed class hash -82007226 and first eligible entity order. Entity532 must be nonzero, class pointer536 nonnull and hash540 matching. Fixtures include inactive, classless and hash-mismatched first candidates with a valid later entity. The table identity and precomputed hashes are supplied; this does not recover bomb creation or class-hash production.
|
| 38 |
+
|
| 39 |
+
Actual65655 computes distance from actor origin488 to selected bomb origin24 with finite native sqrt modeled. Distance must be strictly below75 to start or continue; equality is far. Near mask32768 chooses start/wait/completion. Far distance or absent mask32768 chooses cancellation.
|
| 40 |
+
|
| 41 |
+
If lookup returns null, source execution stops at153612 immediately before fatal2319. Rust returns an explicit missing-bomb boundary diagnostic and does not invent post-error behavior. The replay stops there. Cases cover all three selectors, exact radius, zero/64 teammate counts, gating failures, completed latch, decoys and wrapped timing. Distance fixtures are finite and axis-aligned; broader geometry domains remain open.
|
| 42 |
+
|
| 43 |
+
## Repeated coherent calls
|
| 44 |
+
|
| 45 |
+
Thirty scenarios preserve state across calls at offsets0/1000/2000/5000/6000. Scripted external updates move a bomb inside the radius, press the defuse button or release a blocking teammate before a later call. The source and Rust compare138 snapshots; three missing-bomb scenarios stop after one call, while the other27 execute five calls.
|
| 46 |
+
|
| 47 |
+
Snapshots include flags, busy state, shared clock, completion latch, animation/weapon words, allocated event parameters, ordered effects, lookup results and distance bits. They verify cancellation/restart, waiting, exact completion and suppression of duplicate rewards after completion. The scripted updates are inputs, not evidence for movement/input/native scheduling behavior. Rust bounded replay stages the batch on typed errors and stores immutable snapshots; this is an adapter guarantee beyond the per-call source routine.
|
| 48 |
+
|
| 49 |
+
## Validation and limits
|
| 50 |
+
|
| 51 |
+
Each task runs its own `cargo xtask test-group qvm-defuse-*` or `rust-defuse-*` before committing. Selected reports regenerate twice identically. Source reports retain verified QVM identity and trace summaries; independent gate/arithmetic/state expectations check the probes. Rust reports compare every projected source field and retain source-report SHA256. Ten added Rust tests cover bit preservation, effect order, timing, stale exits, radius/lookup boundaries, completion latching, missing-bomb stopping and late-error rollback.
|
| 52 |
+
|
| 53 |
+
Dependency mappings cover all five source/Rust pairs, the defuse module/CLI and existing eligibility policy inputs, including gameplay test-count metadata. The registry regression checks those mappings. One full-suite run follows task ten: `cargo xtask test-full --since 26cfc686`. All Python uses the flake-declared Nix runtime, including Git hooks. Assets and original binaries are unchanged.
|
| 54 |
+
|
| 55 |
+
Event allocation277695 is supplied. Sound193620, logs7259, teleport205260 and award283463 are captured plans. Their actual allocation, positional, score, network and other state feedback is not executed. Full client routing/movement/timer integration and native macOS/Linux runtime conformance remain open.
|
| 56 |
+
|
| 57 |
+
The single `cargo xtask test-full --since 26cfc686` run at the tenth-commit boundary passed: **1,978 Python tests** across539 modules, **319 Rust tests** (assets10, gameplay279, xtask30), **131 deterministic affected report producers**, storage policy, links across **601 documentation files** and whitespace guards. Regeneration left no changes. Focused dependency-registry regression passed. Validation notes are amended into task ten, preserving ten commits.
|
| 58 |
+
|
| 59 |
+
## Next work: RE-1024
|
| 60 |
+
|
| 61 |
+
- [ ] Recover allocation277695, sound193620, teleport205260 and award283463 for bomb/assistance consumers, then replace captured state feedback with verified adapters.
|
| 62 |
+
- [ ] Recover bomb creation/class ownership and objective event83/84 client rendering/audio consumers; verify shared-clock and teammate ownership across actual lifecycle transitions.
|
| 63 |
+
- [ ] Compose mode8 defusing and nonempty mode10 assistance/self recovery with full154089 client preparation, movement54475 and timer155714.
|
| 64 |
+
- [ ] Recover post-movement event/link/health handling, native trace/contents and time/file/network boundaries, with source-backed longer scenarios.
|
| 65 |
+
- [ ] Expand geometry, aliasing, identity, wrap/configuration and input domains; continue asset/shader conversion, Bevy/Solari rendering and playable macOS/Linux acceptance.
|
docs/research/README.md
CHANGED
|
@@ -1611,3 +1611,7 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 1611 |
- [RE-1021: Port complete bomb-defuse lookup and state policy](RUST_DEFUSE_COMPLETE.md).
|
| 1612 |
|
| 1613 |
- [RE-1022: Recover bomb-defuse sequences and completion latching](QVM_DEFUSE_SEQUENCE.md).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1611 |
- [RE-1021: Port complete bomb-defuse lookup and state policy](RUST_DEFUSE_COMPLETE.md).
|
| 1612 |
|
| 1613 |
- [RE-1022: Recover bomb-defuse sequences and completion latching](QVM_DEFUSE_SEQUENCE.md).
|
| 1614 |
+
|
| 1615 |
+
- [RE-1023: Port bomb-defuse replay and fatal/completion boundaries](RUST_DEFUSE_SEQUENCE.md).
|
| 1616 |
+
|
| 1617 |
+
- [Bomb-defuse transitions and replay: RE-1014–1023](QVM_DEFUSE_BATCH.md).
|
docs/research/RUST_DEFUSE_SEQUENCE.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Port bomb-defuse replay and fatal/completion boundaries
|
| 2 |
+
|
| 3 |
+
RE-1023. Focused validation: `cargo xtask test-group rust-defuse-sequence`. [Machine report](rust-defuse-sequence.json).
|
| 4 |
+
|
| 5 |
+
Rust matches138 source snapshots across30 scripted sequences. Motion/button/teammate inputs apply before each call, while clock/flags/event state persist. Completion latch suppresses duplicate reward requests and missing-bomb diagnostic ends replay. Bounded typed replay stages all updates and snapshots on errors; tests verify exactly one reward, fatal-boundary stop and rollback after a prior successful start. Native effects and frame scheduling remain outside scope.
|
docs/research/rust-defuse-sequence.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
docs/research/rust-health-impulse.json
CHANGED
|
@@ -2985,7 +2985,7 @@
|
|
| 2985 |
"exit_code": 2
|
| 2986 |
}
|
| 2987 |
],
|
| 2988 |
-
"rust_unit_tests":
|
| 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": 279,
|
| 2989 |
"source_report": "docs/research/qvm-health-impulse.json",
|
| 2990 |
"source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
|
| 2991 |
}
|
scripts/analyze_rust_defuse_sequence.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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-defuse'],check=True,capture_output=True)
|
| 9 |
+
binary=Path(os.environ.get('CARGO_TARGET_DIR','target'))/'debug'/'urt-defuse'
|
| 10 |
+
path=Path('docs/research/qvm-defuse-sequence.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 ['frames']},rust=result(binary,'sequence',encode(p['input']))))
|
| 13 |
+
write_json(Path('docs/research/rust-defuse-sequence.json'),dict(source_report=str(path),source_report_sha256=hashlib.sha256(data).hexdigest(),probes=probes,limits='Finite source/Rust contract parity; native time/file/network replies remain supplied or captured.'))
|
| 14 |
+
|
| 15 |
+
from analyze_rust_defuse_complete import encode as base_encode
|
| 16 |
+
def encode(a):return base_encode(a)+[a['profile']]
|
| 17 |
+
if __name__=='__main__':main()
|
scripts/test_rust_defuse_sequence.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-defuse-sequence.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-defuse-sequence.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
|
@@ -4282,3 +4282,35 @@ report scripts/analyze_qvm_defuse_sequence.py docs/research/qvm-defuse-sequence.
|
|
| 4282 |
edge docs/research/qvm-defuse-sequence.json scripts/test_qvm_defuse_sequence.py
|
| 4283 |
group qvm-defuse-sequence scripts/analyze_qvm_defuse_sequence.py
|
| 4284 |
edge scripts/analyze_qvm_defuse_sequence.py scripts/analyze_qvm_resumer_audit.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4282 |
edge docs/research/qvm-defuse-sequence.json scripts/test_qvm_defuse_sequence.py
|
| 4283 |
group qvm-defuse-sequence scripts/analyze_qvm_defuse_sequence.py
|
| 4284 |
edge scripts/analyze_qvm_defuse_sequence.py scripts/analyze_qvm_resumer_audit.py
|
| 4285 |
+
report scripts/analyze_rust_defuse_sequence.py docs/research/rust-defuse-sequence.json
|
| 4286 |
+
edge docs/research/rust-defuse-sequence.json scripts/test_rust_defuse_sequence.py
|
| 4287 |
+
group rust-defuse-sequence scripts/analyze_rust_defuse_sequence.py
|
| 4288 |
+
edge scripts/analyze_rust_defuse_sequence.py scripts/analyze_qvm_resumer_audit.py
|
| 4289 |
+
edge Cargo.toml scripts/analyze_rust_defuse_sequence.py
|
| 4290 |
+
edge Cargo.lock scripts/analyze_rust_defuse_sequence.py
|
| 4291 |
+
edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_defuse_sequence.py
|
| 4292 |
+
edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_defuse_sequence.py
|
| 4293 |
+
edge crates/urt-gameplay/src/filter_loading.rs scripts/analyze_rust_defuse_sequence.py
|
| 4294 |
+
edge crates/urt-gameplay/src/filter_lifecycle.rs scripts/analyze_rust_defuse_sequence.py
|
| 4295 |
+
edge crates/urt-gameplay/src/native_policy.rs scripts/analyze_rust_defuse_sequence.py
|
| 4296 |
+
edge crates/urt-gameplay/src/bin/urt-filter-loading.rs scripts/analyze_rust_defuse_sequence.py
|
| 4297 |
+
edge crates/urt-gameplay/src/qvm_format.rs scripts/analyze_rust_defuse_sequence.py
|
| 4298 |
+
edge docs/research/qvm-defuse-sequence.json scripts/analyze_rust_defuse_sequence.py
|
| 4299 |
+
group rust-defuse-sequence scripts/analyze_rust_health_impulse.py
|
| 4300 |
+
group gameplay scripts/analyze_rust_defuse_sequence.py
|
| 4301 |
+
edge crates/urt-gameplay/src/filter_commands.rs scripts/analyze_rust_defuse_sequence.py
|
| 4302 |
+
edge crates/urt-gameplay/src/bin/urt-filter-commands.rs scripts/analyze_rust_defuse_sequence.py
|
| 4303 |
+
edge crates/urt-gameplay/src/client_timer.rs scripts/analyze_rust_defuse_sequence.py
|
| 4304 |
+
edge crates/urt-gameplay/src/bin/urt-client-timer.rs scripts/analyze_rust_defuse_sequence.py
|
| 4305 |
+
edge crates/urt-gameplay/src/client_processing.rs scripts/analyze_rust_defuse_sequence.py
|
| 4306 |
+
edge crates/urt-gameplay/src/bin/urt-client-processing.rs scripts/analyze_rust_defuse_sequence.py
|
| 4307 |
+
edge crates/urt-gameplay/src/client_move_context.rs scripts/analyze_rust_defuse_sequence.py
|
| 4308 |
+
edge crates/urt-gameplay/src/bin/urt-client-move-context.rs scripts/analyze_rust_defuse_sequence.py
|
| 4309 |
+
edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_defuse_sequence.py
|
| 4310 |
+
edge crates/urt-gameplay/src/bin/urt-move-callbacks.rs scripts/analyze_rust_defuse_sequence.py
|
| 4311 |
+
edge crates/urt-gameplay/src/assistance.rs scripts/analyze_rust_defuse_sequence.py
|
| 4312 |
+
edge crates/urt-gameplay/src/bin/urt-assistance.rs scripts/analyze_rust_defuse_sequence.py
|
| 4313 |
+
edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_defuse_sequence.py
|
| 4314 |
+
edge crates/urt-gameplay/src/defuse.rs scripts/analyze_rust_defuse_sequence.py
|
| 4315 |
+
edge crates/urt-gameplay/src/bin/urt-defuse.rs scripts/analyze_rust_defuse_sequence.py
|
| 4316 |
+
edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_defuse_sequence.py
|
xtask/src/lib.rs
CHANGED
|
@@ -1160,6 +1160,8 @@ mod integration_tests {
|
|
| 1160 |
("move_callbacks", "defuse_finish"),
|
| 1161 |
("defuse", "defuse_complete"),
|
| 1162 |
("move_callbacks", "defuse_complete"),
|
|
|
|
|
|
|
| 1163 |
("client_move_context", "client_move_scratch"),
|
| 1164 |
("client_processing", "client_routing"),
|
| 1165 |
("client_timer", "client_routing"),
|
|
@@ -1392,6 +1394,7 @@ mod integration_tests {
|
|
| 1392 |
("qvm-defuse-cancel", "defuse_cancel"),
|
| 1393 |
("qvm-defuse-finish", "defuse_finish"),
|
| 1394 |
("qvm-defuse-complete", "defuse_complete"),
|
|
|
|
| 1395 |
("qvm-client-move-scratch", "client_move_scratch"),
|
| 1396 |
("qvm-client-routing", "client_routing"),
|
| 1397 |
("qvm-client-command-rewrite", "client_command_rewrite"),
|
|
|
|
| 1160 |
("move_callbacks", "defuse_finish"),
|
| 1161 |
("defuse", "defuse_complete"),
|
| 1162 |
("move_callbacks", "defuse_complete"),
|
| 1163 |
+
("defuse", "defuse_sequence"),
|
| 1164 |
+
("move_callbacks", "defuse_sequence"),
|
| 1165 |
("client_move_context", "client_move_scratch"),
|
| 1166 |
("client_processing", "client_routing"),
|
| 1167 |
("client_timer", "client_routing"),
|
|
|
|
| 1394 |
("qvm-defuse-cancel", "defuse_cancel"),
|
| 1395 |
("qvm-defuse-finish", "defuse_finish"),
|
| 1396 |
("qvm-defuse-complete", "defuse_complete"),
|
| 1397 |
+
("qvm-defuse-sequence", "defuse_sequence"),
|
| 1398 |
("qvm-client-move-scratch", "client_move_scratch"),
|
| 1399 |
("qvm-client-routing", "client_routing"),
|
| 1400 |
("qvm-client-command-rewrite", "client_command_rewrite"),
|