nmarshall commited on
Commit
ed9db0e
·
1 Parent(s): 88cec55

gameplay: compose filter removal and file effects

Browse files
crates/urt-gameplay/src/bin/urt-filter-policy.rs CHANGED
@@ -4,21 +4,38 @@ fn hex(s: &[u8]) -> String {
4
  s.iter().map(|v| format!("{v:02x}")).collect()
5
  }
6
  fn export_json(p: Option<FilterExport>) -> String {
7
- match p {
8
- None => "{\"events\":[],\"formats\":[],\"buffer\":\"7374616c65\"}".into(),
9
- Some(p) => format!(
10
- "{{\"events\":[{{\"op\":\"print\",\"text\":\"57726974696e673a2062616e6c6973742e7478740a\"}},{{\"op\":\"open\",\"path\":\"62616e6c6973742e747874\",\"mode\":1}},{{\"op\":\"write\",\"handle\":{},\"text\":\"{}\"}},{{\"op\":\"close\",\"handle\":{}}}],\"formats\":[{}],\"buffer\":\"{}\"}}",
11
- p.handle,
12
- hex(&p.text),
13
- p.handle,
14
- p.lines
15
- .iter()
16
- .map(|l| format!("\"{}\"", hex(l)))
17
- .collect::<Vec<_>>()
18
- .join(","),
19
- hex(&p.text)
20
- ),
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  }
23
  fn rows(w: &[u32]) -> Vec<FilterRecord> {
24
  w.chunks_exact(3)
@@ -84,6 +101,11 @@ fn main() {
84
  assert_eq!(w.len(), 5 + l + 3 * n);
85
  let mut records = rows(&w[5 + l..]);
86
  match kind.as_str() {
 
 
 
 
 
87
  "metadata" => {
88
  let p = update_filter_metadata(&mut records, &text, w[1], w[2] as i32).unwrap();
89
  println!("{}", mutation_json(p, &records, vec![]));
 
4
  s.iter().map(|v| format!("{v:02x}")).collect()
5
  }
6
  fn export_json(p: Option<FilterExport>) -> String {
7
+ let Some(p) = p else {
8
+ return "{\"events\":[],\"formats\":[],\"buffer\":\"7374616c65\"}".into();
9
+ };
10
+ let events = p
11
+ .effects()
12
+ .iter()
13
+ .map(|e| match e {
14
+ FilterFileEffect::Print(t) => format!(r#"{{"op":"print","text":"{}"}}"#, hex(t)),
15
+ FilterFileEffect::Open { path, mode } => {
16
+ format!(r#"{{"op":"open","path":"{}","mode":{}}}"#, hex(path), mode)
17
+ }
18
+ FilterFileEffect::Write { handle, bytes } => format!(
19
+ r#"{{"op":"write","handle":{},"text":"{}"}}"#,
20
+ handle,
21
+ hex(bytes)
22
+ ),
23
+ FilterFileEffect::Close(handle) => format!(r#"{{"op":"close","handle":{}}}"#, handle),
24
+ })
25
+ .collect::<Vec<_>>()
26
+ .join(",");
27
+ let lines = p
28
+ .lines
29
+ .iter()
30
+ .map(|l| format!("\"{}\"", hex(l)))
31
+ .collect::<Vec<_>>()
32
+ .join(",");
33
+ format!(
34
+ r#"{{"events":[{}],"formats":[{}],"buffer":"{}"}}"#,
35
+ events,
36
+ lines,
37
+ hex(&p.text)
38
+ )
39
  }
40
  fn rows(w: &[u32]) -> Vec<FilterRecord> {
41
  w.chunks_exact(3)
 
101
  assert_eq!(w.len(), 5 + l + 3 * n);
102
  let mut records = rows(&w[5 + l..]);
103
  match kind.as_str() {
104
+ "remove-export" => {
105
+ let p = remove_filter_export(&mut records, &text, w[3]).unwrap();
106
+ let exported = p.export.map(|p| export_json(Some(p))).into_iter().collect();
107
+ println!("{}", mutation_json(p.mutation, &records, exported));
108
+ }
109
  "metadata" => {
110
  let p = update_filter_metadata(&mut records, &text, w[1], w[2] as i32).unwrap();
111
  println!("{}", mutation_json(p, &records, vec![]));
crates/urt-gameplay/src/filter_lifecycle.rs CHANGED
@@ -290,3 +290,119 @@ mod insertion_export_tests {
290
  assert_eq!(rows, vec![row; 4096]);
291
  }
292
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
290
  assert_eq!(rows, vec![row; 4096]);
291
  }
292
  }
293
+
294
+ /// Ordered native-boundary effects of original252500. The open reply is supplied
295
+ /// when constructing the plan; write/close deliberately retain that raw handle.
296
+ #[derive(Clone, Debug, PartialEq, Eq)]
297
+ pub enum FilterFileEffect {
298
+ Print(Vec<u8>),
299
+ Open { path: &'static [u8], mode: i32 },
300
+ Write { handle: u32, bytes: Vec<u8> },
301
+ Close(u32),
302
+ }
303
+ impl FilterExport {
304
+ pub fn effects(&self) -> [FilterFileEffect; 4] {
305
+ [
306
+ FilterFileEffect::Print(b"Writing: banlist.txt\n".to_vec()),
307
+ FilterFileEffect::Open {
308
+ path: b"banlist.txt",
309
+ mode: 1,
310
+ },
311
+ FilterFileEffect::Write {
312
+ handle: self.handle,
313
+ bytes: self.text.clone(),
314
+ },
315
+ FilterFileEffect::Close(self.handle),
316
+ ]
317
+ }
318
+ }
319
+ #[derive(Clone, Debug, PartialEq, Eq)]
320
+ pub struct PersistedMutation {
321
+ pub mutation: FilterMutation,
322
+ pub export: Option<FilterExport>,
323
+ }
324
+ /// Compose253296 with252500. Failed lookup/parse skips export; successful
325
+ /// first-match removal retains count and exports all surviving comparison words.
326
+ pub fn remove_filter_export(
327
+ records: &mut [FilterRecord],
328
+ text: &[u8],
329
+ handle: u32,
330
+ ) -> Result<PersistedMutation, Error> {
331
+ let mut staged = records.to_vec();
332
+ let mutation = remove_filter(&mut staged, text)?;
333
+ let export = if mutation.export {
334
+ export_filters(&staged, handle)?
335
+ } else {
336
+ None
337
+ };
338
+ records.copy_from_slice(&staged);
339
+ Ok(PersistedMutation { mutation, export })
340
+ }
341
+ #[cfg(test)]
342
+ mod removal_export_tests {
343
+ use super::*;
344
+ #[test]
345
+ fn sole_removal_still_prints_opens_writes_and_closes_zero_handle() {
346
+ let mut rows = [FilterRecord {
347
+ mask: u32::MAX,
348
+ comparison: 0x04030201,
349
+ metadata: 9,
350
+ }];
351
+ let p = remove_filter_export(&mut rows, b"1.2.3.4", 0).unwrap();
352
+ assert!(p.mutation.result);
353
+ let export = p.export.unwrap();
354
+ assert_eq!(export.text, b"");
355
+ assert_eq!(
356
+ export.effects(),
357
+ [
358
+ FilterFileEffect::Print(b"Writing: banlist.txt\n".to_vec()),
359
+ FilterFileEffect::Open {
360
+ path: b"banlist.txt",
361
+ mode: 1
362
+ },
363
+ FilterFileEffect::Write {
364
+ handle: 0,
365
+ bytes: vec![]
366
+ },
367
+ FilterFileEffect::Close(0)
368
+ ]
369
+ );
370
+ }
371
+ #[test]
372
+ fn duplicate_survivor_is_exported_with_its_own_metadata() {
373
+ let row = FilterRecord {
374
+ mask: u32::MAX,
375
+ comparison: 0x04030201,
376
+ metadata: 9,
377
+ };
378
+ let mut rows = [
379
+ row,
380
+ FilterRecord {
381
+ metadata: 10,
382
+ ..row
383
+ },
384
+ ];
385
+ let p = remove_filter_export(&mut rows, b"1.2.3.4", u32::MAX).unwrap();
386
+ assert_eq!(p.export.unwrap().text, b"1.2.3.4:10\n");
387
+ assert_eq!(rows[0].metadata, 9);
388
+ assert_eq!(rows.len(), 2);
389
+ }
390
+ #[test]
391
+ fn misses_skip_io_and_unsupported_domains_are_atomic() {
392
+ let row = FilterRecord {
393
+ mask: u32::MAX,
394
+ comparison: 0x04030201,
395
+ metadata: 9,
396
+ };
397
+ let mut rows = [row];
398
+ assert!(
399
+ remove_filter_export(&mut rows, b"2.3.4.5", 7)
400
+ .unwrap()
401
+ .export
402
+ .is_none()
403
+ );
404
+ assert_eq!(rows, [row]);
405
+ assert!(remove_filter_export(&mut rows, &[b'1'; 128], 7).is_err());
406
+ assert_eq!(rows, [row]);
407
+ }
408
+ }
docs/FINDINGS.md CHANGED
@@ -1817,3 +1817,5 @@ RE-940: Twenty-four original252829/252304/252500 compositions verify table check
1817
  RE-941: Rust matches24 source insertion/export compositions, including all table checksums, optional export payloads, sentinel omission, mask loss and zero-handle empty writes after parser failure. The staged API preserves ordinary source mutation semantics and rejects unsupported domains atomically. Unit tests also cover4096-capacity refusal without export and unsupported-token rollback. Native filesystem operations remain plans for a future adapter. [Evidence](research/RUST_FILTER_INSERT_EXPORT.md).
1818
 
1819
  RE-942: Thirty original253296/252304/252500 compositions verify first-match removal, retained row metadata/masks/count, diagnostics and exact survivor export bytes. A sole removed record leaves a nonzero count and therefore causes an empty file write. Duplicate survivors remain serialized in original order. Parse failures and misses never invoke export. Native console/file operations are captured; actual filesystem errors and reload semantics remain open. [Evidence](research/QVM_FILTER_REMOVE_EXPORT.md).
 
 
 
1817
  RE-941: Rust matches24 source insertion/export compositions, including all table checksums, optional export payloads, sentinel omission, mask loss and zero-handle empty writes after parser failure. The staged API preserves ordinary source mutation semantics and rejects unsupported domains atomically. Unit tests also cover4096-capacity refusal without export and unsupported-token rollback. Native filesystem operations remain plans for a future adapter. [Evidence](research/RUST_FILTER_INSERT_EXPORT.md).
1818
 
1819
  RE-942: Thirty original253296/252304/252500 compositions verify first-match removal, retained row metadata/masks/count, diagnostics and exact survivor export bytes. A sole removed record leaves a nonzero count and therefore causes an empty file write. Duplicate survivors remain serialized in original order. Parse failures and misses never invoke export. Native console/file operations are captured; actual filesystem errors and reload semantics remain open. [Evidence](research/QVM_FILTER_REMOVE_EXPORT.md).
1820
+
1821
+ RE-943: Rust matches30 original removal/export compositions, retaining first-match mutation, duplicate survivor order, unchanged count and metadata, diagnostics, sentinel omission and empty writes after sole removal. A typed four-effect sequence exposes print/open/write/close in source order and retains raw supplied handles. Unit tests cover zero handles, duplicate survivor bytes, misses without IO and atomic unsupported-domain rejection. Native execution, reload and time/expiry semantics remain open. [Evidence](research/RUST_FILTER_REMOVE_EXPORT.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -1844,7 +1844,7 @@ RE-932: 132 actual252829/252304/37159 cases recover first-hole reuse, append/cou
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).
1848
 
1849
  - [x] RE-934 Original filter export and native file-operation order ([evidence](research/QVM_FILTER_EXPORT.md)).
1850
 
@@ -1863,3 +1863,7 @@ RE-924–933 completed bounded bot settings, announcement, connect-child composi
1863
  - [x] RE-941 Rust insertion with recovered export composition ([evidence](research/RUST_FILTER_INSERT_EXPORT.md)).
1864
 
1865
  - [x] RE-942 Original removal composed with export and survivor serialization ([evidence](research/QVM_FILTER_REMOVE_EXPORT.md)).
 
 
 
 
 
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. The following batch recovers filter persistence; bot setup/userinfo, native resource/network acceptance and complete runtime integration remain open. [Batch and next work](research/QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md).
1848
 
1849
  - [x] RE-934 Original filter export and native file-operation order ([evidence](research/QVM_FILTER_EXPORT.md)).
1850
 
 
1863
  - [x] RE-941 Rust insertion with recovered export composition ([evidence](research/RUST_FILTER_INSERT_EXPORT.md)).
1864
 
1865
  - [x] RE-942 Original removal composed with export and survivor serialization ([evidence](research/QVM_FILTER_REMOVE_EXPORT.md)).
1866
+
1867
+ - [x] RE-943 Rust removal with survivor export and typed file effects ([evidence](research/RUST_FILTER_REMOVE_EXPORT.md)).
1868
+
1869
+ RE-934–943 completed bounded filter export/removal/metadata and insertion/removal persistence compositions. RE-944 tracks loading/time/command callers, live adapters and runtime integration. [Batch and next work](research/QVM_FILTER_PERSISTENCE_BATCH.md).
docs/RESEARCH_LEDGER.md CHANGED
@@ -2433,3 +2433,9 @@ Rust matches24 source insertion/export compositions, including all table checksu
2433
  ## 2026-10-28 — RE-942 Original removal composed with export and survivor serialization
2434
 
2435
  Thirty original253296/252304/252500 compositions verify first-match removal, retained row metadata/masks/count, diagnostics and exact survivor export bytes. A sole removed record leaves a nonzero count and therefore causes an empty file write. Duplicate survivors remain serialized in original order. Parse failures and misses never invoke export. Native console/file operations are captured; actual filesystem errors and reload semantics remain open. Focused `cargo xtask test-group qvm-filter-remove-export` passes with deterministic report regeneration, relevant regressions and storage/documentation/whitespace checks. Full suite deferred to the tenth-commit boundary. Original assets unchanged; native IO effects remain captured.
 
 
 
 
 
 
 
2433
  ## 2026-10-28 — RE-942 Original removal composed with export and survivor serialization
2434
 
2435
  Thirty original253296/252304/252500 compositions verify first-match removal, retained row metadata/masks/count, diagnostics and exact survivor export bytes. A sole removed record leaves a nonzero count and therefore causes an empty file write. Duplicate survivors remain serialized in original order. Parse failures and misses never invoke export. Native console/file operations are captured; actual filesystem errors and reload semantics remain open. Focused `cargo xtask test-group qvm-filter-remove-export` passes with deterministic report regeneration, relevant regressions and storage/documentation/whitespace checks. Full suite deferred to the tenth-commit boundary. Original assets unchanged; native IO effects remain captured.
2436
+
2437
+ ## 2026-10-28 — RE-943 Rust removal with survivor export and typed file effects
2438
+
2439
+ Rust matches30 original removal/export compositions, retaining first-match mutation, duplicate survivor order, unchanged count and metadata, diagnostics, sentinel omission and empty writes after sole removal. A typed four-effect sequence exposes print/open/write/close in source order and retains raw supplied handles. Unit tests cover zero handles, duplicate survivor bytes, misses without IO and atomic unsupported-domain rejection. Native execution, reload and time/expiry semantics remain open. Focused `cargo xtask test-group rust-filter-remove-export` passes with deterministic report regeneration, relevant regressions and storage/documentation/whitespace checks. Full suite deferred to the tenth-commit boundary. Original assets unchanged; native IO effects remain captured.
2440
+
2441
+ Batch RE-934–943 boundary: the single `cargo xtask test-full --since 7bb397d4` run after commit ten passed with the flake-declared Nix Python: 1,818 Python tests, 236 Rust tests (assets10, gameplay196, xtask30), 92 deterministic report producers, storage policy, 513 documentation files and whitespace guards. No generated report drift. The focused dependency-selection regression also passed after adding the shared module/adapter edges for gameplay test-count metadata. Validation notes were amended into task ten; original assets unchanged. See [batch findings and next work](research/QVM_FILTER_PERSISTENCE_BATCH.md).
docs/REVERSE_ENGINEERING_TODO.md CHANGED
@@ -1881,7 +1881,7 @@ Purpose: turn the supplied installation into an evidence-backed specification of
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)).
1885
 
1886
  - [x] RE-934 Original filter export and native file-operation order ([evidence](research/QVM_FILTER_EXPORT.md)).
1887
 
@@ -1900,3 +1900,7 @@ Purpose: turn the supplied installation into an evidence-backed specification of
1900
  - [x] RE-941 Rust insertion with recovered export composition ([evidence](research/RUST_FILTER_INSERT_EXPORT.md)).
1901
 
1902
  - [x] RE-942 Original removal composed with export and survivor serialization ([evidence](research/QVM_FILTER_REMOVE_EXPORT.md)).
 
 
 
 
 
1881
  - [x] RE-933 Rust filter insertion and non-rollback semantics ([evidence](research/RUST_FILTER_INSERT.md)).
1882
 
1883
 
1884
+ RE-934–943 continue the prior batch with filter export/removal/metadata and composed persistence. Bot setup/userinfo and native acceptance remain open.
1885
 
1886
  - [x] RE-934 Original filter export and native file-operation order ([evidence](research/QVM_FILTER_EXPORT.md)).
1887
 
 
1900
  - [x] RE-941 Rust insertion with recovered export composition ([evidence](research/RUST_FILTER_INSERT_EXPORT.md)).
1901
 
1902
  - [x] RE-942 Original removal composed with export and survivor serialization ([evidence](research/QVM_FILTER_REMOVE_EXPORT.md)).
1903
+
1904
+ - [x] RE-943 Rust removal with survivor export and typed file effects ([evidence](research/RUST_FILTER_REMOVE_EXPORT.md)).
1905
+
1906
+ - [ ] RE-944 Recover filter loading/time/commands, live file/network adapters, bot setup/userinfo and remaining Rust/Bevy/Solari integration ([next work](research/QVM_FILTER_PERSISTENCE_BATCH.md)).
docs/TESTING.md CHANGED
@@ -175,3 +175,5 @@ RE-914–923 adds `qvm-byte-compare`, `rust-byte-compare`, `qvm-address-filter`,
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).
 
 
 
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).
178
+
179
+ Filter persistence focused groups: `qvm-filter-export`, `rust-filter-export`, `qvm-filter-remove`, `rust-filter-remove`, `qvm-filter-metadata`, `rust-filter-metadata`, `qvm-filter-insert-export`, `rust-filter-insert-export`, `qvm-filter-remove-export` and `rust-filter-remove-export`. The shared Rust filter lifecycle module and adapter select all affected parity reports and scoped gameplay test metadata; formatter edits also select these consumers. Run one group per invocation. Native file effects are captured plans in these checks.
docs/research/QVM_BOT_ANNOUNCEMENT_FILTER_BATCH.md CHANGED
@@ -39,7 +39,7 @@ Dependency-selection regression coverage includes all five new source/Rust repor
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.
@@ -49,3 +49,5 @@ After task ten, the single `cargo xtask test-full --since bc3e7621` run passed:
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.
 
 
 
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
+ ## Historical next work after RE-933
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.
 
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.
52
+
53
+ Filter persistence follow-up: [RE-934–943 findings and current next work](QVM_FILTER_PERSISTENCE_BATCH.md).
docs/research/QVM_FILTER_PERSISTENCE_BATCH.md ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Filter persistence and mutation: RE-934–943
2
+
3
+ Ten tasks recover three original QVM routines, port each to Rust, then compose export with insertion and removal. The five source/Rust pairs cover **282 paired fixtures**. Every task has its own commit and focused `cargo xtask` validation. Native file operations remain captured effects; this evidence does not establish live filesystem, network or full-game acceptance.
4
+
5
+ | Tasks | Recovered contract | Paired fixtures |
6
+ | --- | --- | ---: |
7
+ | RE-934 / RE-935 | [Original export](QVM_FILTER_EXPORT.md) / [Rust export](RUST_FILTER_EXPORT.md) | 18 |
8
+ | RE-936 / RE-937 | [Original removal](QVM_FILTER_REMOVE.md) / [Rust removal](RUST_FILTER_REMOVE.md) | 30 |
9
+ | RE-938 / RE-939 | [Original metadata update](QVM_FILTER_METADATA.md) / [Rust metadata update](RUST_FILTER_METADATA.md) | 180 |
10
+ | RE-940 / RE-941 | [Original insertion/export](QVM_FILTER_INSERT_EXPORT.md) / [Rust insertion/export](RUST_FILTER_INSERT_EXPORT.md) | 24 |
11
+ | RE-942 / RE-943 | [Original removal/export](QVM_FILTER_REMOVE_EXPORT.md) / [Rust removal/export](RUST_FILTER_REMOVE_EXPORT.md) | 30 |
12
+
13
+ ## Recovered behavior
14
+
15
+ Actual252500 performs no file operations when the table count is zero. For a nonempty table it clears a 131072-byte buffer, visits rows in order, skips comparison words equal to -1, and formats each survivor as address bytes followed by signed metadata and LF. It ignores masks. It then prints the writing message, opens `banlist.txt` in mode1, writes the accumulated bytes and closes the supplied handle. A nonempty table containing only holes still opens and writes an empty file. Zero and negative handle replies are used without an intervening success check.
16
+
17
+ The source harness executes actual70386,37914 and69338 for formatting and bounded copies, including the original formatter's unusual wrapping-negation output for INT_MIN. Native memset/strncpy are explicitly modeled. Native console/open/write/close operations are captured. Rust reuses the recovered decimal formatter and exposes a typed sequence of file effects for a future adapter. For valid counts through4096, each line is at most28 bytes, so the complete payload fits below131072 bytes. The Rust test covers the maximum row count and rejects4097; malformed original counts and arbitrary pointer provenance remain outside the verified contract.
18
+
19
+ Actual253296 parses through252304/37159 and matches the exact mask/comparison pair. It removes only the first duplicate by setting its comparison to-1, retains mask/metadata/count, prints a removal diagnostic and exports. Missing pairs and invalid parses return0 without export. The broadcast comparison equals the hole sentinel, so a hole can match `255.255.255.255` and report successful removal again.
20
+
21
+ Actual252127 performs the same exact first-match scan, writes only the metadata word, and requests export only after a successful match with nonzero saving enabled. Metadata remains a raw word in the port; this routine alone does not establish time or expiry semantics. It can update metadata on a matching hole without activating it.
22
+
23
+ The compositions execute recovered export from the actual insertion/removal callbacks. They preserve table checksums, first-match ordering and native effect records. Insertion parse failure can retain count growth and still export an empty table. Sole-record removal also exports an empty table because it retains the nonzero count. Duplicate survivors keep their own metadata and original order. Serialized output loses wildcard masks; reload behavior needs to be recovered before assuming a faithful round trip.
24
+
25
+ ## Validation
26
+
27
+ Each task ran its own `cargo xtask test-group` before its commit: qvm/rust-filter-export, qvm/rust-filter-remove, qvm/rust-filter-metadata, qvm/rust-filter-insert-export and qvm/rust-filter-remove-export. Each selected report regenerated twice identically. Original-source checks use independent parsing/mutation/serialization expectations; Rust reports compare every projected field with its original fixture. Rust unit tests also cover4096-row bounds, duplicate preservation, ordinary parse-failure mutation, invalid handles, ordered file effects, misses without IO and atomic rejection of unsupported token domains.
28
+
29
+ The dependency registry maps both the new Rust module/adapter and formatter dependencies to the affected reports. Its focused regression includes all five source/Rust pairs. All Python processes use the flake-declared Nix runtime, including Git hooks. Original assets are unchanged. The single `cargo xtask test-full --since 7bb397d4` run after task ten passed: **1,818 Python tests**, **236 Rust tests** (assets10, gameplay196, xtask30), **92 deterministic report producers**, storage policy, links across **513 documentation files** and whitespace guards. Regeneration left no changes. Validation notes are amended into task ten, preserving ten commits for the batch.
30
+
31
+ ## Next work: RE-944
32
+
33
+ - [ ] Recover file loading at actual252933, including newline bounds, colon metadata parsing,252829/252127 interactions, missing files, short reads and native handle failures. Check exact caller addresses before extending the trace.
34
+ - [ ] Recover duration command252213, actual251995 time conversion and native time-structure provenance; establish metadata/expiry semantics from callers rather than names.
35
+ - [ ] Recover253100 add-filter command, client-number/userinfo lookup, native drop/command effects and console/client diagnostic paths.
36
+ - [ ] Compose write/reload with wildcard masks, holes, duplicates, INT_MIN metadata and repeated removal; document any lossy round trips.
37
+ - [ ] Implement and validate native file-effect adapters, preserving source ordering and actual engine error behavior on macOS/Linux.
38
+ - [ ] Recover125185 bot setup/resource ownership,171668 userinfo mutation and5864 ranking/publication; compose them with connect and native network effects.
39
+ - [ ] Continue native collision, spatial queries, respawn/intermission/event/scoreboard integration, asset conversion and Rust/Bevy/Solari runtime acceptance on macOS/Linux.
docs/research/README.md CHANGED
@@ -1435,3 +1435,7 @@ The extension collector adds five focused tests for native tail calls, command-r
1435
  - [RE-941: Rust insertion with recovered export composition](RUST_FILTER_INSERT_EXPORT.md).
1436
 
1437
  - [RE-942: Original removal composed with export and survivor serialization](QVM_FILTER_REMOVE_EXPORT.md).
 
 
 
 
 
1435
  - [RE-941: Rust insertion with recovered export composition](RUST_FILTER_INSERT_EXPORT.md).
1436
 
1437
  - [RE-942: Original removal composed with export and survivor serialization](QVM_FILTER_REMOVE_EXPORT.md).
1438
+
1439
+ - [RE-943: Rust removal with survivor export and typed file effects](RUST_FILTER_REMOVE_EXPORT.md).
1440
+
1441
+ - [RE-934–943 filter persistence batch and RE-944 next work](QVM_FILTER_PERSISTENCE_BATCH.md).
docs/research/RUST_FILTER_REMOVE_EXPORT.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Rust removal with survivor export and typed file effects
2
+
3
+ RE-943. Focused validation: `cargo xtask test-group rust-filter-remove-export`. [Machine report](rust-filter-remove-export.json).
4
+
5
+ Rust matches30 original removal/export compositions, retaining first-match mutation, duplicate survivor order, unchanged count and metadata, diagnostics, sentinel omission and empty writes after sole removal. A typed four-effect sequence exposes print/open/write/close in source order and retains raw supplied handles. Unit tests cover zero handles, duplicate survivor bytes, misses without IO and atomic unsupported-domain rejection. Native execution, reload and time/expiry semantics remain open.
docs/research/rust-filter-remove-export.json ADDED
@@ -0,0 +1,1583 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Finite recovered policy parity; native filesystem/network effects are not executed.",
3
+ "probes": [
4
+ {
5
+ "rust": {
6
+ "diagnostics": [
7
+ {
8
+ "op": "not-found",
9
+ "text": "312e322e332e34"
10
+ }
11
+ ],
12
+ "exported": [],
13
+ "exports": [],
14
+ "result": 0,
15
+ "rows": []
16
+ },
17
+ "source": {
18
+ "diagnostics": [
19
+ {
20
+ "op": "not-found",
21
+ "text": "312e322e332e34"
22
+ }
23
+ ],
24
+ "exported": [],
25
+ "exports": [],
26
+ "result": 0,
27
+ "rows": []
28
+ }
29
+ },
30
+ {
31
+ "rust": {
32
+ "diagnostics": [
33
+ {
34
+ "op": "not-found",
35
+ "text": "312e2a"
36
+ }
37
+ ],
38
+ "exported": [],
39
+ "exports": [],
40
+ "result": 0,
41
+ "rows": []
42
+ },
43
+ "source": {
44
+ "diagnostics": [
45
+ {
46
+ "op": "not-found",
47
+ "text": "312e2a"
48
+ }
49
+ ],
50
+ "exported": [],
51
+ "exports": [],
52
+ "result": 0,
53
+ "rows": []
54
+ }
55
+ },
56
+ {
57
+ "rust": {
58
+ "diagnostics": [
59
+ {
60
+ "op": "not-found",
61
+ "text": "2a"
62
+ }
63
+ ],
64
+ "exported": [],
65
+ "exports": [],
66
+ "result": 0,
67
+ "rows": []
68
+ },
69
+ "source": {
70
+ "diagnostics": [
71
+ {
72
+ "op": "not-found",
73
+ "text": "2a"
74
+ }
75
+ ],
76
+ "exported": [],
77
+ "exports": [],
78
+ "result": 0,
79
+ "rows": []
80
+ }
81
+ },
82
+ {
83
+ "rust": {
84
+ "diagnostics": [
85
+ {
86
+ "op": "bad-address",
87
+ "text": "626164"
88
+ }
89
+ ],
90
+ "exported": [],
91
+ "exports": [],
92
+ "result": 0,
93
+ "rows": []
94
+ },
95
+ "source": {
96
+ "diagnostics": [
97
+ {
98
+ "op": "bad-address",
99
+ "text": "626164"
100
+ }
101
+ ],
102
+ "exported": [],
103
+ "exports": [],
104
+ "result": 0,
105
+ "rows": []
106
+ }
107
+ },
108
+ {
109
+ "rust": {
110
+ "diagnostics": [
111
+ {
112
+ "op": "not-found",
113
+ "text": "3235352e3235352e3235352e323535"
114
+ }
115
+ ],
116
+ "exported": [],
117
+ "exports": [],
118
+ "result": 0,
119
+ "rows": []
120
+ },
121
+ "source": {
122
+ "diagnostics": [
123
+ {
124
+ "op": "not-found",
125
+ "text": "3235352e3235352e3235352e323535"
126
+ }
127
+ ],
128
+ "exported": [],
129
+ "exports": [],
130
+ "result": 0,
131
+ "rows": []
132
+ }
133
+ },
134
+ {
135
+ "rust": {
136
+ "diagnostics": [
137
+ {
138
+ "op": "bad-address",
139
+ "text": ""
140
+ }
141
+ ],
142
+ "exported": [],
143
+ "exports": [],
144
+ "result": 0,
145
+ "rows": []
146
+ },
147
+ "source": {
148
+ "diagnostics": [
149
+ {
150
+ "op": "bad-address",
151
+ "text": ""
152
+ }
153
+ ],
154
+ "exported": [],
155
+ "exports": [],
156
+ "result": 0,
157
+ "rows": []
158
+ }
159
+ },
160
+ {
161
+ "rust": {
162
+ "diagnostics": [
163
+ {
164
+ "op": "removed"
165
+ }
166
+ ],
167
+ "exported": [
168
+ {
169
+ "buffer": "",
170
+ "events": [
171
+ {
172
+ "op": "print",
173
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
174
+ },
175
+ {
176
+ "mode": 1,
177
+ "op": "open",
178
+ "path": "62616e6c6973742e747874"
179
+ },
180
+ {
181
+ "handle": 7,
182
+ "op": "write",
183
+ "text": ""
184
+ },
185
+ {
186
+ "handle": 7,
187
+ "op": "close"
188
+ }
189
+ ],
190
+ "formats": []
191
+ }
192
+ ],
193
+ "exports": [
194
+ 252500
195
+ ],
196
+ "result": 1,
197
+ "rows": [
198
+ [
199
+ 4294967295,
200
+ 4294967295,
201
+ 9
202
+ ]
203
+ ]
204
+ },
205
+ "source": {
206
+ "diagnostics": [
207
+ {
208
+ "op": "removed"
209
+ }
210
+ ],
211
+ "exported": [
212
+ {
213
+ "buffer": "",
214
+ "events": [
215
+ {
216
+ "op": "print",
217
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
218
+ },
219
+ {
220
+ "mode": 1,
221
+ "op": "open",
222
+ "path": "62616e6c6973742e747874"
223
+ },
224
+ {
225
+ "handle": 7,
226
+ "op": "write",
227
+ "text": ""
228
+ },
229
+ {
230
+ "handle": 7,
231
+ "op": "close"
232
+ }
233
+ ],
234
+ "formats": []
235
+ }
236
+ ],
237
+ "exports": [
238
+ 252500
239
+ ],
240
+ "result": 1,
241
+ "rows": [
242
+ [
243
+ 4294967295,
244
+ 4294967295,
245
+ 9
246
+ ]
247
+ ]
248
+ }
249
+ },
250
+ {
251
+ "rust": {
252
+ "diagnostics": [
253
+ {
254
+ "op": "not-found",
255
+ "text": "312e2a"
256
+ }
257
+ ],
258
+ "exported": [],
259
+ "exports": [],
260
+ "result": 0,
261
+ "rows": [
262
+ [
263
+ 4294967295,
264
+ 67305985,
265
+ 9
266
+ ]
267
+ ]
268
+ },
269
+ "source": {
270
+ "diagnostics": [
271
+ {
272
+ "op": "not-found",
273
+ "text": "312e2a"
274
+ }
275
+ ],
276
+ "exported": [],
277
+ "exports": [],
278
+ "result": 0,
279
+ "rows": [
280
+ [
281
+ 4294967295,
282
+ 67305985,
283
+ 9
284
+ ]
285
+ ]
286
+ }
287
+ },
288
+ {
289
+ "rust": {
290
+ "diagnostics": [
291
+ {
292
+ "op": "not-found",
293
+ "text": "2a"
294
+ }
295
+ ],
296
+ "exported": [],
297
+ "exports": [],
298
+ "result": 0,
299
+ "rows": [
300
+ [
301
+ 4294967295,
302
+ 67305985,
303
+ 9
304
+ ]
305
+ ]
306
+ },
307
+ "source": {
308
+ "diagnostics": [
309
+ {
310
+ "op": "not-found",
311
+ "text": "2a"
312
+ }
313
+ ],
314
+ "exported": [],
315
+ "exports": [],
316
+ "result": 0,
317
+ "rows": [
318
+ [
319
+ 4294967295,
320
+ 67305985,
321
+ 9
322
+ ]
323
+ ]
324
+ }
325
+ },
326
+ {
327
+ "rust": {
328
+ "diagnostics": [
329
+ {
330
+ "op": "bad-address",
331
+ "text": "626164"
332
+ }
333
+ ],
334
+ "exported": [],
335
+ "exports": [],
336
+ "result": 0,
337
+ "rows": [
338
+ [
339
+ 4294967295,
340
+ 67305985,
341
+ 9
342
+ ]
343
+ ]
344
+ },
345
+ "source": {
346
+ "diagnostics": [
347
+ {
348
+ "op": "bad-address",
349
+ "text": "626164"
350
+ }
351
+ ],
352
+ "exported": [],
353
+ "exports": [],
354
+ "result": 0,
355
+ "rows": [
356
+ [
357
+ 4294967295,
358
+ 67305985,
359
+ 9
360
+ ]
361
+ ]
362
+ }
363
+ },
364
+ {
365
+ "rust": {
366
+ "diagnostics": [
367
+ {
368
+ "op": "not-found",
369
+ "text": "3235352e3235352e3235352e323535"
370
+ }
371
+ ],
372
+ "exported": [],
373
+ "exports": [],
374
+ "result": 0,
375
+ "rows": [
376
+ [
377
+ 4294967295,
378
+ 67305985,
379
+ 9
380
+ ]
381
+ ]
382
+ },
383
+ "source": {
384
+ "diagnostics": [
385
+ {
386
+ "op": "not-found",
387
+ "text": "3235352e3235352e3235352e323535"
388
+ }
389
+ ],
390
+ "exported": [],
391
+ "exports": [],
392
+ "result": 0,
393
+ "rows": [
394
+ [
395
+ 4294967295,
396
+ 67305985,
397
+ 9
398
+ ]
399
+ ]
400
+ }
401
+ },
402
+ {
403
+ "rust": {
404
+ "diagnostics": [
405
+ {
406
+ "op": "bad-address",
407
+ "text": ""
408
+ }
409
+ ],
410
+ "exported": [],
411
+ "exports": [],
412
+ "result": 0,
413
+ "rows": [
414
+ [
415
+ 4294967295,
416
+ 67305985,
417
+ 9
418
+ ]
419
+ ]
420
+ },
421
+ "source": {
422
+ "diagnostics": [
423
+ {
424
+ "op": "bad-address",
425
+ "text": ""
426
+ }
427
+ ],
428
+ "exported": [],
429
+ "exports": [],
430
+ "result": 0,
431
+ "rows": [
432
+ [
433
+ 4294967295,
434
+ 67305985,
435
+ 9
436
+ ]
437
+ ]
438
+ }
439
+ },
440
+ {
441
+ "rust": {
442
+ "diagnostics": [
443
+ {
444
+ "op": "removed"
445
+ }
446
+ ],
447
+ "exported": [
448
+ {
449
+ "buffer": "312e322e332e343a31300a",
450
+ "events": [
451
+ {
452
+ "op": "print",
453
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
454
+ },
455
+ {
456
+ "mode": 1,
457
+ "op": "open",
458
+ "path": "62616e6c6973742e747874"
459
+ },
460
+ {
461
+ "handle": 7,
462
+ "op": "write",
463
+ "text": "312e322e332e343a31300a"
464
+ },
465
+ {
466
+ "handle": 7,
467
+ "op": "close"
468
+ }
469
+ ],
470
+ "formats": [
471
+ "312e322e332e343a31300a"
472
+ ]
473
+ }
474
+ ],
475
+ "exports": [
476
+ 252500
477
+ ],
478
+ "result": 1,
479
+ "rows": [
480
+ [
481
+ 4294967295,
482
+ 4294967295,
483
+ 9
484
+ ],
485
+ [
486
+ 4294967295,
487
+ 67305985,
488
+ 10
489
+ ]
490
+ ]
491
+ },
492
+ "source": {
493
+ "diagnostics": [
494
+ {
495
+ "op": "removed"
496
+ }
497
+ ],
498
+ "exported": [
499
+ {
500
+ "buffer": "312e322e332e343a31300a",
501
+ "events": [
502
+ {
503
+ "op": "print",
504
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
505
+ },
506
+ {
507
+ "mode": 1,
508
+ "op": "open",
509
+ "path": "62616e6c6973742e747874"
510
+ },
511
+ {
512
+ "handle": 7,
513
+ "op": "write",
514
+ "text": "312e322e332e343a31300a"
515
+ },
516
+ {
517
+ "handle": 7,
518
+ "op": "close"
519
+ }
520
+ ],
521
+ "formats": [
522
+ "312e322e332e343a31300a"
523
+ ]
524
+ }
525
+ ],
526
+ "exports": [
527
+ 252500
528
+ ],
529
+ "result": 1,
530
+ "rows": [
531
+ [
532
+ 4294967295,
533
+ 4294967295,
534
+ 9
535
+ ],
536
+ [
537
+ 4294967295,
538
+ 67305985,
539
+ 10
540
+ ]
541
+ ]
542
+ }
543
+ },
544
+ {
545
+ "rust": {
546
+ "diagnostics": [
547
+ {
548
+ "op": "not-found",
549
+ "text": "312e2a"
550
+ }
551
+ ],
552
+ "exported": [],
553
+ "exports": [],
554
+ "result": 0,
555
+ "rows": [
556
+ [
557
+ 4294967295,
558
+ 67305985,
559
+ 9
560
+ ],
561
+ [
562
+ 4294967295,
563
+ 67305985,
564
+ 10
565
+ ]
566
+ ]
567
+ },
568
+ "source": {
569
+ "diagnostics": [
570
+ {
571
+ "op": "not-found",
572
+ "text": "312e2a"
573
+ }
574
+ ],
575
+ "exported": [],
576
+ "exports": [],
577
+ "result": 0,
578
+ "rows": [
579
+ [
580
+ 4294967295,
581
+ 67305985,
582
+ 9
583
+ ],
584
+ [
585
+ 4294967295,
586
+ 67305985,
587
+ 10
588
+ ]
589
+ ]
590
+ }
591
+ },
592
+ {
593
+ "rust": {
594
+ "diagnostics": [
595
+ {
596
+ "op": "not-found",
597
+ "text": "2a"
598
+ }
599
+ ],
600
+ "exported": [],
601
+ "exports": [],
602
+ "result": 0,
603
+ "rows": [
604
+ [
605
+ 4294967295,
606
+ 67305985,
607
+ 9
608
+ ],
609
+ [
610
+ 4294967295,
611
+ 67305985,
612
+ 10
613
+ ]
614
+ ]
615
+ },
616
+ "source": {
617
+ "diagnostics": [
618
+ {
619
+ "op": "not-found",
620
+ "text": "2a"
621
+ }
622
+ ],
623
+ "exported": [],
624
+ "exports": [],
625
+ "result": 0,
626
+ "rows": [
627
+ [
628
+ 4294967295,
629
+ 67305985,
630
+ 9
631
+ ],
632
+ [
633
+ 4294967295,
634
+ 67305985,
635
+ 10
636
+ ]
637
+ ]
638
+ }
639
+ },
640
+ {
641
+ "rust": {
642
+ "diagnostics": [
643
+ {
644
+ "op": "bad-address",
645
+ "text": "626164"
646
+ }
647
+ ],
648
+ "exported": [],
649
+ "exports": [],
650
+ "result": 0,
651
+ "rows": [
652
+ [
653
+ 4294967295,
654
+ 67305985,
655
+ 9
656
+ ],
657
+ [
658
+ 4294967295,
659
+ 67305985,
660
+ 10
661
+ ]
662
+ ]
663
+ },
664
+ "source": {
665
+ "diagnostics": [
666
+ {
667
+ "op": "bad-address",
668
+ "text": "626164"
669
+ }
670
+ ],
671
+ "exported": [],
672
+ "exports": [],
673
+ "result": 0,
674
+ "rows": [
675
+ [
676
+ 4294967295,
677
+ 67305985,
678
+ 9
679
+ ],
680
+ [
681
+ 4294967295,
682
+ 67305985,
683
+ 10
684
+ ]
685
+ ]
686
+ }
687
+ },
688
+ {
689
+ "rust": {
690
+ "diagnostics": [
691
+ {
692
+ "op": "not-found",
693
+ "text": "3235352e3235352e3235352e323535"
694
+ }
695
+ ],
696
+ "exported": [],
697
+ "exports": [],
698
+ "result": 0,
699
+ "rows": [
700
+ [
701
+ 4294967295,
702
+ 67305985,
703
+ 9
704
+ ],
705
+ [
706
+ 4294967295,
707
+ 67305985,
708
+ 10
709
+ ]
710
+ ]
711
+ },
712
+ "source": {
713
+ "diagnostics": [
714
+ {
715
+ "op": "not-found",
716
+ "text": "3235352e3235352e3235352e323535"
717
+ }
718
+ ],
719
+ "exported": [],
720
+ "exports": [],
721
+ "result": 0,
722
+ "rows": [
723
+ [
724
+ 4294967295,
725
+ 67305985,
726
+ 9
727
+ ],
728
+ [
729
+ 4294967295,
730
+ 67305985,
731
+ 10
732
+ ]
733
+ ]
734
+ }
735
+ },
736
+ {
737
+ "rust": {
738
+ "diagnostics": [
739
+ {
740
+ "op": "bad-address",
741
+ "text": ""
742
+ }
743
+ ],
744
+ "exported": [],
745
+ "exports": [],
746
+ "result": 0,
747
+ "rows": [
748
+ [
749
+ 4294967295,
750
+ 67305985,
751
+ 9
752
+ ],
753
+ [
754
+ 4294967295,
755
+ 67305985,
756
+ 10
757
+ ]
758
+ ]
759
+ },
760
+ "source": {
761
+ "diagnostics": [
762
+ {
763
+ "op": "bad-address",
764
+ "text": ""
765
+ }
766
+ ],
767
+ "exported": [],
768
+ "exports": [],
769
+ "result": 0,
770
+ "rows": [
771
+ [
772
+ 4294967295,
773
+ 67305985,
774
+ 9
775
+ ],
776
+ [
777
+ 4294967295,
778
+ 67305985,
779
+ 10
780
+ ]
781
+ ]
782
+ }
783
+ },
784
+ {
785
+ "rust": {
786
+ "diagnostics": [
787
+ {
788
+ "op": "removed"
789
+ }
790
+ ],
791
+ "exported": [
792
+ {
793
+ "buffer": "312e302e302e303a31310a",
794
+ "events": [
795
+ {
796
+ "op": "print",
797
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
798
+ },
799
+ {
800
+ "mode": 1,
801
+ "op": "open",
802
+ "path": "62616e6c6973742e747874"
803
+ },
804
+ {
805
+ "handle": 7,
806
+ "op": "write",
807
+ "text": "312e302e302e303a31310a"
808
+ },
809
+ {
810
+ "handle": 7,
811
+ "op": "close"
812
+ }
813
+ ],
814
+ "formats": [
815
+ "312e302e302e303a31310a"
816
+ ]
817
+ }
818
+ ],
819
+ "exports": [
820
+ 252500
821
+ ],
822
+ "result": 1,
823
+ "rows": [
824
+ [
825
+ 255,
826
+ 1,
827
+ 11
828
+ ],
829
+ [
830
+ 4294967295,
831
+ 4294967295,
832
+ 9
833
+ ]
834
+ ]
835
+ },
836
+ "source": {
837
+ "diagnostics": [
838
+ {
839
+ "op": "removed"
840
+ }
841
+ ],
842
+ "exported": [
843
+ {
844
+ "buffer": "312e302e302e303a31310a",
845
+ "events": [
846
+ {
847
+ "op": "print",
848
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
849
+ },
850
+ {
851
+ "mode": 1,
852
+ "op": "open",
853
+ "path": "62616e6c6973742e747874"
854
+ },
855
+ {
856
+ "handle": 7,
857
+ "op": "write",
858
+ "text": "312e302e302e303a31310a"
859
+ },
860
+ {
861
+ "handle": 7,
862
+ "op": "close"
863
+ }
864
+ ],
865
+ "formats": [
866
+ "312e302e302e303a31310a"
867
+ ]
868
+ }
869
+ ],
870
+ "exports": [
871
+ 252500
872
+ ],
873
+ "result": 1,
874
+ "rows": [
875
+ [
876
+ 255,
877
+ 1,
878
+ 11
879
+ ],
880
+ [
881
+ 4294967295,
882
+ 4294967295,
883
+ 9
884
+ ]
885
+ ]
886
+ }
887
+ },
888
+ {
889
+ "rust": {
890
+ "diagnostics": [
891
+ {
892
+ "op": "removed"
893
+ }
894
+ ],
895
+ "exported": [
896
+ {
897
+ "buffer": "312e322e332e343a390a",
898
+ "events": [
899
+ {
900
+ "op": "print",
901
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
902
+ },
903
+ {
904
+ "mode": 1,
905
+ "op": "open",
906
+ "path": "62616e6c6973742e747874"
907
+ },
908
+ {
909
+ "handle": 7,
910
+ "op": "write",
911
+ "text": "312e322e332e343a390a"
912
+ },
913
+ {
914
+ "handle": 7,
915
+ "op": "close"
916
+ }
917
+ ],
918
+ "formats": [
919
+ "312e322e332e343a390a"
920
+ ]
921
+ }
922
+ ],
923
+ "exports": [
924
+ 252500
925
+ ],
926
+ "result": 1,
927
+ "rows": [
928
+ [
929
+ 255,
930
+ 4294967295,
931
+ 11
932
+ ],
933
+ [
934
+ 4294967295,
935
+ 67305985,
936
+ 9
937
+ ]
938
+ ]
939
+ },
940
+ "source": {
941
+ "diagnostics": [
942
+ {
943
+ "op": "removed"
944
+ }
945
+ ],
946
+ "exported": [
947
+ {
948
+ "buffer": "312e322e332e343a390a",
949
+ "events": [
950
+ {
951
+ "op": "print",
952
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
953
+ },
954
+ {
955
+ "mode": 1,
956
+ "op": "open",
957
+ "path": "62616e6c6973742e747874"
958
+ },
959
+ {
960
+ "handle": 7,
961
+ "op": "write",
962
+ "text": "312e322e332e343a390a"
963
+ },
964
+ {
965
+ "handle": 7,
966
+ "op": "close"
967
+ }
968
+ ],
969
+ "formats": [
970
+ "312e322e332e343a390a"
971
+ ]
972
+ }
973
+ ],
974
+ "exports": [
975
+ 252500
976
+ ],
977
+ "result": 1,
978
+ "rows": [
979
+ [
980
+ 255,
981
+ 4294967295,
982
+ 11
983
+ ],
984
+ [
985
+ 4294967295,
986
+ 67305985,
987
+ 9
988
+ ]
989
+ ]
990
+ }
991
+ },
992
+ {
993
+ "rust": {
994
+ "diagnostics": [
995
+ {
996
+ "op": "not-found",
997
+ "text": "2a"
998
+ }
999
+ ],
1000
+ "exported": [],
1001
+ "exports": [],
1002
+ "result": 0,
1003
+ "rows": [
1004
+ [
1005
+ 255,
1006
+ 1,
1007
+ 11
1008
+ ],
1009
+ [
1010
+ 4294967295,
1011
+ 67305985,
1012
+ 9
1013
+ ]
1014
+ ]
1015
+ },
1016
+ "source": {
1017
+ "diagnostics": [
1018
+ {
1019
+ "op": "not-found",
1020
+ "text": "2a"
1021
+ }
1022
+ ],
1023
+ "exported": [],
1024
+ "exports": [],
1025
+ "result": 0,
1026
+ "rows": [
1027
+ [
1028
+ 255,
1029
+ 1,
1030
+ 11
1031
+ ],
1032
+ [
1033
+ 4294967295,
1034
+ 67305985,
1035
+ 9
1036
+ ]
1037
+ ]
1038
+ }
1039
+ },
1040
+ {
1041
+ "rust": {
1042
+ "diagnostics": [
1043
+ {
1044
+ "op": "bad-address",
1045
+ "text": "626164"
1046
+ }
1047
+ ],
1048
+ "exported": [],
1049
+ "exports": [],
1050
+ "result": 0,
1051
+ "rows": [
1052
+ [
1053
+ 255,
1054
+ 1,
1055
+ 11
1056
+ ],
1057
+ [
1058
+ 4294967295,
1059
+ 67305985,
1060
+ 9
1061
+ ]
1062
+ ]
1063
+ },
1064
+ "source": {
1065
+ "diagnostics": [
1066
+ {
1067
+ "op": "bad-address",
1068
+ "text": "626164"
1069
+ }
1070
+ ],
1071
+ "exported": [],
1072
+ "exports": [],
1073
+ "result": 0,
1074
+ "rows": [
1075
+ [
1076
+ 255,
1077
+ 1,
1078
+ 11
1079
+ ],
1080
+ [
1081
+ 4294967295,
1082
+ 67305985,
1083
+ 9
1084
+ ]
1085
+ ]
1086
+ }
1087
+ },
1088
+ {
1089
+ "rust": {
1090
+ "diagnostics": [
1091
+ {
1092
+ "op": "not-found",
1093
+ "text": "3235352e3235352e3235352e323535"
1094
+ }
1095
+ ],
1096
+ "exported": [],
1097
+ "exports": [],
1098
+ "result": 0,
1099
+ "rows": [
1100
+ [
1101
+ 255,
1102
+ 1,
1103
+ 11
1104
+ ],
1105
+ [
1106
+ 4294967295,
1107
+ 67305985,
1108
+ 9
1109
+ ]
1110
+ ]
1111
+ },
1112
+ "source": {
1113
+ "diagnostics": [
1114
+ {
1115
+ "op": "not-found",
1116
+ "text": "3235352e3235352e3235352e323535"
1117
+ }
1118
+ ],
1119
+ "exported": [],
1120
+ "exports": [],
1121
+ "result": 0,
1122
+ "rows": [
1123
+ [
1124
+ 255,
1125
+ 1,
1126
+ 11
1127
+ ],
1128
+ [
1129
+ 4294967295,
1130
+ 67305985,
1131
+ 9
1132
+ ]
1133
+ ]
1134
+ }
1135
+ },
1136
+ {
1137
+ "rust": {
1138
+ "diagnostics": [
1139
+ {
1140
+ "op": "bad-address",
1141
+ "text": ""
1142
+ }
1143
+ ],
1144
+ "exported": [],
1145
+ "exports": [],
1146
+ "result": 0,
1147
+ "rows": [
1148
+ [
1149
+ 255,
1150
+ 1,
1151
+ 11
1152
+ ],
1153
+ [
1154
+ 4294967295,
1155
+ 67305985,
1156
+ 9
1157
+ ]
1158
+ ]
1159
+ },
1160
+ "source": {
1161
+ "diagnostics": [
1162
+ {
1163
+ "op": "bad-address",
1164
+ "text": ""
1165
+ }
1166
+ ],
1167
+ "exported": [],
1168
+ "exports": [],
1169
+ "result": 0,
1170
+ "rows": [
1171
+ [
1172
+ 255,
1173
+ 1,
1174
+ 11
1175
+ ],
1176
+ [
1177
+ 4294967295,
1178
+ 67305985,
1179
+ 9
1180
+ ]
1181
+ ]
1182
+ }
1183
+ },
1184
+ {
1185
+ "rust": {
1186
+ "diagnostics": [
1187
+ {
1188
+ "op": "not-found",
1189
+ "text": "312e322e332e34"
1190
+ }
1191
+ ],
1192
+ "exported": [],
1193
+ "exports": [],
1194
+ "result": 0,
1195
+ "rows": [
1196
+ [
1197
+ 4294967295,
1198
+ 4294967295,
1199
+ 12
1200
+ ],
1201
+ [
1202
+ 0,
1203
+ 0,
1204
+ 13
1205
+ ]
1206
+ ]
1207
+ },
1208
+ "source": {
1209
+ "diagnostics": [
1210
+ {
1211
+ "op": "not-found",
1212
+ "text": "312e322e332e34"
1213
+ }
1214
+ ],
1215
+ "exported": [],
1216
+ "exports": [],
1217
+ "result": 0,
1218
+ "rows": [
1219
+ [
1220
+ 4294967295,
1221
+ 4294967295,
1222
+ 12
1223
+ ],
1224
+ [
1225
+ 0,
1226
+ 0,
1227
+ 13
1228
+ ]
1229
+ ]
1230
+ }
1231
+ },
1232
+ {
1233
+ "rust": {
1234
+ "diagnostics": [
1235
+ {
1236
+ "op": "not-found",
1237
+ "text": "312e2a"
1238
+ }
1239
+ ],
1240
+ "exported": [],
1241
+ "exports": [],
1242
+ "result": 0,
1243
+ "rows": [
1244
+ [
1245
+ 4294967295,
1246
+ 4294967295,
1247
+ 12
1248
+ ],
1249
+ [
1250
+ 0,
1251
+ 0,
1252
+ 13
1253
+ ]
1254
+ ]
1255
+ },
1256
+ "source": {
1257
+ "diagnostics": [
1258
+ {
1259
+ "op": "not-found",
1260
+ "text": "312e2a"
1261
+ }
1262
+ ],
1263
+ "exported": [],
1264
+ "exports": [],
1265
+ "result": 0,
1266
+ "rows": [
1267
+ [
1268
+ 4294967295,
1269
+ 4294967295,
1270
+ 12
1271
+ ],
1272
+ [
1273
+ 0,
1274
+ 0,
1275
+ 13
1276
+ ]
1277
+ ]
1278
+ }
1279
+ },
1280
+ {
1281
+ "rust": {
1282
+ "diagnostics": [
1283
+ {
1284
+ "op": "removed"
1285
+ }
1286
+ ],
1287
+ "exported": [
1288
+ {
1289
+ "buffer": "",
1290
+ "events": [
1291
+ {
1292
+ "op": "print",
1293
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
1294
+ },
1295
+ {
1296
+ "mode": 1,
1297
+ "op": "open",
1298
+ "path": "62616e6c6973742e747874"
1299
+ },
1300
+ {
1301
+ "handle": 7,
1302
+ "op": "write",
1303
+ "text": ""
1304
+ },
1305
+ {
1306
+ "handle": 7,
1307
+ "op": "close"
1308
+ }
1309
+ ],
1310
+ "formats": []
1311
+ }
1312
+ ],
1313
+ "exports": [
1314
+ 252500
1315
+ ],
1316
+ "result": 1,
1317
+ "rows": [
1318
+ [
1319
+ 4294967295,
1320
+ 4294967295,
1321
+ 12
1322
+ ],
1323
+ [
1324
+ 0,
1325
+ 4294967295,
1326
+ 13
1327
+ ]
1328
+ ]
1329
+ },
1330
+ "source": {
1331
+ "diagnostics": [
1332
+ {
1333
+ "op": "removed"
1334
+ }
1335
+ ],
1336
+ "exported": [
1337
+ {
1338
+ "buffer": "",
1339
+ "events": [
1340
+ {
1341
+ "op": "print",
1342
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
1343
+ },
1344
+ {
1345
+ "mode": 1,
1346
+ "op": "open",
1347
+ "path": "62616e6c6973742e747874"
1348
+ },
1349
+ {
1350
+ "handle": 7,
1351
+ "op": "write",
1352
+ "text": ""
1353
+ },
1354
+ {
1355
+ "handle": 7,
1356
+ "op": "close"
1357
+ }
1358
+ ],
1359
+ "formats": []
1360
+ }
1361
+ ],
1362
+ "exports": [
1363
+ 252500
1364
+ ],
1365
+ "result": 1,
1366
+ "rows": [
1367
+ [
1368
+ 4294967295,
1369
+ 4294967295,
1370
+ 12
1371
+ ],
1372
+ [
1373
+ 0,
1374
+ 4294967295,
1375
+ 13
1376
+ ]
1377
+ ]
1378
+ }
1379
+ },
1380
+ {
1381
+ "rust": {
1382
+ "diagnostics": [
1383
+ {
1384
+ "op": "bad-address",
1385
+ "text": "626164"
1386
+ }
1387
+ ],
1388
+ "exported": [],
1389
+ "exports": [],
1390
+ "result": 0,
1391
+ "rows": [
1392
+ [
1393
+ 4294967295,
1394
+ 4294967295,
1395
+ 12
1396
+ ],
1397
+ [
1398
+ 0,
1399
+ 0,
1400
+ 13
1401
+ ]
1402
+ ]
1403
+ },
1404
+ "source": {
1405
+ "diagnostics": [
1406
+ {
1407
+ "op": "bad-address",
1408
+ "text": "626164"
1409
+ }
1410
+ ],
1411
+ "exported": [],
1412
+ "exports": [],
1413
+ "result": 0,
1414
+ "rows": [
1415
+ [
1416
+ 4294967295,
1417
+ 4294967295,
1418
+ 12
1419
+ ],
1420
+ [
1421
+ 0,
1422
+ 0,
1423
+ 13
1424
+ ]
1425
+ ]
1426
+ }
1427
+ },
1428
+ {
1429
+ "rust": {
1430
+ "diagnostics": [
1431
+ {
1432
+ "op": "removed"
1433
+ }
1434
+ ],
1435
+ "exported": [
1436
+ {
1437
+ "buffer": "302e302e302e303a31330a",
1438
+ "events": [
1439
+ {
1440
+ "op": "print",
1441
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
1442
+ },
1443
+ {
1444
+ "mode": 1,
1445
+ "op": "open",
1446
+ "path": "62616e6c6973742e747874"
1447
+ },
1448
+ {
1449
+ "handle": 7,
1450
+ "op": "write",
1451
+ "text": "302e302e302e303a31330a"
1452
+ },
1453
+ {
1454
+ "handle": 7,
1455
+ "op": "close"
1456
+ }
1457
+ ],
1458
+ "formats": [
1459
+ "302e302e302e303a31330a"
1460
+ ]
1461
+ }
1462
+ ],
1463
+ "exports": [
1464
+ 252500
1465
+ ],
1466
+ "result": 1,
1467
+ "rows": [
1468
+ [
1469
+ 4294967295,
1470
+ 4294967295,
1471
+ 12
1472
+ ],
1473
+ [
1474
+ 0,
1475
+ 0,
1476
+ 13
1477
+ ]
1478
+ ]
1479
+ },
1480
+ "source": {
1481
+ "diagnostics": [
1482
+ {
1483
+ "op": "removed"
1484
+ }
1485
+ ],
1486
+ "exported": [
1487
+ {
1488
+ "buffer": "302e302e302e303a31330a",
1489
+ "events": [
1490
+ {
1491
+ "op": "print",
1492
+ "text": "57726974696e673a2062616e6c6973742e7478740a"
1493
+ },
1494
+ {
1495
+ "mode": 1,
1496
+ "op": "open",
1497
+ "path": "62616e6c6973742e747874"
1498
+ },
1499
+ {
1500
+ "handle": 7,
1501
+ "op": "write",
1502
+ "text": "302e302e302e303a31330a"
1503
+ },
1504
+ {
1505
+ "handle": 7,
1506
+ "op": "close"
1507
+ }
1508
+ ],
1509
+ "formats": [
1510
+ "302e302e302e303a31330a"
1511
+ ]
1512
+ }
1513
+ ],
1514
+ "exports": [
1515
+ 252500
1516
+ ],
1517
+ "result": 1,
1518
+ "rows": [
1519
+ [
1520
+ 4294967295,
1521
+ 4294967295,
1522
+ 12
1523
+ ],
1524
+ [
1525
+ 0,
1526
+ 0,
1527
+ 13
1528
+ ]
1529
+ ]
1530
+ }
1531
+ },
1532
+ {
1533
+ "rust": {
1534
+ "diagnostics": [
1535
+ {
1536
+ "op": "bad-address",
1537
+ "text": ""
1538
+ }
1539
+ ],
1540
+ "exported": [],
1541
+ "exports": [],
1542
+ "result": 0,
1543
+ "rows": [
1544
+ [
1545
+ 4294967295,
1546
+ 4294967295,
1547
+ 12
1548
+ ],
1549
+ [
1550
+ 0,
1551
+ 0,
1552
+ 13
1553
+ ]
1554
+ ]
1555
+ },
1556
+ "source": {
1557
+ "diagnostics": [
1558
+ {
1559
+ "op": "bad-address",
1560
+ "text": ""
1561
+ }
1562
+ ],
1563
+ "exported": [],
1564
+ "exports": [],
1565
+ "result": 0,
1566
+ "rows": [
1567
+ [
1568
+ 4294967295,
1569
+ 4294967295,
1570
+ 12
1571
+ ],
1572
+ [
1573
+ 0,
1574
+ 0,
1575
+ 13
1576
+ ]
1577
+ ]
1578
+ }
1579
+ }
1580
+ ],
1581
+ "source_report": "docs/research/qvm-filter-remove-export.json",
1582
+ "source_report_sha256": "ebb5de37482c3b62dd2c2fe6432ec782cc143cd6ee0d5a0493e3c4117afa805a"
1583
+ }
docs/research/rust-health-impulse.json CHANGED
@@ -2985,7 +2985,7 @@
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
- "rust_unit_tests": 193,
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": 196,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
scripts/analyze_rust_filter_remove_export.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Compare the Rust filter policy with the original QVM report."""
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-filter-policy'],check=True,capture_output=True)
9
+ binary=Path(os.environ.get('CARGO_TARGET_DIR','target'))/'debug'/'urt-filter-policy'
10
+ path=Path('docs/research/qvm-filter-remove-export.json');data=path.read_bytes();probes=[]
11
+ for p in json.loads(data)['probes']:
12
+ a=p['input'];words=encode(a)
13
+ probes.append(dict(source={k:p[k] for k in ['result', 'diagnostics', 'exports', 'exported', 'rows']},rust=result(binary,'remove-export',words)))
14
+ write_json(Path('docs/research/rust-filter-remove-export.json'),dict(source_report=str(path),source_report_sha256=hashlib.sha256(data).hexdigest(),probes=probes,limits='Finite recovered policy parity; native filesystem/network effects are not executed.'))
15
+
16
+ def encode(a):
17
+ text=bytes.fromhex(a['text']);return [len(a['rows']),a['metadata'],a['save'],a['handle'],len(text),*text,*[v for r in a['rows'] for v in r]]
18
+ if __name__=='__main__':main()
scripts/test_rust_filter_remove_export.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-filter-remove-export.json').read_text());self.assertGreaterEqual(len(r['probes']),18)
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-filter-remove-export.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
@@ -3183,3 +3183,22 @@ report scripts/analyze_qvm_filter_remove_export.py docs/research/qvm-filter-remo
3183
  edge docs/research/qvm-filter-remove-export.json scripts/test_qvm_filter_remove_export.py
3184
  group qvm-filter-remove-export scripts/analyze_qvm_filter_remove_export.py
3185
  edge scripts/analyze_qvm_filter_remove_export.py scripts/analyze_qvm_resumer_audit.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3183
  edge docs/research/qvm-filter-remove-export.json scripts/test_qvm_filter_remove_export.py
3184
  group qvm-filter-remove-export scripts/analyze_qvm_filter_remove_export.py
3185
  edge scripts/analyze_qvm_filter_remove_export.py scripts/analyze_qvm_resumer_audit.py
3186
+ report scripts/analyze_rust_filter_remove_export.py docs/research/rust-filter-remove-export.json
3187
+ edge docs/research/rust-filter-remove-export.json scripts/test_rust_filter_remove_export.py
3188
+ group rust-filter-remove-export scripts/analyze_rust_filter_remove_export.py
3189
+ edge scripts/analyze_rust_filter_remove_export.py scripts/analyze_qvm_resumer_audit.py
3190
+ edge Cargo.toml scripts/analyze_rust_filter_remove_export.py
3191
+ edge Cargo.lock scripts/analyze_rust_filter_remove_export.py
3192
+ edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_filter_remove_export.py
3193
+ edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_filter_remove_export.py
3194
+ edge crates/urt-gameplay/src/filter_lifecycle.rs scripts/analyze_rust_filter_remove_export.py
3195
+ edge crates/urt-gameplay/src/native_policy.rs scripts/analyze_rust_filter_remove_export.py
3196
+ edge crates/urt-gameplay/src/bin/urt-filter-policy.rs scripts/analyze_rust_filter_remove_export.py
3197
+ edge docs/research/qvm-filter-remove-export.json scripts/analyze_rust_filter_remove_export.py
3198
+ group rust-filter-remove-export scripts/analyze_rust_health_impulse.py
3199
+ group gameplay scripts/analyze_rust_filter_remove_export.py
3200
+ edge crates/urt-gameplay/src/qvm_format.rs scripts/analyze_rust_filter_remove_export.py
3201
+ edge crates/urt-gameplay/src/qvm_format.rs scripts/analyze_rust_filter_remove.py
3202
+ edge crates/urt-gameplay/src/qvm_format.rs scripts/analyze_rust_filter_metadata.py
3203
+ edge crates/urt-gameplay/src/filter_lifecycle.rs scripts/analyze_rust_health_impulse.py
3204
+ edge crates/urt-gameplay/src/bin/urt-filter-policy.rs scripts/analyze_rust_health_impulse.py
xtask/src/lib.rs CHANGED
@@ -1128,6 +1128,19 @@ mod integration_tests {
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"),
@@ -1218,6 +1231,11 @@ mod integration_tests {
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"),
 
1128
  ("native_policy", "resolved_connect_tail"),
1129
  ("native_policy", "resolved_connect_complete"),
1130
  ("native_policy", "filter_insert"),
1131
+ ("filter_lifecycle", "filter_export"),
1132
+ ("native_policy", "filter_export"),
1133
+ ("qvm_format", "filter_export"),
1134
+ ("filter_lifecycle", "filter_remove"),
1135
+ ("native_policy", "filter_remove"),
1136
+ ("filter_lifecycle", "filter_metadata"),
1137
+ ("native_policy", "filter_metadata"),
1138
+ ("filter_lifecycle", "filter_insert_export"),
1139
+ ("native_policy", "filter_insert_export"),
1140
+ ("qvm_format", "filter_insert_export"),
1141
+ ("filter_lifecycle", "filter_remove_export"),
1142
+ ("native_policy", "filter_remove_export"),
1143
+ ("qvm_format", "filter_remove_export"),
1144
  ("qvm_format", "resolved_connect_complete"),
1145
  ("protected", "protected_update"),
1146
  ("mode10", "mode10_entry"),
 
1231
  ("qvm-resolved-connect-tail", "resolved_connect_tail"),
1232
  ("qvm-resolved-connect-complete", "resolved_connect_complete"),
1233
  ("qvm-filter-insert", "filter_insert"),
1234
+ ("qvm-filter-export", "filter_export"),
1235
+ ("qvm-filter-remove", "filter_remove"),
1236
+ ("qvm-filter-metadata", "filter_metadata"),
1237
+ ("qvm-filter-insert-export", "filter_insert_export"),
1238
+ ("qvm-filter-remove-export", "filter_remove_export"),
1239
  ("qvm-rank-small-sort", "rank_sort"),
1240
  ("qvm-rank-large-sort", "rank_sort"),
1241
  ("qvm-ranking-complete", "ranking_complete"),