gameplay: port filter insertion mutation semantics
Browse files- crates/urt-gameplay/src/bin/urt-native-policy.rs +77 -0
- crates/urt-gameplay/src/native_policy.rs +148 -0
- docs/FINDINGS.md +3 -0
- docs/PROVISIONAL_TODO.md +6 -0
- docs/RESEARCH_LEDGER.md +7 -0
- docs/REVERSE_ENGINEERING_TODO.md +7 -1
- docs/TESTING.md +3 -0
- docs/research/QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md +51 -0
- docs/research/QVM_CONNECT_POLICY_BATCH.md +3 -1
- docs/research/README.md +6 -0
- docs/research/RUST_FILTER_INSERT.md +7 -0
- docs/research/rust-filter-insert.json +0 -0
- docs/research/rust-health-impulse.json +1 -1
- scripts/analyze_rust_filter_insert.py +14 -0
- scripts/test_rust_filter_insert.py +9 -0
- xtask/checks.tsv +13 -0
- xtask/src/lib.rs +11 -0
crates/urt-gameplay/src/bin/urt-native-policy.rs
CHANGED
|
@@ -1133,6 +1133,52 @@ fn run() -> Result<String, String> {
|
|
| 1133 |
out.ring_advance
|
| 1134 |
))
|
| 1135 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1136 |
_ => Err("unknown command".into()),
|
| 1137 |
}
|
| 1138 |
}
|
|
@@ -1619,3 +1665,34 @@ fn notices_json(sends: &[TeamNotice]) -> String {
|
|
| 1619 |
.join(",")
|
| 1620 |
)
|
| 1621 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1133 |
out.ring_advance
|
| 1134 |
))
|
| 1135 |
}
|
| 1136 |
+
"filter-insert" => {
|
| 1137 |
+
if w.len() < 3 || w[0] > 5 {
|
| 1138 |
+
return Err("invalid insert header".into());
|
| 1139 |
+
}
|
| 1140 |
+
let mut p = 2;
|
| 1141 |
+
let text = input_blob(&w, &mut p)?.ok_or("null filter")?;
|
| 1142 |
+
if p != w.len() {
|
| 1143 |
+
return Err("trailing insert words".into());
|
| 1144 |
+
}
|
| 1145 |
+
let (mut count, mut records) = filter_fixture(w[0]);
|
| 1146 |
+
let before_count = count;
|
| 1147 |
+
let prior = records.clone();
|
| 1148 |
+
let out = insert_filter(&mut records, &mut count, &text, w[1] as i32)
|
| 1149 |
+
.map_err(|e| format!("{e:?}"))?;
|
| 1150 |
+
let diagnostics = out
|
| 1151 |
+
.diagnostics
|
| 1152 |
+
.iter()
|
| 1153 |
+
.map(|d| match d {
|
| 1154 |
+
FilterDiagnostic::Full => r#"{"op":"full"}"#.into(),
|
| 1155 |
+
FilterDiagnostic::BadAddress(text) => {
|
| 1156 |
+
format!(r#"{{"op":"bad-address","text":"{}"}}"#, hex(text))
|
| 1157 |
+
}
|
| 1158 |
+
})
|
| 1159 |
+
.collect::<Vec<String>>()
|
| 1160 |
+
.join(",");
|
| 1161 |
+
let row = |r: FilterRecord| list(&[r.mask, r.comparison, r.metadata]);
|
| 1162 |
+
let before = out.slot.map(|j| row(prior[j])).unwrap_or("null".into());
|
| 1163 |
+
let after = out.slot.map(|j| row(records[j])).unwrap_or("null".into());
|
| 1164 |
+
let mut hash = 14695981039346656037u64;
|
| 1165 |
+
for r in &records {
|
| 1166 |
+
for word in [r.mask, r.comparison, r.metadata] {
|
| 1167 |
+
for byte in word.to_le_bytes() {
|
| 1168 |
+
hash = (hash ^ byte as u64).wrapping_mul(1099511628211);
|
| 1169 |
+
}
|
| 1170 |
+
}
|
| 1171 |
+
}
|
| 1172 |
+
Ok(format!(
|
| 1173 |
+
r#"{{"result":{},"slot":{},"parsed":{},"diagnostics":[{diagnostics}],"exports":{},"before_count":{before_count},"count":{count},"before":{before},"after":{after},"checksum":{hash}}}"#,
|
| 1174 |
+
u32::from(out.result),
|
| 1175 |
+
out.slot.map(|j| j.to_string()).unwrap_or("null".into()),
|
| 1176 |
+
out.parsed
|
| 1177 |
+
.map(|v| u32::from(v).to_string())
|
| 1178 |
+
.unwrap_or("null".into()),
|
| 1179 |
+
if out.export { "[252500]" } else { "[]" }
|
| 1180 |
+
))
|
| 1181 |
+
}
|
| 1182 |
_ => Err("unknown command".into()),
|
| 1183 |
}
|
| 1184 |
}
|
|
|
|
| 1665 |
.join(",")
|
| 1666 |
)
|
| 1667 |
}
|
| 1668 |
+
|
| 1669 |
+
fn filter_fixture(profile: u32) -> (usize, Vec<FilterRecord>) {
|
| 1670 |
+
let n = if profile == 0 {
|
| 1671 |
+
0
|
| 1672 |
+
} else if profile >= 4 {
|
| 1673 |
+
4096
|
| 1674 |
+
} else {
|
| 1675 |
+
3
|
| 1676 |
+
};
|
| 1677 |
+
let mut rows = (0..n)
|
| 1678 |
+
.map(|j| FilterRecord {
|
| 1679 |
+
mask: u32::MAX,
|
| 1680 |
+
comparison: j as u32 + 1,
|
| 1681 |
+
metadata: 100 + j as u32,
|
| 1682 |
+
})
|
| 1683 |
+
.collect::<Vec<_>>();
|
| 1684 |
+
if matches!(profile, 2 | 4) {
|
| 1685 |
+
rows[0].comparison = u32::MAX;
|
| 1686 |
+
}
|
| 1687 |
+
if profile == 3 {
|
| 1688 |
+
rows[1].comparison = u32::MAX;
|
| 1689 |
+
}
|
| 1690 |
+
if n < 4096 {
|
| 1691 |
+
rows.push(FilterRecord {
|
| 1692 |
+
mask: 0x11223344,
|
| 1693 |
+
comparison: 0x55667788,
|
| 1694 |
+
metadata: 0x99aabbcc,
|
| 1695 |
+
});
|
| 1696 |
+
}
|
| 1697 |
+
(n, rows)
|
| 1698 |
+
}
|
crates/urt-gameplay/src/native_policy.rs
CHANGED
|
@@ -3109,3 +3109,151 @@ mod resolved_complete_tests {
|
|
| 3109 |
assert_eq!(selector, 0);
|
| 3110 |
}
|
| 3111 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3109 |
assert_eq!(selector, 0);
|
| 3110 |
}
|
| 3111 |
}
|
| 3112 |
+
|
| 3113 |
+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
| 3114 |
+
pub struct FilterRecord {
|
| 3115 |
+
pub mask: u32,
|
| 3116 |
+
pub comparison: u32,
|
| 3117 |
+
pub metadata: u32,
|
| 3118 |
+
}
|
| 3119 |
+
#[derive(Clone, Debug, PartialEq, Eq)]
|
| 3120 |
+
pub enum FilterDiagnostic {
|
| 3121 |
+
Full,
|
| 3122 |
+
BadAddress(Vec<u8>),
|
| 3123 |
+
}
|
| 3124 |
+
#[derive(Clone, Debug, PartialEq, Eq)]
|
| 3125 |
+
pub struct FilterInsert {
|
| 3126 |
+
pub result: bool,
|
| 3127 |
+
pub slot: Option<usize>,
|
| 3128 |
+
pub parsed: Option<bool>,
|
| 3129 |
+
pub diagnostics: Vec<FilterDiagnostic>,
|
| 3130 |
+
pub export: bool,
|
| 3131 |
+
}
|
| 3132 |
+
/// Original252304 safe token subset: missing components remain wildcarded;
|
| 3133 |
+
/// a sole * is wildcard, other digit/* tokens use numeric-prefix conversion.
|
| 3134 |
+
fn parse_filter(text: &[u8]) -> Result<Result<(u32, u32), Vec<u8>>, Error> {
|
| 3135 |
+
let text = cbytes(text);
|
| 3136 |
+
if text.len() > 1024 {
|
| 3137 |
+
return Err(Error::InvalidInput);
|
| 3138 |
+
}
|
| 3139 |
+
let (mut p, mut mask, mut value) = (0, [0u8; 4], [0u8; 4]);
|
| 3140 |
+
for j in 0..4 {
|
| 3141 |
+
if p >= text.len() || !(text[p].is_ascii_digit() || text[p] == b'*') {
|
| 3142 |
+
return Ok(Err(text[p..].to_vec()));
|
| 3143 |
+
}
|
| 3144 |
+
let start = p;
|
| 3145 |
+
while p < text.len() && (text[p].is_ascii_digit() || text[p] == b'*') {
|
| 3146 |
+
p += 1;
|
| 3147 |
+
}
|
| 3148 |
+
let token = &text[start..p];
|
| 3149 |
+
if token.len() >= 128 {
|
| 3150 |
+
return Err(Error::InvalidInput);
|
| 3151 |
+
}
|
| 3152 |
+
if token != b"*" {
|
| 3153 |
+
value[j] = signed_prefix(token) as u8;
|
| 3154 |
+
mask[j] = 255;
|
| 3155 |
+
}
|
| 3156 |
+
if p == text.len() {
|
| 3157 |
+
break;
|
| 3158 |
+
}
|
| 3159 |
+
p += 1;
|
| 3160 |
+
}
|
| 3161 |
+
Ok(Ok((u32::from_le_bytes(mask), u32::from_le_bytes(value))))
|
| 3162 |
+
}
|
| 3163 |
+
/// Original252829 mutates on parser failure: append count persists, comparison
|
| 3164 |
+
/// becomes-1, and optional export is still requested. Unsupported domains stage
|
| 3165 |
+
/// no writes; normal full-capacity refusal is a false result with a diagnostic.
|
| 3166 |
+
pub fn insert_filter(
|
| 3167 |
+
records: &mut [FilterRecord],
|
| 3168 |
+
count: &mut usize,
|
| 3169 |
+
text: &[u8],
|
| 3170 |
+
save: i32,
|
| 3171 |
+
) -> Result<FilterInsert, Error> {
|
| 3172 |
+
if *count > 4096 || *count > records.len() || records.len() > 4096 {
|
| 3173 |
+
return Err(Error::InvalidCount);
|
| 3174 |
+
}
|
| 3175 |
+
let slot = records[..*count]
|
| 3176 |
+
.iter()
|
| 3177 |
+
.position(|v| v.comparison == u32::MAX)
|
| 3178 |
+
.unwrap_or(*count);
|
| 3179 |
+
if slot == *count && *count == 4096 {
|
| 3180 |
+
return Ok(FilterInsert {
|
| 3181 |
+
result: false,
|
| 3182 |
+
slot: None,
|
| 3183 |
+
parsed: None,
|
| 3184 |
+
diagnostics: vec![FilterDiagnostic::Full],
|
| 3185 |
+
export: false,
|
| 3186 |
+
});
|
| 3187 |
+
}
|
| 3188 |
+
if slot >= records.len() {
|
| 3189 |
+
return Err(Error::InvalidCount);
|
| 3190 |
+
}
|
| 3191 |
+
let parsed = parse_filter(text)?;
|
| 3192 |
+
let appended = slot == *count;
|
| 3193 |
+
let (success, diagnostics) = match parsed {
|
| 3194 |
+
Ok((mask, comparison)) => {
|
| 3195 |
+
records[slot] = FilterRecord {
|
| 3196 |
+
mask,
|
| 3197 |
+
comparison,
|
| 3198 |
+
metadata: u32::MAX,
|
| 3199 |
+
};
|
| 3200 |
+
(true, vec![])
|
| 3201 |
+
}
|
| 3202 |
+
Err(remaining) => {
|
| 3203 |
+
records[slot].comparison = u32::MAX;
|
| 3204 |
+
(false, vec![FilterDiagnostic::BadAddress(remaining)])
|
| 3205 |
+
}
|
| 3206 |
+
};
|
| 3207 |
+
if appended {
|
| 3208 |
+
*count += 1;
|
| 3209 |
+
}
|
| 3210 |
+
Ok(FilterInsert {
|
| 3211 |
+
result: true,
|
| 3212 |
+
slot: Some(slot),
|
| 3213 |
+
parsed: Some(success),
|
| 3214 |
+
diagnostics,
|
| 3215 |
+
export: save != 0,
|
| 3216 |
+
})
|
| 3217 |
+
}
|
| 3218 |
+
#[cfg(test)]
|
| 3219 |
+
mod filter_insert_tests {
|
| 3220 |
+
use super::*;
|
| 3221 |
+
#[test]
|
| 3222 |
+
fn invalid_parse_keeps_growth_and_export() {
|
| 3223 |
+
let mut r = [FilterRecord {
|
| 3224 |
+
mask: 7,
|
| 3225 |
+
comparison: 8,
|
| 3226 |
+
metadata: 9,
|
| 3227 |
+
}];
|
| 3228 |
+
let mut n = 0;
|
| 3229 |
+
let out = insert_filter(&mut r, &mut n, b"bad", 1).unwrap();
|
| 3230 |
+
assert!(out.result);
|
| 3231 |
+
assert_eq!(out.parsed, Some(false));
|
| 3232 |
+
assert!(out.export);
|
| 3233 |
+
assert_eq!(n, 1);
|
| 3234 |
+
assert_eq!(
|
| 3235 |
+
r[0],
|
| 3236 |
+
FilterRecord {
|
| 3237 |
+
mask: 7,
|
| 3238 |
+
comparison: u32::MAX,
|
| 3239 |
+
metadata: 9
|
| 3240 |
+
}
|
| 3241 |
+
);
|
| 3242 |
+
}
|
| 3243 |
+
#[test]
|
| 3244 |
+
fn unsupported_token_is_atomic() {
|
| 3245 |
+
let mut r = [FilterRecord {
|
| 3246 |
+
mask: 7,
|
| 3247 |
+
comparison: 8,
|
| 3248 |
+
metadata: 9,
|
| 3249 |
+
}];
|
| 3250 |
+
let before = r;
|
| 3251 |
+
let mut n = 0;
|
| 3252 |
+
assert_eq!(
|
| 3253 |
+
insert_filter(&mut r, &mut n, &vec![b'1'; 128], 0),
|
| 3254 |
+
Err(Error::InvalidInput)
|
| 3255 |
+
);
|
| 3256 |
+
assert_eq!(r, before);
|
| 3257 |
+
assert_eq!(n, 0);
|
| 3258 |
+
}
|
| 3259 |
+
}
|
docs/FINDINGS.md
CHANGED
|
@@ -1796,3 +1796,6 @@ RE-813–822 replaces the scoreboard decimal assumption with actual37914 executi
|
|
| 1796 |
|
| 1797 |
|
| 1798 |
**RE-932:** 132 actual252829/252304/37159 cases recover first-hole reuse, append/count growth,4096 capacity, wildcard/numeric masks, modulo-byte values and permissive separators. Parsing failure still returns outer success1, marks comparison-1 and preserves other fields; count growth is not rolled back. Successful insert sets metadata-1. Optional252500 export is requested even after parse failure; full-capacity refusal skips it. Full-table scans execute with a bounded262144-instruction budget. Table/export/network provenance and malformed counts remain open. [Evidence](research/QVM_FILTER_INSERT.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1796 |
|
| 1797 |
|
| 1798 |
**RE-932:** 132 actual252829/252304/37159 cases recover first-hole reuse, append/count growth,4096 capacity, wildcard/numeric masks, modulo-byte values and permissive separators. Parsing failure still returns outer success1, marks comparison-1 and preserves other fields; count growth is not rolled back. Successful insert sets metadata-1. Optional252500 export is requested even after parse failure; full-capacity refusal skips it. Full-table scans execute with a bounded262144-instruction budget. Table/export/network provenance and malformed counts remain open. [Evidence](research/QVM_FILTER_INSERT.md).
|
| 1799 |
+
|
| 1800 |
+
|
| 1801 |
+
**RE-933:** Rust matches132 original252829/252304 table cases including4096-capacity scans, first-hole reuse, wildcard/numeric masks and comparison-1 sentinel behavior. Parser failure retains count growth and requests optional export, matching the source. Typed malformed counts/token-overflow domains reject atomically. Export body252500, live table writers and native network acceptance remain open. [Evidence](research/RUST_FILTER_INSERT.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1839,3 +1839,9 @@ RE-931: Rust matches96 complete source173979/161744/182896 compositions, includi
|
|
| 1839 |
|
| 1840 |
|
| 1841 |
RE-932: 132 actual252829/252304/37159 cases recover first-hole reuse, append/count growth,4096 capacity, wildcard/numeric masks, modulo-byte values and permissive separators. Parsing failure still returns outer success1, marks comparison-1 and preserves other fields; count growth is not rolled back. Successful insert sets metadata-1. Optional252500 export is requested even after parse failure; full-capacity refusal skips it. Full-table scans execute with a bounded262144-instruction budget. Table/export/network provenance and malformed counts remain open. Full runtime completion remains open. [Evidence](research/QVM_FILTER_INSERT.md).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1839 |
|
| 1840 |
|
| 1841 |
RE-932: 132 actual252829/252304/37159 cases recover first-hole reuse, append/count growth,4096 capacity, wildcard/numeric masks, modulo-byte values and permissive separators. Parsing failure still returns outer success1, marks comparison-1 and preserves other fields; count growth is not rolled back. Successful insert sets metadata-1. Optional252500 export is requested even after parse failure; full-capacity refusal skips it. Full-table scans execute with a bounded262144-instruction budget. Table/export/network provenance and malformed counts remain open. Full runtime completion remains open. [Evidence](research/QVM_FILTER_INSERT.md).
|
| 1842 |
+
|
| 1843 |
+
|
| 1844 |
+
RE-933: Rust matches132 original252829/252304 table cases including4096-capacity scans, first-hole reuse, wildcard/numeric masks and comparison-1 sentinel behavior. Parser failure retains count growth and requests optional export, matching the source. Typed malformed counts/token-overflow domains reject atomically. Export body252500, live table writers and native network acceptance remain open. Full runtime completion remains open. [Evidence](research/RUST_FILTER_INSERT.md).
|
| 1845 |
+
|
| 1846 |
+
|
| 1847 |
+
RE-924–933 completed bounded bot settings, announcement, connect-child composition and filter insertion contracts. RE-934 tracks bot setup/userinfo/filter export, native resource/network acceptance and complete runtime integration. [Batch and next work](research/QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md).
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -2390,3 +2390,10 @@ Rust matches96 complete source173979/161744/182896 compositions, including setti
|
|
| 2390 |
## 2026-10-28 — RE-932 Original address-filter table insertion and wildcard parser
|
| 2391 |
|
| 2392 |
132 actual252829/252304/37159 cases recover first-hole reuse, append/count growth,4096 capacity, wildcard/numeric masks, modulo-byte values and permissive separators. Parsing failure still returns outer success1, marks comparison-1 and preserves other fields; count growth is not rolled back. Successful insert sets metadata-1. Optional252500 export is requested even after parse failure; full-capacity refusal skips it. Full-table scans execute with a bounded262144-instruction budget. Table/export/network provenance and malformed counts remain open. Focused `cargo xtask test-group qvm-filter-insert` passes (4 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2390 |
## 2026-10-28 — RE-932 Original address-filter table insertion and wildcard parser
|
| 2391 |
|
| 2392 |
132 actual252829/252304/37159 cases recover first-hole reuse, append/count growth,4096 capacity, wildcard/numeric masks, modulo-byte values and permissive separators. Parsing failure still returns outer success1, marks comparison-1 and preserves other fields; count growth is not rolled back. Successful insert sets metadata-1. Optional252500 export is requested even after parse failure; full-capacity refusal skips it. Full-table scans execute with a bounded262144-instruction budget. Table/export/network provenance and malformed counts remain open. Focused `cargo xtask test-group qvm-filter-insert` passes (4 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.
|
| 2393 |
+
|
| 2394 |
+
|
| 2395 |
+
## 2026-10-28 — RE-933 Rust filter insertion and non-rollback semantics
|
| 2396 |
+
|
| 2397 |
+
Rust matches132 original252829/252304 table cases including4096-capacity scans, first-hole reuse, wildcard/numeric masks and comparison-1 sentinel behavior. Parser failure retains count growth and requests optional export, matching the source. Typed malformed counts/token-overflow domains reject atomically. Export body252500, live table writers and native network acceptance remain open. Focused `cargo xtask test-group rust-filter-insert` 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.
|
| 2398 |
+
|
| 2399 |
+
Batch RE-924–933 boundary: the single `cargo xtask test-full --since bc3e7621` run after commit ten passed with the flake-declared Nix Python: 1,798 Python tests, 225 Rust tests (assets 10, gameplay 185, xtask 30), 42 deterministic report producers, storage policy, 502 documentation files and whitespace guards. No generated report drift. Validation notes were amended into task ten; original assets unchanged. See [batch findings and next work](research/QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md).
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -1848,7 +1848,7 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1848 |
- [x] RE-923 Rust complete connect policy composition ([evidence](research/RUST_CONNECT_COMPLETE.md)).
|
| 1849 |
|
| 1850 |
|
| 1851 |
-
- [ ] RE-
|
| 1852 |
|
| 1853 |
|
| 1854 |
- [x] RE-924 Original bot settings admission wrapper ([evidence](research/QVM_BOT_SETTINGS.md)).
|
|
@@ -1876,3 +1876,9 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1876 |
|
| 1877 |
|
| 1878 |
- [x] RE-932 Original address-filter table insertion and wildcard parser ([evidence](research/QVM_FILTER_INSERT.md)).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1848 |
- [x] RE-923 Rust complete connect policy composition ([evidence](research/RUST_CONNECT_COMPLETE.md)).
|
| 1849 |
|
| 1850 |
|
| 1851 |
+
- [ ] Follow-up after RE-923: recover bot/userinfo/team/ranking callback bodies, filter writers and native engine acceptance, with remaining scalar/alias and full runtime integration ([next work](research/QVM_CONNECT_POLICY_BATCH.md)).
|
| 1852 |
|
| 1853 |
|
| 1854 |
- [x] RE-924 Original bot settings admission wrapper ([evidence](research/QVM_BOT_SETTINGS.md)).
|
|
|
|
| 1876 |
|
| 1877 |
|
| 1878 |
- [x] RE-932 Original address-filter table insertion and wildcard parser ([evidence](research/QVM_FILTER_INSERT.md)).
|
| 1879 |
+
|
| 1880 |
+
|
| 1881 |
+
- [x] RE-933 Rust filter insertion and non-rollback semantics ([evidence](research/RUST_FILTER_INSERT.md)).
|
| 1882 |
+
|
| 1883 |
+
|
| 1884 |
+
- [ ] RE-934 Recover bot setup/userinfo/filter-export internals, native resource/network acceptance and remaining runtime integration ([next work](research/QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md)).
|
docs/TESTING.md
CHANGED
|
@@ -172,3 +172,6 @@ RE-904–913 adds focused groups `qvm-session-init`, `rust-session-init`, `qvm-p
|
|
| 172 |
|
| 173 |
|
| 174 |
RE-914–923 adds `qvm-byte-compare`, `rust-byte-compare`, `qvm-address-filter`, `rust-address-filter`, `qvm-connect-admission`, `rust-connect-admission`, `qvm-connect-tail`, `rust-connect-tail`, `qvm-connect-complete` and `rust-connect-complete`. Invoke one group per command. Full validation after task ten uses `cargo xtask test-full --since 2b1ac7ec` with explicit flake-declared Nix PYTHON. [Bounded connect evidence](research/QVM_CONNECT_POLICY_BATCH.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 172 |
|
| 173 |
|
| 174 |
RE-914–923 adds `qvm-byte-compare`, `rust-byte-compare`, `qvm-address-filter`, `rust-address-filter`, `qvm-connect-admission`, `rust-connect-admission`, `qvm-connect-tail`, `rust-connect-tail`, `qvm-connect-complete` and `rust-connect-complete`. Invoke one group per command. Full validation after task ten uses `cargo xtask test-full --since 2b1ac7ec` with explicit flake-declared Nix PYTHON. [Bounded connect evidence](research/QVM_CONNECT_POLICY_BATCH.md).
|
| 175 |
+
|
| 176 |
+
|
| 177 |
+
RE-924–933 adds `qvm-bot-settings`, `rust-bot-settings`, `qvm-team-announcement`, `rust-team-announcement`, `qvm-resolved-connect-tail`, `rust-resolved-connect-tail`, `qvm-resolved-connect-complete`, `rust-resolved-connect-complete`, `qvm-filter-insert` and `rust-filter-insert`. Use one group per invocation. Full validation after task ten uses `cargo xtask test-full --since bc3e7621` with explicit flake-declared Nix PYTHON. [Callback/filter evidence](research/QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md).
|
docs/research/QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Connect children and filter insertion: RE-924–933
|
| 2 |
+
|
| 3 |
+
Ten separately committed tasks recover concrete callback bodies, integrate them into connect policies, and recover filter-table insertion across822 paired source/Rust cases. Native125185 bot setup,171668 userinfo mutation, ranking, engine/network/IO and filter export252500 remain explicit supplied/captured boundaries. This evidence does not establish native multiplayer acceptance or complete gameplay.
|
| 4 |
+
|
| 5 |
+
| Task | Evidence | Cases |
|
| 6 |
+
| --- | --- | ---: |
|
| 7 |
+
| RE-924 | [Bot161744 settings/drop wrapper](QVM_BOT_SETTINGS.md) | 288 |
|
| 8 |
+
| RE-925 | [Rust bot setup record](RUST_BOT_SETTINGS.md) | 288 |
|
| 9 |
+
| RE-926 | [Announcement182896](QVM_TEAM_ANNOUNCEMENT.md) | 162 |
|
| 10 |
+
| RE-927 | [Rust exact announcements](RUST_TEAM_ANNOUNCEMENT.md) | 162 |
|
| 11 |
+
| RE-928 | [Suffix with recovered children](QVM_RESOLVED_CONNECT_TAIL.md) | 144 |
|
| 12 |
+
| RE-929 | [Rust composed suffix children](RUST_RESOLVED_CONNECT_TAIL.md) | 144 |
|
| 13 |
+
| RE-930 | [Whole connect with recovered children](QVM_RESOLVED_CONNECT_COMPLETE.md) | 96 |
|
| 14 |
+
| RE-931 | [Rust whole connect child policies](RUST_RESOLVED_CONNECT_COMPLETE.md) | 96 |
|
| 15 |
+
| RE-932 | [Filter252829 insertion/252304 parser](QVM_FILTER_INSERT.md) | 132 |
|
| 16 |
+
| RE-933 | [Rust filter insertion semantics](RUST_FILTER_INSERT.md) | 132 |
|
| 17 |
+
|
| 18 |
+
## Bot setup wrapper and announcement semantics
|
| 19 |
+
|
| 20 |
+
Actual161744 requests native userinfo, then looks up characterfile, skill and team through actual70503. It copies characterfile/team into144-byte fields with143 logical bytes plus NUL padding; the four bytes between those fields contain the raw f32 result of actual37144/36779 skill conversion. This292-byte settings record, client slot and restart argument reach125185. A nonzero supplied result becomes1; zero captures native -17 drop with exact BotAISetupClient failed text, then returns0. Fixtures include long/raw-byte strings, negative/prefix skills, restart values and negative nonzero setup replies. Setup125185 internals, botlib allocations and engine drop acceptance remain open.
|
| 21 |
+
|
| 22 |
+
Actual182896 is an announcement body, with no team-selection mutation. Teams0/1/2 broadcast `ccprint "5" "name" "team"`; team3 broadcasts spectator text only when the supplied previous team differs from3. Other team values do nothing. Original70458/37914 performs formatting, including raw name bytes and wrapping global23708. Native sends are captured. Earlier event/API labels Join and choice identify this historical request boundary; the parameter is previous-team context, not a new team choice.
|
| 23 |
+
|
| 24 |
+
The144 suffix and96 whole-caller fixtures replace the supplied161744 boolean and captured182896 request with these original bodies. Parent control flow, client/entity state, messages and persistence timing remain identical to the earlier caller fixtures. New evidence includes actual bot settings records and drop requests, the additional three userinfo-selector toggles per bot wrapper, precise team broadcasts and extra formatter advancement. The separate child records attach to parent Bot/Join markers. Rust derives these pure supplied-snapshot policies without executing native effects. Actual setup, arbitrary userinfo mutations and ranking/network/logging callbacks still need integration.
|
| 25 |
+
|
| 26 |
+
## Filter table mutation
|
| 27 |
+
|
| 28 |
+
Actual252829 scans comparison words for the first -1 hole, otherwise appends and increments count36275948, with an exact4096-capacity refusal. It calls actual252304 to parse the input. That parser initializes four mask/value bytes, accepts digit/* tokens separated by any single separator, uses sole * as wildcard, and otherwise applies original signed integer-prefix conversion then stores the low byte. Missing components remain wildcarded; empty/trailing-invalid components fail. Masks/values are little-endian words. Very long integer tokens, malformed counts and raw pointer/token overflow outside the verified safe subset remain open.
|
| 29 |
+
|
| 30 |
+
On parse success, the selected record receives mask/value and metadata-1. On parse failure, comparison becomes-1 while mask/metadata remain as before; an already-grown count is not rolled back. The outer routine returns1 even for this parser failure and requests optional252500 export. A full-capacity refusal returns0 and skips export. Fixtures cover empty/append/reused-hole/full-capacity tables, wildcard and mixed tokens, invalid text and255.255.255.255. The latter comparison word equals the hole sentinel; this ambiguity is preserved rather than reinterpreted. Export body252500 and its treatment of sentinels remain open.
|
| 31 |
+
|
| 32 |
+
Full4096-entry source scans use a bounded262144-instruction budget; table-wide FNV-1a checksums and before/after record snapshots verify untouched entries as well as the selected slot. Rust requires explicit table storage/count, stages unsupported domains without mutation, and preserves normal parse-failure mutation/export semantics. Its safe token domain rejects128-byte component tokens before the original scratch-buffer boundary. This is not strict IP validation or a native network filter implementation.
|
| 33 |
+
|
| 34 |
+
## Validation
|
| 35 |
+
|
| 36 |
+
Each task ran focused `cargo xtask test-group <name>` before its own commit, including deterministic double regeneration, relevant source/Rust parity, scoped gameplay tests and storage/documentation/whitespace guards. Groups are qvm-bot-settings, rust-bot-settings, qvm-team-announcement, rust-team-announcement, qvm-resolved-connect-tail, rust-resolved-connect-tail, qvm-resolved-connect-complete, rust-resolved-connect-complete, qvm-filter-insert and rust-filter-insert. Shared parent policies received focused regression checks.
|
| 37 |
+
|
| 38 |
+
Dependency-selection regression coverage includes all five new source/Rust report pairs, native_policy consumers and formatting dependencies. Existing health/session import smoke checks remain intact. Every Python process uses the resolved Nix runtime declared by flake.nix, with explicit PYTHON for xtask and Git hooks. Original assets are unchanged.
|
| 39 |
+
|
| 40 |
+
After task ten, the single `cargo xtask test-full --since bc3e7621` run passed: 1,798 Python tests, 225 Rust tests (assets 10, gameplay 185, xtask 30), 42 deterministic report producers, storage policy, documentation links across 502 files and whitespace guards. Report regeneration left no drift. These validation notes are amended into task ten, preserving ten task commits for the batch.
|
| 41 |
+
|
| 42 |
+
## Next work: RE-934
|
| 43 |
+
|
| 44 |
+
- [ ] Recover125185 bot setup internals and native botlib resource/failure ownership, then compose them with161744 and whole connect.
|
| 45 |
+
- [ ] Recover171668 userinfo parsing/sanitization/state mutation and all related callbacks; compose actual5864 ranking/publication and native network effects.
|
| 46 |
+
- [ ] Recover252500 filter export and related removal/expiry/table writers; verify comparison-1 sentinel ambiguity, malformed counts/token overflow and live network provenance.
|
| 47 |
+
- [ ] Attach real cvar/file/network adapters and validate actual connect/reload/failure behavior on macOS/Linux, preserving observed operation order.
|
| 48 |
+
- [ ] Extend scanner/string/alias domains and trace actual caller scratch provenance.
|
| 49 |
+
- [ ] Compose series6939/readiness, native commands, bot rotation/genetics and221662 map-list parsing.
|
| 50 |
+
- [ ] Replace supplied spatial-query answers with native broadphase/world collision, and complete respawn/intermission/event/scoreboard integration.
|
| 51 |
+
- [ ] Validate actual Linux/macOS Rust/Bevy/Solari gameplay/rendering. Full-game completion remains open.
|
docs/research/QVM_CONNECT_POLICY_BATCH.md
CHANGED
|
@@ -43,7 +43,7 @@ Every task ran focused `cargo xtask test-group <name>` before its own commit, wi
|
|
| 43 |
|
| 44 |
Dependency-selection regression coverage includes the five new source/Rust report pairs, native_policy consumers and intermission/formatting dependencies. The existing health/session helper import smoke check remains in place. Every Python process uses the resolved Nix runtime declared by flake.nix, with explicit PYTHON for xtask and Git hooks. After commit ten, `cargo xtask test-full --since 2b1ac7ec` passed on its first full attempt: 1,783 Python tests and216 Rust tests (assets10, gameplay176, xtask30). All32 affected report producers regenerated twice deterministically. Storage policy, links across491 documentation files and whitespace checks passed with no generated-report drift. Validation notes were amended into task ten.
|
| 45 |
|
| 46 |
-
##
|
| 47 |
|
| 48 |
- [ ] Recover161744 bot admission,171668 userinfo mutation and182896 team-join callback bodies, then compose them with173979 and actual5864 ranking/publication.
|
| 49 |
- [ ] Recover address-filter table writers and native IP/userinfo provenance; verify partial-address stack provenance, aliases, malformed counts and live configuration changes.
|
|
@@ -53,3 +53,5 @@ Dependency-selection regression coverage includes the five new source/Rust repor
|
|
| 53 |
- [ ] Replace supplied spatial-query answers with recovered native broadphase/world collision and compare native math.
|
| 54 |
- [ ] Compose complete respawn/intermission, event lifetime and scoreboard/network execution.
|
| 55 |
- [ ] Validate actual Linux/macOS Rust/Bevy/Solari gameplay/rendering. Full-game completion remains open.
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
Dependency-selection regression coverage includes the five new source/Rust report pairs, native_policy consumers and intermission/formatting dependencies. The existing health/session helper import smoke check remains in place. Every Python process uses the resolved Nix runtime declared by flake.nix, with explicit PYTHON for xtask and Git hooks. After commit ten, `cargo xtask test-full --since 2b1ac7ec` passed on its first full attempt: 1,783 Python tests and216 Rust tests (assets10, gameplay176, xtask30). All32 affected report producers regenerated twice deterministically. Storage policy, links across491 documentation files and whitespace checks passed with no generated-report drift. Validation notes were amended into task ten.
|
| 45 |
|
| 46 |
+
## Follow-up work (expanded by RE-924–933)
|
| 47 |
|
| 48 |
- [ ] Recover161744 bot admission,171668 userinfo mutation and182896 team-join callback bodies, then compose them with173979 and actual5864 ranking/publication.
|
| 49 |
- [ ] Recover address-filter table writers and native IP/userinfo provenance; verify partial-address stack provenance, aliases, malformed counts and live configuration changes.
|
|
|
|
| 53 |
- [ ] Replace supplied spatial-query answers with recovered native broadphase/world collision and compare native math.
|
| 54 |
- [ ] Compose complete respawn/intermission, event lifetime and scoreboard/network execution.
|
| 55 |
- [ ] Validate actual Linux/macOS Rust/Bevy/Solari gameplay/rendering. Full-game completion remains open.
|
| 56 |
+
|
| 57 |
+
[RE-924–933](QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md) recovers bot settings, announcement and filter-insertion bodies and composes the connect children. Its RE-934 list supersedes the historical follow-up list above.
|
docs/research/README.md
CHANGED
|
@@ -1411,3 +1411,9 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 1411 |
|
| 1412 |
|
| 1413 |
[RE-932: Original address-filter table insertion and wildcard parser](QVM_FILTER_INSERT.md).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1411 |
|
| 1412 |
|
| 1413 |
[RE-932: Original address-filter table insertion and wildcard parser](QVM_FILTER_INSERT.md).
|
| 1414 |
+
|
| 1415 |
+
|
| 1416 |
+
[RE-933: Rust filter insertion and non-rollback semantics](RUST_FILTER_INSERT.md).
|
| 1417 |
+
|
| 1418 |
+
|
| 1419 |
+
[RE-924–933 bot/announcement/filter batch](QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md).
|
docs/research/RUST_FILTER_INSERT.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Rust filter insertion and non-rollback semantics
|
| 2 |
+
|
| 3 |
+
RE-933. Reproduce with `python3 scripts/analyze_rust_filter_insert.py`; focused validation: `cargo xtask test-group rust-filter-insert`. [Machine report](rust-filter-insert.json).
|
| 4 |
+
|
| 5 |
+
Rust matches132 original252829/252304 table cases including4096-capacity scans, first-hole reuse, wildcard/numeric masks and comparison-1 sentinel behavior. Parser failure retains count growth and requests optional export, matching the source. Typed malformed counts/token-overflow domains reject atomically. Export body252500, live table writers and native network acceptance remain open.
|
| 6 |
+
|
| 7 |
+
Original executable/native runtime and complete Linux/macOS Rust/Bevy/Solari acceptance remain unverified.
|
docs/research/rust-filter-insert.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": 185,
|
| 2989 |
"source_report": "docs/research/qvm-health-impulse.json",
|
| 2990 |
"source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
|
| 2991 |
}
|
scripts/analyze_rust_filter_insert.py
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
import hashlib,json
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from rust_native_policy_support import binary,result,invoke
|
| 5 |
+
from analyze_qvm import write_json
|
| 6 |
+
def encode(s):
|
| 7 |
+
a=s['input'];text=bytes.fromhex(a['text']);return [a['profile'],a['save'],len(text),*text]
|
| 8 |
+
def project(s):return {k:s[k] for k in ['result','slot','parsed','diagnostics','exports','before_count','count','before','after','checksum']}
|
| 9 |
+
|
| 10 |
+
def main():
|
| 11 |
+
b=binary();p=Path('docs/research/qvm-filter-insert.json');data=p.read_bytes();rows=[]
|
| 12 |
+
for s in json.loads(data)['probes']:rows.append({'source':project(s),'rust':result(b,'filter-insert',encode(s))})
|
| 13 |
+
write_json(Path('docs/research/rust-filter-insert.json'),{'source_report':str(p),'source_report_sha256':hashlib.sha256(data).hexdigest(),'probes':rows,'limits':'Rust matches132 original252829/252304 table cases including4096-capacity scans, first-hole reuse, wildcard/numeric masks and comparison-1 sentinel behavior. Parser failure retains count growth and requests optional export, matching the source. Typed malformed counts/token-overflow domains reject atomically. Export body252500, live table writers and native network acceptance remain open.'})
|
| 14 |
+
if __name__=='__main__':main()
|
scripts/test_rust_filter_insert.py
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import hashlib,json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
class PortTests(unittest.TestCase):
|
| 4 |
+
def test_all_original_cases(self):
|
| 5 |
+
r=json.loads(Path('docs/research/rust-filter-insert.json').read_text());src=json.loads(Path(r['source_report']).read_text());self.assertEqual(len(r['probes']),len(src['probes']));self.assertGreater(len(r['probes']),20)
|
| 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-filter-insert.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
|
@@ -3092,3 +3092,16 @@ group qvm-filter-insert scripts/analyze_qvm_filter_insert.py
|
|
| 3092 |
edge scripts/analyze_qvm_filter_insert.py scripts/analyze_qvm_resumer_audit.py
|
| 3093 |
edge scripts/qvm_filter_insert_oracle.py scripts/analyze_qvm_resumer_audit.py
|
| 3094 |
edge scripts/qvm_filter_update_support.py scripts/analyze_qvm_resumer_audit.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3092 |
edge scripts/analyze_qvm_filter_insert.py scripts/analyze_qvm_resumer_audit.py
|
| 3093 |
edge scripts/qvm_filter_insert_oracle.py scripts/analyze_qvm_resumer_audit.py
|
| 3094 |
edge scripts/qvm_filter_update_support.py scripts/analyze_qvm_resumer_audit.py
|
| 3095 |
+
edge Cargo.toml scripts/analyze_rust_filter_insert.py
|
| 3096 |
+
edge Cargo.lock scripts/analyze_rust_filter_insert.py
|
| 3097 |
+
edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_filter_insert.py
|
| 3098 |
+
edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_filter_insert.py
|
| 3099 |
+
edge crates/urt-gameplay/src/native_policy.rs scripts/analyze_rust_filter_insert.py
|
| 3100 |
+
edge crates/urt-gameplay/src/bin/urt-native-policy.rs scripts/analyze_rust_filter_insert.py
|
| 3101 |
+
edge docs/research/qvm-filter-insert.json scripts/analyze_rust_filter_insert.py
|
| 3102 |
+
group rust-filter-insert scripts/analyze_rust_health_impulse.py
|
| 3103 |
+
group gameplay scripts/analyze_rust_filter_insert.py
|
| 3104 |
+
report scripts/analyze_rust_filter_insert.py docs/research/rust-filter-insert.json
|
| 3105 |
+
edge docs/research/rust-filter-insert.json scripts/test_rust_filter_insert.py
|
| 3106 |
+
group rust-filter-insert scripts/analyze_rust_filter_insert.py
|
| 3107 |
+
edge scripts/analyze_rust_filter_insert.py scripts/analyze_qvm_resumer_audit.py
|
xtask/src/lib.rs
CHANGED
|
@@ -1123,6 +1123,12 @@ mod integration_tests {
|
|
| 1123 |
("native_policy", "connect_tail"),
|
| 1124 |
("native_policy", "connect_complete"),
|
| 1125 |
("intermission", "connect_complete"),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1126 |
("protected", "protected_update"),
|
| 1127 |
("mode10", "mode10_entry"),
|
| 1128 |
("intercept_animation", "mode10_animation"),
|
|
@@ -1207,6 +1213,11 @@ mod integration_tests {
|
|
| 1207 |
("qvm-connect-admission", "connect_admission"),
|
| 1208 |
("qvm-connect-tail", "connect_tail"),
|
| 1209 |
("qvm-connect-complete", "connect_complete"),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1210 |
("qvm-rank-small-sort", "rank_sort"),
|
| 1211 |
("qvm-rank-large-sort", "rank_sort"),
|
| 1212 |
("qvm-ranking-complete", "ranking_complete"),
|
|
|
|
| 1123 |
("native_policy", "connect_tail"),
|
| 1124 |
("native_policy", "connect_complete"),
|
| 1125 |
("intermission", "connect_complete"),
|
| 1126 |
+
("native_policy", "bot_settings"),
|
| 1127 |
+
("native_policy", "team_announcement"),
|
| 1128 |
+
("native_policy", "resolved_connect_tail"),
|
| 1129 |
+
("native_policy", "resolved_connect_complete"),
|
| 1130 |
+
("native_policy", "filter_insert"),
|
| 1131 |
+
("qvm_format", "resolved_connect_complete"),
|
| 1132 |
("protected", "protected_update"),
|
| 1133 |
("mode10", "mode10_entry"),
|
| 1134 |
("intercept_animation", "mode10_animation"),
|
|
|
|
| 1213 |
("qvm-connect-admission", "connect_admission"),
|
| 1214 |
("qvm-connect-tail", "connect_tail"),
|
| 1215 |
("qvm-connect-complete", "connect_complete"),
|
| 1216 |
+
("qvm-bot-settings", "bot_settings"),
|
| 1217 |
+
("qvm-team-announcement", "team_announcement"),
|
| 1218 |
+
("qvm-resolved-connect-tail", "resolved_connect_tail"),
|
| 1219 |
+
("qvm-resolved-connect-complete", "resolved_connect_complete"),
|
| 1220 |
+
("qvm-filter-insert", "filter_insert"),
|
| 1221 |
("qvm-rank-small-sort", "rank_sort"),
|
| 1222 |
("qvm-rank-large-sort", "rank_sort"),
|
| 1223 |
("qvm-ranking-complete", "ranking_complete"),
|