Files
verstack/docs/validation.md

4.8 KiB

Validation record

Development environment: Linux x86-64, Rust/Cargo 1.98.1, Python 3.14.4. Ghidra 12.1.3 and Temurin JDK 21 were installed locally; see the real SPIKE pilot.

  • Rust integration tests: 15 passed, including exact restoration, cross-game reuse, out-of-order imports, input retention on failed import, corrupt packs, missing backend configuration, interrupted-run reconciliation, ownership/path boundaries, plugin revisions, range reads, and conservative function comparison.
  • Python adapter tests: 12 passed, covering exact ZIP entries, opaque supporting content, unsafe paths, expansion limits, missing Ghidra, rejected Ghidra version mismatch, structural wrapper probing, and credential references.
  • cargo clippy --all-targets -- -D warnings: passed.
  • cargo build --locked --offline: passed using the downloaded dependency cache.
  • Browser smoke: Chromium/Playwright exercised upload, release-date retention, browsing, text inspection, download, verification, and comparison; no JavaScript errors. UI screenshot.
  • Synthetic storage feasibility measurement: all restored binaries matched their respective inputs; exact cross-game content introduced no new file chunks.

Browser tooling and missing browser shared libraries were downloaded into /tmp; no system packages or frontend runtime dependencies were added to the application. Test servers and archives were disposable.

Real-tool validation: the pinned SPIKE extractor processed Game of Thrones 1.37.0, and Ghidra exported/reopened synthetic x86-64 and real ARM program databases. The real ARM run also completed through the core plugin host, published an immutable derived snapshot, passed archive verification, and restored its five output files. Still unvalidated: other package families/wrappers, SD-card filesystem decryption, proprietary inner asset formats, real power-loss behavior, RAM workspaces, and corpus-scale performance/memory. Retention/GC is not implemented.

Comparison milestone: real Pro/LE ARM inventories produced a verified/restored immutable report. New tests cover differing executable selection paths, incompatible analysis options, unmatched reasons, duplicate addresses, both-source provenance, persistence after reopening, and the HTTP save route. tests/ui-functions.mjs passed in Chromium using synthetic intercepted responses (no archive listener): source labels, pagination, filtering, matches, saving, and reopening a report. Clippy passed after implementation.

LUKS checks: generated LUKS2 fixture accepted its known key and rejected a wrong key. Both Pokémon LE/Pro headers rejected five representations of the user-supplied key. Pokémon LE original import and a retained credential-check report were exercised through HTTP. That earlier credential was incorrect for these updates; see the corrected-key results below.

Corrected-key validation: /srv/firmware/luks.key unlocks all eight local SPIKE 3 update-container headers. It does not unlock the four tested Pokémon SD-card partitions. A new userspace LUKS2/ext4 wrapper plugin recovered Pokémon LE's SPK; a separately pinned numeric-type-4 extension to the upstream SPK parser verified MD5/HMAC and extracted 708 files. Python tests now also cover split-part ordering/completeness/budgets and retrieval of a known volume key through libcryptsetup.

Pokémon LE full pipeline passed through HTTP, with verified immutable wrapper and extracted snapshots. All 708 SPK payloads passed upstream MD5/HMAC verification. A live Chromium preview and byte-identical HTTP PNG download passed. Pokémon Ghidra and full extraction of other SPIKE 3 titles remain pending.

  • cargo test --locked --offline: 16 integration tests passed, including new library response size, version/source isolation, media type, search, page bounds, and empty-result checks. Existing streaming byte-range tests remain green.
  • tests/ui-functions.mjs: source selection, comparison paging/filtering, saving, and reopening reports passed with the grouped navigation.
  • tests/ui-media.mjs: real browser decoding/playback of synthetic WAV and VP8 WebM, deferred preload, broken-image fallback, and media filtering passed.
  • tests/ui.mjs: import/upload, text preview, download, release date, verification, and file comparison passed against a disposable archive.
  • tests/ui-gallery.mjs: read-only current corpus checks cover two games, three edition/version groups, Pokémon's 311 PNGs, pagination, image decoding and enlargement, reload, search, all-files navigation, and mobile page width.

The original archive was used only for browsing. Native format support is not a claim that proprietary game media containers or every codec can play in browsers. Gallery images retain original bytes; thumbnail generation and a persistent artifact query index remain future performance work.