Files
f0d695ec97
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / original-cli (push) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Failing after 7s
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: ci / ci-result (push) Failing after 6s
QRun-IO/ci-policy: native / native-result (push) Successful in 6s
chore: preserve paused QBit work and document remaining issues
Save the current implementation and README, status, and known-issue documentation at the user-requested stop. No completed release or deployment is claimed.

Co-Authored-By: Claude <noreply@anthropic.com>

Co-Authored-By: GPT-6 Codex <noreply@openai.com>
2026-11-04 10:45:28 -06:00

3.1 KiB

Fixed Wasm guest: locked reproducible build and pin (updated 2026-11-02)

The fixed Javy/QuickJS guest qqq_javy_runtime.wasm is pinned in PINNED-WASM.json (sha256, length, the exact source inputs and their hash, Cargo.lock hash, Rust commit, WASI SDK identity). deploy/snapshot_execution.py (WASM_SHA), the license inventory, import inventory and review doc all carry the same hash, and deploy/test_deploy.py (PinnedWasmTest) fails if any of them, the Wasm source inputs or Cargo.lock drift apart. Change the guest source only together with a reviewed re-pin.

Reproduce (operator, offline, no network)

pwsh -File wasm-runtime/Build-Wasm.ps1 -SdkRoot <extracted wasi-sdk-33.0-x86_64-windows> -OutputDir <NEW absolute directory>

Build-Wasm.ps1 refuses an existing output directory, verifies the source-input hash and Cargo.lock against the pin, the Rust 1.97.1 compiler commit, and the SDK's clang version line plus clang.exe, libclang.dll and WASI libc hashes; sets WASI_SDK, LIBCLANG_PATH and BINDGEN_EXTRA_CLANG_ARGS (forward slashes; the rquickjs-sys build script must never download an SDK); runs cargo +1.97.1 build --release --target wasm32-wasip1 --offline --locked; then FAILS unless the artifact equals the pinned sha256 and length. It writes provenance.json next to the artifact. Inputs: WASI SDK 33.0 archive sha256 df14ca2a2127c2d6b6be07e6f5549b3af9c1b3c0112430c200a4749970c59f06 (extracted copy used here: root's qqq-javy-wasi-tools-20261031/sdk-extracted), Rust 1.97.1 with the wasm32-wasip1 target.

Current pin

4b247288d6cdff6783f8087a2a9039935f50af9099451cc841a3639c9625a18c, 1,567,189 bytes, source inputs ec834dc9d9d10e360c7abcb10c811e6dd892ce744bb40974a068e01908530cb7. Reproduced twice from clean copies in different directories and different output directories with identical hash (repro-A, repro-B logs). A one-byte source change is refused before any build.

Why the pin changed (finding)

The earlier pin ca72ac7d72a0876a2c602fe6b73c9ded7ead35fbba6f4034ee544345a38557af was built before a standards pass added a 3-line license header to each src/*.rs on 2026-11-01. Rebuilding the CURRENT inputs with those 3 lines removed, using this same recipe and toolchain, reproduces ca72... exactly, so the original recipe is recovered. The two artifacts differ in exactly 9 bytes, all Rust panic-location line numbers (each +3); the type, import, function, export, code and custom Wasm sections are byte-identical (only the data section differs). Reverting the headers would violate the repository's header standard, so the owned source is re-pinned to the artifact built from current source. The old artifact is still the one inside the existing image qqq-script-execution:qualification-20261031-1 and the root's old context; they were not modified, and snapshot_execution.py --verify of that old context now refuses under the new pin by design.

Evidence (trusted local only; productionQualified=false)

12 native tests and clippy -D warnings pass from the clean checkout; the native fixed-Wasm + Extism supervisor corpus passes with the new artifact in the existing image (private evidence, not carried in this tree).