Compare commits

...
11866 changed files with 4215490 additions and 0 deletions

No files matched your search

+30
View File
@@ -5475,3 +5475,33 @@ remain; no live state, schema or bus policy change.
2026-10-24 | Goldie | Row265 / #1770 first slot STOP (sage-3932) | New parser14/14, rooms18/18 green; serialized bus stops at old project-runtime.test.mjs:14 import-closure pin, partial619 ok/1 not ok. New pure address.mjs import is absent from expected imports. Static trace also needs address.mjs in seat RUNNER_FILES. No old-test/product correction, no mutant/restored run, no green commit/push; old-pin and out-of-owned-files mount change sent to Sage for ruling. Audit prose missed the direct source pin despite raw grep hit; correction recorded in BUILD.md.
2026-10-24 | Goldie | Row265 / #1770 verified (mos-1567, sage-3942) | Approved correction adds solely address import pin + Row265 comment to project-runtime.test and one pure-source RUNNER_FILES mount; new block checks parser has no imports. Serialized fresh-short-TMP timeout-k10: unchanged sandbox10/10, parser15/15, rooms18/18, full bus957/957, twelve named refusal mutants killed (each Node1, driver0), restored parser15/15 + rooms18/18. All positives zero fail/skip/cancel; every mutation restored full broker SHA71b32ee4. Old first-red evidence retained, no other old-test change. Slot returned goldie-0034; Boyd packet explicitly includes mount-list review, candidate push next.
## 2026-10-24 — W2 row 310 / #1824 started (Gyro)
Before: only Louie's evaluation artifact and S0 conditional baseline review exist. Sage assigned the owned source import, offline pinned restricted web build and root-independent output/CSP evidence under Q246/mos-1571. Implementation plan and subsequent measurements live in agents/gyro/work/queue-310/BUILD.md. No build/test, serving route or live change at start.
## 2026-10-24 — W2 row 310 / #1824 bounded scratch measurement (Gyro)
After sage-3992: 534 existing cached registry archives extract to 24,844 files / 611,577,974 bytes, or 614,049,226 bytes with generated checksums. A full 538-package lock vendor set adds 329 identities beyond S0's 209. In isolated scratch, with the three already-reviewed git inputs and approved local workspace reduction, exact S0 199/209 package closures matched; baseline release measurement succeeded offline with networking disabled. Valid absolute-nice19/four-job environment retry: 397.864805 s; four runtime files total 44,142,800 bytes, scratch Git blob pack 16,720,159 bytes. Initial 388.757578 s attempt had an inherited-priority defect and is retained as limited evidence. Receipt and caveats: agents/gyro/work/queue-310/BUILD.md, “Full-lock measurement results (sage-3992)”. No full-lock repository import, runtime output commit/push, serving or live change. W2 remains incomplete at the packaging boundary; no M1–M14/CSP/reproducibility acceptance claimed.
## 2026-10-24 — W2 row 310 / #1824 223-source packaging evidence (Gyro)
Under sage-4008/4010, exactly209+14 source packages measured in scratch: total11,201 files /145,260,334 bytes and26,538,894-byte independent blob pack; extra14 total702 files /14,523,104 bytes and1,720,566-byte blob pack. Original pinned lock refused with --locked after existing cfg-filter script; one authorized automatic offline lock regeneration produced a strict subset (558→226 entries,332 removed,0 added,0 changed). Original lock untouched. Per-package source/archive/license/notice inventory and exact errors are in agents/gyro/work/queue-310/BUILD.md, “223-source measurement — sage-4008 and sage-4010”. Release measurement approved but awaits CLEAR after row327 gate (sage-4011). This evidence commit contains plain text only, no imported crate source or runtime outputs; packaging/landing choice remains held under Vikunja618, and source/notice review goes to Gladstone.
## 2026-10-24 — W2 row310 / #1824 223-vendor release measurement (Gyro)
sage-4014 CLEAR run: frozen/offline scratch build exit0 in380.674036s, actual nice19/four jobs/cores/CPUs, no external network interface, no retry. Four outputs total44,137,258 bytes; WASM43,952,335 bytes SHA2560322beb9e58b9abeed6b6e05125879bfb3eccbebb05094e191df3542a74007ea differs from the full-lock build. Exact S0 package closures passed preflight; original lock unchanged, pruned lock remains3401363e.... Slot released immediately for Bradford in gyro-0018. Gladstone supplemental review of14 additions found10 PASS/4 CONCERN (not adoption approval); embedded W3C notices/attribution, dpi full-source conjunction/copyrights, explicit spirv standard-text map and winit example PNG inventory are now documented in plain-text evidence. Details: agents/gyro/work/queue-310/BUILD.md, “223 release result and notice supplement — sage-4014”. No crate sources/binaries/runtime route committed or served; row held for Vikunja618 and all implementation/CSP gates remain open.
## 2026-10-24 — W2 row310 supplemental notice collection recheck recorded (Gyro)
Gladstone-0027 at9522d2356 independently passes the four corrected collection/mapping gaps, with earlier ten package source/notice PASS results standing. Bundle4d8e2aac... and all12 incremental path hashes verified. This is supplemental evidence only: W3C/M13/license adoption, pruned lock, packaging/size, Worker/native runtime, WASM difference and implementation/CSP gates remain uncleared; row310 stays held. Details: agents/gyro/work/queue-310/BUILD.md, “Supplemental notice recheck — gladstone-0027”. No build or source/notice/runtime change.
## 2026-10-24 — W2 Q248 targeted policy/provenance unit step (Gyro)
Under sage-4178 CLEAR, targeted red/green cycles only in the two new WordCraft files: final40/40 pass, no failures/skips. New MOSAIC_REQUIRE_WORDCRAFT_BUILD policy distinguishes missing tools from invalid binaries/support, checks CLI/refusals and rebuilt-output integrity, and enforces original S0 normal/build closure with approved223-source inventory. Inputs/notices/pruned-lock patch are prepared in owned uncommitted paths. No release build, browser, full suite, npm/canonical mutation or binary push. Actual source-builder/rebuild integration and other W2 gates remain pending;621 hold stays. Receipts: agents/gyro/work/queue-310/q248-*.txt and BUILD.md.
## 2026-10-24 — W2 local freeze and exact binary authority proof (Gyro)
Local implementation freeze aebc8d283 contains Q248 inputs and the40-tested policy step. The real row327 guard passed log/FF but refused unreviewed source binaries; nothing pushed. sage-4202 changes the prerequisite to a local tip, deferring push until complete W2/latest approved review round. Follow-up manifests attest11802 changed paths and94 guard binaries. Independent bytes/checksum proof covers72 registry files (Cargo file+package checksum, original locked archive/member),4 Git-dependency files (Cargo file checksum plus pinned original Git blob),18 WordCraft upstream files (pinned original Git blob; no Cargo checksum file). Four winit example PNGs are bound by the original lock but absent from the approved pruned lock; explicitly marked. Table/JSON in agents/gyro/work/queue-310/BUILD.md. No build/test, source mutation, interim review move or guard bypass.
2026-10-24 — Gyro, row310/#1824, sage-4270 source preparation fixtures: before, prepareSourceRoot/applySourcePatch were absent (10 expected RED failures); after, pinned scratch source/patch preparation and refusal paths implemented,50 targeted policy/provenance/preparation cases GREEN. Nice19 set absolutely; RED observed19, GREEN16/19. Receipts agents/gyro/work/queue-310/q248-preparation-{red,green-attempt}.txt. No compilation/browser/full suite/push; slot returned to Sage in gyro-0030, full W2 acceptance remains unfinished.
+900
View File
@@ -0,0 +1,900 @@
# Row 310 W2 WordCraft restricted source build
Started 2026-10-24 by Gyro, T3 thread 4c520dc8-238f-4f76-a973-28f2ef87310d.
Issue #1824; branch gyro/row310; base d16958bcf.
## Authority and constraints
Sage dispatch sage-3970 implements the approved W2 brief under Q246/mos-1571.
Read AGENTS.md, agents/gyro/README.md, D2/F4/D6-D9/G1/S0/W2 in
`docs/plans/2026-10-21_q195-writing-editor.md`, S0 report/inventory and CSP
measurement using `git show 74ec32013:<path>`, and Louie's pinned evaluation.
S0 is evidence, never modified. Protected source is read-only at
`e05b7fe86f3b85454000dffc321de638d7009817`, WordCraft 0.9.0.
No source checkout builds, live services/configuration, credentials, private books,
frame routes, shell CSP changes, policy expansion or dependency/tool changes.
All build/test runs need Sage CLEAR and use low priority, at most four jobs,
and TMPDIR freshly allocated beneath /mnt/storage/scratch/tmp.
No commit before applicable checks pass; report source/vendor bytes before commit
and every product binary path/size before first push. Push gyro/* only after ruling.
## Implementation plan
The existing approved design fixes the approach: immutable original import plus a
reviewable patch applied to isolated build roots, offline vendor inputs and pinned
tool hashes. An edited upstream import would lose the original-source receipt;
Louie's built files cannot substitute for a reproducible source build.
- [ ] Inventory original tracked input paths/bytes/hashes; import via git archive
into third_party/wordcraft/upstream. Inventory 209 reviewed packages and exact
git pins from S0; vendor only approved inputs with license/source receipts.
- [ ] Write provenance/build refusal tests first: changed/missing inputs, extra
dependencies, wrong tools, non-offline build, unshipped runtime dependency,
inline bootstrap/styles and stale output manifests must refuse.
- [ ] Implement build.mjs/toolchain.json/PROVENANCE.json/NOTICE and source patch.
Build from copied owned source with path remapping, stable environment and
manifest verification; external frame HTML/CSS/module bootstrap; package all
runtime files under src/public/wordcraft without serving them.
- [ ] Carry M1-M14 explicitly through patch and acceptance inventory. Host hooks
replace rfd/picker/download/print; block raw drops, local font enumeration,
persisted prose/fonts and direct outbound navigation. W6 owns production
bridge/routes, host import watchdog/sandbox and malformed corpus integration;
no placeholder is counted as passing mitigation evidence.
- [ ] Request CLEAR for each build/test stage. Build twice at different absolute
roots offline with the pinned tools. Compare every integration output hash,
record bytes/tool hashes/timings and run each touched test file independently,
affected WebUI suite and required repository checks on the assigned slot.
- [ ] Use scratch fixtures to measure exact Q234 style-src 'self' CSP with full
function coverage including host-owned Print, zero violations, no rfd/file
picker/download fallback and no external traffic. Preserve plain-text receipts.
- [ ] Report source/vendor totals and product binary inventory to Sage. After
checks/ruling, commit, push gyro/row310 through helper, send Sage and Gladstone
base/tip plus sha256 for every changed path. Move only row 310 to in-review;
Sage posts Gitea request. Filbert rechecks inventory once at landing.
## Acceptance risks to resolve
1. Vendor resolution must match reviewed normal/build closure, while preserving
original Cargo.lock and accounting for workspace-only dependency resolution.
2. Tool identity includes Rust target std and actual Trunk/wasm helper executables;
installed versions alone cannot establish tool identity.
3. Removing one Services hook leaves UI/engine fallbacks; trace all before patching.
4. Root-independent WASM includes generated build metadata; wasm-bindgen-shared's
git probing and absolute source paths need deterministic inputs/remapping.
5. W2 scratch host coverage must be real bytes/function behavior; W6 mitigation
gates remain explicit where production bridge authority is not yet available.
## Activity and evidence
- Initial worktree clean; HEAD d16958bcf, correct branch. Protected source HEAD
matches pin and git status is clean. No build or test has run.
- `scripts/mosaic queue next gyro` correctly refused in linked worktree. Retried
through canonical checkout as documented; operation still running at this note.
- Sage CLEAR sage-3973 covers new test red/green, offline metadata/tree/vendor prep
and one restricted release build with nice 19 / four jobs / fresh TMPDIR.
- Retried identical queue op gyro-0001 after Glomgold released lock: success,
revision 3857, row 310 briefed -> in-progress.
- Count reconciliation: F4's 199 counts third-party normal dependency edges for
wordcraft-web/wasm32-unknown-unknown. S0 adds 10 build-only dependencies, hence
209 third-party source/notice inputs, plus 15 local crates = 224 records.
These are distinct closures, not a dependency expansion. Current vendor is
exactly those 209 package identities, 10,499 files / 130,737,232 bytes before
final packaging corrections; upstream is 612 files / 26,913,076 bytes.
- New provenance/build tests ran individually under CLEAR; each has 2 expected
first-run failures because the owned verifier/builder does not exist yet.
- First offline metadata probe caught an error in my git-manifest normalization:
replacing version.workspace as a substring also changed rust-version.workspace.
No upstream input changed. Correcting anchored substitutions before repeating.
### Build-only manifest reduction (sage-3974)
- Cargo.toml: members reduced to the 15 reviewed local crates; default member wordcraft-web. No runtime feature changes.
- crates/doc/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/docbin/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/docx/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/engine/Cargo.toml: remove [target.'cfg(not(target_arch = "wasm32"))'.dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/engine/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/formats/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/pdf/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/proof/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/render/Cargo.toml: remove [target.'cfg(not(target_arch = "wasm32"))'.dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/ui-egui/Cargo.toml: remove [target.'cfg(target_os = "linux")'.dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/ui-egui/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- crates/zotero/Cargo.toml: remove [dev-dependencies] from isolated build copy; excluded dev/test or native-only resolution.
- sage-3976 permits proven-false target-section removal in THIRD-PARTY manifests
only in isolated build copies, with matching checksum rewrites. A three-valued
cfg analysis keeps unknown/custom flags/features unchanged and identifies 26
manifests / 57 false-target dependency sections; target-filter-plan.json lists
every crate/cfg/dependency. This is below the ~30-manifest stop boundary.
- The scratch-only filtered source still refuses: wgpu-core's dormant `angle`
feature references its removed Apple-only dependency. Stopped at the explicit
feature-definition boundary and sent gyro-0006 to Sage. No feature edited.
- Tool versions match all five pins; toolchain.json records their binary hashes
and the Rust compiler driver/wasm target support files. No release build yet.
- Current notice bundle includes 209 third-party package mappings, local source
license/attribution/font texts and self_cell/ryu Apache-2.0 elections. Source
verifier green: 2/2. Output/build acceptance remains red/unimplemented.
### Original-source subset (sage-3976)
Excluded whole directories assets/app-icon/, docs/images/ and packaging/macos/: web frame serves no icon; screenshots and macOS packaging are never build inputs. Every license/notice/copyright remains. Included files remain byte-identical; no vendor file removed. Exact excluded paths:
- assets/app-icon/hicolor/128x128/apps/ai.storyteller.wordcraft.png
- assets/app-icon/hicolor/16x16/apps/ai.storyteller.wordcraft.png
- assets/app-icon/hicolor/24x24/apps/ai.storyteller.wordcraft.png
- assets/app-icon/hicolor/256x256/apps/ai.storyteller.wordcraft.png
- assets/app-icon/hicolor/32x32/apps/ai.storyteller.wordcraft.png
- assets/app-icon/hicolor/48x48/apps/ai.storyteller.wordcraft.png
- assets/app-icon/hicolor/512x512/apps/ai.storyteller.wordcraft.png
- assets/app-icon/hicolor/64x64/apps/ai.storyteller.wordcraft.png
- assets/app-icon/hicolor/scalable/apps/ai.storyteller.wordcraft.svg
- assets/app-icon/wordcraft-1024.png
- assets/app-icon/wordcraft-macos-512.png
- assets/app-icon/wordcraft.icns
- assets/app-icon/wordcraft.ico
- assets/app-icon/wordcraft.svg
- docs/images/backstage.png
- docs/images/dark.png
- docs/images/design.png
- docs/images/hero.png
- docs/images/layout.png
- docs/images/references.png
- docs/images/review.png
- packaging/macos/Info.plist.in
- packaging/macos/dmg/README.md
- packaging/macos/dmg/background.svg
- packaging/macos/dmg/background.tiff
- packaging/macos/dmg/dmg-layout.DS_Store
- packaging/macos/dmg/generate.py
- packaging/macos/entitlements.plist
- packaging/macos/import-cert.sh
- packaging/macos/package.sh
- sage-3982 approved the 103 enumerated feature items across eight manifests,
mechanical script only, build copies only. Scratch application completed;
original vendor unchanged. A committed reproducible generator/test is pending
the packaging decision; no third-party source/feature edits are hand-applied.
- sage-3983 permits custom cfg fuzzing/loom/miri false under a sanitized,
refusing release environment. Third-party target inventory is now 28 manifests
/ 59 sections. It narrows the feature gate to root-specific package/selected
feature closure equality: S0's workspace-unified 293-node feature metadata is
context, not an equality target. Exact 199 normal /209 normal+build identities
remain the acceptance sets.
- Following that reduction, metadata refuses on encoding_rs/simdutf8 under a
target_feature=simd128 cfg. Pinned rustc default cfg has no simd128. The filter
retained target-feature flags as unknown. Scope stop per sage-3983: one-page
PACKAGING-BOUNDARY.md and complete survey sent to Sage in gyro-0010. No further
cfg/dependency category changed. No release build, commit, push or live change.
- Mos mos-1572/1573 via sage-3979: landing held pending Jason/Vikunja618; gyro
review-branch push is allowed after validation, with full binary listing.
Whole-row and runtime-only pack-size measurements are required after a local
verified commit; offline tool availability/provenance/timing also requested.
## Measured-cfg reduction under sage-3984g
Pinned rustc cfg is rustc-wasm32-cfg.txt. releaseEnvironment refuses inherited flag variables and forwards only an allowlist to the cfg measurement. Filter evaluator and mechanical feature cleanup are in build.mjs; no optional normal dependency removed.
- aes-0.9.3: remove dependencies under cfg(any(target_arch = "aarch64", target_arch = "x86_64", target_arch = "x86")); dependencies cpufeatures.
- bytes-1.12.1: remove dev-dependencies under cfg(loom); dependencies loom.
- cmov-0.5.4: remove dev-dependencies under cfg(any(unix, windows)); dependencies proptest.
- eframe-0.36.2: remove dependencies under cfg(any(target_os = "macos")); dependencies objc2.
- eframe-0.36.2: remove dependencies under cfg(any(target_os = "macos")); dependencies objc2-app-kit.
- eframe-0.36.2: remove dependencies under cfg(any(target_os = "macos")); dependencies objc2-foundation.
- eframe-0.36.2: remove dependencies under cfg(any(target_os = "windows")); dependencies windows-sys.
- eframe-0.36.2: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies egui-wgpu.
- eframe-0.36.2: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies egui-winit.
- eframe-0.36.2: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies glutin.
- eframe-0.36.2: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies glutin-winit.
- eframe-0.36.2: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies image.
- eframe-0.36.2: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies pollster.
- eframe-0.36.2: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies winit.
- eframe-0.36.2: remove dev-dependencies under cfg(not(target_arch = "wasm32")); dependencies directories.
- eframe-0.36.2: feature accesskit removes egui-winit/accesskit; dependency egui-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature android-game-activity removes egui-winit/android-game-activity; dependency egui-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature android-native-activity removes egui-winit/android-native-activity; dependency egui-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature default removes winit/default; dependency winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature glow removes dep:glutin-winit; dependency glutin-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature glow removes dep:glutin; dependency glutin removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature links removes egui-winit/links; dependency egui-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature persistence removes egui-winit/serde; dependency egui-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature wayland removes egui-winit/wayland; dependency egui-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature wayland removes glutin?/wayland; dependency glutin removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature wayland removes glutin-winit?/wayland; dependency glutin-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature wgpu_no_default_features removes dep:pollster; dependency pollster removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature x11 removes egui-winit/x11; dependency egui-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature x11 removes glutin?/x11; dependency glutin removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature x11 removes glutin?/glx; dependency glutin removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature x11 removes glutin-winit?/x11; dependency glutin-winit removed under cfg(not(target_arch = "wasm32")).
- eframe-0.36.2: feature x11 removes glutin-winit?/glx; dependency glutin-winit removed under cfg(not(target_arch = "wasm32")).
- encoding_rs-0.8.42: remove dependencies under cfg(all(any(target_arch = "x86_64", target_arch = "x86"), not(all(target_feature = "avx2", target_feature = "bmi1")))); dependencies multiversion.
- encoding_rs-0.8.42: remove dependencies under cfg(any(target_arch = "x86_64", target_arch = "x86")); dependencies core_detect.
- encoding_rs-0.8.42: remove dependencies under cfg(any(target_arch = "x86_64", target_arch = "x86", target_arch = "aarch64", all(target_arch = "wasm32", target_feature = "simd128"))); dependencies simdutf8.
- encoding_rs-0.8.42: feature std removes dep:multiversion; dependency multiversion removed under cfg(all(any(target_arch = "x86_64", target_arch = "x86"), not(all(target_feature = "avx2", target_feature = "bmi1")))).
- getrandom-0.3.4: remove dependencies under cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))); dependencies libc.
- getrandom-0.3.4: remove dependencies under cfg(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none"), target_feature = "atomics")); dependencies js-sys.
- getrandom-0.3.4: remove dependencies under cfg(all(target_arch = "wasm32", target_os = "wasi", target_env = "p2")); dependencies wasip2.
- getrandom-0.3.4: remove dependencies under cfg(all(target_os = "uefi", getrandom_backend = "efi_rng")); dependencies r-efi.
- getrandom-0.3.4: remove dependencies under cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))); dependencies libc.
- getrandom-0.3.4: remove dependencies under cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix")); dependencies libc.
- getrandom-0.3.4: remove dependencies under cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")); dependencies libc.
- getrandom-0.3.4: remove dependencies under cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")); dependencies libc.
- getrandom-0.3.4: remove dependencies under cfg(target_os = "netbsd"); dependencies libc.
- getrandom-0.3.4: remove dependencies under cfg(target_os = "solaris"); dependencies libc.
- getrandom-0.3.4: remove dependencies under cfg(target_os = "vxworks"); dependencies libc.
- getrandom-0.3.4: feature wasm_js removes dep:js-sys; dependency js-sys removed under cfg(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none"), target_feature = "atomics")).
- half-2.7.1: remove dependencies under cfg(target_arch = "spirv"); dependencies crunchy.
- harfrust-0.12.0: remove dev-dependencies under cfg(target_vendor = "apple"); dependencies objc2-core-foundation.
- harfrust-0.12.0: remove dev-dependencies under cfg(target_vendor = "apple"); dependencies objc2-core-text.
- harfrust-0.13.3: remove dev-dependencies under cfg(target_vendor = "apple"); dependencies objc2-core-foundation.
- harfrust-0.13.3: remove dev-dependencies under cfg(target_vendor = "apple"); dependencies objc2-core-text.
- hashbrown-0.17.1: remove dependencies under cfg(any()); dependencies serde.
- hashbrown-0.17.1: remove dev-dependencies under cfg(unix); dependencies libc.
- hashbrown-0.17.1: feature serde removes dep:serde; dependency serde removed under cfg(any()).
- indexmap-2.14.2: remove dependencies under cfg(any()); dependencies serde.
- indexmap-2.14.2: feature serde removes dep:serde; dependency serde removed under cfg(any()).
- parking_lot_core-0.9.12: remove dependencies under cfg(target_os = "redox"); dependencies redox_syscall.
- parking_lot_core-0.9.12: remove dependencies under cfg(unix); dependencies libc.
- parking_lot_core-0.9.12: remove dependencies under cfg(windows); dependencies windows-link.
- png-0.18.1: remove dev-dependencies under cfg(not(target_arch = "wasm32")); dependencies criterion.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies glib-sys.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies gobject-sys.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies gtk-sys.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies libc.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies percent-encoding.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies pollster.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies wayland-backend.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies wayland-client.
- rfd-0.17.2: remove dependencies under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")); dependencies wayland-protocols.
- rfd-0.17.2: remove dependencies under cfg(target_os = "macos"); dependencies block2.
- rfd-0.17.2: remove dependencies under cfg(target_os = "macos"); dependencies dispatch2.
- rfd-0.17.2: remove dependencies under cfg(target_os = "macos"); dependencies objc2.
- rfd-0.17.2: remove dependencies under cfg(target_os = "macos"); dependencies objc2-app-kit.
- rfd-0.17.2: remove dependencies under cfg(target_os = "macos"); dependencies objc2-core-foundation.
- rfd-0.17.2: remove dependencies under cfg(target_os = "macos"); dependencies objc2-foundation.
- rfd-0.17.2: remove dependencies under cfg(target_os = "windows"); dependencies windows-sys.
- rfd-0.17.2: feature common-controls-v6 removes windows-sys/Win32_UI_Controls; dependency windows-sys removed under cfg(target_os = "windows").
- rfd-0.17.2: feature gtk3 removes gtk-sys; dependency gtk-sys removed under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")).
- rfd-0.17.2: feature gtk3 removes glib-sys; dependency glib-sys removed under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")).
- rfd-0.17.2: feature gtk3 removes gobject-sys; dependency gobject-sys removed under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")).
- rfd-0.17.2: feature wayland removes wayland-backend; dependency wayland-backend removed under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")).
- rfd-0.17.2: feature wayland removes wayland-client; dependency wayland-client removed under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")).
- rfd-0.17.2: feature wayland removes wayland-protocols; dependency wayland-protocols removed under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")).
- rfd-0.17.2: feature xdg-portal removes pollster; dependency pollster removed under cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd")).
- serde_core-1.0.229: remove dependencies under cfg(any()); dependencies serde_derive.
- serde_json-1.0.151: remove dependencies under cfg(any()); dependencies serde.
- sha1-0.11.0: remove dependencies under cfg(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64")); dependencies cpufeatures.
- sha2-0.11.0: remove dependencies under cfg(any(target_arch = "aarch64", target_arch = "x86_64", target_arch = "x86")); dependencies cpufeatures.
- sys-locale-0.3.2: remove dependencies under cfg(target_os = "android"); dependencies libc.
- uuid-1.27.0: remove dependencies under cfg(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none"), target_feature = "atomics")); dependencies js-sys.
- uuid-1.27.0: remove dependencies under cfg(not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none")))); dependencies getrandom.
- uuid-1.27.0: remove dependencies under cfg(not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none")))); dependencies rand.
- uuid-1.27.0: remove dev-dependencies under cfg(not(target_arch = "wasm32")); dependencies gungraun.
- uuid-1.27.0: feature fast-rng removes dep:rand; dependency rand removed under cfg(not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none")))).
- uuid-1.27.0: feature js removes dep:js-sys; dependency js-sys removed under cfg(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none"), target_feature = "atomics")).
- uuid-1.27.0: feature rng removes dep:getrandom; dependency getrandom removed under cfg(not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none")))).
- uuid-1.27.0: feature rng-getrandom removes dep:getrandom; dependency getrandom removed under cfg(not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none")))).
- uuid-1.27.0: feature rng-rand removes dep:rand; dependency rand removed under cfg(not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none")))).
- uuid-1.27.0: feature std removes js-sys?/std; dependency js-sys removed under cfg(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none"), target_feature = "atomics")).
- wasm-bindgen-0.2.129: remove dev-dependencies under cfg(all(target_os = "emscripten", wasm_bindgen_unstable_tokio)); dependencies tokio.
- wasm-bindgen-0.2.129: remove dev-dependencies under cfg(target_arch = "wasm64"); dependencies paste.
- wasm-bindgen-0.2.129: remove dev-dependencies under cfg(target_arch = "wasm64"); dependencies serde_derive.
- wasm-bindgen-futures-0.4.79: remove dependencies under cfg(all(target_os = "emscripten", wasm_bindgen_unstable_tokio)); dependencies tokio.
- web-time-1.1.0: remove dev-dependencies under cfg(all(target_family = "wasm", target_feature = "atomics")); dependencies futures-channel.
- web-time-1.1.0: remove dev-dependencies under cfg(all(target_family = "wasm", target_feature = "atomics")); dependencies futures-util.
- web-time-1.1.0: remove dev-dependencies under cfg(all(target_family = "wasm", target_feature = "atomics")); dependencies web-sys.
- web-time-1.1.0: remove dev-dependencies under cfg(not(target_family = "wasm")); dependencies pollster.
- wgpu-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies smallvec.
- wgpu-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies wgpu-core.
- wgpu-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies wgpu-hal.
- wgpu-30.0.1: remove dependencies under cfg(not(target_has_atomic = "64")); dependencies portable-atomic.
- wgpu-30.0.1: remove dependencies under cfg(target_os = "emscripten"); dependencies smallvec.
- wgpu-30.0.1: remove dependencies under cfg(target_os = "emscripten"); dependencies wgpu-core.
- wgpu-30.0.1: remove dependencies under cfg(target_os = "emscripten"); dependencies wgpu-hal.
- wgpu-core-30.0.1: remove dependencies under cfg(any(windows, target_os = "linux", target_os = "android", target_os = "freebsd")); dependencies wgpu-core-deps-windows-linux-android.
- wgpu-core-30.0.1: remove dependencies under cfg(not(target_has_atomic = "64")); dependencies portable-atomic.
- wgpu-core-30.0.1: remove dependencies under cfg(target_os = "emscripten"); dependencies wgpu-core-deps-emscripten.
- wgpu-core-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies wgpu-core-deps-apple.
- wgpu-core-30.0.1: feature angle removes wgpu-core-deps-apple/angle; dependency wgpu-core-deps-apple removed under cfg(target_vendor = "apple").
- wgpu-core-30.0.1: feature drm removes wgpu-core-deps-windows-linux-android/drm; dependency wgpu-core-deps-windows-linux-android removed under cfg(any(windows, target_os = "linux", target_os = "android", target_os = "freebsd")).
- wgpu-core-30.0.1: feature dx12 removes wgpu-core-deps-windows-linux-android/dx12; dependency wgpu-core-deps-windows-linux-android removed under cfg(any(windows, target_os = "linux", target_os = "android", target_os = "freebsd")).
- wgpu-core-30.0.1: feature gles removes wgpu-core-deps-windows-linux-android/gles; dependency wgpu-core-deps-windows-linux-android removed under cfg(any(windows, target_os = "linux", target_os = "android", target_os = "freebsd")).
- wgpu-core-30.0.1: feature gles removes wgpu-core-deps-emscripten/gles; dependency wgpu-core-deps-emscripten removed under cfg(target_os = "emscripten").
- wgpu-core-30.0.1: feature metal removes wgpu-core-deps-apple/metal; dependency wgpu-core-deps-apple removed under cfg(target_vendor = "apple").
- wgpu-core-30.0.1: feature portable-atomic removes dep:portable-atomic; dependency portable-atomic removed under cfg(not(target_has_atomic = "64")).
- wgpu-core-30.0.1: feature renderdoc removes wgpu-core-deps-windows-linux-android/renderdoc; dependency wgpu-core-deps-windows-linux-android removed under cfg(any(windows, target_os = "linux", target_os = "android", target_os = "freebsd")).
- wgpu-core-30.0.1: feature vulkan removes wgpu-core-deps-windows-linux-android/vulkan; dependency wgpu-core-deps-windows-linux-android removed under cfg(any(windows, target_os = "linux", target_os = "android", target_os = "freebsd")).
- wgpu-core-30.0.1: feature vulkan-portability removes wgpu-core-deps-apple/vulkan-portability; dependency wgpu-core-deps-apple removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: remove dependencies under cfg(all(unix, not(target_vendor = "apple"), not(target_family = "wasm"))); dependencies drm.
- wgpu-hal-30.0.1: remove dependencies under cfg(all(windows, not(target_arch = "aarch64"), target_env = "msvc")); dependencies mach-dxcompiler-rs.
- wgpu-hal-30.0.1: remove dependencies under cfg(any(not(target_has_atomic = "64"), not(target_has_atomic = "ptr"))); dependencies portable-atomic.
- wgpu-hal-30.0.1: remove dev-dependencies under cfg(not(any(target_arch = "wasm32", target_os = "ios", target_os = "visionos", target_env = "ohos"))); dependencies glutin.
- wgpu-hal-30.0.1: remove dev-dependencies under cfg(not(any(target_arch = "wasm32", target_os = "ios", target_os = "visionos", target_env = "ohos"))); dependencies glutin-winit.
- wgpu-hal-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies ash.
- wgpu-hal-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies gpu-allocator.
- wgpu-hal-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies khronos-egl.
- wgpu-hal-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies libloading.
- wgpu-hal-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies renderdoc-sys.
- wgpu-hal-30.0.1: remove dependencies under cfg(not(target_arch = "wasm32")); dependencies smallvec.
- wgpu-hal-30.0.1: remove dependencies under cfg(not(target_has_atomic = "ptr")); dependencies portable-atomic-util.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_os = "android"); dependencies android_system_properties.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_os = "android"); dependencies ndk-sys.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_os = "emscripten"); dependencies khronos-egl.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_os = "emscripten"); dependencies libloading.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies block2.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies bytemuck.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies objc2.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies objc2-core-foundation.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies objc2-core-graphics.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies objc2-foundation.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies objc2-metal.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies objc2-quartz-core.
- wgpu-hal-30.0.1: remove dependencies under cfg(target_vendor = "apple"); dependencies raw-window-metal.
- wgpu-hal-30.0.1: remove dependencies under cfg(unix); dependencies libc.
- wgpu-hal-30.0.1: remove dependencies under cfg(unix); dependencies wayland-sys.
- wgpu-hal-30.0.1: remove dependencies under cfg(windows); dependencies bit-set.
- wgpu-hal-30.0.1: remove dependencies under cfg(windows); dependencies glutin_wgl_sys.
- wgpu-hal-30.0.1: remove dependencies under cfg(windows); dependencies once_cell.
- wgpu-hal-30.0.1: remove dependencies under cfg(windows); dependencies range-alloc.
- wgpu-hal-30.0.1: remove dependencies under cfg(windows); dependencies windows.
- wgpu-hal-30.0.1: remove dependencies under cfg(windows); dependencies windows-core.
- wgpu-hal-30.0.1: remove dependencies under cfg(windows); dependencies windows-result.
- wgpu-hal-30.0.1: feature dx12 removes dep:bit-set; dependency bit-set removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes dep:gpu-allocator; dependency gpu-allocator removed under cfg(not(target_arch = "wasm32")).
- wgpu-hal-30.0.1: feature dx12 removes dep:libloading; dependency libloading removed under cfg(not(target_arch = "wasm32")) / cfg(target_os = "emscripten").
- wgpu-hal-30.0.1: feature dx12 removes dep:once_cell; dependency once_cell removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes dep:range-alloc; dependency range-alloc removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes dep:windows-core; dependency windows-core removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes gpu-allocator/d3d12; dependency gpu-allocator removed under cfg(not(target_arch = "wasm32")).
- wgpu-hal-30.0.1: feature dx12 removes once_cell/std; dependency once_cell removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Devices_DeviceAndDriverInstallation; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Devices_Display; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Graphics_Direct3D_Dxc; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Graphics_Direct3D_Fxc; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Graphics_Direct3D; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Graphics_Direct3D12; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Graphics_DirectComposition; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Graphics_Dxgi_Common; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Graphics_Gdi; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_Security; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_System_Diagnostics_Debug; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_System_Kernel; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_System_Performance; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_System_Threading; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature dx12 removes windows/Win32_UI_WindowsAndMessaging; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature gles removes dep:glutin_wgl_sys; dependency glutin_wgl_sys removed under cfg(windows).
- wgpu-hal-30.0.1: feature gles removes dep:khronos-egl; dependency khronos-egl removed under cfg(not(target_arch = "wasm32")) / cfg(target_os = "emscripten").
- wgpu-hal-30.0.1: feature gles removes dep:libloading; dependency libloading removed under cfg(not(target_arch = "wasm32")) / cfg(target_os = "emscripten").
- wgpu-hal-30.0.1: feature gles removes dep:ndk-sys; dependency ndk-sys removed under cfg(target_os = "android").
- wgpu-hal-30.0.1: feature gles removes dep:objc2; dependency objc2 removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature gles removes dep:wayland-sys; dependency wayland-sys removed under cfg(unix).
- wgpu-hal-30.0.1: feature gles removes dep:windows-result; dependency windows-result removed under cfg(windows).
- wgpu-hal-30.0.1: feature gles removes windows-result/std; dependency windows-result removed under cfg(windows).
- wgpu-hal-30.0.1: feature gles removes windows/Win32_Graphics_Gdi; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature gles removes windows/Win32_Graphics_OpenGL; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature gles removes windows/Win32_System_LibraryLoader; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature gles removes windows/Win32_UI_WindowsAndMessaging; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature metal removes dep:block2; dependency block2 removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature metal removes dep:libloading; dependency libloading removed under cfg(not(target_arch = "wasm32")) / cfg(target_os = "emscripten").
- wgpu-hal-30.0.1: feature metal removes dep:objc2; dependency objc2 removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature metal removes dep:objc2-core-foundation; dependency objc2-core-foundation removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature metal removes dep:objc2-core-graphics; dependency objc2-core-graphics removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature metal removes dep:objc2-foundation; dependency objc2-foundation removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature metal removes dep:objc2-metal; dependency objc2-metal removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature metal removes dep:objc2-quartz-core; dependency objc2-quartz-core removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature metal removes dep:smallvec; dependency smallvec removed under cfg(not(target_arch = "wasm32")).
- wgpu-hal-30.0.1: feature metal removes dep:raw-window-metal; dependency raw-window-metal removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature portable-atomic removes dep:portable-atomic; dependency portable-atomic removed under cfg(any(not(target_has_atomic = "64"), not(target_has_atomic = "ptr"))).
- wgpu-hal-30.0.1: feature portable-atomic removes dep:portable-atomic-util; dependency portable-atomic-util removed under cfg(not(target_has_atomic = "ptr")).
- wgpu-hal-30.0.1: feature renderdoc removes dep:libloading; dependency libloading removed under cfg(not(target_arch = "wasm32")) / cfg(target_os = "emscripten").
- wgpu-hal-30.0.1: feature renderdoc removes dep:renderdoc-sys; dependency renderdoc-sys removed under cfg(not(target_arch = "wasm32")).
- wgpu-hal-30.0.1: feature static-dxc removes dep:mach-dxcompiler-rs; dependency mach-dxcompiler-rs removed under cfg(all(windows, not(target_arch = "aarch64"), target_env = "msvc")).
- wgpu-hal-30.0.1: feature vulkan removes dep:android_system_properties; dependency android_system_properties removed under cfg(target_os = "android").
- wgpu-hal-30.0.1: feature vulkan removes dep:ash; dependency ash removed under cfg(not(target_arch = "wasm32")).
- wgpu-hal-30.0.1: feature vulkan removes dep:libc; dependency libc removed under cfg(unix).
- wgpu-hal-30.0.1: feature vulkan removes dep:libloading; dependency libloading removed under cfg(not(target_arch = "wasm32")) / cfg(target_os = "emscripten").
- wgpu-hal-30.0.1: feature vulkan removes dep:raw-window-metal; dependency raw-window-metal removed under cfg(target_vendor = "apple").
- wgpu-hal-30.0.1: feature vulkan removes dep:smallvec; dependency smallvec removed under cfg(not(target_arch = "wasm32")).
- wgpu-hal-30.0.1: feature vulkan removes dep:windows; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature vulkan removes gpu-allocator/vulkan; dependency gpu-allocator removed under cfg(not(target_arch = "wasm32")).
- wgpu-hal-30.0.1: feature vulkan removes windows/Win32; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature vulkan removes windows/Win32_Devices_Display; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature vulkan removes windows/Win32_Foundation; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature vulkan removes windows/Win32_Graphics_Dxgi; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature vulkan removes windows/Win32_Graphics_Dxgi_Common; dependency windows removed under cfg(windows).
- wgpu-hal-30.0.1: feature vulkan removes windows/Win32_Graphics_Gdi; dependency windows removed under cfg(windows).
- zerocopy-0.8.61: remove dependencies under cfg(any()); dependencies zerocopy-derive.
- zip-3.0.0: remove dependencies under cfg(fuzzing); dependencies arbitrary.
Count correction: 28 changed manifests /121 individual TOML dependency table sections /109 feature items. Earlier57/59 counted grouped cfg+kind sections, not individual dependency tables. Initial indexmap failure exposed my filter treating a dev-dependency as preserving an optional normal dependency; fixed only that bookkeeping bug with a failing then passing regression. No inventory expansion.
Resolution stop: vello_cpu0.1.0 optional normal glifo ^0.2.0 (locked0.2.0) is outside reviewed209 (reviewed glifo is0.3.0). No cfg-filtered section controls it. Stopped per sage-3984g; no import/fetch. Offline size receipt full-lock-cache-size.json: 538 third-party lock records =534 registry +4 git. Default cache175 present/359 missing,16,666,072 archive bytes; existing Louie toolchain cache534 present/0 missing,85,234,501 bytes; S0 cache412 present/122 missing,44,438,740 bytes. Sent Sage gyro-0011. Root closure/release/CSP acceptance is unproved.
## Full-lock scratch measurement — sage-3992
Scope is measurement only, entirely under
`/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0`. No additional source,
outputs or tool binaries imported into the repository; no commit/push. The
restricted-runtime/security/CSP gates remain open. No further manifest surgery.
Extraction from Louie's pre-existing cache verified every registry archive
against the ORIGINAL Cargo.lock checksum, with no fetch. All four git lock
records were excluded from this extraction. Registry results (534 packages):
- Original archive total: 85,234,501 bytes.
- Extracted archive content: 24,844 files / 611,577,974 bytes.
- Including 534 generated Cargo checksum files: 25,378 files / 614,049,226 bytes.
- Beyond the reviewed 209, the full 538 lock set adds 329 packages: 328 registry
plus one git package. The additional registry content alone is 15,005 files /
484,646,629 bytes including generated checksums. The fourth git package was
neither fetched nor copied. Full details: full-lock-extracted-size.json.
For the measurement build, three ALREADY REVIEWED git packages were copied from
owned cargo-vendor into scratch after registry extraction. No new git source
was imported. Source is the owned source copy with the already approved local
15-member workspace reduction and unchanged vendor manifests/features. The exact
pinned original icon was restored only in scratch for the original Trunk index.
This builds the baseline for size/timing; it is not the restricted adapter and
cannot count as M1-M14 or zero-CSP evidence.
Before compiling, offline cargo tree with normal edges exactly matched S0's
199 third-party +15 local packages; normal,build exactly matched 209+15. The
comparison refused on any added/missing pair. Scratch metadata/tree commands and
the release command each run with unshare --user --map-root-user --net, nice19,
four Cargo jobs, isolated HOME/CARGO_HOME and a fresh scratch TMPDIR. There is no
connected network interface in these namespaces, only loopback; Cargo and Trunk
also have offline enabled and Trunk update checks disabled. Inherited Rust flags
are refused and none are set for this measurement. Release build started after
those package-closure checks; result/timing/output pack measurement pending.
Tool availability/provenance on this host:
- rustc/Cargo 1.99.1 and wasm32-unknown-unknown std: existing isolated rustup
stable toolchain under Louie's evaluation toolchain directory, installed Oct21;
rustup settings and target manifests identify it. No install repeated.
- Trunk0.22.0: existing isolated cargo install; .crates.toml records the exact
version and crates.io origin. No install repeated.
- wasm-bindgen0.2.129 and wasm-opt131: existing Trunk versioned helper cache,
copied to isolated scratch cache/PATH. No download. Their original download
commands are not present in Louie's evaluation report.
- Five executable versions/hashes and Rust support hashes: toolchain.json.
All required tools are already present; this build needs no network.
### Measurement environment correction and retry
The first measurement command succeeded in 388.757578 seconds (06:02:17.598Z
through 06:08:46.356Z). The requested `nice -n19` was relative to inherited
negative priority; compiler workers were initially nice15. I detected and set
only this build's processes/threads absolutely to19 during compilation, then
retained this result as a LIMITED timing, not a whole-run nice19 sample.
Receipt: full-lock-release-limited.json and measurement-priority-correction.json.
No baseline source change was made. Sage was told in gyro-0012 before retry.
The one environment retry authorized in sage-3992 establishes absolute nice19
before child spawn, uses a fresh target-retry directory, CARGO_BUILD_JOBS=4,
BINARYEN_CORES=4 and a four-CPU affinity inherited by all build children.
measurement-retry-priority.jsonl confirms Trunk/Cargo/rustc at19 on those CPUs.
The harness separately reprioritizes the waiting Python launcher, so launcher
priority alone is not the build-child measurement. The network namespace,
offline flags and isolated source/vendor/tool environment are unchanged.
### Full-lock measurement results (sage-3992)
The valid environment retry succeeded, exit0, in **397.864805 seconds** (06:09:38.409Z–06:16:16.274Z), from a fresh target directory. Actual Trunk/Cargo/rustc/wasm-opt children were nice19, four-CPU affinity; Cargo jobs4 and Binaryen cores4. The waiting Python launcher was independently reprioritized to-4 by the harness; that is recorded separately and does not describe build child priority. Evidence: full-lock-release-measurement.json, measurement-retry-priority.jsonl and measurement-release.log. Three existing engine dead-code warnings; no build error.
| Baseline measurement output | Bytes | SHA-256 |
|---|---:|---|
| index.html | 1604 | 299b76f4004bbc65204d561cc381b3fbb249d10069eaa50e88c7fba3b6c63cb8 |
| wordcraft-fa59e09a3f921e03.ico | 18378 | 53a23dcf66260f44d87d4d143d633395f3e967f391eda47e6e9cc3a52f820225 |
| wordcraft-web-832240fdc6ce872b_bg.wasm | 43957877 | c1c15050a9b394c21e7540aa57c9292b86d32bfea2476094a9976304dacf1de0 |
| wordcraft-web-88f7089f25a3b338.js | 164941 | 866a1de6a33eff2ded8ae9588fd049aeacfc42557a3863ccd2107b3faf4d691e |
Total runtime output: **44142800 bytes**. Output blobs alone pack to **16720159 bytes** using Git2.55.0: hash-object -w into a NEW scratch bare repo, sorted four blob IDs through pack-objects --stdout --threads=4. No git gc, no object writes in the Mosaic repository; count-objects receipts are in measurement-output-pack.json. The empty internal .trunk-lock is excluded. This is an independent four-blob pack, not a cross-version delta estimate and not the whole-row pack. Whole-row pack measurement remains unavailable because this work is not committed.
**Network access was disabled:** every Cargo/Trunk command ran in a new isolated user/network namespace with no connected interface; the topology receipt shows only zero-traffic loopback. Cargo and Trunk offline flags and disabled Trunk version checks were also enforced. No fetch/install was needed. No host HOME, Cargo config or credentials were passed into the build environment.
Read-only metadata observation: the unfiltered scratch resolver has238 package records; root tree joins give exactly214 normal and224 normal+build (199/209 third-party +15 local). Fourteen metadata-only extra packages total14,523,104 extracted bytes. measurement-resolution-extra-packages.json lists them for the packaging decision; no smaller vendor experiment/import was performed, and this does not clear additional source for landing.
Both requested scratch measurements are complete. No full-lock vendor source or runtime output entered the repository, no commit/push, no serving route or live change. The packaging choice still waits on Mos/Jason; M1–M14, restricted adapter, two-root reproducibility, CSP/browser and full package checks are unproved. Row310 stays in-progress, not in-review.
## 223-source measurement — sage-4008 and sage-4010
Mos mos-1574 requested the209+14 comparison before Jason chooses (Vikunja618). Scratch only: /mnt/storage/scratch/gyro-223-measure-mzbp0x23. The source includes exactly223 packages: owned reviewed209 plus14 checksum-verified registry archives from the existing cache. No other package, no fetch, no source adoption. Original vendor manifests are preserved for sizing.
| Pristine source set | Files incl checksums | Bytes incl checksums | Independent Git blob pack bytes |
|---|---:|---:|---:|
| Extra14 | 702 | 14523104 | 1720566 |
| Total223 | 11201 | 145260334 | 26538894 |
Packs use the prior output-pack method: source files hash-object -w --no-filters into a NEW scratch bare repository, then sorted unique blob IDs to pack-objects --stdout --threads=4, at nice19. No gc, tree/commit objects or cross-version delta estimate. Pack/input digests and count-objects: measurement-223-source-packs.json and measurement-223-input-manifest.json. Sizes include all original package files (no vendor pruning), plus generated .cargo-checksum.json.
### Resolution and lock result
Unfiltered223 with the original pin lock: metadata --offline --locked exits101 on missing native-only cpufeatures (exact error in measurement-223-unfiltered-resolution.json). Existing packet filterVendorManifest was then applied mechanically to the scratch copy:31 manifests /155 individual false-target dependency table sections /133 dangling feature items, including3 additional changed manifests from the14. No new algorithm or hand edits. Original reviewed209 source remains untouched. Filtered metadata --offline --locked exits101: cannot update Cargo.lock because --locked prevents this. Original lock remains06b745e43c13df3df7f048fa6a1981625ce7a5fe4cd484bc6254d0913d865b0b.
sage-4010 separately authorized one cargo metadata --offline run WITHOUT --locked in another scratch source copy. It exited0 and generated a lock with226 entries against the original558: **332 removed,0 added,0 changed** when comparing name/version/source/checksum entry by entry. Pruned SHA2563401363e100783dc70c8f5ba09324947c0b6f8562f1ac1cbbc61a0497200c17f. Exact diff and generated lock are measurement-223-lock-diff.json and measurement-223-pruned-Cargo.lock.txt. The original source lock was not modified, and there were no manual lock edits.
CLEAR request gyro-0015 covers one release measurement under --locked/--frozen with that generated lock, nice19,4 jobs/cores, isolated netns, fresh HOME/CARGO_HOME/TMPDIR/target and one environment-fault retry. sage-4011 approves the description but withholds CLEAR until row327 landing gate finishes (roughly06:45–06:55Z). **No223 release build has run.** Packaging choice and row310 remain held. Shipping a pruned lock is itself a packaging change needing S0 reviewer and Jason's choice; this measurement does not adopt it.
### Fourteen-package source and notice inventory
Every source is registry+https://github.com/rust-lang/crates.io-index. Exact archive SHA256/size and notice-file SHA256/size: measurement-223-inputs.json; all present notice text: measurement-14-notices.txt. No election or license approval is asserted.
| Package | Version | Declared license expression | Notice/license files present |
|---|---|---|---|
| cursor-icon | 1.2.0 | MIT OR Apache-2.0 OR Zlib | LICENSE-APACHE, LICENSE-MIT, LICENSE-ZLIB |
| dpi | 0.1.2 | Apache-2.0 AND MIT | LICENSE, LICENSE-LIBM-MIT |
| futures-macro | 0.3.34 | MIT OR Apache-2.0 | LICENSE-APACHE, LICENSE-MIT |
| glifo | 0.2.0 | Apache-2.0 OR MIT | LICENSE-APACHE, LICENSE-MIT |
| ordered-float | 5.5.0 | MIT | LICENSE-MIT |
| pin-project | 1.1.13 | Apache-2.0 OR MIT | LICENSE-APACHE, LICENSE-MIT |
| pin-project-internal | 1.1.13 | Apache-2.0 OR MIT | LICENSE-APACHE, LICENSE-MIT |
| smol_str | 0.2.2 | MIT OR Apache-2.0 | LICENSE-APACHE, LICENSE-MIT |
| spirv | 0.4.0+sdk-1.4.341.0 | Apache-2.0 | **None present** |
| termcolor | 1.4.1 | Unlicense OR MIT | COPYING, LICENSE-MIT, UNLICENSE |
| tracing | 0.1.44 | MIT | LICENSE |
| tracing-attributes | 0.1.31 | MIT | LICENSE |
| tracing-core | 0.1.36 | MIT | LICENSE, src/spin/LICENSE |
| winit | 0.30.13 | Apache-2.0 | LICENSE |
spirv has no license/notice file in its archive despite declaring Apache-2.0; this needs Gladstone's notice review before adoption. dpi declares Apache-2.0 AND MIT and includes LICENSE-LIBM-MIT; tracing-core includes an additional src/spin/LICENSE. Both are inventoried, not flattened to a single default text. No source code or binaries from any crate are included in this plain-text evidence commit.
Plain-text packet hygiene: trailing spaces in Node assertion transcripts normalized before commit (filter-dev-red.txt, cfg-red.txt, filter-red.txt); test outcomes and source/notice hashes unchanged.
## 223 release result and notice supplement — sage-4014
sage-4014 CLEAR supersedes the earlier slot hold. Build started06:31:53.099Z and finished06:38:13.773Z, exit0, **380.674036 seconds**. No retry used. Frozen+locked generated lock remains3401363e100783dc70c8f5ba09324947c0b6f8562f1ac1cbbc61a0497200c17f; original06b745e4... remains unchanged. Actual Trunk/Cargo/rustc/wasm-opt at nice19, CPUs12–15, Cargo jobs4/Binaryen cores4; fresh HOME/CARGO_HOME/TMPDIR/target; isolated netns with no external interface and offline/update-check-disabled tooling. No network access or fetch. Three existing engine dead-code warnings; no build error. Slot released to Sage for Bradford in gyro-0018 immediately after completion.
Frozen/offline cargo-tree preflight exactly matches S0:214 normal and224 normal+build records (199/209 third-party plus15 local), no added/missing package identities. measurement-223-build-preflight.json records this.
| Scratch baseline output | Bytes | SHA-256 |
|---|---:|---|
| index.html | 1604 | 28ce55d5c017d545aaac91bbd96f22e6ebd3b35af8d856315cdcb150a2a4a57d |
| wordcraft-fa59e09a3f921e03.ico | 18378 | 53a23dcf66260f44d87d4d143d633395f3e967f391eda47e6e9cc3a52f820225 |
| wordcraft-web-88f7089f25a3b338.js | 164941 | 866a1de6a33eff2ded8ae9588fd049aeacfc42557a3863ccd2107b3faf4d691e |
| wordcraft-web-8e80c8f64c8671f7_bg.wasm | 43952335 | 0322beb9e58b9abeed6b6e05125879bfb3eccbebb05094e191df3542a74007ea |
Total output **44137258 bytes**. The WASM SHA256 **does not equal** the full-lock build c1c15050a9b394c21e7540aa57c9292b86d32bfea2476094a9976304dacf1de0. No reproducibility or functional/CSP equivalence is asserted. Source roots and packaging differ; this run does not isolate the reason for the hash difference. Full result, child priority observations and log: measurement-223-build.json, measurement-223-build-priority.jsonl, measurement-223-release.log.
### Gladstone supplemental review and notice response
gladstone-0026 (06:37:48Z) independently checked the14 original archive checksums and original manifest/source/license inventory:10 supplemental PASS /4 CONCERN. This is not adoption or candidate approval. Checked flags: winit has one cfg-alias build script; futures-macro, pin-project-internal and tracing-attributes are proc-macros; winit has native cfg paths and Worker/Blob source. None of14 appears in the measured normal/build target closure. Source-level Worker/native flags do not imply permission to select those paths or relax Q234.
The filename-only notice collector missed embedded W3C terms in cursor-icon/src/lib.rs and winit/src/keyboard.rs. After re-reading those actual headers, measurement-14-notices.txt now includes each complete embedded license, short notice, source document URI and attribution. measurement-14-notice-supplement.json records original source hashes/line spans and extracted text hashes. The added W3C form remains an explicit S0/license-adoption review gate, not silently folded into the root SPDX expressions.
dpi remains **Apache-2.0 AND MIT** for the full-source inventory: both root LICENSE and LICENSE-LIBM-MIT retained, plus README feature explanation and complete libm copyright header added to the notice packet. No Apache-only election. tracing-core retains root LICENSE and distinct src/spin/LICENSE. spirv has no text file in its archive; supplemental mapping explicitly supplies the standard Apache-2.0 text from the pinned WordCraft LICENSE-APACHE, following S0 M13 missing-file treatment, with its source pin/hash recorded. This is an evidence mapping, not a shipping approval.
measurement-14-binary-inputs.json now lists all four winit example PNGs: examples/data/cross.png159B, cross2.png129B, gradient.png229B, icon.png2950B, each with SHA256. No other non-UTF8/NUL payload among14. They remain scratch source inputs; no binary is in this evidence commit.
All runtime outputs and all223 crate sources remain scratch-only. Only plain-text results/notices/metadata are committed. Shipping the pruned lock, the14 additions, new W3C notice form and repository size still require S0 reviewer/owner choices. Row310 stays held for Vikunja618; restricted adapter, M1–M14, two-root reproducibility and CSP/browser acceptance remain unproved.
## Supplemental notice recheck — gladstone-0027
Gladstone rechecked the collection delta at9522d2356 against1716f5a22 on
2026-10-24T06:44:42Z. All four prior notice-collection/mapping gaps now PASS as
supplemental evidence: cursor-icon embedded W3C text/attribution, dpi full-source
conjunction/copyrights, spirv explicit standard Apache-2.0 text mapping, and
winit embedded W3C text plus four example PNG records. The earlier ten package
source/notice PASS results stand. tracing-core root/spin license texts remain
complete. No additional collection gap was found in this requested delta.
Reviewer independently verified original header/source hashes and extracted
notice hashes, PNG/archive bytes, all12 incremental path hashes and changed-path
set, UTF8/no-NUL boundary and diff whitespace check. Bundle SHA256
4d8e2aac5de85d3f3145d5d3945924436d1c30bc043fb3e2d4391cd98b1adbde also matches
this worktree's fresh hash check.
This recheck is **not adoption or candidate approval**. New W3C terms still need
explicit M13/license/owner adoption review; dpi conjunction and spirv mapping
must carry into any shipped M13 bundle; PNG classification and future selection
of Worker/native paths remain explicit gates. Gladstone did not rerun or
functionally/CSP-validate the WASM. Its differing hash, the pruned lock and
packaging/size choice remain uncleared. S0 M1–M14, Jason's choice/Vikunja618 and
the row310 hold remain in force. No further build, source, notice-text or runtime
change was made to record this result.
## Approved implementation plan — sage-4176 / Q248
Current pushed tip:1749728ca6aa7541a78a304c1f10e0c0751809c3. Q248 via
mos-1593 approves adopting exactly209+14 source packages, the cargo-generated
558→226 pruned lock3401363e..., the four Gladstone notice fixes, and committing
WASM with a mandatory landing rebuild. Vikunja621 still blocks landing because
the additional W3C Software License terms await Jason. Build and review proceed.
No tests/builds have run for this new implementation assignment yet.
1. Finalize the owned pristine source subset and223-package vendor inventory,
source hashes, approved pruned-lock patch and complete notice bundle. Keep
original upstream and vendor bytes immutable; apply mechanical reduction,
source restrictions and matching checksums only in isolated build roots.
2. Complete owned build.mjs/toolchain.json as the offline source builder and
toolchain policy. Use **MOSAIC_REQUIRE_WORDCRAFT_BUILD=1**, separate from row154:
a routine rebuild skips only an absent/wrong-version pinned toolchain, required
mode fails; a wrong binary/support hash, malformed switch, invalid inputs,
forbidden inherited flags, closure drift or output mismatch always refuses.
Each refusal path gets an independent test. Keep these APIs in the existing
owned build.mjs rather than adding an unowned toolchain module.
3. Implement the restricted web source patch and external bootstrap/styles:
host-owned file I/O and Print, no web rfd, browser picker/download fallback,
blob print iframe, local-font access or persisted document/font state. Carry
every S0 M1–M14 requirement/refusal through the patch and scratch acceptance
matrix. W6 still owns production bridge/routes and must repeat integration
mitigation proofs before serving anything.
4. On separately CLEARed slots, run new test red/green cycles, pinned offline
release builds in two different absolute roots, then scratch-only full-function
measurement under the exact Q234 style-src self header including host Print.
Require identical integration output hashes, zero CSP violations, and record
sizes/times/tool/input/output hashes. No live instance, books or credentials.
5. Ship inert runtime artifacts and notices only under src/public/wordcraft,
commit the resulting WASM, and test a gate rebuild against its committed SHA.
Run each touched test independently, affected WebUI suite and repository checks
on Sage's slot; any npm install remains solely in this worktree (mos-1575).
Submit Gladstone's first implementation review, then Filbert once at landing
for Opus/S0 source/patch recheck. Respect621 hold and use row327 reviewed binary
manifest SHA path for every product binary push; do not bypass a refusal.
Slot request first: only the two new wordcraft test files, targeted red/green
cycles for provenance/toolchain/rebuild-gate refusal paths, nice19/four-job
ceiling/fresh scratch TMPDIR. Release builds, two-root proof, browser measurement
and full WebUI/repository suites will each be requested before execution.
### Q248 targeted unit slot — sage-4178
The approved slot ran only targeted cases in the two new WordCraft test files,
with absolute nice19, max4 job/core settings, isolated test HOME and a fresh
mktemp TMPDIR under /mnt/storage/scratch/tmp for each run. No npm, release build,
browser, full suite, canonical mutation or toolchain installation.
- q248-gate-red.txt: initial missing policy APIs failed as expected.
- q248-cli-red.txt: missing CLI handling failed as expected.
- q248-provenance-red.txt: approved223 inventory/closure APIs failed as expected.
- q248-targeted-green.txt: final targeted run **40/40 pass**,0 failures,0 skips,
including CLI optional/required behavior, version/hash/support/platform/flag
refusals, rebuild byte/missing/extra-file refusals, exact223 source/notice
inventory, target closure drift refusals and deterministic223 patch replay.
Use MOSAIC_REQUIRE_WORDCRAFT_BUILD=1 for W2; MOSAIC_REQUIRE_EDITOR_BUILD remains
row154's switch. The policy/comparison APIs and --toolchain CLI are implemented
inside the existing owned build.mjs; the heavy source-build orchestration and
actual committed-artifact rebuild test remain to be completed/tested on later
CLEARed slots. This unit result is not a release/rebuild/CSP acceptance claim.
No implementation commit or binary push yet; pushed tip remains1749728ca.
Owned pristine vendor input now contains exactly223 packages (11,201 files).
PROVENANCE names238 local+third-party records:15 local,199 normal third-party,
10 build-only third-party,14 resolution-only third-party. Complete approved
notice corrections are carried into NOTICE. Original upstream/vendor payloads
are unchanged; the mechanical31-manifest reduction and approved3401363e lock
are recorded in source-build.patch, applied only to future isolated build roots.
Vikunja621 and all remaining implementation/landing gates remain open.
### Freeze before the next fixture slot — sage-4197
Sage requires a committed/pushed implementation tip before requesting the next
CLEAR. The current40-tested policy/provenance/input step is frozen separately
from the unfinished source builder and restricted runtime. It imports exactly
Q248's approved223 source packages and original source subset, with their
approved notice fixes, pruned-lock/manifest patch, gate policy and owned tests.
No runtime WASM has been built/shipped for this implementation yet; full-file,
release, rebuild and CSP acceptance remain future steps, not green claims.
The import contains the previously inventoried font/data/image binaries. The
row327 push guard requires their exact paths and SHA256 to match a reviewed
candidate/manifest. A local commit plus explicit binary manifest will be sent
to Sage for that review path before pushing; no binary refusal is bypassed.
The third-place slot order (Della224, Fethry328, then Gyro) is preserved. Future
runs record observed nice values because ananicy-cpp can renice the host.
The full-import whitespace scan flags existing upstream/vendor whitespace and
unified-patch context (blank context lines intentionally begin with a space).
These bytes are immutable approved source/patch inputs and are not restyled.
Owned transcript trailing spaces are normalized; the owned-code/tracking
whitespace check excludes the verbatim third-party tree and recorded patch.
Source byte/hash and mechanical patch checks remain the applicable import proof.
Staging verification caught crate-local .gitignore rules omitting recorded
payload files (for example packaged Cargo.lock files). The exact11783 recorded
import paths were explicitly staged, including ignored payloads; every staged
blob then matched PROVENANCE SHA256/size. No import file was edited or dropped.
## Local source freeze and binary checksum proof — sage-4202
Local implementation freeze aebc8d2832001df1ad7d7400dc760f20eb3fa1ec; base1749728ca. The row327 guard refused unreviewed source binaries, so no push occurred. Its canonical read-only invocation passed log/FF and stopped on aes128.blb. sage-4202 supersedes the earlier push-before-fixture rule: a LOCAL commit names the fixture tip; no interim binary review round or premature310 in-review move. Push waits until the full build is complete and the real latest review round approves its commit candidate/binaries. Slot order224→328→Gyro remains; no further test run without CLEAR.
The three manifests below attest only the immutable aebc8d283 snapshot; their own blobs are recorded in this follow-up commit, avoiding self-hash recursion.
- q248-aebc8d283-binaries.sha256: Git blob 4899820079623cd3c8473709b8a6fe726b1ea427, SHA256 e46a9b57f4366b15c42d8987561ef5e043a90e701507ea99ecf3c1fe49d9fbd3.
- q248-aebc8d283-binary-inventory.json: Git blob 353aacec5decff30c23da1750392511f15c5b412, SHA256 e67ac5bfad6cdb1c224152e98622d0f80be559d90683849c3e0ed3dd251e2104.
- q248-aebc8d283-paths.sha256: Git blob 7b99bb3578cab2ace907b2cc878fb6ad83580515, SHA256 171ad2b0ec282ff7f4aac58e2e8891af13a11dc490330b7c11a5c9d1fe18bbe8.
Independent authority checks for all94 guard-classified binary paths follow. Registry payloads match their crate .cargo-checksum.json file entry; package checksum equals ORIGINAL pinned Cargo.lock and the actual cached .crate archive SHA256; archive member bytes also match the committed blob. Git-dependency payloads use the same file-checksum proof plus original pinned Git blob (registry package checksum is absent by format). WordCraft upstream assets have NO Cargo package checksum file; original e05b7fe86 Git blob/bytes are their independent authority, rather than an invented crate checksum.
The original full lock06b745e4... binds every distributed registry source. Where a binary belongs to a resolution-only crate omitted by the approved pruned3401363e lock, the table marks that explicitly; no package checksum is invented in the pruned lock. Complete machine proof: q248-aebc8d283-binary-checksum-proof.json.
| Binary path (under third_party/wordcraft) | Bytes | Committed SHA256 | Independent checksum/pin proof |
|---|---:|---|---|
| cargo-vendor/aes-0.9.3/tests/data/aes128.blb | 27420 | 9f9bffab69f9884213edbfa2d2c634ce49ac32218d5b25353aabc7e45bb2aacd | file checksum OK; archive/package/original-lock 35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32; pruned lock present/matches |
| cargo-vendor/aes-0.9.3/tests/data/aes192.blb | 41324 | 562a23e427032b85f7478cb07a33b48aa48381612d2e4bfd2314aadb541a346c | file checksum OK; archive/package/original-lock 35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32; pruned lock present/matches |
| cargo-vendor/aes-0.9.3/tests/data/aes256.blb | 49596 | 01653e20fa730900358c240a55db0b843cb93d29b3569866d0a0a5f2fdf6eb54 | file checksum OK; archive/package/original-lock 35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_alloc | 14106 | d3743f9748422ecb6e965d8a0b8cdd9daba71f28fa9fa876729b7c111e5849b0 | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_chain | 16959 | 6a206fd90052ff13cc7eb56aa6cefd9af8ff478badce8acf94005ed8d3c0d468 | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_directory | 13954 | 286754276f1a1e7eae818823f0db1111efaafafb70d1f3cd6ac347333618d454 | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_minialloc | 14336 | d37e6ba08c7a4da986b06e8369d92ef81901ca618551a7cc604de39f56ab8f4c | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_minichain | 13992 | ea5a3a69882ffc08d79d3c15eeb028a4987c933f740bba630ccab28e8cc792a2 | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_open_1 | 1049 | b587ad479a6bc028b26c93c9d53bce38d1d08f1a2294426e6c10003664158873 | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_open_2 | 13830 | d895b126559ec1f66bd2146d2da0dca79e59d2dfcce2bc41bcd8352cdbf666cf | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/panics_fuzzed/alloc_panic | 16928 | 43dc86944f70e3f146d5f42fed1ba2cd3c07738556dd2d52a445cb630c60333f | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cfb-0.15.0/tests/panics_fuzzed/minialloc_panic | 16909 | 73e5cb0e0f1700f8e795ccc4fed2141d8689bebc0cfa7318d38c4c25130c4376 | file checksum OK; archive/package/original-lock 0f13298d9178622b7916ec5d01d470425c04273c8ed07e87b1c38b34c4f4612b; pruned lock present/matches |
| cargo-vendor/cipher-0.5.2/tests/data/dummy_stream_cipher.blb | 84 | b9573cccdb727cd7281940f69e934565c387e9074cbb4949358e20f0ea0e2c77 | file checksum OK; archive/package/original-lock e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c; pruned lock present/matches |
| cargo-vendor/digest-0.11.3/tests/data/fixed_hash_serialization.bin | 16 | a983af743e3ee4dfb986e4a2283fb790a306afe2c06238491a147e3f24299202 | file checksum OK; archive/package/original-lock f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2; pruned lock present/matches |
| cargo-vendor/eframe-0.36.2/data/icon.png | 12052 | 9e076c34e32a0b0ef35c62ebf6be8b5594a4601e7bcd478b681e9eff1f327973 | file checksum OK; archive/package/original-lock 55ad41fac6e3149abb4866e93df37dbd33baa95db525c3368c944584e95a5dc2; pruned lock present/matches |
| cargo-vendor/epaint_default_fonts-0.36.2/fonts/Hack-Regular.ttf | 309408 | 15f55cc0c85a2988d2b4b3a8cdb5d77fdfbaf319e1bb5309d725db9818fb7125 | file checksum OK; archive/package/original-lock 773fa9c96dd0dbef887e39d0ed6177f141cce4d68e6041df77570aa3702dfa13; pruned lock present/matches |
| cargo-vendor/epaint_default_fonts-0.36.2/fonts/NotoEmoji-Regular.ttf | 418804 | 415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5 | file checksum OK; archive/package/original-lock 773fa9c96dd0dbef887e39d0ed6177f141cce4d68e6041df77570aa3702dfa13; pruned lock present/matches |
| cargo-vendor/epaint_default_fonts-0.36.2/fonts/Ubuntu-Light.ttf | 361676 | 80307b8da7649aa4ee4d484b232140e3ce1ec0ca093073d3c53c8f5a5ced7a70 | file checksum OK; archive/package/original-lock 773fa9c96dd0dbef887e39d0ed6177f141cce4d68e6041df77570aa3702dfa13; pruned lock present/matches |
| cargo-vendor/epaint_default_fonts-0.36.2/fonts/emoji-icon-font.ttf | 324132 | f426bec371f484646d002717e2c555a95cd5145e635d83a48bbef83f3abf18ca | file checksum OK; archive/package/original-lock 773fa9c96dd0dbef887e39d0ed6177f141cce4d68e6041df77570aa3702dfa13; pruned lock present/matches |
| cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example1.zz | 207 | 215d6eafcce032f917f0559c3f35e575fdfcccd5548df8fed5092bc70cf24812 | file checksum OK; archive/package/original-lock 1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c; pruned lock present/matches |
| cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example2.zz | 41 | 9eafada86c8d8af16b90b280e77fd4aa750fa8fb54e31623dc3aaac8097d0c2f | file checksum OK; archive/package/original-lock 1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c; pruned lock present/matches |
| cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example3.zz | 52 | bf63f178c0c288e004339e2d3084adce4c43064697b860accf13bb81fa5fa1f2 | file checksum OK; archive/package/original-lock 1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c; pruned lock present/matches |
| cargo-vendor/flate2-1.1.10/examples/hello_world.txt.gz | 33 | 8b4c5972b92b8ee8dc99116e278afb9165276ddb13c0d334c8da2770fd4d1f7d | file checksum OK; archive/package/original-lock 6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb; pruned lock present/matches |
| cargo-vendor/flate2-1.1.10/tests/good-file.gz | 6766 | 87296963e53024a74752179ce7e54087565d358a85d3e65c3b37ef36eaa3d4a6 | file checksum OK; archive/package/original-lock 6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb; pruned lock present/matches |
| cargo-vendor/flate2-1.1.10/tests/multi.gz | 53 | efa3341da052f95056314cc6920e02a3da15bdef30234b2552fb407812db5cc6 | file checksum OK; archive/package/original-lock 6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_md5_rfc2104.blb | 246 | da0f258edb0afec38714fb3685077c8cb49860d4cf6a9b58259eed6c77212faf | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_sha1_wycheproof.blb | 4877 | f2105dcd15a427b754df3906a6278f3f83f51a45cd5e9198dcd07b41ae7af546 | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_sha224_rfc4231.blb | 804 | c65ff3b3e11abb2d1a3445356efdb15182b8089268183db0f1e3bd7da457faae | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_sha256_rfc4231.blb | 832 | 948650052341b8c2104a4512ccbcaa85d33139a2378d0c89bde4274dfc1683e0 | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_sha256_wycheproof.blb | 6155 | 3ba194af7f11776c9e39164613653810633042a267baec88293a5d9edce07ee5 | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_sha384_rfc4231.blb | 944 | b5a29b1f23a7b417f87048047f0b9e633a97fe076914f2040bcc46fe59ca47fd | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_sha384_wycheproof.blb | 7859 | 3bfd7098a8e374923bfa99123aacd447e4bf30eb8ff90dbe11441d2336adbe3c | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_sha512_rfc4231.blb | 1063 | 9161ca8594f57bf3759ac2b49a1ad7fbead54b6747d2e8242aefb9353aa28bea | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_sha512_wycheproof.blb | 9650 | 55263d9d13a51959ce6e964cd46c6e8ee8aec92ae28f21e02855014ffc6d52b7 | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_streebog256_gost.blb | 85 | d63e4d1ebcf3356943b300a99e7ac13fe91ea69b600e180dd08f5fbb445300e4 | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/hmac-0.13.0/tests/data/hmac_streebog512_gost.blb | 118 | 9a722b982d264ecdc6bc0821c5c31a91a45bda6b101b4b824bf0d8200747a362 | file checksum OK; archive/package/original-lock 6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f; pruned lock present/matches |
| cargo-vendor/krilla-0.8.2/icc/sGrey-v2-magic.icc | 616 | 4110169287e5f1b5149ca9f1da1814d32943905bba8030e849d1a3b729a19481 | file checksum OK; registry checksum absent in both formats; Git c3487320b2d1de657b860b3c8abb44e1f2b32bd8:vendor/krilla/icc/sGrey-v2-magic.icc blob 1ea54310ec58bfcf955e1a5f9fb701c49500979a |
| cargo-vendor/krilla-0.8.2/icc/sGrey-v4.icc | 360 | 00c0f94e09127520a17dc0e1d9264b5702081d96dbdb1549ee88e3631ce42a9d | file checksum OK; registry checksum absent in both formats; Git c3487320b2d1de657b860b3c8abb44e1f2b32bd8:vendor/krilla/icc/sGrey-v4.icc blob 2187b6786aa7c6a6744aad62599eb70b46118352 |
| cargo-vendor/krilla-0.8.2/icc/sRGB-v2-magic.icc | 736 | af4efe28f6d311799865f325ba39184a2e978b113ca74124d60af7de22b105f4 | file checksum OK; registry checksum absent in both formats; Git c3487320b2d1de657b860b3c8abb44e1f2b32bd8:vendor/krilla/icc/sRGB-v2-magic.icc blob b29f729dbff1d6eae55aa62418f79b42b1fce9e8 |
| cargo-vendor/krilla-0.8.2/icc/sRGB-v4.icc | 480 | c56e1685d888f5edb92fe07f2750f387f8fe8e91b32ff8fb0b56bfbbb9458353 | file checksum OK; registry checksum absent in both formats; Git c3487320b2d1de657b860b3c8abb44e1f2b32bd8:vendor/krilla/icc/sRGB-v4.icc blob d9f3c055bd4d7573124090569e1b9533932214eb |
| cargo-vendor/pdf-writer-0.15.0/examples/bear-1280x720.jpg | 67710 | fa0fdd2bd4794557672f79ce6b1e33550d4e257e33e4f43d7d48da347ad5eb06 | file checksum OK; archive/package/original-lock f5e456864a7a304047bff84977dc6fb162bd956475d40ba50b2dcecaada7f753; pruned lock present/matches |
| cargo-vendor/pdf-writer-0.15.0/examples/bear-1280x720.mp4 | 715963 | bcb75d3db0a1a5056f4cd5c770ceccdb4cae920f21abb8139b29cd9ad39e3857 | file checksum OK; archive/package/original-lock f5e456864a7a304047bff84977dc6fb162bd956475d40ba50b2dcecaada7f753; pruned lock present/matches |
| cargo-vendor/pdf-writer-0.15.0/examples/rhino.png | 215287 | ff24fc2957e628cb93bf2e3b83d9109d46ab1e494cd182df6025785ecd7952a2 | file checksum OK; archive/package/original-lock f5e456864a7a304047bff84977dc6fb162bd956475d40ba50b2dcecaada7f753; pruned lock present/matches |
| cargo-vendor/pdf-writer-0.15.0/examples/sRGB_v4.icc | 60960 | 83174717332326ddc198d9df188a4daec27b8979ba152cebbfc470c793d0bb11 | file checksum OK; archive/package/original-lock f5e456864a7a304047bff84977dc6fb162bd956475d40ba50b2dcecaada7f753; pruned lock present/matches |
| cargo-vendor/pdf-writer-0.15.0/examples/tiger-cmyk.jpg | 945216 | e270c2acdeb0754c840de73eb25c61af4504e2463225dba845441ffb9792a8a0 | file checksum OK; archive/package/original-lock f5e456864a7a304047bff84977dc6fb162bd956475d40ba50b2dcecaada7f753; pruned lock present/matches |
| cargo-vendor/sha1-0.11.0/tests/data/sha1_kat.blb | 235 | 076e29b410198ce71243d47a3c01629cb80d9494cc56e01e09e127c7950031b4 | file checksum OK; archive/package/original-lock aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214; pruned lock present/matches |
| cargo-vendor/sha1-0.11.0/tests/data/sha1_serialization.bin | 92 | f5f4a2f204aeb33bc002e3f7d1e3dfc87998b1834380c84e9d5f0e3a70c90e44 | file checksum OK; archive/package/original-lock aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha224_kat.blb | 179 | 0404ce7dbf64488c74237f06c0925468f75539aee9d647461edf3324c7411833 | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha224_serialization.bin | 104 | 6b7164859b4c83edda87ca1bab9b07afb6ba5eae77cc242b04be6ca7f122abba | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha256_kat.blb | 191 | f947b01761a4cd1324d5021852bcec19d07f193ea034b43bf34b08f1fb1bbf2f | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha256_serialization.bin | 104 | 6a44d0e8c9d089de8df7f7e848a016127bb2b85608c73e19a0f898c77a283f19 | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha384_kat.blb | 239 | 2fafeb11ed81abf78a33b3e098269b0add361e8855e394293a5d7e5e57fddab9 | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha384_serialization.bin | 208 | 299df90bb78d579d7d303985b1bd9e1a9dd205d48b888d87350dc887511886b4 | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha512_224_kat.blb | 179 | 3c3c0c408eda6d2d264d50bd1fa5c012f1c5dc2f5bf625ca471fcccebd476870 | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha512_224_serialization.bin | 208 | 0be3e7d9cf7821a4e031e2c5b1609006b15995a4553691f9be311f4a87bd5f70 | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha512_256_kat.blb | 191 | 10dcef0cb0a381d2e4e336e88cb23b38859d3a5c894a3658aaef37a83c058cfb | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha512_256_serialization.bin | 208 | fc6735a14cbd66dcd9111021a26fa70373c5dd245272fd4874268a6622f7d97f | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha512_kat.blb | 290 | 4963aa09edeb0c39efa94e397551a2b0018f4a3bd5f343e21010a264db8cc2e9 | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/sha2-0.11.0/tests/data/sha512_serialization.bin | 208 | d4ad28878dce9ac24ee8cc27622fc758b9db070406cad37eb89518f33f012604 | file checksum OK; archive/package/original-lock 446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4; pruned lock present/matches |
| cargo-vendor/tiff-0.11.3/tests/decodedata-rgb-3c-8b.tiff | 30180 | 88fb7908c4562ad3f3a1180c02115da71efc34a6d3b4f0573360113385cef33c | file checksum OK; archive/package/original-lock b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52; pruned lock present/matches |
| cargo-vendor/ttf-parser-0.25.1/examples/wasm/TTC.ttc | 2608 | a8521588045ed5f1f8b07eecaac06ed3186c644655bfac00dd4507cd316fbdc5 | file checksum OK; archive/package/original-lock d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31; pruned lock present/matches |
| cargo-vendor/ttf-parser-0.25.1/tests/fonts/bitmap.otb | 2072 | d46bf7270263aff1de7b1be50c67884938bd15cb554c0f50ad9bebb9c7137d0b | file checksum OK; archive/package/original-lock d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31; pruned lock present/matches |
| cargo-vendor/ttf-parser-0.25.1/tests/fonts/colr_1.ttf | 21568 | 0441303144c314d46ee12cf9742f1dd3fcbcb42700e7c51dba7b1b689c1dd1d7 | file checksum OK; archive/package/original-lock d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31; pruned lock present/matches |
| cargo-vendor/ttf-parser-0.25.1/tests/fonts/colr_1_variable.ttf | 53096 | 1e861480ba54c411af09d600e9b0ecf8deb15b8c2929589ac5a84f2038332c18 | file checksum OK; archive/package/original-lock d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31; pruned lock present/matches |
| cargo-vendor/ttf-parser-0.25.1/tests/fonts/demo.ttf | 400 | cb40a3b0aed56dbd2465355ff5ac53ea5e6b567877132844d8f780fd600bdade | file checksum OK; archive/package/original-lock d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31; pruned lock present/matches |
| cargo-vendor/unicode-ident-1.0.26/tests/fst/xid_continue.fst | 78779 | a4c8f6daf453fba6d12daeb5e10192839edf930250234309049b4325406b5979 | file checksum OK; archive/package/original-lock d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954; pruned lock present/matches |
| cargo-vendor/unicode-ident-1.0.26/tests/fst/xid_start.fst | 69927 | 5e177e91fdf0cc2f117bd66277803aa21bc4d563357f6d81a9d4250456f9fa2f | file checksum OK; archive/package/original-lock d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954; pruned lock present/matches |
| cargo-vendor/vello_common-0.1.0/assets/probe.png | 877 | 88ff34af8db521e5e2520719706bc24388e7e976ac02dd818b867e0f6a8e0d13 | file checksum OK; archive/package/original-lock b2e9aed918117e8152c9eddfd8362d73c465c23f26c44786aa331707b8a64fa2; pruned lock present/matches |
| cargo-vendor/vello_common-0.1.0/assets/probe.rgba | 10404 | 01c87c436d7b3cfaa357dfaad9259f57b4fdcb27a62da9658afb10056ee54bea | file checksum OK; archive/package/original-lock b2e9aed918117e8152c9eddfd8362d73c465c23f26c44786aa331707b8a64fa2; pruned lock present/matches |
| cargo-vendor/vello_common-0.2.0/assets/probe.png | 877 | 88ff34af8db521e5e2520719706bc24388e7e976ac02dd818b867e0f6a8e0d13 | file checksum OK; archive/package/original-lock bbb2141a2bca6e6d598e471fd4d1d7eed8e020aad6a28187edda07f091a325dd; pruned lock present/matches |
| cargo-vendor/vello_common-0.2.0/assets/probe.rgba | 10404 | 01c87c436d7b3cfaa357dfaad9259f57b4fdcb27a62da9658afb10056ee54bea | file checksum OK; archive/package/original-lock bbb2141a2bca6e6d598e471fd4d1d7eed8e020aad6a28187edda07f091a325dd; pruned lock present/matches |
| cargo-vendor/winit-0.30.13/examples/data/cross.png | 159 | 4db9fec917c6cb3196872073e4168d28c4f3e0ad04c5c41865407088abf279e4 | file checksum OK; archive/package/original-lock a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d; pruned lock absent (resolution-only source) |
| cargo-vendor/winit-0.30.13/examples/data/cross2.png | 129 | fbeeb71e5d6f24898017739d088acefb522d85108a6f1f96183e60e6b4b1f6e6 | file checksum OK; archive/package/original-lock a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d; pruned lock absent (resolution-only source) |
| cargo-vendor/winit-0.30.13/examples/data/gradient.png | 229 | 8f80c21867a59959b84f9ced19ff3aba7bf4e1cf0e2c24dea2c8465c8705c7ca | file checksum OK; archive/package/original-lock a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d; pruned lock absent (resolution-only source) |
| cargo-vendor/winit-0.30.13/examples/data/icon.png | 2950 | 4340d72fb8b5d95a10e3b2c02230f1060dff0950a137bd1d830c63dbc020dd45 | file checksum OK; archive/package/original-lock a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d; pruned lock absent (resolution-only source) |
| cargo-vendor/zlib-rs-0.6.8/src/deflate/test-data/inflate_buf_error.dat | 67008 | 254f280f8f1e8914bd12d8bcd3813e5c08083b1b46d8d643c8e2ebe109e75cb8 | file checksum OK; archive/package/original-lock b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112; pruned lock present/matches |
| upstream/assets/fonts/Inter-Medium.ttf | 417300 | 97ad806f526e41546d46365bb3a393145f75b7b1568913db74549ad8b8dba872 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/Inter-Medium.ttf blob 458cd0601d28013d3817481aa2839c9bbb5ded70; no Cargo checksum file |
| upstream/assets/fonts/Inter-Regular.ttf | 411640 | 40d692fce188e4471e2b3cba937be967878f631ad3ebbbdcd587687c7ebe0c82 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/Inter-Regular.ttf blob b7aaca8de1fe458399e17311d35d543a1fa2f984; no Cargo checksum file |
| upstream/assets/fonts/Inter-SemiBold.ttf | 419744 | 78a843fade9d4612a5567302fb595b56976eb5fcebf4fea5a5912d638bafcde3 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/Inter-SemiBold.ttf blob 47f8ab1d68144fc004b310d65d95180d502b449b; no Cargo checksum file |
| upstream/assets/fonts/JetBrainsMono-Regular.ttf | 270224 | e6fd0d7e91550b3ed2b735d4312474362c4716edc4fc0577a0f61ed782d5aed1 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/JetBrainsMono-Regular.ttf blob 711830ede02a366f8b99f88e52f3148405e67eaf; no Cargo checksum file |
| upstream/assets/fonts/SourceSans3-Bold.ttf | 428176 | 9214b9d95e4231c609802815c2646c98174e2102d0d37f88978a7f8e71006e6a | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSans3-Bold.ttf blob 85693ccc852fbd7fa4ae9d89d6ccbf6d38f8e0f0; no Cargo checksum file |
| upstream/assets/fonts/SourceSans3-It.ttf | 315812 | 192afd78f0f54a3c69eaf02d43f4d9a821e9d6110e41d3d25d61a7385cd580e4 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSans3-It.ttf blob 8e0576f246d15c19d445af943f7302dc95a8b18e; no Cargo checksum file |
| upstream/assets/fonts/SourceSans3-Regular.ttf | 431196 | 4644c81b86ec9caaa76b634889968ed3c4f4f52f054855933acc7c2b21e53b0f | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSans3-Regular.ttf blob c5dd0b88cc8ff4edd7ebdcefee0290df15529657; no Cargo checksum file |
| upstream/assets/fonts/SourceSans3-Semibold.ttf | 425904 | a3f4f8dcf343a8f24dc61951de93f3ba1558b15cd250ba24af8a40e957081b7d | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSans3-Semibold.ttf blob 4aff9a3aea9b5f1e746f03ed40e1b293740dc8a2; no Cargo checksum file |
| upstream/assets/fonts/SourceSerif4-Bold.ttf | 271568 | 7cf4f4e1ad74f45058d5bc61716b82560442fbdcd9d3654d2dea96bf6c683d86 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSerif4-Bold.ttf blob c4159ff2a409d9224dfa97af4e5167817e91e833; no Cargo checksum file |
| upstream/assets/fonts/SourceSerif4-BoldIt.ttf | 191832 | 7b215b37f8873f5579f3f8d2ded3ca7c588e2f435cd996605ebfc5befe2cd5eb | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSerif4-BoldIt.ttf blob 40f3863f36edab3fa46a22e16a196f487b3df240; no Cargo checksum file |
| upstream/assets/fonts/SourceSerif4-It.ttf | 187808 | 9d2950a8f1da66e21502c35d646a1d2148e79f9ea43fd2158cf02f5232e7f430 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSerif4-It.ttf blob e818087d0c75997a38189f6cf578c468df175062; no Cargo checksum file |
| upstream/assets/fonts/SourceSerif4-Regular.ttf | 261868 | e5a4ee6a3d87bb9024796be390c6771e2a0eb1883dae25effaf57ca01668e24b | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSerif4-Regular.ttf blob 964a2bf8934182485cf4e2348c8443091739334f; no Cargo checksum file |
| upstream/assets/fonts/SourceSerif4-Semibold.ttf | 272088 | 36db62940cb5728b12b1802476dc7fcf4c6c519a7bdd476ba23a4e555fc4655f | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/fonts/SourceSerif4-Semibold.ttf blob 151e9a9d5c08dfd4751650ab4bff92771a132888; no Cargo checksum file |
| upstream/assets/hyphenation/en-us.dic | 432905 | 66ce9023847dd2cfc5c6ad14b83aaab94e58607fe95258f4f3ac431a23df63f1 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:assets/hyphenation/en-us.dic blob a09009145a91ed230ba7739bd6170cad6a041a45; no Cargo checksum file |
| upstream/docs/brand/artcraft-logo-white.png | 32161 | 8b86aeb06a12a90ba77a60e0d90329272310e244ee5c1f9b161b391280ca79d8 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:docs/brand/artcraft-logo-white.png blob 8cfb31d940f6663ecaf93da2bc04c5904704b4af; no Cargo checksum file |
| upstream/docs/brand/artcraft-logo.png | 31302 | 08fc6d9d3717e8f13417bac6f9025b50e11d1e0b32e9e000883d2fe0c4a0c67b | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:docs/brand/artcraft-logo.png blob a4d1544caa4c8b8dae14e1d10d79afa197261e3b; no Cargo checksum file |
| upstream/docs/brand/artcraft-mark-black.png | 26793 | 5954cc0306e1b9d7beb47097e2e842157113a39d9aba078b57304902687936a9 | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:docs/brand/artcraft-mark-black.png blob 27664bc119d2b485ba6fee213ee749df658ab508; no Cargo checksum file |
| upstream/docs/brand/artcraft-mark.png | 24715 | 9d372157a949c147318561e629b11561c28b7cbc14c84b516a3fe6e84d8fbbad | upstream Git e05b7fe86f3b85454000dffc321de638d7009817:docs/brand/artcraft-mark.png blob dbb3dc08955f8214561c7922730e78266600aa36; no Cargo checksum file |
All94 committed payloads equal their independently read original archive/Git bytes. Checks read only pinned caches/protected source and committed blobs; no source was changed, built or fetched. This checksum evidence is not a review/adoption verdict and does not open621 or the final push gate.
### Next fixture contract frozen, not run
The next local fixture tip adds source-preparation/patch refusal expectations
for prepareSourceRoot/applySourcePatch. It is a TDD red/green contract: the APIs
are not implemented yet and these new cases have not run. Existing40 policy
cases are the only completed unit step. The queued scope remains Node/file/Git
fixtures only, never Cargo/Trunk compilation or a browser/full suite. New test
runs will name their local commit and record actual observed nice values.
### Q48 W3C decision — sage-4266, 2026-10-24
Jason accepted the W3C Software License terms for cursor-icon 1.2.0 and
winit 0.30.13 only (Q48 / mos-1606). Vikunja 621 is closed; row310 revision4022
records the ruling. S0's general accepted-license list is unchanged. Any other
W3C occurrence must return to Sage. The existing complete embedded notices and
attributions remain required. Historical references above to the621 hold record
the state at that time; that hold is now removed.
The next requested slot remains fixture-only red/green on the two new WordCraft
test files: source preparation, exact patch replay and refusal paths, followed
by the previously passing policy/provenance cases. Local implementation tip is
278c08e728fb82ca6721e2630926ea1a8a081441 before this tracking-only update.
No test run is authorized by the license decision itself. Release builds,
two-root reproducibility and Q234 browser evidence each still need CLEAR.
Final candidate push/in-review follows the complete build and manifest, with
Gladstone first and Filbert at landing; no interim binary review/push.
### Source preparation fixture red/green — sage-4270
Starting local tip e14a322f0c3d120d12ef8759ac949d36695d9ee4. Executed only
Node/file/Git fixtures in this worktree with a new mktemp TMPDIR under
/mnt/storage/scratch/tmp for each run. The committed q248-unit-runner.py sets
absolute nice19, CARGO_BUILD_JOBS=4 and BINARYEN_CORES=4, isolated fixture HOME,
and a minimal environment. No Cargo/Trunk compilation, browser or full suite ran.
- q248-preparation-red.txt: pattern `q248 (builder|patch)`,10 failures,0 pass;
all ten failed because prepareSourceRoot/applySourcePatch were absent.
Observed nice values:19. Receipt trailing whitespace normalized after capture.
- q248-preparation-green-attempt.txt: pattern `q248|deterministically` across
the two WordCraft test files,50 pass,0 fail,0 skip; Node duration2842.173131ms.
Observed nice values:16,19. Host renice recorded per sage-4197, not a stop.
Implemented prepareSourceRoot to require an explicit scratch TMPDIR, an empty
build root outside the repository, no symlink root/ancestor and no ambient
ancestor Cargo config. It verifies the pristine imported source/notice/patch
receipts, copies to scratch, applies the pinned patch, verifies exact filtered
vendor manifests, rewrites only their Cargo.toml checksum entries, verifies the
resulting whole vendor tree, and checks the3401363e pruned lock.
Implemented applySourcePatch to check the recorded bytes/SHA, restrict both
header paths to existing recorded regular files, reject traversal/symlinks and
unrecorded paths, then dry-run the complete patch before mutation. The fixture
with a nonapplying context verifies the original file remains unchanged.
The positive fixture prepares the actual223-source copy and rechecks pristine
inputs; no compilation or crate code execution is involved.
Sage notified in gyro-0030 immediately after GREEN; slot returned for Boyd's
row329 review. These50 fixtures are bounded evidence, not full W2 acceptance.
Restricted runtime/source edits, canonical output packaging, mandatory actual
rebuild, two-root reproducibility and exact Q234 proof remain unfinished.
No new tests or builds may run without another CLEAR. No push or queue move.
### Lane B handoff — sage-4294, 2026-10-24
No test/build was started under this CLEAR. The requested fixture step had
already completed50/50 at911389399 and was reported in gyro-0030. No subsequent
code change required repeating it. Lane B was returned immediately in gyro-0031
for Fethry332; lane A and case1-accept.test.mjs were untouched.
Import-derived bounded fixture run list for the next request:
- packages/webui/tests/wordcraft-build.test.mjs, selected by name pattern;
- packages/webui/tests/wordcraft-provenance.test.mjs, selected by name pattern;
- both import only packages/webui/wordcraft/build.mjs as repository code;
- transitive dependencies are Node builtins test, assert/strict, fs, path, os,
crypto, child_process and url. The q248/deterministic fixtures invoke Git,
diff, and fake shell tools. No packages/cli test is imported. The unselected
compiler-cfg test invokes pinned rustc and the unselected artifact test needs
the still-unbuilt runtime: neither belongs in a fixture-only run.
Future runs require timeout -k10 with a bounded duration, a new
mktemp -d /mnt/storage/scratch/tmp/gXXXXXX TMPDIR per run, absolute nice19,
at most4 jobs, and an own-process node/chromium sweep. The pre-run report must
include the precise selected tests and their transitive imports, not merely a
package-wide suite name. A separate CLEAR is still required for release,
two-root and Q234 evidence.
Sweep read process names, cwd, start times and executable/command-category
markers only, with no environment or credential reads. Seven Node/npm processes
with this worktree cwd all started17:37:27–17:37:31Z and identify session/MCP
servers (including chrome-devtools MCP). None was node --test or a WordCraft
fixture runner; none was terminated. No chromium test/browser process was found.
@@ -0,0 +1,103 @@
# Row310 W2 handoff — stopped under mos-1631
The T3 crash stop ruling is in force. No long jobs were restarted. Do not resume
builds/tests without a new instruction and Sage CLEAR. No other thread was
messaged for this handoff. No merge, queue move, serving or deployment occurred.
## State
Worktree: /home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310
Branch: gyro/row310. Pre-handoff local tip: da200332c63dfa1f7c4497a4633678d3e9ad888b.
Last pushed commit, independently checked with git ls-remote after stop:
1749728ca6aa7541a78a304c1f10e0c0751809c3.
Local implementation commits remain in this worktree, not remotely published:
aebc8d283 (source/toolchain/gate policy), ce6761233 (manifests/binary proof),
ce95a6255 (fixture contract),278c08e72 (nice observer), e14a322f0 (Q48 ruling),
911389399 (scratch source/patch APIs), da200332c (lane handoff/import boundary).
The commit containing this note follows them. Working tree was clean at stop.
The unpublished ancestry includes94 original source/vendor binaries,8,921,027
bytes, requiring the row327 latest approved candidate review. Sage-4202
explicitly prohibited an interim binary-only review or push; push must wait for
the completed W2 candidate and its real review round. Pushing a later docs-only
commit would publish those ancestors too. No guard bypass, alternate branch or
history rewrite is authorized by this stop. Therefore the local implementation
and handoff are committed safely but cannot yet be pushed to gyro/row310.
## Completed evidence
223 pristine third-party source packages (209 reviewed plus14 approved additions)
and582 upstream files imported locally. Upstream source checkout remains read
only. Approved Cargo-pruned lock3401363e100783dc70c8f5ba09324947c0b6f8562f1ac1cbbc61a0497200c17f
is applied only to scratch copies via the recorded patch. Original upstream lock
06b745e43c13df3df7f048fa6a1981625ce7a5fe4cd484bc6254d0913d865b0b is unchanged.
Q248 approves223 sources/pruned lock and the notice fixes. Q48/mos-1606 accepts
W3C terms for cursor-icon1.2.0 and winit0.30.13 only; Vikunja621 is closed.
S0's general license list remains unchanged; other W3C occurrences go to Sage.
All94 imported binaries have independent archive/Git checksum proof and a table
in BUILD.md; relevant q248-aebc8d283 manifests are committed locally.
Last actual test run under sage-4270:10 expected RED failures for absent APIs,
then50/50 targeted GREEN after implementation at911389399. RED observed nice19;
GREEN observed16/19 despite requested absolute19. Receipts:
- agents/gyro/work/queue-310/q248-preparation-red.txt
- agents/gyro/work/queue-310/q248-preparation-green-attempt.txt
Only Node/file/Git fixtures ran. No restricted release build, browser or full
suite ran. The later sage-4294 laneB CLEAR was not used: completed cases did not
need repetition. LaneB was returned via gyro-0031. Detailed sweep follow-up
messages gyro-0032 timed out twice. At that sweep only17:37Z session/MCP server
processes were found in this cwd, with no fixture/test process; none was killed.
No job was running on Gyro's behalf when the crash stop arrived.
## Next step after an explicit resume
Read AGENTS.md, agents/gyro/README.md, this note, BUILD.md and the W2 brief. Check
queue state read-only; do not move310 to in-review until the artifact exists.
Continue the bounded output packaging/rebuild fixture contract, obtain exact
Sage CLEAR, then implement. The source-preparation APIs exist; canonical runtime
packaging and actual mandatory build orchestration do not. build.mjs currently
only has the --toolchain CLI policy operation.
Restricted Rust/web source edits remain unfinished: eliminate web rfd/pickers,
direct save/download, blob print, storage/local fonts, unsafe drop/URL actions;
retain host-owned Print and required M1–M14 protections. The current source-build
patch is packaging-only. No runtime WASM, public/wordcraft output or BUILD.json
exists in the implementation. Measurement scratch artifacts are unrestricted
baseline evidence, never a shipping substitute.
After source/runtime work: request separate CLEARs for offline release,
two-root reproducibility and exact Q234 browser/function/CSP proof. Need zero
violations with style-src 'self', no style hash fallback, all functions including
host Print, no shell CSP change, no frame route or serving beforeW6. Mandatory
MOSAIC_REQUIRE_WORDCRAFT_BUILD=1 rebuild must compare committed WASM sha256;
optional missing toolchain skips, required missing/refusals fail with tests.
Gladstone reviews first, Filbert once at landing with S0/import/patch recheck.
No interrupted run needs repeating: the prior50-case result was complete before
the crash. Future code changes require appropriate targeted regression evidence;
full build/reproducibility/browser acceptance has never been completed.
Every future run needs a prior import-derived run list/report and Sage CLEAR,
timeout -k10, a fresh mktemp -d /mnt/storage/scratch/tmp/gXXXXXX per run, absolute
nice19/max4 jobs, observed-nice receipts, assigned lane isolation, and own-process
node/chromium sweep. Exclude packages/cli/tests/case1-accept.test.mjs. Never run
npm/remove in canonical checkout. Never touch live stack/credentials/private books.
## Push disposition
A read-only canonical push-check was attempted, not a test/build or push. First
invocation used an incorrect expected log from canonical HEAD and stopped LOG;
corrected expected log names the explicit local commit range. Receipt:
/mnt/storage/scratch/gyro-stop-push-check.txt. The known source-binary review gate
remains the reason no unpublished ancestor can safely be sent. The last remote
tip above is the authoritative pushed state. Nothing is intentionally left
uncommitted; all unfinished implementation work is preserved in local commits.
The corrected guard reached LOG_OK/FF_OK but was taking longer than appropriate
under the crash-stop instruction. I terminated only its exact own Node process
(PID2243405); it produced no binary approval and no push followed. Do not treat
that partial check as a fresh approval or a completed refusal. The earlier
row327 binary refusal and sage-4202 no-interim-push ruling remain in force.
@@ -0,0 +1,57 @@
# W2 offline packaging decision — 2026-10-24
Sage requested this consolidated stop report in sage-3983. No additional
category has been applied. No release build, commit or push has run.
The original source/lock resolve packages outside the reviewed WASM target.
The imported vendor tree contains exactly S0's 209 third-party identities:
199 normal plus 10 build-only; the web root adds 15 local crates. Original
source lock has 538 third-party records; S0 workspace metadata has 293 total
resolved packages after target filtering. These are different sets.
Approved and exercised only in scratch:
- Local workspace: 15 members/default web root; remove 12 dev/native sections.
Original included upstream bytes stay identical to the source pin. The local
manifest deltas are currently in source-build.patch and BUILD.md.
- Third-party target filtering: 28 manifests / 59 sections after adding explicit
false custom cfgs fuzzing/loom/miri (sage-3983); 26/57 before that ruling.
All other unknown cfgs remain unknown. target-filter-plan.json is the list.
- Dangling feature lists: 103 removed items across 8 manifests (sage-3982),
mechanically applied in scratch from dangling-features.json. Original vendor
bytes/checksums stay intact; scratch checksum updates touch only Cargo.toml.
- Release flags must refuse inherited RUSTFLAGS/CARGO_ENCODED_RUSTFLAGS/
RUSTDOCFLAGS/CARGO_TARGET_*_RUSTFLAGS/CARGO_BUILD_RUSTFLAGS. Not yet implemented.
- Gate narrowing from sage-3983: compare root-specific resolved package/selected
feature closures before/after packaging, not complete workspace-unified S0
feature text. Both package closures must match the 199/209 S0 sets. Still
unproved: pristine 209-only vendor itself cannot resolve the broader lock.
The next refusal is an unresolved cfg category: encoding_rs 0.8.42 declares
`simdutf8` 0.1.5 under cfg(any(x86_64,x86,aarch64,all(wasm32,simd128))).
The default pinned wasm target has no simd128 feature, but the conservative
filter retains unknown target_feature conditions rather than treating every
potential target feature as false. No target_feature-based removal was made.
The latest command/error is in offline-resolution.txt. Beyond that exact
refusal, a static survey identifies 176 unconditional optional dependency
entries (110 names across 82 manifests) absent from the 209; see
unselected-dependency-resolution.json. These are not current errors and no
such dependency was removed. They show why continued iterative reduction may
require another category. This is a lower-bound survey, not a claim that
removing all of those would make resolution succeed.
Decision requested: continue reducing target-feature and unselected optional dependency metadata,
or adopt the full-lock vendor tree with a separately identified resolution-only
inventory. I recommend the full-lock vendor approach: it preserves upstream
manifests/features and makes before/after root-closure comparison possible
without accumulating more manifest surgery. It adds source/notice review and
size; no extra package should enter the compiled web closure. This is not
permission to fetch/import extra sources. Sage decides that boundary.
Current tree sizes: upstream 582 files / 21,021,869 bytes; vendor 209 packages /
10,499 files / 130,737,230 bytes; combined 151,759,099 bytes. Upstream exclusions
are the authorized 30 icon/screenshot/macOS packaging paths, all enumerated in
BUILD.md/PROVENANCE.json. No license/notice/copyright is omitted; no vendor file
is dropped. Binary path/size inventory is binary-inputs.json (18 upstream and
74 vendor non-text files). Source subset/integrity checks pass 3/3; build test
is 1/2, with runtime-output check expected red because nothing is built yet.
@@ -0,0 +1,370 @@
[
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-Medium.ttf",
"bytes": 417300
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-Regular.ttf",
"bytes": 411640
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-SemiBold.ttf",
"bytes": 419744
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/JetBrainsMono-Regular.ttf",
"bytes": 270224
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Bold.ttf",
"bytes": 428176
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-It.ttf",
"bytes": 315812
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Regular.ttf",
"bytes": 431196
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Semibold.ttf",
"bytes": 425904
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Bold.ttf",
"bytes": 271568
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-BoldIt.ttf",
"bytes": 191832
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-It.ttf",
"bytes": 187808
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Regular.ttf",
"bytes": 261868
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Semibold.ttf",
"bytes": 272088
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/hyphenation/en-us.dic",
"bytes": 432905
},
{
"path": "packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-logo-white.png",
"bytes": 32161
},
{
"path": "packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-logo.png",
"bytes": 31302
},
{
"path": "packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-mark-black.png",
"bytes": 26793
},
{
"path": "packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-mark.png",
"bytes": 24715
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes128.blb",
"bytes": 27420
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes192.blb",
"bytes": 41324
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes256.blb",
"bytes": 49596
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/brotli-decompressor-5.0.3/src/bin/ipsum.brotli",
"bytes": 1752
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_alloc",
"bytes": 14106
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_chain",
"bytes": 16959
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_directory",
"bytes": 13954
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_minialloc",
"bytes": 14336
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_minichain",
"bytes": 13992
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_open_1",
"bytes": 1049
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_open_2",
"bytes": 13830
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/panics_fuzzed/alloc_panic",
"bytes": 16928
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/panics_fuzzed/minialloc_panic",
"bytes": 16909
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cipher-0.5.2/tests/data/dummy_stream_cipher.blb",
"bytes": 84
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/digest-0.11.3/tests/data/fixed_hash_serialization.bin",
"bytes": 16
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/eframe-0.36.2/data/icon.png",
"bytes": 12052
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/Hack-Regular.ttf",
"bytes": 309408
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/NotoEmoji-Regular.ttf",
"bytes": 418804
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/Ubuntu-Light.ttf",
"bytes": 361676
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/emoji-icon-font.ttf",
"bytes": 324132
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example1.zz",
"bytes": 207
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example2.zz",
"bytes": 41
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example3.zz",
"bytes": 52
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/examples/hello_world.txt.gz",
"bytes": 33
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/tests/good-file.gz",
"bytes": 6766
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/tests/multi.gz",
"bytes": 53
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_md5_rfc2104.blb",
"bytes": 246
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha1_wycheproof.blb",
"bytes": 4877
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha224_rfc4231.blb",
"bytes": 804
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha256_rfc4231.blb",
"bytes": 832
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha256_wycheproof.blb",
"bytes": 6155
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha384_rfc4231.blb",
"bytes": 944
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha384_wycheproof.blb",
"bytes": 7859
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha512_rfc4231.blb",
"bytes": 1063
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha512_wycheproof.blb",
"bytes": 9650
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_streebog256_gost.blb",
"bytes": 85
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_streebog512_gost.blb",
"bytes": 118
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sGrey-v2-magic.icc",
"bytes": 616
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sGrey-v4.icc",
"bytes": 360
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sRGB-v2-magic.icc",
"bytes": 736
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sRGB-v4.icc",
"bytes": 480
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/bear-1280x720.jpg",
"bytes": 67710
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/bear-1280x720.mp4",
"bytes": 715963
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/rhino.png",
"bytes": 215287
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/sRGB_v4.icc",
"bytes": 60960
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/tiger-cmyk.jpg",
"bytes": 945216
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha1-0.11.0/tests/data/sha1_kat.blb",
"bytes": 235
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha1-0.11.0/tests/data/sha1_serialization.bin",
"bytes": 92
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha224_kat.blb",
"bytes": 179
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha224_serialization.bin",
"bytes": 104
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha256_kat.blb",
"bytes": 191
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha256_serialization.bin",
"bytes": 104
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha384_kat.blb",
"bytes": 239
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha384_serialization.bin",
"bytes": 208
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_224_kat.blb",
"bytes": 179
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_224_serialization.bin",
"bytes": 208
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_256_kat.blb",
"bytes": 191
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_256_serialization.bin",
"bytes": 208
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_kat.blb",
"bytes": 290
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_serialization.bin",
"bytes": 208
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/tiff-0.11.3/tests/decodedata-rgb-3c-8b.tiff",
"bytes": 30180
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/examples/wasm/TTC.ttc",
"bytes": 2608
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/bitmap.otb",
"bytes": 2072
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/colr_1.ttf",
"bytes": 21568
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/colr_1_variable.ttf",
"bytes": 53096
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/demo.ttf",
"bytes": 400
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/unicode-ident-1.0.26/tests/fst/xid_continue.fst",
"bytes": 78779
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/unicode-ident-1.0.26/tests/fst/xid_start.fst",
"bytes": 69927
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.1.0/assets/probe.png",
"bytes": 877
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.1.0/assets/probe.rgba",
"bytes": 10404
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.2.0/assets/probe.png",
"bytes": 877
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.2.0/assets/probe.rgba",
"bytes": 10404
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/zlib-rs-0.6.8/src/deflate/test-data/inflate_buf_error.dat",
"bytes": 67008
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/zlib-rs-0.6.8/src/deflate/test-data/paper-100k.pdf",
"bytes": 102400
}
]
@@ -0,0 +1,27 @@
✔ release build refuses a missing or mismatched pinned tool before compilation (4.631422ms)
✖ shipped runtime is self-contained and matches every output receipt (0.349349ms)
ℹ tests 2
ℹ suites 0
ℹ pass 1
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 48.123956
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:14:1
✖ shipped runtime is self-contained and matches every output receipt (0.349349ms)
Error: ENOENT: no such file or directory, open '/home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/wordcraft/BUILD.json'
at readFileSync (node:fs:621:20)
at readJSON (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/wordcraft/build.mjs:9:37)
at verifyOutputs (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/wordcraft/build.mjs:61:19)
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:17:18)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/wordcraft/BUILD.json'
}
+46
View File
@@ -0,0 +1,46 @@
✖ release build refuses a missing or mismatched pinned tool before compilation (0.932948ms)
✖ shipped runtime is self-contained and matches every output receipt (0.1963ms)
ℹ tests 2
ℹ suites 0
ℹ pass 0
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 48.311391
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:7:1
✖ release build refuses a missing or mismatched pinned tool before compilation (0.932948ms)
AssertionError [ERR_ASSERTION]: owned builder must exist
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:8:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.start (node:internal/test_runner/test:1262:17)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '==',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:14:1
✖ shipped runtime is self-contained and matches every output receipt (0.1963ms)
AssertionError [ERR_ASSERTION]: owned builder must exist
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:15:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '==',
diff: 'simple'
}
File diff suppressed because it is too large. Load diff
+10
View File
@@ -0,0 +1,10 @@
✔ release cfg evaluation follows pinned rustc and refuses inherited flags (7.782219ms)
✔ pinned compiler reproduces the recorded wasm target cfg (10.432502ms)
ℹ tests 2
ℹ suites 0
ℹ pass 2
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 59.893168
+38
View File
@@ -0,0 +1,38 @@
✖ release cfg evaluation follows pinned rustc and refuses inherited flags (9.116481ms)
✖ pinned compiler reproduces the recorded wasm target cfg (0.413075ms)
ℹ tests 2
ℹ suites 0
ℹ pass 0
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 62.764015
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:25:1
✖ release cfg evaluation follows pinned rustc and refuses inherited flags (9.116481ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:27:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:39:1
✖ pinned compiler reproduces the recorded wasm target cfg (0.413075ms)
TypeError: releaseEnvironment is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:43:121)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
@@ -0,0 +1,517 @@
[
{
"crate": "eframe-0.36.2",
"feature": "accesskit",
"edge": "egui-winit/accesskit"
},
{
"crate": "eframe-0.36.2",
"feature": "android-game-activity",
"edge": "egui-winit/android-game-activity"
},
{
"crate": "eframe-0.36.2",
"feature": "android-native-activity",
"edge": "egui-winit/android-native-activity"
},
{
"crate": "eframe-0.36.2",
"feature": "default",
"edge": "winit/default"
},
{
"crate": "eframe-0.36.2",
"feature": "glow",
"edge": "dep:glutin-winit"
},
{
"crate": "eframe-0.36.2",
"feature": "glow",
"edge": "dep:glutin"
},
{
"crate": "eframe-0.36.2",
"feature": "links",
"edge": "egui-winit/links"
},
{
"crate": "eframe-0.36.2",
"feature": "persistence",
"edge": "egui-winit/serde"
},
{
"crate": "eframe-0.36.2",
"feature": "wayland",
"edge": "egui-winit/wayland"
},
{
"crate": "eframe-0.36.2",
"feature": "wayland",
"edge": "glutin?/wayland"
},
{
"crate": "eframe-0.36.2",
"feature": "wayland",
"edge": "glutin-winit?/wayland"
},
{
"crate": "eframe-0.36.2",
"feature": "wgpu_no_default_features",
"edge": "dep:pollster"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "egui-winit/x11"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "glutin?/x11"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "glutin?/glx"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "glutin-winit?/x11"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "glutin-winit?/glx"
},
{
"crate": "encoding_rs-0.8.42",
"feature": "std",
"edge": "dep:multiversion"
},
{
"crate": "hashbrown-0.17.1",
"feature": "serde",
"edge": "dep:serde"
},
{
"crate": "indexmap-2.14.2",
"feature": "serde",
"edge": "dep:serde"
},
{
"crate": "rfd-0.17.2",
"feature": "common-controls-v6",
"edge": "windows-sys/Win32_UI_Controls"
},
{
"crate": "rfd-0.17.2",
"feature": "gtk3",
"edge": "gtk-sys"
},
{
"crate": "rfd-0.17.2",
"feature": "gtk3",
"edge": "glib-sys"
},
{
"crate": "rfd-0.17.2",
"feature": "gtk3",
"edge": "gobject-sys"
},
{
"crate": "rfd-0.17.2",
"feature": "wayland",
"edge": "wayland-backend"
},
{
"crate": "rfd-0.17.2",
"feature": "wayland",
"edge": "wayland-client"
},
{
"crate": "rfd-0.17.2",
"feature": "wayland",
"edge": "wayland-protocols"
},
{
"crate": "rfd-0.17.2",
"feature": "xdg-portal",
"edge": "pollster"
},
{
"crate": "uuid-1.27.0",
"feature": "fast-rng",
"edge": "dep:rand"
},
{
"crate": "uuid-1.27.0",
"feature": "rng",
"edge": "dep:getrandom"
},
{
"crate": "uuid-1.27.0",
"feature": "rng-getrandom",
"edge": "dep:getrandom"
},
{
"crate": "uuid-1.27.0",
"feature": "rng-rand",
"edge": "dep:rand"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "angle",
"edge": "wgpu-core-deps-apple/angle"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "drm",
"edge": "wgpu-core-deps-windows-linux-android/drm"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "dx12",
"edge": "wgpu-core-deps-windows-linux-android/dx12"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "gles",
"edge": "wgpu-core-deps-windows-linux-android/gles"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "gles",
"edge": "wgpu-core-deps-emscripten/gles"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "metal",
"edge": "wgpu-core-deps-apple/metal"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "renderdoc",
"edge": "wgpu-core-deps-windows-linux-android/renderdoc"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "vulkan",
"edge": "wgpu-core-deps-windows-linux-android/vulkan"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "vulkan-portability",
"edge": "wgpu-core-deps-apple/vulkan-portability"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:bit-set"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:gpu-allocator"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:once_cell"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:range-alloc"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:windows-core"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "gpu-allocator/d3d12"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "once_cell/std"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Devices_DeviceAndDriverInstallation"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Devices_Display"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Direct3D_Dxc"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Direct3D_Fxc"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Direct3D"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Direct3D12"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_DirectComposition"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Dxgi_Common"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Gdi"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Security"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_System_Diagnostics_Debug"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_System_Kernel"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_System_Performance"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_System_Threading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_UI_WindowsAndMessaging"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:glutin_wgl_sys"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:khronos-egl"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:ndk-sys"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:objc2"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:wayland-sys"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:windows-result"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows-result/std"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows/Win32_Graphics_Gdi"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows/Win32_Graphics_OpenGL"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows/Win32_System_LibraryLoader"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows/Win32_UI_WindowsAndMessaging"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:block2"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-core-foundation"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-core-graphics"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-foundation"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-metal"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-quartz-core"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:smallvec"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:raw-window-metal"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "renderdoc",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "renderdoc",
"edge": "dep:renderdoc-sys"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "static-dxc",
"edge": "dep:mach-dxcompiler-rs"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:android_system_properties"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:ash"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:libc"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:raw-window-metal"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:smallvec"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:windows"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "gpu-allocator/vulkan"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Devices_Display"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Foundation"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Graphics_Dxgi"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Graphics_Dxgi_Common"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Graphics_Gdi"
}
]
@@ -0,0 +1,28 @@
✖ a dev dependency cannot preserve a removed optional feature dependency (9.223259ms)
ℹ tests 1
ℹ suites 0
ℹ pass 0
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 55.624704
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:61:1
✖ a dev dependency cannot preserve a removed optional feature dependency (9.223259ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /serde = \[\]/. Input:
'[features]\nserde = ["dep:serde"]\n[dev-dependencies.serde]\nversion = "1"\n'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:65:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: '[features]\nserde = ["dep:serde"]\n[dev-dependencies.serde]\nversion = "1"\n',
expected: /serde = \[\]/,
operator: 'match',
diff: 'simple'
}
@@ -0,0 +1,14 @@
✔ release build refuses a missing or mismatched pinned tool before compilation (5.38916ms)
✔ release cfg evaluation follows pinned rustc and refuses inherited flags (0.546102ms)
✔ pinned compiler reproduces the recorded wasm target cfg (11.861748ms)
✔ vendor filtering removes only false target sections and their dangling feature edges (1.475556ms)
✔ a dev dependency cannot preserve a removed optional feature dependency (0.239783ms)
✔ pristine vendor deterministically reproduces the recorded filter inventory and patch (49.412038ms)
ℹ tests 6
ℹ suites 0
ℹ pass 6
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 117.789074
@@ -0,0 +1,25 @@
✖ pristine vendor deterministically reproduces the recorded filter inventory and patch (77.792167ms)
ℹ tests 1
ℹ suites 0
ℹ pass 0
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 126.569143
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:69:1
✖ pristine vendor deterministically reproduces the recorded filter inventory and patch (77.792167ms)
AssertionError [ERR_ASSERTION]: patch must contain exactly the mechanically reproduced vendor changes
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:99:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '==',
diff: 'simple'
}
+30
View File
@@ -0,0 +1,30 @@
✖ vendor filtering removes only false target sections and their dangling feature edges (7.574024ms)
ℹ tests 1
ℹ suites 0
ℹ pass 0
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 49.047592
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:48:1
✖ vendor filtering removes only false target sections and their dangling feature edges (7.574024ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:50:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,52 @@
{
"scratchRoot": "/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0",
"startUTC": "2026-10-24T06:02:17.598071+00:00",
"endUTC": "2026-10-24T06:08:46.355786+00:00",
"wallSeconds": 388.757577938959,
"exitCode": 0,
"network": "new user/network namespace for metadata, tree and release commands; only loopback exists, no connected interface",
"nice": 19,
"cargoJobs": 4,
"flags": "no inherited Rust flag variables; no configured Rust flags; isolated CARGO_HOME and HOME",
"source": "owned pinned upstream copy, approved 15-member local workspace reduction, original vendor manifests; pinned icon restored only in scratch for original Trunk HTML; baseline measurement, NOT restricted runtime/CSP evidence",
"command": [
"unshare",
"--user",
"--map-root-user",
"--net",
"nice",
"-n",
"19",
"/mnt/storage/scratch/louie-wordcraft-toolchain/trunk/bin/trunk",
"build",
"--release",
"--locked",
"--offline",
"--skip-version-check"
],
"outputs": {
".trunk-lock": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"index.html": {
"bytes": 1604,
"sha256": "299b76f4004bbc65204d561cc381b3fbb249d10069eaa50e88c7fba3b6c63cb8"
},
"wordcraft-fa59e09a3f921e03.ico": {
"bytes": 18378,
"sha256": "53a23dcf66260f44d87d4d143d633395f3e967f391eda47e6e9cc3a52f820225"
},
"wordcraft-web-832240fdc6ce872b_bg.wasm": {
"bytes": 43957877,
"sha256": "c1c15050a9b394c21e7540aa57c9292b86d32bfea2476094a9976304dacf1de0"
},
"wordcraft-web-88f7089f25a3b338.js": {
"bytes": 164941,
"sha256": "866a1de6a33eff2ded8ae9588fd049aeacfc42557a3863ccd2107b3faf4d691e"
}
},
"validation": "timing invalid for wholly nice19 run: effective initial nice15; corrected to19 during compilation",
"initialEffectiveNice": 15,
"priorityCorrectionReceipt": "measurement-priority-correction.json"
}
@@ -0,0 +1,40 @@
{
"scratchRoot": "/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0",
"startUTC": "2026-10-24T06:09:38.408737+00:00",
"endUTC": "2026-10-24T06:16:16.273643+00:00",
"wallSeconds": 397.86480517999735,
"exitCode": 0,
"attempt": "one allowed environment retry after initial effective nice15 was detected",
"cpuAffinity": [
12,
13,
14,
15
],
"cargoJobs": 4,
"binaryenCores": 4,
"targetCache": "fresh target-retry directory",
"network": "enforced isolated user/network namespace, no external interface; Cargo/Trunk offline; Trunk update checks disabled",
"source": "baseline owned source copy plus approved local workspace reduction; vendor manifests unfiltered. Not a restricted editor/CSP gate result.",
"outputs": {
"index.html": {
"bytes": 1604,
"sha256": "299b76f4004bbc65204d561cc381b3fbb249d10069eaa50e88c7fba3b6c63cb8"
},
"wordcraft-fa59e09a3f921e03.ico": {
"bytes": 18378,
"sha256": "53a23dcf66260f44d87d4d143d633395f3e967f391eda47e6e9cc3a52f820225"
},
"wordcraft-web-832240fdc6ce872b_bg.wasm": {
"bytes": 43957877,
"sha256": "c1c15050a9b394c21e7540aa57c9292b86d32bfea2476094a9976304dacf1de0"
},
"wordcraft-web-88f7089f25a3b338.js": {
"bytes": 164941,
"sha256": "866a1de6a33eff2ded8ae9588fd049aeacfc42557a3863ccd2107b3faf4d691e"
}
},
"launcherFinalNice": -4,
"buildChildNice": 19,
"priorityEvidence": "measurement-retry-priority.jsonl: Trunk/Cargo/rustc and wasm-opt all observed at19, CPUs12-15; launcher separately reprioritized by harness"
}
@@ -0,0 +1,34 @@
[
{
"name": "winit",
"version": "0.30.13",
"archivePath": "examples/data/cross.png",
"bytes": 159,
"sha256": "4db9fec917c6cb3196872073e4168d28c4f3e0ad04c5c41865407088abf279e4",
"scope": "example data only; not a committed evidence binary or runtime approval"
},
{
"name": "winit",
"version": "0.30.13",
"archivePath": "examples/data/cross2.png",
"bytes": 129,
"sha256": "fbeeb71e5d6f24898017739d088acefb522d85108a6f1f96183e60e6b4b1f6e6",
"scope": "example data only; not a committed evidence binary or runtime approval"
},
{
"name": "winit",
"version": "0.30.13",
"archivePath": "examples/data/gradient.png",
"bytes": 229,
"sha256": "8f80c21867a59959b84f9ced19ff3aba7bf4e1cf0e2c24dea2c8465c8705c7ca",
"scope": "example data only; not a committed evidence binary or runtime approval"
},
{
"name": "winit",
"version": "0.30.13",
"archivePath": "examples/data/icon.png",
"bytes": 2950,
"sha256": "4340d72fb8b5d95a10e3b2c02230f1060dff0950a137bd1d830c63dbc020dd45",
"scope": "example data only; not a committed evidence binary or runtime approval"
}
]
@@ -0,0 +1,46 @@
{
"review": "gladstone-0026",
"scope": "supplemental inventory corrections, no adoption/implementation approval",
"records": [
{
"crate": "cursor-icon-1.2.0",
"sourcePath": "src/lib.rs",
"sourceSha256": "2f649887b91d2ea059fcf64ef8512a16c0bde72e38ff0aeb14df0f119a9885cb",
"startLine": 34,
"endLine": 102,
"noticeTextSha256": "c54d5155b68d1bd2d3ba1f6b10ee15e3c08696461c3351aef1b71d6cf22cef5e",
"terms": "embedded W3C full license, short notice, document URI and attribution; additional to root SPDX expression",
"adoption": "pending S0/M13 review and owner packaging/license choice; not a policy election"
},
{
"crate": "winit-0.30.13",
"sourcePath": "src/keyboard.rs",
"sourceSha256": "fb1400750fb0c6d376415e642c837e0e8ded95f55ba03a8889d336d180620394",
"startLine": 3,
"endLine": 70,
"noticeTextSha256": "42fe72ba50223d1042803270ecaa191072fe2c41b0f2bd1d7b1a0e19a7bbba7b",
"terms": "embedded W3C full license, short notice, document URI and attribution; additional to root SPDX expression",
"adoption": "pending S0/M13 review and owner packaging/license choice; not a policy election"
},
{
"crate": "dpi-0.1.2",
"sourcePaths": [
"README.md",
"src/libm.rs"
],
"licenseExpression": "Apache-2.0 AND MIT",
"noticeTextSha256": "a3432b00bcf66d370747a494ff8038788019340aaa8cb93c74d3b77d6c1ca025",
"retention": "LICENSE and LICENSE-LIBM-MIT remain in main notice bundle; README explanation and libm copyrights appended; no flattening/election"
},
{
"crate": "spirv-0.4.0+sdk-1.4.341.0",
"declared": "Apache-2.0",
"archiveNoticeFiles": [],
"mapping": "Apache-2.0 standard text, S0 M13 missing-file treatment",
"textSource": "WordCraft e05b7fe86f3b85454000dffc321de638d7009817:LICENSE-APACHE",
"textSha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594",
"adoption": "explicit supplemental evidence mapping only; no shipping adoption or cleared notice verdict asserted"
}
],
"bundleSha256": "4d8e2aac5de85d3f3145d5d3945924436d1c30bc043fb3e2d4391cd98b1adbde"
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,44 @@
from pathlib import Path
import os,subprocess,json,datetime,time,hashlib,re
root=Path('/mnt/storage/scratch/gyro-223-measure-root.txt').read_text().strip();root=Path(root);work=Path('agents/gyro/work/queue-310');src=root/'pruned-source'
assert hashlib.sha256((src/'Cargo.lock').read_bytes()).hexdigest()=='3401363e100783dc70c8f5ba09324947c0b6f8562f1ac1cbbc61a0497200c17f'
for k in os.environ:
if k in ['RUSTFLAGS','RUSTDOCFLAGS','CARGO_ENCODED_RUSTFLAGS','CARGO_BUILD_RUSTFLAGS'] or (k.startswith('CARGO_TARGET_') and k.endswith('_RUSTFLAGS')):raise RuntimeError('inherited flags refused: '+k)
for name in ['build-home','build-cargo-home','build-target']:(root/name).mkdir()
rust='/mnt/storage/scratch/louie-wordcraft-toolchain/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin'
trunk='/mnt/storage/scratch/louie-wordcraft-toolchain/trunk/bin/trunk'
env={'PATH':rust+':'+str(root/'cache/trunk/wasm-bindgen-0.2.129')+':'+str(root/'cache/trunk/wasm-opt-version_131/bin')+':/usr/bin:/bin','HOME':str(root/'build-home'),'CARGO_HOME':str(root/'build-cargo-home'),'XDG_CACHE_HOME':str(root/'cache'),'CARGO_NET_OFFLINE':'true','CARGO_BUILD_JOBS':'4','BINARYEN_CORES':'4','RUSTC':rust+'/rustc','CARGO_TARGET_DIR':str(root/'build-target'),'LC_ALL':'C','TZ':'UTC','TMPDIR':os.environ['TMPDIR'],'TRUNK_OFFLINE':'true','TRUNK_SKIP_VERSION_CHECK':'true','TRUNK_TOOLS_WASM_BINDGEN':'0.2.129','TRUNK_TOOLS_WASM_OPT':'version_131','SOURCE_DATE_EPOCH':'1792587600'}
cpus=sorted(os.sched_getaffinity(0))[-4:]
def limit():os.setpriority(os.PRIO_PROCESS,0,19);os.sched_setaffinity(0,cpus)
base=['unshare','--user','--map-root-user','--net']
expected=json.load(open(work/'measurement-root-closure.json'))['packages'];closures={}
for edge in ['normal','normal,build']:
cmd=base+[rust+'/cargo','tree','--offline','--frozen','--locked','-p','wordcraft-web','--target','wasm32-unknown-unknown','--edges',edge,'--prefix','none','--format','{p}']
p=subprocess.run(cmd,cwd=src,env=env,preexec_fn=limit,capture_output=True,text=True)
(root/('build-tree-'+edge.replace(',','-')+'.txt')).write_text(p.stdout+p.stderr)
actual=set()
for line in p.stdout.splitlines():
m=re.match(r'(\S+) v(\S+)',line)
if m:actual.add((m[1],m[2]))
keys={(p['name'],p['version']) for p in expected if edge=='normal,build' or p['edge']=='normal'}
closures[edge]={'exit':p.returncode,'count':len(actual),'added':sorted(actual-keys),'missing':sorted(keys-actual)}
if p.returncode or actual!=keys:
(work/'measurement-223-build-preflight.json').write_text(json.dumps(closures,indent=2)+'\n');raise RuntimeError('closure check failed: '+edge)
(work/'measurement-223-build-preflight.json').write_text(json.dumps(closures,indent=2)+'\n')
start=datetime.datetime.now(datetime.timezone.utc).isoformat();t=time.monotonic();cmd=base+[trunk,'build','--release','--frozen','--locked','--offline','--skip-version-check']
with (root/'release-build.log').open('w') as log:
child=subprocess.Popen(cmd,cwd=src/'apps/wordcraft-web',env=env,preexec_fn=limit,stdout=log,stderr=subprocess.STDOUT)
priority={'pid':child.pid,'nice':os.getpriority(os.PRIO_PROCESS,child.pid),'cpus':sorted(os.sched_getaffinity(child.pid))}
assert priority['nice']==19 and len(priority['cpus'])==4
(work/'measurement-223-build-start.json').write_text(json.dumps({'startUTC':start,'command':cmd,'priority':priority,'network':'new isolated user/network namespace; no external interface; offline/frozen/locked Cargo/Trunk'},indent=2)+'\n')
print('release started '+start+' '+str(priority),flush=True)
code=child.wait()
seconds=time.monotonic()-t;end=datetime.datetime.now(datetime.timezone.utc).isoformat()
result={'authority':'sage-4014 CLEAR; scratch measurement only','scratchRoot':str(root),'startUTC':start,'endUTC':end,'exitCode':code,'wallSeconds':seconds,'nice':19,'cpuAffinity':cpus,'cargoJobs':4,'binaryenCores':4,'freshDirectories':['HOME','CARGO_HOME','TMPDIR','target'],'lockSha256':hashlib.sha256((src/'Cargo.lock').read_bytes()).hexdigest(),'network':'isolated user/network namespace, no external interface; offline/frozen/locked and no Trunk update checks','source':'baseline measurement with existing packaging filter and cargo-generated pruned lock; not restricted adapter or CSP acceptance','outputs':{}}
if code==0:
for f in sorted((src/'dist/web').rglob('*')):
if f.is_file() and f.name!='.trunk-lock':result['outputs'][f.name]={'bytes':f.stat().st_size,'sha256':hashlib.sha256(f.read_bytes()).hexdigest()}
old=json.load(open(work/'full-lock-release-measurement.json'));oldwasm=next(v['sha256'] for k,v in old['outputs'].items() if k.endswith('.wasm'));newwasm=next(v['sha256'] for k,v in result['outputs'].items() if k.endswith('.wasm'))
result.update({'fullLockWasmSha256':oldwasm,'wasmSha256EqualsFullLock':oldwasm==newwasm})
(root/'release-measurement.json').write_text(json.dumps(result,indent=2)+'\n');(work/'measurement-223-build.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps(result,indent=2),flush=True)
@@ -0,0 +1,14 @@
{
"normal": {
"exit": 0,
"count": 214,
"added": [],
"missing": []
},
"normal,build": {
"exit": 0,
"count": 224,
"added": [],
"missing": []
}
}
@@ -0,0 +1,2 @@
{"atUTC": "2026-10-24T06:34:09.192942+00:00", "processes": [{"pid": 2180936, "name": "trunk", "nice": 19, "cpus": [12, 13, 14, 15]}, {"pid": 2180947, "name": "cargo", "nice": 19, "cpus": [12, 13, 14, 15]}, {"pid": 2198782, "name": "rustc", "nice": 19, "cpus": [12, 13, 14, 15]}]}
{"atUTC": "2026-10-24T06:36:42.030208+00:00", "processes": [{"pid": 2214200, "name": "wasm-opt", "nice": 19, "cpus": [12, 13, 14, 15], "threads": 5}]}
@@ -0,0 +1,27 @@
{
"startUTC": "2026-10-24T06:31:53.099322+00:00",
"command": [
"unshare",
"--user",
"--map-root-user",
"--net",
"/mnt/storage/scratch/louie-wordcraft-toolchain/trunk/bin/trunk",
"build",
"--release",
"--frozen",
"--locked",
"--offline",
"--skip-version-check"
],
"priority": {
"pid": 2180936,
"nice": 19,
"cpus": [
12,
13,
14,
15
]
},
"network": "new isolated user/network namespace; no external interface; offline/frozen/locked Cargo/Trunk"
}
@@ -0,0 +1,46 @@
{
"authority": "sage-4014 CLEAR; scratch measurement only",
"scratchRoot": "/mnt/storage/scratch/gyro-223-measure-mzbp0x23",
"startUTC": "2026-10-24T06:31:53.099322+00:00",
"endUTC": "2026-10-24T06:38:13.773390+00:00",
"exitCode": 0,
"wallSeconds": 380.6740357100498,
"nice": 19,
"cpuAffinity": [
12,
13,
14,
15
],
"cargoJobs": 4,
"binaryenCores": 4,
"freshDirectories": [
"HOME",
"CARGO_HOME",
"TMPDIR",
"target"
],
"lockSha256": "3401363e100783dc70c8f5ba09324947c0b6f8562f1ac1cbbc61a0497200c17f",
"network": "isolated user/network namespace, no external interface; offline/frozen/locked and no Trunk update checks",
"source": "baseline measurement with existing packaging filter and cargo-generated pruned lock; not restricted adapter or CSP acceptance",
"outputs": {
"index.html": {
"bytes": 1604,
"sha256": "28ce55d5c017d545aaac91bbd96f22e6ebd3b35af8d856315cdcb150a2a4a57d"
},
"wordcraft-fa59e09a3f921e03.ico": {
"bytes": 18378,
"sha256": "53a23dcf66260f44d87d4d143d633395f3e967f391eda47e6e9cc3a52f820225"
},
"wordcraft-web-88f7089f25a3b338.js": {
"bytes": 164941,
"sha256": "866a1de6a33eff2ded8ae9588fd049aeacfc42557a3863ccd2107b3faf4d691e"
},
"wordcraft-web-8e80c8f64c8671f7_bg.wasm": {
"bytes": 43952335,
"sha256": "0322beb9e58b9abeed6b6e05125879bfb3eccbebb05094e191df3542a74007ea"
}
},
"fullLockWasmSha256": "c1c15050a9b394c21e7540aa57c9292b86d32bfea2476094a9976304dacf1de0",
"wasmSha256EqualsFullLock": false
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,18 @@
import {readFileSync,writeFileSync,readdirSync} from 'node:fs';
import {pathToFileURL} from 'node:url';
const {filterVendorManifest,sha256}=await import(pathToFileURL(`${process.cwd()}/packages/webui/wordcraft/build.mjs`));
const root=readFileSync('/mnt/storage/scratch/gyro-223-measure-root.txt','utf8').trim();
const cfg=readFileSync('agents/gyro/work/queue-310/rustc-wasm32-cfg.txt','utf8');
const inventory=[];
for(const crate of readdirSync(`${root}/vendor`).sort()) {
const path=`${root}/vendor/${crate}/Cargo.toml`;
const original=readFileSync(path,'utf8');const result=filterVendorManifest(original,cfg);
if(result.text===original)continue;
writeFileSync(path,result.text);
const checksum=JSON.parse(readFileSync(`${root}/vendor/${crate}/.cargo-checksum.json`,'utf8'));
checksum.files['Cargo.toml']=sha256(Buffer.from(result.text));
writeFileSync(`${root}/vendor/${crate}/.cargo-checksum.json`,JSON.stringify(checksum)+'\n');
inventory.push({crate,sections:result.sections,features:result.features});
}
writeFileSync('agents/gyro/work/queue-310/measurement-223-filter-inventory.json',JSON.stringify(inventory,null,2)+'\n');
console.log(JSON.stringify({manifests:inventory.length,sections:inventory.reduce((n,x)=>n+x.sections.length,0),featureItems:inventory.reduce((n,x)=>n+x.features.length,0)}));
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,315 @@
{
"scratchRoot": "/mnt/storage/scratch/gyro-223-measure-mzbp0x23",
"authority": "sage-4008 / mos-1574",
"originalLockSha256": "06b745e43c13df3df7f048fa6a1981625ce7a5fe4cd484bc6254d0913d865b0b",
"packages": 223,
"extraPackages": [
{
"name": "cursor-icon",
"version": "1.2.0",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f",
"archiveBytes": 14267,
"license": "MIT OR Apache-2.0 OR Zlib",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE-APACHE",
"bytes": 11346,
"sha256": "b59affd015e517ed998dd735757f9a3693643cd389609947ed54074234a10784"
},
{
"path": "LICENSE-MIT",
"bytes": 1059,
"sha256": "c138726a726ac37bae09d0f8a48e74e8e3aa8a8952fcd10fae0fb224cc1c05f1"
},
{
"path": "LICENSE-ZLIB",
"bytes": 844,
"sha256": "01e533bd94e8f1c32b2c2531e2c398de7d35d7804add3d574b4e1fe581d53537"
}
],
"files": 14,
"bytes": 44329
},
{
"name": "dpi",
"version": "0.1.2",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76",
"archiveBytes": 14812,
"license": "Apache-2.0 AND MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE",
"bytes": 11323,
"sha256": "6dc0e068dcf3a5bc8e054205b85b7720e1d49265bbc64bf515d2cf79197df69a"
},
{
"path": "LICENSE-LIBM-MIT",
"bytes": 2444,
"sha256": "9eff396a99bafd208e7126602420d6864f6066c08b84485a5b032320a9c01997"
}
],
"files": 11,
"bytes": 64188
},
{
"name": "futures-macro",
"version": "0.3.34",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44",
"archiveBytes": 11926,
"license": "MIT OR Apache-2.0",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE-APACHE",
"bytes": 10874,
"sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427"
},
{
"path": "LICENSE-MIT",
"bytes": 1094,
"sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd"
}
],
"files": 12,
"bytes": 41731
},
{
"name": "glifo",
"version": "0.2.0",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "ed4a1bb24121291d27230c1b1b44e07d6a9b28cefdb32fe1581dfb84e14f940a",
"archiveBytes": 55880,
"license": "Apache-2.0 OR MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE-APACHE",
"bytes": 9723,
"sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a"
},
{
"path": "LICENSE-MIT",
"bytes": 1057,
"sha256": "3252fc481fda4d2bad9e1ae675065889abd35c8abb500499ac01e70aaffa02b9"
}
],
"files": 20,
"bytes": 222068
},
{
"name": "ordered-float",
"version": "5.5.0",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "8c7c9e0d9b23589f26070720bac724174bfec1083e82f7854cdd0267518343c0",
"archiveBytes": 34706,
"license": "MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE-MIT",
"bytes": 1057,
"sha256": "f7715d38a3fa1b4ac97c5729740752505a39cb92ee83ab5b102aeb5eaa7cdea4"
}
],
"files": 14,
"bytes": 179606
},
{
"name": "pin-project",
"version": "1.1.13",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924",
"archiveBytes": 56345,
"license": "Apache-2.0 OR MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE-APACHE",
"bytes": 10174,
"sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594"
},
{
"path": "LICENSE-MIT",
"bytes": 1023,
"sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3"
}
],
"files": 209,
"bytes": 476259
},
{
"name": "pin-project-internal",
"version": "1.1.13",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b",
"archiveBytes": 29331,
"license": "Apache-2.0 OR MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE-APACHE",
"bytes": 10174,
"sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594"
},
{
"path": "LICENSE-MIT",
"bytes": 1023,
"sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3"
}
],
"files": 15,
"bytes": 114911
},
{
"name": "smol_str",
"version": "0.2.2",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead",
"archiveBytes": 15840,
"license": "MIT OR Apache-2.0",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE-APACHE",
"bytes": 10847,
"sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2"
},
{
"path": "LICENSE-MIT",
"bytes": 1023,
"sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3"
}
],
"files": 14,
"bytes": 56395
},
{
"name": "spirv",
"version": "0.4.0+sdk-1.4.341.0",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f",
"archiveBytes": 41285,
"license": "Apache-2.0",
"licenseFile": null,
"noticeFiles": [],
"files": 9,
"bytes": 257440
},
{
"name": "termcolor",
"version": "1.4.1",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755",
"archiveBytes": 18773,
"license": "Unlicense OR MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "COPYING",
"bytes": 126,
"sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f"
},
{
"path": "LICENSE-MIT",
"bytes": 1081,
"sha256": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f"
},
{
"path": "UNLICENSE",
"bytes": 1211,
"sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c"
}
],
"files": 12,
"bytes": 92727
},
{
"name": "tracing",
"version": "0.1.44",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100",
"archiveBytes": 463135,
"license": "MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE",
"bytes": 1062,
"sha256": "898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1"
}
],
"files": 94,
"bytes": 9827320
},
{
"name": "tracing-attributes",
"version": "0.1.31",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da",
"archiveBytes": 39733,
"license": "MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE",
"bytes": 1062,
"sha256": "898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1"
}
],
"files": 31,
"bytes": 184696
},
{
"name": "tracing-core",
"version": "0.1.36",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a",
"archiveBytes": 63967,
"license": "MIT",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE",
"bytes": 1062,
"sha256": "898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1"
},
{
"path": "src/spin/LICENSE",
"bytes": 1085,
"sha256": "58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79"
}
],
"files": 29,
"bytes": 257879
},
{
"name": "winit",
"version": "0.30.13",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"archiveSha256": "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d",
"archiveBytes": 605180,
"license": "Apache-2.0",
"licenseFile": null,
"noticeFiles": [
{
"path": "LICENSE",
"bytes": 11323,
"sha256": "6dc0e068dcf3a5bc8e054205b85b7720e1d49265bbc64bf515d2cf79197df69a"
}
],
"files": 218,
"bytes": 2703555
}
],
"extraFiles": 702,
"extraBytes": 14523104,
"totalFiles": 11201,
"totalBytes": 145260334,
"vendorManifestEdits": "none; original 209 packaging plus 14 checksum-verified archive extractions",
"sourceManifestEdits": "same approved local 15-member workspace reduction as prior packet, no additional changes"
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,8 @@
command: unshare --user --map-root-user --net /mnt/storage/scratch/louie-wordcraft-toolchain/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/cargo metadata --offline --locked --filter-platform wasm32-unknown-unknown --format-version 1
exit: 101
wallSeconds: 0.17994241300038993
STDERR:
error: cannot update the lock file /mnt/storage/scratch/gyro-223-measure-mzbp0x23/source/Cargo.lock because --locked was passed to prevent this
help: to generate the lock file without accessing the network, remove the --locked flag and use --offline instead.
STDOUT:
@@ -0,0 +1,32 @@
from pathlib import Path
import os,subprocess,json,hashlib
root=Path('/mnt/storage/scratch/gyro-223-measure-root.txt').read_text().strip();root=Path(root);work=Path('agents/gyro/work/queue-310')
os.setpriority(os.PRIO_PROCESS,0,19);os.sched_setaffinity(0,sorted(os.sched_getaffinity(0))[-4:])
env={'PATH':'/usr/bin:/bin','HOME':str(root/'home'),'LC_ALL':'C','GIT_CONFIG_NOSYSTEM':'1','GIT_CONFIG_GLOBAL':'/dev/null'}
def priority():os.setpriority(os.PRIO_PROCESS,0,19)
def call(args,**kw):return subprocess.run(args,env=env,preexec_fn=priority,check=True,**kw)
repo=root/'source-measurement.git';call(['git','init','--bare',str(repo)],capture_output=True)
git=['git','--git-dir',str(repo)]
inputs=json.load(open(work/'measurement-223-inputs.json'));extras={p['name']+'-'+p['version'] for p in inputs['extraPackages']}
review=Path('packages/webui/third_party/wordcraft/cargo-vendor').resolve();prior=Path('/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/vendor')
files=[]
for d in sorted(review.iterdir()):files.extend((f,False,d.name+'/'+f.relative_to(d).as_posix()) for f in sorted(d.rglob('*')) if f.is_file())
for name in sorted(extras):
d=prior/name;files.extend((f,True,name+'/'+f.relative_to(d).as_posix()) for f in sorted(d.rglob('*')) if f.is_file())
assert len(files)==inputs['totalFiles'];assert sum(f.stat().st_size for f,_,_ in files)==inputs['totalBytes']
assert all('\n' not in str(f) for f,_,_ in files)
before=call(git+['count-objects','-v'],capture_output=True,text=True).stdout
p=call(git+['hash-object','-w','--no-filters','--stdin-paths'],input='\n'.join(str(f) for f,_,_ in files)+'\n',capture_output=True,text=True)
oids=p.stdout.splitlines();assert len(oids)==len(files)
sets={'all223':sorted(set(oids)),'extra14':sorted({oid for oid,(_,extra,_) in zip(oids,files) if extra})}
packs={}
for name,ids in sets.items():
f=root/(name+'-sources.pack')
with f.open('wb') as out:call(git+['pack-objects','--stdout','--threads=4'],input='\n'.join(ids)+'\n',stdout=out,text=True)
packs[name]={'packedBytes':f.stat().st_size,'uniqueBlobs':len(ids),'sha256':hashlib.sha256(f.read_bytes()).hexdigest()}
after=call(git+['count-objects','-v'],capture_output=True,text=True).stdout
report={'scratchRoot':str(root),'method':'pristine package files (not filtered build copy), git hash-object -w --no-filters --stdin-paths into scratch bare repo; each sorted unique blob set through pack-objects --stdout --threads=4; no gc; no tree/commit objects or cross-version deltas','all223Files':len(files),'all223Bytes':sum(f.stat().st_size for f,_,_ in files),'extra14Files':sum(extra for _,extra,_ in files),'extra14Bytes':sum(f.stat().st_size for f,extra,_ in files if extra),'packs':packs,'countObjectsBefore':before,'countObjectsAfter':after}
(work/'measurement-223-source-packs.json').write_text(json.dumps(report,indent=2)+'\n')
manifest=[{'path':path,'bytes':f.stat().st_size,'sha256':hashlib.sha256(f.read_bytes()).hexdigest(),'gitBlob':oid,'extra':extra} for oid,(f,extra,path) in zip(oids,files)]
(work/'measurement-223-input-manifest.json').write_text(json.dumps(manifest,indent=2)+'\n')
print(json.dumps(report,indent=2))
@@ -0,0 +1,37 @@
from pathlib import Path
import os,json,tomllib,hashlib,tarfile,shutil,tempfile,subprocess,datetime,time
os.setpriority(os.PRIO_PROCESS,0,19)
root=Path(tempfile.mkdtemp(prefix='gyro-223-measure-',dir='/mnt/storage/scratch'))
work=Path('agents/gyro/work/queue-310'); prior=Path('/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0')
shutil.copytree('packages/webui/third_party/wordcraft/cargo-vendor',root/'vendor')
lockfile=Path('packages/webui/third_party/wordcraft/upstream/Cargo.lock');lock=tomllib.loads(lockfile.read_text())
bykey={(p['name'],p['version']):p for p in lock['package']}
extra=json.load(open(work/'measurement-resolution-extra-packages.json'))['packages']
cache=Path('/mnt/storage/scratch/louie-wordcraft-toolchain/cargo/registry/cache/index.crates.io-1949cf8c6b5b557f')
inventory=[]
for p in extra:
key=(p['name'],p['version']);pin=bykey[key];archive=cache/(key[0]+'-'+key[1]+'.crate')
assert hashlib.sha256(archive.read_bytes()).hexdigest()==pin['checksum']
with tarfile.open(archive) as tf:tf.extractall(root/'vendor',filter='data')
d=root/'vendor'/(key[0]+'-'+key[1]);fs=sorted(f for f in d.rglob('*') if f.is_file())
(d/'.cargo-checksum.json').write_text(json.dumps({'files':{f.relative_to(d).as_posix():hashlib.sha256(f.read_bytes()).hexdigest() for f in fs},'package':pin['checksum']},sort_keys=True)+'\n')
manifest=tomllib.loads((d/'Cargo.toml').read_text());licenses=[]
for f in sorted(d.rglob('*')):
if f.is_file() and any(k in f.name.lower() for k in ['license','notice','copying','copyright']):
licenses.append({'path':f.relative_to(d).as_posix(),'bytes':f.stat().st_size,'sha256':hashlib.sha256(f.read_bytes()).hexdigest()})
allfs=[f for f in d.rglob('*') if f.is_file()]
inventory.append({'name':key[0],'version':key[1],'source':pin['source'],'archiveSha256':pin['checksum'],'archiveBytes':archive.stat().st_size,'license':manifest['package'].get('license'),'licenseFile':manifest['package'].get('license-file'),'noticeFiles':licenses,'files':len(allfs),'bytes':sum(f.stat().st_size for f in allfs)})
assert len(list((root/'vendor').iterdir()))==223
shutil.copytree(prior/'source',root/'source')
# Restore the original lock exactly, as Sage requested. Keep only the already
# approved local-workspace reduction; vendor manifests are pristine/unfiltered.
shutil.copyfile(lockfile,root/'source/Cargo.lock')
for name in ['home','cargo-home']:(root/name).mkdir()
shutil.copytree(prior/'cache',root/'cache')
cfg=(root/'source/.cargo/config.toml').read_text().replace(str(prior/'vendor'),str(root/'vendor'))
(root/'source/.cargo/config.toml').write_text(cfg)
fs=[f for f in (root/'vendor').rglob('*') if f.is_file()]
report={'scratchRoot':str(root),'authority':'sage-4008 / mos-1574','originalLockSha256':hashlib.sha256(lockfile.read_bytes()).hexdigest(),'packages':223,'extraPackages':inventory,'extraFiles':sum(p['files'] for p in inventory),'extraBytes':sum(p['bytes'] for p in inventory),'totalFiles':len(fs),'totalBytes':sum(f.stat().st_size for f in fs),'vendorManifestEdits':'none; original 209 packaging plus 14 checksum-verified archive extractions','sourceManifestEdits':'same approved local 15-member workspace reduction as prior packet, no additional changes'}
(work/'measurement-223-inputs.json').write_text(json.dumps(report,indent=2)+'\n');(root/'measurement-inputs.json').write_text(json.dumps(report,indent=2)+'\n')
Path('/mnt/storage/scratch/gyro-223-measure-root.txt').write_text(str(root)+'\n')
print(json.dumps({k:v for k,v in report.items() if k!='extraPackages'},indent=2))
@@ -0,0 +1,25 @@
from pathlib import Path
import os,shutil,subprocess,json,tomllib,hashlib,time
root=Path('/mnt/storage/scratch/gyro-223-measure-root.txt').read_text().strip();root=Path(root);work=Path('agents/gyro/work/queue-310')
src=root/'pruned-source';shutil.copytree(root/'source',src)
rust='/mnt/storage/scratch/louie-wordcraft-toolchain/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin'
env={'PATH':rust+':/usr/bin:/bin','HOME':str(root/'home'),'CARGO_HOME':str(root/'cargo-home'),'CARGO_NET_OFFLINE':'true','CARGO_BUILD_JOBS':'4','RUSTC':rust+'/rustc','CARGO_TARGET_DIR':str(root/'target'),'LC_ALL':'C','TZ':'UTC','TMPDIR':os.environ['TMPDIR']}
for k in os.environ:
if k in ['RUSTFLAGS','RUSTDOCFLAGS','CARGO_ENCODED_RUSTFLAGS','CARGO_BUILD_RUSTFLAGS'] or (k.startswith('CARGO_TARGET_') and k.endswith('_RUSTFLAGS')):raise RuntimeError('inherited flags refused: '+k)
def priority():os.setpriority(os.PRIO_PROCESS,0,19)
cmd=['unshare','--user','--map-root-user','--net',rust+'/cargo','metadata','--offline','--filter-platform','wasm32-unknown-unknown','--format-version','1']
p=subprocess.run(cmd,cwd=src,env=env,preexec_fn=priority,capture_output=True,text=True)
(root/'pruned-metadata.json').write_text(p.stdout);(work/'measurement-223-pruned-metadata.txt').write_text('command: '+' '.join(cmd)+'\nexit: '+str(p.returncode)+'\n'+p.stderr)
original=(root/'source/Cargo.lock').read_bytes();new=(src/'Cargo.lock').read_bytes()
a=tomllib.loads(original.decode());b=tomllib.loads(new.decode())
def indexed(doc):return {(p['name'],p['version']):p for p in doc['package']}
a=indexed(a);b=indexed(b)
removed=[a[k] for k in sorted(a.keys()-b.keys())];added=[b[k] for k in sorted(b.keys()-a.keys())];changed=[]
for k in sorted(a.keys()&b.keys()):
before={f:a[k].get(f) for f in ['name','version','source','checksum']};after={f:b[k].get(f) for f in ['name','version','source','checksum']}
if before!=after:changed.append({'before':before,'after':after})
report={'authority':'sage-4010, scratch measurement only; shipping would be a packaging change needing S0 reviewer and Jason choice','scratchRoot':str(root),'source':str(src),'metadataExit':p.returncode,'stderr':p.stderr,'originalLockSha256':hashlib.sha256(original).hexdigest(),'prunedLockSha256':hashlib.sha256(new).hexdigest(),'originalEntries':len(a),'prunedEntries':len(b),'removedCount':len(removed),'addedCount':len(added),'changedCount':len(changed),'removed':[{f:r.get(f) for f in ['name','version','source','checksum']} for r in removed],'added':added,'changed':changed,'subsetPass':p.returncode==0 and not added and not changed}
(work/'measurement-223-lock-diff.json').write_text(json.dumps(report,indent=2)+'\n');(root/'pruned-lock-diff.json').write_text(json.dumps(report,indent=2)+'\n')
(work/'measurement-223-pruned-Cargo.lock.txt').write_bytes(new)
print(json.dumps({k:v for k,v in report.items() if k not in ['removed','added','changed']},indent=2))
assert hashlib.sha256((root/'source/Cargo.lock').read_bytes()).hexdigest()==report['originalLockSha256']
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,2 @@
command: unshare --user --map-root-user --net /mnt/storage/scratch/louie-wordcraft-toolchain/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/cargo metadata --offline --filter-platform wasm32-unknown-unknown --format-version 1
exit: 0
@@ -0,0 +1,251 @@
2026-10-24T06:31:53.109215Z INFO Starting trunk 0.22.0
2026-10-24T06:31:53.109534Z INFO starting build
2026-10-24T06:31:53.109733Z INFO node packages []
Compiling unicode-ident v1.0.26
Compiling proc-macro2 v1.0.107
Compiling quote v1.0.47
Compiling cfg-if v1.0.5
Compiling serde_core v1.0.229
Compiling once_cell v1.21.4
Compiling serde v1.0.229
Compiling libm v0.2.16
Compiling rustversion v1.0.23
Compiling autocfg v1.5.1
Compiling log v0.4.34
Compiling syn v3.0.6
Compiling wasm-bindgen-shared v0.2.129
Compiling num-traits v0.2.19
Compiling bitflags v2.13.2
Compiling thiserror v2.0.21
Compiling bumpalo v3.20.3
Compiling arrayvec v0.7.8
Compiling wasm-bindgen v0.2.129
Compiling foldhash v0.2.0
Compiling futures-task v0.3.34
Compiling hashbrown v0.17.1
Compiling slab v0.4.12
Compiling futures-core v0.3.34
Compiling pin-project-lite v0.2.17
Compiling futures-util v0.3.34
Compiling simd-adler32 v0.3.10
Compiling syn v2.0.119
Compiling zerocopy v0.8.61
Compiling crc32fast v1.5.2
Compiling adler2 v2.0.1
Compiling polycool v0.4.0
Compiling wasm-bindgen-macro-support v0.2.129
Compiling miniz_oxide v0.9.1
Compiling bytemuck_derive v1.12.1
Compiling serde_derive v1.0.229
Compiling thiserror-impl v2.0.21
Compiling bytemuck v1.25.2
Compiling zerocopy-derive v0.8.61
Compiling zlib-rs v0.6.8
Compiling wasm-bindgen-macro v0.2.129
Compiling smallvec v1.16.2
Compiling kurbo v0.13.1
Compiling equivalent v1.0.2
Compiling indexmap v2.14.2
Compiling js-sys v0.3.106
Compiling flate2 v1.1.10
Compiling font-types v0.12.6
Compiling memchr v2.8.3
Compiling zmij v1.0.23
Compiling miniz_oxide v0.8.9
Compiling scopeguard v1.2.0
Compiling version_check v0.9.5
Compiling half v2.7.1
Compiling fdeflate v0.3.7
Compiling cfg_aliases v0.2.2
Compiling serde_json v1.0.151
Compiling png v0.18.1
Compiling color v0.3.3
Compiling euclid v0.22.14
Compiling unicode-segmentation v1.13.3
Compiling linebender_resource_handle v0.1.1
Compiling typenum v1.20.1
Compiling peniko v0.6.1
Compiling guillotiere v0.7.0
Compiling hybrid-array v0.4.15
Compiling weezl v0.1.12
Compiling fearless_simd v0.4.1
Compiling quick-error v2.0.1
Compiling itoa v1.0.18
Compiling zune-core v0.5.3
Compiling read-fonts v0.41.0
Compiling zune-jpeg v0.5.15
Compiling byteorder-lite v0.1.0
Compiling parking_lot_core v0.9.12
Compiling color_quant v1.1.0
Compiling gif v0.14.2
Compiling image-webp v0.2.4
Compiling uuid v1.27.0
Compiling crypto-common v0.2.2
Compiling lock_api v0.4.14
Compiling fax v0.2.7
Compiling pxfm v0.1.30
Compiling tiff v0.11.3
Compiling web-sys v0.3.106
Compiling moxcms v0.8.1
Compiling skrifa v0.44.0
Compiling parking_lot v0.12.5
Compiling wordcraft-geom v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/geom)
Compiling font-types v0.11.3
Compiling synstructure v0.14.0
Compiling rustc-hash v1.1.0
Compiling cmov v0.5.4
Compiling profiling v1.0.18
Compiling rustc-hash v2.1.3
Compiling unicode-script v0.5.8
Compiling ctutils v0.4.3
Compiling naga-types v30.0.1
Compiling wordcraft-doc v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/doc)
Compiling read-fonts v0.39.2
Compiling image v0.25.10
Compiling web-time v1.1.0
Compiling block-buffer v0.12.1
Compiling naga v30.0.1
Compiling slotmap v1.1.1
Compiling unicode-width v0.2.2
Compiling bit-vec v0.9.1
Compiling const-oid v0.10.2
Compiling raw-window-handle v0.6.2
Compiling alloc-no-stdlib v2.0.4
Compiling brotli-decompressor v5.0.3
Compiling bit-set v0.10.0
Compiling digest v0.11.3
Compiling codespan-reporting v0.13.1
Compiling zerofrom-derive v0.1.8
Compiling ahash v0.8.12
Compiling read-fonts v0.44.0
Compiling read-fonts v0.43.3
Compiling core_maths v0.1.1
Compiling static_assertions v1.1.0
Compiling wordcraft-fonts v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/fonts)
Compiling unicode-general-category v1.1.0
Compiling unicode-bidi v0.3.18
Compiling bytes v1.12.1
Compiling wgpu-types v30.0.1
Compiling wuff v0.2.9
Compiling ttf-parser v0.25.1
Compiling zerofrom v0.1.8
Compiling skrifa v0.47.0
Compiling harfrust v0.13.3
Compiling skrifa v0.42.1
Compiling write-fonts v0.48.1
Compiling yoke-derive v0.8.4
Compiling vello_common v0.1.0
Compiling wgpu-hal v30.0.1
Compiling emath v0.36.2
Compiling encoding_rs v0.8.42
Compiling strict-num v0.1.1
Compiling unicode-bidi-mirroring v0.4.0
Compiling fnv v1.0.7
Compiling stable_deref_trait v1.2.1
Compiling base64 v0.22.1
Compiling unicode-properties v0.1.4
Compiling unicode-ccc v0.4.0
Compiling arrayref v0.3.9
Compiling ryu v1.0.23
Compiling pdf-writer v0.15.0
Compiling tiny-skia-path v0.12.0
Compiling rustybuzz v0.20.1
Compiling vello_cpu v0.1.0
Compiling yoke v0.8.3
Compiling cfb v0.15.0
Compiling subsetter v0.2.6
Compiling ecolor v0.36.2
Compiling glow v0.17.0
Compiling wgpu-naga-bridge v30.0.1
Compiling zopfli v0.8.3
Compiling harfrust v0.12.0
Compiling vello_common v0.2.0
Compiling inout v0.2.2
Compiling wordcraft-proof v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/proof)
Compiling float-cmp v0.9.0
Compiling nohash-hasher v0.2.0
Compiling unicode-linebreak v0.1.5
Compiling xmp-writer v0.3.3
Compiling getrandom v0.3.4
Compiling multiversion_no_op v1.0.0
Compiling imagesize v0.14.0
Compiling either v1.19.0
Compiling self_cell v1.3.0
Compiling epaint_default_fonts v0.36.2
Compiling siphasher v1.0.4
Compiling epaint v0.36.2
Compiling krilla v0.8.2 (https://github.com/storytold/craft-libs?rev=c3487320b2d1de657b860b3c8abb44e1f2b32bd8#c3487320)
Compiling itertools v0.15.0
Compiling wordcraft-layout v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/layout)
Compiling glifo v0.3.0
Compiling cipher v0.5.2
Compiling zip v3.0.0
Compiling sha1 v0.11.0
Compiling accesskit v0.24.1
Compiling wgpu-core v30.0.1
Compiling aho-corasick v1.1.5
Compiling quick-xml v0.41.0
Compiling wordcraft-metafile v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/metafile)
Compiling cpubits v0.1.1
Compiling regex-syntax v0.8.11
Compiling litrs v1.0.0
Compiling winnow v1.0.4
Compiling toml_parser v1.1.3+spec-1.1.0
Compiling document-features v0.2.12
Compiling aes v0.9.3
Compiling wgpu-core-deps-wasm v30.0.1
Compiling regex-automata v0.4.18
Compiling egui v0.36.2
Compiling vello_cpu v0.2.0
Compiling chardetng v1.0.0
Compiling craft-pdf v0.1.0 (https://github.com/storytold/craft-libs?rev=c3487320b2d1de657b860b3c8abb44e1f2b32bd8#c3487320)
Compiling toml_datetime v1.1.1+spec-1.1.0
Compiling serde_spanned v1.1.1
Compiling hmac v0.13.0
Compiling sha2 v0.11.0
Compiling wasm-bindgen-futures v0.4.79
Compiling wgpu v30.0.1
Compiling zeroize v1.9.1
Compiling toml_writer v1.1.2+spec-1.1.0
Compiling toml v1.1.6+spec-1.1.0
Compiling wordcraft-docx v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/docx)
Compiling wordcraft-pdf v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/pdf)
Compiling wordcraft-formats v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/formats)
Compiling wordcraft-render v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/render)
Compiling regex v1.13.1
Compiling wordcraft-docbin v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/docbin)
Compiling wordcraft-engine v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/engine)
Compiling wordcraft-ui-egui v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/ui-egui)
Compiling type-map v0.5.1
Compiling rfd v0.17.2
Compiling craft-ui v0.1.0 (https://github.com/storytold/craft-libs?rev=d27646a5f7c8b4fc85d9dd3213b8c88b58e0088d#d27646a5)
Compiling sys-locale v0.3.2
Compiling percent-encoding v2.3.2
warning: function `by_author` is never used
--> crates/engine/src/cmd/citations.rs:534:4
|
534 | fn by_author(x: &Source) -> &str {
| ^^^^^^^^^
|
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
warning: function `primary_tag` is never used
--> crates/engine/src/speech.rs:252:4
|
252 | fn primary_tag(tag: &str) -> Option<String> {
| ^^^^^^^^^^^
warning: function `voice_language` is never used
--> crates/engine/src/speech.rs:260:4
|
260 | fn voice_language(lang: Option<&str>, default: &str) -> Option<String> {
| ^^^^^^^^^^^^^^
Compiling egui-wgpu v0.36.2
Compiling eframe v0.36.2
Compiling wordcraft-zotero v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/crates/zotero)
warning: `wordcraft-engine` (lib) generated 3 warnings
Compiling wordcraft-web v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/pruned-source/apps/wordcraft-web)
Finished `release` profile [optimized] target(s) in 3m 16s
2026-10-24T06:38:13.771065Z INFO applying new distribution
2026-10-24T06:38:13.771634Z INFO success
@@ -0,0 +1,10 @@
{
"scratchRoot": "/mnt/storage/scratch/gyro-223-measure-mzbp0x23",
"metadataExit": 101,
"metadataError": "error: cannot update the lock file /mnt/storage/scratch/gyro-223-measure-mzbp0x23/source/Cargo.lock because --locked was passed to prevent this\nhelp: to generate the lock file without accessing the network, remove the --locked flag and use --offline instead.\n",
"originalLockSha256": "06b745e43c13df3df7f048fa6a1981625ce7a5fe4cd484bc6254d0913d865b0b",
"lockUnchanged": true,
"network": "isolated network namespace with no external interface; offline Cargo; fresh HOME/CARGO_HOME",
"closures": {},
"resolves": false
}
@@ -0,0 +1,31 @@
from pathlib import Path
import os,json,subprocess,re,time,hashlib
root=Path('/mnt/storage/scratch/gyro-223-measure-root.txt').read_text().strip();root=Path(root);work=Path('agents/gyro/work/queue-310')
rust='/mnt/storage/scratch/louie-wordcraft-toolchain/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin'
for k in os.environ:
if k in ['RUSTFLAGS','RUSTDOCFLAGS','CARGO_ENCODED_RUSTFLAGS','CARGO_BUILD_RUSTFLAGS'] or (k.startswith('CARGO_TARGET_') and k.endswith('_RUSTFLAGS')):raise RuntimeError('inherited flags refused: '+k)
env={'PATH':rust+':/usr/bin:/bin','HOME':str(root/'home'),'CARGO_HOME':str(root/'cargo-home'),'CARGO_NET_OFFLINE':'true','CARGO_BUILD_JOBS':'4','RUSTC':rust+'/rustc','CARGO_TARGET_DIR':str(root/'target'),'LC_ALL':'C','TZ':'UTC','TMPDIR':os.environ['TMPDIR']}
def priority():os.setpriority(os.PRIO_PROCESS,0,19)
def run(args,name):
command=['unshare','--user','--map-root-user','--net']+args;t=time.monotonic()
p=subprocess.run(command,cwd=root/'source',env=env,preexec_fn=priority,capture_output=True,text=True)
(root/(name+'.stdout')).write_text(p.stdout);(root/(name+'.stderr')).write_text(p.stderr)
(work/('measurement-223-'+name+'.txt')).write_text('command: '+' '.join(command)+'\nexit: '+str(p.returncode)+'\nwallSeconds: '+str(time.monotonic()-t)+'\nSTDERR:\n'+p.stderr+('\nSTDOUT:\n'+p.stdout if p.returncode else ''))
return p
original=(root/'source/Cargo.lock').read_bytes()
p=run([rust+'/cargo','metadata','--offline','--locked','--filter-platform','wasm32-unknown-unknown','--format-version','1'],'metadata')
report={'scratchRoot':str(root),'metadataExit':p.returncode,'metadataError':p.stderr,'originalLockSha256':hashlib.sha256(original).hexdigest(),'lockUnchanged':original==(root/'source/Cargo.lock').read_bytes(),'network':'isolated network namespace with no external interface; offline Cargo; fresh HOME/CARGO_HOME','closures':{}}
if p.returncode==0:
inv=json.load(open('packages/webui/third_party/wordcraft/PROVENANCE.json'))['packages']
for edge in ['normal','normal,build']:
p=run([rust+'/cargo','tree','--locked','--offline','-p','wordcraft-web','--target','wasm32-unknown-unknown','--edges',edge,'--prefix','none','--format','{p}'],'tree-'+edge.replace(',','-'))
actual=set()
for line in p.stdout.splitlines():
m=re.match(r'(\S+) v(\S+)',line)
if m:actual.add((m[1],m[2]))
expected={(x['name'],x['version']) for x in inv if edge=='normal,build' or x['edge']=='normal'}
report['closures'][edge]={'exit':p.returncode,'packages':len(actual),'added':sorted(actual-expected),'missing':sorted(expected-actual),'matchesS0':p.returncode==0 and actual==expected}
report['resolves']=all(x['matchesS0'] for x in report['closures'].values())
else:report['resolves']=False
(work/'measurement-223-resolution.json').write_text(json.dumps(report,indent=2)+'\n');(root/'resolution-result.json').write_text(json.dumps(report,indent=2)+'\n')
print(json.dumps(report,indent=2))
@@ -0,0 +1,22 @@
{
"scratchRoot": "/mnt/storage/scratch/gyro-223-measure-mzbp0x23",
"method": "pristine package files (not filtered build copy), git hash-object -w --no-filters --stdin-paths into scratch bare repo; each sorted unique blob set through pack-objects --stdout --threads=4; no gc; no tree/commit objects or cross-version deltas",
"all223Files": 11201,
"all223Bytes": 145260334,
"extra14Files": 702,
"extra14Bytes": 14523104,
"packs": {
"all223": {
"packedBytes": 26538894,
"uniqueBlobs": 10275,
"sha256": "70b06c31030057d7b994290b464f3ed7707d1ae5490140a0853ac520c7563304"
},
"extra14": {
"packedBytes": 1720566,
"uniqueBlobs": 691,
"sha256": "71e53a9af8dd368a56bb382cf313b2a8ead530055028e1a31f57fc8119071bd0"
}
},
"countObjectsBefore": "count: 0\nsize: 0\nin-pack: 0\npacks: 0\nsize-pack: 0\nprune-packable: 0\ngarbage: 0\nsize-garbage: 0\n",
"countObjectsAfter": "count: 10275\nsize: 66172\nin-pack: 0\npacks: 0\nsize-pack: 0\nprune-packable: 0\ngarbage: 0\nsize-garbage: 0\n"
}
@@ -0,0 +1,10 @@
{
"scratchRoot": "/mnt/storage/scratch/gyro-223-measure-mzbp0x23",
"metadataExit": 101,
"metadataError": "error: no matching package named `cpufeatures` found\nlocation searched: directory source `/mnt/storage/scratch/gyro-223-measure-mzbp0x23/vendor` (which is replacing registry `crates-io`)\nrequired by package `sha1 v0.11.0`\n ... which satisfies dependency `sha1 = \"^0.11\"` (locked to 0.11.0) of package `wordcraft-docbin v0.9.0 (/mnt/storage/scratch/gyro-223-measure-mzbp0x23/source/crates/docbin)`\nnote: offline mode (via `--offline`) can sometimes cause surprising resolution failures\nhelp: if this error is too confusing you may wish to retry without `--offline`\n",
"originalLockSha256": "06b745e43c13df3df7f048fa6a1981625ce7a5fe4cd484bc6254d0913d865b0b",
"lockUnchanged": true,
"network": "isolated network namespace with no external interface; offline Cargo; fresh HOME/CARGO_HOME",
"closures": {},
"resolves": false
}
@@ -0,0 +1,106 @@
// Verbatim measurement routines from the W2 packet; no crate sources.
// sage-3983/3984g: target cfgs are measured with a sanitized environment.
// Keep release flags under builder control; ambient flags cannot widen the target.
export function releaseEnvironment(input) {
const forbidden = key => ['RUSTFLAGS', 'CARGO_ENCODED_RUSTFLAGS', 'RUSTDOCFLAGS', 'CARGO_BUILD_RUSTFLAGS'].includes(key)
|| /^CARGO_TARGET_.*_RUSTFLAGS$/.test(key);
for (const key of Object.keys(input)) {
if (forbidden(key)) throw new Error(`refusing inherited Rust flags: ${key}`);
}
const permitted = ['PATH', 'TMPDIR', 'LANG', 'LC_ALL', 'TZ'];
return Object.fromEntries(permitted.filter(key => input[key] !== undefined).map(key => [key, input[key]]));
}
export function evaluateCfg(expression, printCfg) {
const enabled = new Set(printCfg.split('\n').map(line => line.trim()).filter(Boolean));
const tokens = expression.match(/"(?:[^"\\]|\\.)*"|[A-Za-z_][A-Za-z_0-9]*|[(),=]|\S/g) ?? [];
let pos = 0;
const take = expected => {
if (tokens[pos++] !== expected) throw new Error(`invalid cfg expression: ${expression}`);
};
function parse() {
const name = tokens[pos++];
if (!/^[A-Za-z_][A-Za-z_0-9]*$/.test(name ?? '')) throw new Error(`invalid cfg name: ${expression}`);
if (tokens[pos] === '(') {
pos++;
const args = [];
while (tokens[pos] !== ')') {
args.push(parse());
if (tokens[pos] === ',') pos++;
else if (tokens[pos] !== ')') throw new Error(`invalid cfg arguments: ${expression}`);
}
take(')');
if (name === 'cfg' && args.length === 1) return args[0];
if (name === 'not' && args.length === 1) return !args[0];
if (name === 'all') return args.every(Boolean);
if (name === 'any') return args.some(Boolean);
throw new Error(`unsupported cfg operation: ${name}`);
}
if (tokens[pos] === '=') {
pos++;
const value = JSON.parse(tokens[pos++]);
return enabled.has(`${name}=${JSON.stringify(value)}`);
}
return enabled.has(name);
}
const result = parse();
if (pos !== tokens.length) throw new Error(`trailing cfg tokens: ${expression}`);
return result;
}
// Dependency-table parsing only: all edited TOML values are upstream string
// arrays. Unknown syntax refuses instead of guessing or changing a dependency.
function targetSection(part) {
const line = part.split('\n', 1)[0];
const match = /^\[target\.("(?:[^"\\]|\\.)*"|'[^']*'|[^.\]]+)\.(dependencies|build-dependencies|dev-dependencies)(?:\.([A-Za-z0-9_-]+))?\]$/.exec(line);
if (!match) return null;
const selector = match[1].startsWith('"') ? JSON.parse(match[1]) : match[1].replace(/^'|'$/g, '');
const names = match[3] ? [match[3]] : [...part.matchAll(/^([A-Za-z0-9_-]+)\s*=/gm)].map(m => m[1]);
return { cfg: selector, kind: match[2], dependencies: names };
}
export function filterVendorManifest(text, printCfg) {
const parts = text.split(/(?=^\[)/m);
const sections = [];
const retained = [];
for (const part of parts) {
const section = targetSection(part);
if (section?.cfg.startsWith('cfg(') && !evaluateCfg(section.cfg, printCfg)) sections.push(section);
else retained.push(part);
}
const remainingNames = new Set();
for (const part of retained) {
const section = targetSection(part);
if (section && section.kind !== 'dev-dependencies') section.dependencies.forEach(name => remainingNames.add(name));
else {
const header = /^\[(dependencies|build-dependencies)(?:\.([A-Za-z0-9_-]+))?\]/.exec(part);
if (header?.[2]) remainingNames.add(header[2]);
else if (header) for (const match of part.matchAll(/^([A-Za-z0-9_-]+)\s*=/gm)) remainingNames.add(match[1]);
}
}
const removed = new Map();
for (const section of sections) {
for (const name of section.dependencies) {
if (!remainingNames.has(name)) removed.set(name, [...(removed.get(name) ?? []), section.cfg]);
}
}
const features = [];
const output = retained.map(part => {
if (!part.startsWith('[features]')) return part;
return part.replace(/^([A-Za-z0-9_-]+)\s*=\s*\[([^\]]*)\]/gm, (whole, feature, body) => {
const noComments = body.replace(/#[^\n]*/g, '');
let items;
try { items = JSON.parse(`[${noComments.replace(/,\s*$/, '')}]`); }
catch { throw new Error(`unsupported feature array: ${feature}`); }
if (!items.every(item => typeof item === 'string')) throw new Error(`non-string feature item: ${feature}`);
const kept = items.filter(item => {
const dependency = item.replace(/^dep:/, '').split('/')[0].replace(/\?$/, '');
if (!removed.has(dependency)) return true;
features.push({ feature, item, dependency, cfg: removed.get(dependency) });
return false;
});
return kept.length === items.length ? whole : `${feature} = ${JSON.stringify(kept)}`;
});
}).join('');
return { text: output, sections, features };
}
@@ -0,0 +1,251 @@
2026-10-24T06:02:17.606436Z INFO Starting trunk 0.22.0
2026-10-24T06:02:17.608522Z INFO starting build
2026-10-24T06:02:17.609024Z INFO node packages []
Compiling proc-macro2 v1.0.107
Compiling unicode-ident v1.0.26
Compiling quote v1.0.47
Compiling cfg-if v1.0.5
Compiling serde_core v1.0.229
Compiling once_cell v1.21.4
Compiling serde v1.0.229
Compiling libm v0.2.16
Compiling rustversion v1.0.23
Compiling wasm-bindgen-shared v0.2.129
Compiling syn v3.0.6
Compiling autocfg v1.5.1
Compiling log v0.4.34
Compiling num-traits v0.2.19
Compiling thiserror v2.0.21
Compiling bitflags v2.13.2
Compiling arrayvec v0.7.8
Compiling bumpalo v3.20.3
Compiling wasm-bindgen v0.2.129
Compiling foldhash v0.2.0
Compiling slab v0.4.12
Compiling hashbrown v0.17.1
Compiling futures-core v0.3.34
Compiling pin-project-lite v0.2.17
Compiling futures-task v0.3.34
Compiling futures-util v0.3.34
Compiling simd-adler32 v0.3.10
Compiling syn v2.0.119
Compiling zerocopy v0.8.61
Compiling crc32fast v1.5.2
Compiling adler2 v2.0.1
Compiling polycool v0.4.0
Compiling wasm-bindgen-macro-support v0.2.129
Compiling miniz_oxide v0.9.1
Compiling bytemuck_derive v1.12.1
Compiling serde_derive v1.0.229
Compiling thiserror-impl v2.0.21
Compiling bytemuck v1.25.2
Compiling zerocopy-derive v0.8.61
Compiling zlib-rs v0.6.8
Compiling wasm-bindgen-macro v0.2.129
Compiling smallvec v1.16.2
Compiling kurbo v0.13.1
Compiling equivalent v1.0.2
Compiling indexmap v2.14.2
Compiling flate2 v1.1.10
Compiling js-sys v0.3.106
Compiling font-types v0.12.6
Compiling memchr v2.8.3
Compiling zmij v1.0.23
Compiling miniz_oxide v0.8.9
Compiling version_check v0.9.5
Compiling scopeguard v1.2.0
Compiling fdeflate v0.3.7
Compiling half v2.7.1
Compiling serde_json v1.0.151
Compiling cfg_aliases v0.2.2
Compiling png v0.18.1
Compiling color v0.3.3
Compiling euclid v0.22.14
Compiling linebender_resource_handle v0.1.1
Compiling unicode-segmentation v1.13.3
Compiling typenum v1.20.1
Compiling peniko v0.6.1
Compiling guillotiere v0.7.0
Compiling hybrid-array v0.4.15
Compiling fearless_simd v0.4.1
Compiling quick-error v2.0.1
Compiling itoa v1.0.18
Compiling weezl v0.1.12
Compiling zune-core v0.5.3
Compiling zune-jpeg v0.5.15
Compiling read-fonts v0.41.0
Compiling parking_lot_core v0.9.12
Compiling byteorder-lite v0.1.0
Compiling color_quant v1.1.0
Compiling gif v0.14.2
Compiling image-webp v0.2.4
Compiling uuid v1.27.0
Compiling crypto-common v0.2.2
Compiling lock_api v0.4.14
Compiling fax v0.2.7
Compiling pxfm v0.1.30
Compiling tiff v0.11.3
Compiling web-sys v0.3.106
Compiling moxcms v0.8.1
Compiling skrifa v0.44.0
Compiling parking_lot v0.12.5
Compiling wordcraft-geom v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/geom)
Compiling font-types v0.11.3
Compiling synstructure v0.14.0
Compiling unicode-script v0.5.8
Compiling profiling v1.0.18
Compiling rustc-hash v2.1.3
Compiling cmov v0.5.4
Compiling rustc-hash v1.1.0
Compiling ctutils v0.4.3
Compiling naga-types v30.0.1
Compiling read-fonts v0.39.2
Compiling wordcraft-doc v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/doc)
Compiling image v0.25.10
Compiling web-time v1.1.0
Compiling block-buffer v0.12.1
Compiling naga v30.0.1
Compiling slotmap v1.1.1
Compiling unicode-width v0.2.2
Compiling bit-vec v0.9.1
Compiling raw-window-handle v0.6.2
Compiling alloc-no-stdlib v2.0.4
Compiling const-oid v0.10.2
Compiling digest v0.11.3
Compiling brotli-decompressor v5.0.3
Compiling bit-set v0.10.0
Compiling codespan-reporting v0.13.1
Compiling zerofrom-derive v0.1.8
Compiling ahash v0.8.12
Compiling read-fonts v0.44.0
Compiling read-fonts v0.43.3
Compiling core_maths v0.1.1
Compiling unicode-bidi v0.3.18
Compiling bytes v1.12.1
Compiling unicode-general-category v1.1.0
Compiling static_assertions v1.1.0
Compiling wordcraft-fonts v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/fonts)
Compiling wgpu-types v30.0.1
Compiling wuff v0.2.9
Compiling ttf-parser v0.25.1
Compiling zerofrom v0.1.8
Compiling skrifa v0.47.0
Compiling harfrust v0.13.3
Compiling skrifa v0.42.1
Compiling write-fonts v0.48.1
Compiling yoke-derive v0.8.4
Compiling vello_common v0.1.0
Compiling wgpu-hal v30.0.1
Compiling emath v0.36.2
Compiling encoding_rs v0.8.42
Compiling strict-num v0.1.1
Compiling base64 v0.22.1
Compiling fnv v1.0.7
Compiling stable_deref_trait v1.2.1
Compiling unicode-ccc v0.4.0
Compiling arrayref v0.3.9
Compiling ryu v1.0.23
Compiling unicode-properties v0.1.4
Compiling unicode-bidi-mirroring v0.4.0
Compiling rustybuzz v0.20.1
Compiling pdf-writer v0.15.0
Compiling tiny-skia-path v0.12.0
Compiling yoke v0.8.3
Compiling cfb v0.15.0
Compiling vello_cpu v0.1.0
Compiling subsetter v0.2.6
Compiling ecolor v0.36.2
Compiling glow v0.17.0
Compiling wgpu-naga-bridge v30.0.1
Compiling zopfli v0.8.3
Compiling harfrust v0.12.0
Compiling vello_common v0.2.0
Compiling inout v0.2.2
Compiling wordcraft-proof v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/proof)
Compiling float-cmp v0.9.0
Compiling self_cell v1.3.0
Compiling imagesize v0.14.0
Compiling epaint_default_fonts v0.36.2
Compiling xmp-writer v0.3.3
Compiling unicode-linebreak v0.1.5
Compiling nohash-hasher v0.2.0
Compiling multiversion_no_op v1.0.0
Compiling getrandom v0.3.4
Compiling either v1.19.0
Compiling siphasher v1.0.4
Compiling itertools v0.15.0
Compiling krilla v0.8.2 (https://github.com/storytold/craft-libs?rev=c3487320b2d1de657b860b3c8abb44e1f2b32bd8#c3487320)
Compiling epaint v0.36.2
Compiling wordcraft-layout v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/layout)
Compiling glifo v0.3.0
Compiling cipher v0.5.2
Compiling zip v3.0.0
Compiling sha1 v0.11.0
Compiling accesskit v0.24.1
Compiling wgpu-core v30.0.1
Compiling quick-xml v0.41.0
Compiling aho-corasick v1.1.5
Compiling wordcraft-metafile v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/metafile)
Compiling winnow v1.0.4
Compiling cpubits v0.1.1
Compiling regex-syntax v0.8.11
Compiling litrs v1.0.0
Compiling document-features v0.2.12
Compiling aes v0.9.3
Compiling toml_parser v1.1.3+spec-1.1.0
Compiling wgpu-core-deps-wasm v30.0.1
Compiling egui v0.36.2
Compiling vello_cpu v0.2.0
Compiling regex-automata v0.4.18
Compiling craft-pdf v0.1.0 (https://github.com/storytold/craft-libs?rev=c3487320b2d1de657b860b3c8abb44e1f2b32bd8#c3487320)
Compiling chardetng v1.0.0
Compiling toml_datetime v1.1.1+spec-1.1.0
Compiling serde_spanned v1.1.1
Compiling sha2 v0.11.0
Compiling hmac v0.13.0
Compiling wasm-bindgen-futures v0.4.79
Compiling wgpu v30.0.1
Compiling toml_writer v1.1.2+spec-1.1.0
Compiling zeroize v1.9.1
Compiling wordcraft-docx v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/docx)
Compiling toml v1.1.6+spec-1.1.0
Compiling wordcraft-formats v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/formats)
Compiling wordcraft-pdf v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/pdf)
Compiling regex v1.13.1
Compiling wordcraft-render v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/render)
Compiling wordcraft-docbin v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/docbin)
Compiling wordcraft-engine v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/engine)
Compiling wordcraft-ui-egui v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/ui-egui)
Compiling type-map v0.5.1
Compiling rfd v0.17.2
Compiling craft-ui v0.1.0 (https://github.com/storytold/craft-libs?rev=d27646a5f7c8b4fc85d9dd3213b8c88b58e0088d#d27646a5)
Compiling sys-locale v0.3.2
Compiling percent-encoding v2.3.2
warning: function `by_author` is never used
--> crates/engine/src/cmd/citations.rs:534:4
|
534 | fn by_author(x: &Source) -> &str {
| ^^^^^^^^^
|
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
warning: function `primary_tag` is never used
--> crates/engine/src/speech.rs:252:4
|
252 | fn primary_tag(tag: &str) -> Option<String> {
| ^^^^^^^^^^^
warning: function `voice_language` is never used
--> crates/engine/src/speech.rs:260:4
|
260 | fn voice_language(lang: Option<&str>, default: &str) -> Option<String> {
| ^^^^^^^^^^^^^^
Compiling egui-wgpu v0.36.2
Compiling eframe v0.36.2
Compiling wordcraft-zotero v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/zotero)
warning: `wordcraft-engine` (lib) generated 3 warnings
Compiling wordcraft-web v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/apps/wordcraft-web)
Finished `release` profile [optimized] target(s) in 3m 31s
2026-10-24T06:08:46.350795Z INFO applying new distribution
2026-10-24T06:08:46.351536Z INFO success
@@ -0,0 +1,3 @@
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
@@ -0,0 +1,29 @@
{
"method": "git hash-object -w for four output blobs into new scratch bare repo; sorted blob ids piped into git pack-objects --stdout --threads=4; no gc, no repo-tree object writes",
"gitVersion": "git version 2.55.0",
"packedBytes": 16720159,
"unpackedOutputBytes": 44142800,
"excluded": ".trunk-lock (empty internal Trunk lock, not runtime artifact)",
"outputs": {
"index.html": {
"bytes": 1604,
"sha256": "299b76f4004bbc65204d561cc381b3fbb249d10069eaa50e88c7fba3b6c63cb8"
},
"wordcraft-fa59e09a3f921e03.ico": {
"bytes": 18378,
"sha256": "53a23dcf66260f44d87d4d143d633395f3e967f391eda47e6e9cc3a52f820225"
},
"wordcraft-web-832240fdc6ce872b_bg.wasm": {
"bytes": 43957877,
"sha256": "c1c15050a9b394c21e7540aa57c9292b86d32bfea2476094a9976304dacf1de0"
},
"wordcraft-web-88f7089f25a3b338.js": {
"bytes": 164941,
"sha256": "866a1de6a33eff2ded8ae9588fd049aeacfc42557a3863ccd2107b3faf4d691e"
}
},
"countObjectsBefore": "count: 0\nsize: 0\nin-pack: 0\npacks: 0\nsize-pack: 0\nprune-packable: 0\ngarbage: 0\nsize-garbage: 0\n",
"countObjectsAfterHash": "count: 4\nsize: 21628\nin-pack: 0\npacks: 0\nsize-pack: 0\nprune-packable: 0\ngarbage: 0\nsize-garbage: 0\n",
"countObjectsAfterPack": "count: 4\nsize: 21628\nin-pack: 0\npacks: 0\nsize-pack: 0\nprune-packable: 0\ngarbage: 0\nsize-garbage: 0\n",
"scratchRepo": "/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/output-measurement.git"
}
@@ -0,0 +1,26 @@
{
"atUTC": "2026-10-24T06:05:25.404163+00:00",
"note": "nice -n 19 is relative; observed inherited priority resulted in nice15. Set owned build process/thread priorities absolutely to19 during the build. No other process affected.",
"processes": [
{
"pid": 1518443,
"before": -4,
"after": 19
},
{
"pid": 1518605,
"before": 15,
"after": 19
},
{
"pid": 1518655,
"before": 15,
"after": 19
},
{
"pid": 1538729,
"before": 15,
"after": 19
}
]
}
@@ -0,0 +1,251 @@
2026-10-24T06:09:38.421692Z INFO Starting trunk 0.22.0
2026-10-24T06:09:38.423033Z INFO starting build
2026-10-24T06:09:38.423284Z INFO node packages []
Compiling unicode-ident v1.0.26
Compiling proc-macro2 v1.0.107
Compiling quote v1.0.47
Compiling cfg-if v1.0.5
Compiling serde_core v1.0.229
Compiling once_cell v1.21.4
Compiling serde v1.0.229
Compiling libm v0.2.16
Compiling rustversion v1.0.23
Compiling wasm-bindgen-shared v0.2.129
Compiling autocfg v1.5.1
Compiling syn v3.0.6
Compiling log v0.4.34
Compiling num-traits v0.2.19
Compiling thiserror v2.0.21
Compiling bitflags v2.13.2
Compiling bumpalo v3.20.3
Compiling arrayvec v0.7.8
Compiling wasm-bindgen v0.2.129
Compiling foldhash v0.2.0
Compiling hashbrown v0.17.1
Compiling futures-task v0.3.34
Compiling slab v0.4.12
Compiling futures-core v0.3.34
Compiling pin-project-lite v0.2.17
Compiling simd-adler32 v0.3.10
Compiling futures-util v0.3.34
Compiling syn v2.0.119
Compiling zerocopy v0.8.61
Compiling crc32fast v1.5.2
Compiling adler2 v2.0.1
Compiling polycool v0.4.0
Compiling wasm-bindgen-macro-support v0.2.129
Compiling miniz_oxide v0.9.1
Compiling bytemuck_derive v1.12.1
Compiling serde_derive v1.0.229
Compiling bytemuck v1.25.2
Compiling thiserror-impl v2.0.21
Compiling zerocopy-derive v0.8.61
Compiling zlib-rs v0.6.8
Compiling wasm-bindgen-macro v0.2.129
Compiling smallvec v1.16.2
Compiling kurbo v0.13.1
Compiling equivalent v1.0.2
Compiling indexmap v2.14.2
Compiling js-sys v0.3.106
Compiling flate2 v1.1.10
Compiling font-types v0.12.6
Compiling memchr v2.8.3
Compiling zmij v1.0.23
Compiling miniz_oxide v0.8.9
Compiling half v2.7.1
Compiling scopeguard v1.2.0
Compiling version_check v0.9.5
Compiling fdeflate v0.3.7
Compiling cfg_aliases v0.2.2
Compiling serde_json v1.0.151
Compiling color v0.3.3
Compiling png v0.18.1
Compiling euclid v0.22.14
Compiling typenum v1.20.1
Compiling unicode-segmentation v1.13.3
Compiling linebender_resource_handle v0.1.1
Compiling peniko v0.6.1
Compiling hybrid-array v0.4.15
Compiling guillotiere v0.7.0
Compiling zune-core v0.5.3
Compiling fearless_simd v0.4.1
Compiling itoa v1.0.18
Compiling weezl v0.1.12
Compiling quick-error v2.0.1
Compiling zune-jpeg v0.5.15
Compiling read-fonts v0.41.0
Compiling color_quant v1.1.0
Compiling byteorder-lite v0.1.0
Compiling parking_lot_core v0.9.12
Compiling image-webp v0.2.4
Compiling gif v0.14.2
Compiling uuid v1.27.0
Compiling crypto-common v0.2.2
Compiling lock_api v0.4.14
Compiling pxfm v0.1.30
Compiling fax v0.2.7
Compiling tiff v0.11.3
Compiling web-sys v0.3.106
Compiling moxcms v0.8.1
Compiling skrifa v0.44.0
Compiling parking_lot v0.12.5
Compiling wordcraft-geom v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/geom)
Compiling font-types v0.11.3
Compiling synstructure v0.14.0
Compiling rustc-hash v1.1.0
Compiling unicode-script v0.5.8
Compiling cmov v0.5.4
Compiling rustc-hash v2.1.3
Compiling profiling v1.0.18
Compiling ctutils v0.4.3
Compiling naga-types v30.0.1
Compiling read-fonts v0.39.2
Compiling wordcraft-doc v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/doc)
Compiling image v0.25.10
Compiling web-time v1.1.0
Compiling block-buffer v0.12.1
Compiling naga v30.0.1
Compiling slotmap v1.1.1
Compiling alloc-no-stdlib v2.0.4
Compiling raw-window-handle v0.6.2
Compiling unicode-width v0.2.2
Compiling bit-vec v0.9.1
Compiling const-oid v0.10.2
Compiling bit-set v0.10.0
Compiling digest v0.11.3
Compiling codespan-reporting v0.13.1
Compiling brotli-decompressor v5.0.3
Compiling zerofrom-derive v0.1.8
Compiling ahash v0.8.12
Compiling read-fonts v0.44.0
Compiling read-fonts v0.43.3
Compiling core_maths v0.1.1
Compiling wordcraft-fonts v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/fonts)
Compiling bytes v1.12.1
Compiling unicode-general-category v1.1.0
Compiling unicode-bidi v0.3.18
Compiling static_assertions v1.1.0
Compiling wgpu-types v30.0.1
Compiling wuff v0.2.9
Compiling ttf-parser v0.25.1
Compiling zerofrom v0.1.8
Compiling skrifa v0.47.0
Compiling harfrust v0.13.3
Compiling skrifa v0.42.1
Compiling write-fonts v0.48.1
Compiling yoke-derive v0.8.4
Compiling vello_common v0.1.0
Compiling wgpu-hal v30.0.1
Compiling emath v0.36.2
Compiling encoding_rs v0.8.42
Compiling ryu v1.0.23
Compiling unicode-properties v0.1.4
Compiling base64 v0.22.1
Compiling arrayref v0.3.9
Compiling fnv v1.0.7
Compiling strict-num v0.1.1
Compiling unicode-bidi-mirroring v0.4.0
Compiling stable_deref_trait v1.2.1
Compiling unicode-ccc v0.4.0
Compiling rustybuzz v0.20.1
Compiling yoke v0.8.3
Compiling tiny-skia-path v0.12.0
Compiling cfb v0.15.0
Compiling subsetter v0.2.6
Compiling pdf-writer v0.15.0
Compiling vello_cpu v0.1.0
Compiling ecolor v0.36.2
Compiling glow v0.17.0
Compiling wgpu-naga-bridge v30.0.1
Compiling zopfli v0.8.3
Compiling harfrust v0.12.0
Compiling vello_common v0.2.0
Compiling inout v0.2.2
Compiling wordcraft-proof v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/proof)
Compiling float-cmp v0.9.0
Compiling siphasher v1.0.4
Compiling self_cell v1.3.0
Compiling xmp-writer v0.3.3
Compiling nohash-hasher v0.2.0
Compiling either v1.19.0
Compiling imagesize v0.14.0
Compiling epaint_default_fonts v0.36.2
Compiling multiversion_no_op v1.0.0
Compiling unicode-linebreak v0.1.5
Compiling getrandom v0.3.4
Compiling wordcraft-layout v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/layout)
Compiling epaint v0.36.2
Compiling krilla v0.8.2 (https://github.com/storytold/craft-libs?rev=c3487320b2d1de657b860b3c8abb44e1f2b32bd8#c3487320)
Compiling itertools v0.15.0
Compiling glifo v0.3.0
Compiling cipher v0.5.2
Compiling zip v3.0.0
Compiling sha1 v0.11.0
Compiling accesskit v0.24.1
Compiling wgpu-core v30.0.1
Compiling aho-corasick v1.1.5
Compiling quick-xml v0.41.0
Compiling wordcraft-metafile v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/metafile)
Compiling winnow v1.0.4
Compiling litrs v1.0.0
Compiling regex-syntax v0.8.11
Compiling cpubits v0.1.1
Compiling aes v0.9.3
Compiling document-features v0.2.12
Compiling toml_parser v1.1.3+spec-1.1.0
Compiling wgpu-core-deps-wasm v30.0.1
Compiling egui v0.36.2
Compiling vello_cpu v0.2.0
Compiling regex-automata v0.4.18
Compiling craft-pdf v0.1.0 (https://github.com/storytold/craft-libs?rev=c3487320b2d1de657b860b3c8abb44e1f2b32bd8#c3487320)
Compiling chardetng v1.0.0
Compiling toml_datetime v1.1.1+spec-1.1.0
Compiling serde_spanned v1.1.1
Compiling hmac v0.13.0
Compiling sha2 v0.11.0
Compiling wasm-bindgen-futures v0.4.79
Compiling wgpu v30.0.1
Compiling toml_writer v1.1.2+spec-1.1.0
Compiling zeroize v1.9.1
Compiling wordcraft-docx v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/docx)
Compiling toml v1.1.6+spec-1.1.0
Compiling regex v1.13.1
Compiling wordcraft-formats v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/formats)
Compiling wordcraft-pdf v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/pdf)
Compiling wordcraft-render v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/render)
Compiling wordcraft-docbin v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/docbin)
Compiling wordcraft-engine v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/engine)
Compiling wordcraft-ui-egui v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/ui-egui)
Compiling type-map v0.5.1
Compiling rfd v0.17.2
Compiling craft-ui v0.1.0 (https://github.com/storytold/craft-libs?rev=d27646a5f7c8b4fc85d9dd3213b8c88b58e0088d#d27646a5)
Compiling sys-locale v0.3.2
Compiling percent-encoding v2.3.2
warning: function `by_author` is never used
--> crates/engine/src/cmd/citations.rs:534:4
|
534 | fn by_author(x: &Source) -> &str {
| ^^^^^^^^^
|
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
warning: function `primary_tag` is never used
--> crates/engine/src/speech.rs:252:4
|
252 | fn primary_tag(tag: &str) -> Option<String> {
| ^^^^^^^^^^^
warning: function `voice_language` is never used
--> crates/engine/src/speech.rs:260:4
|
260 | fn voice_language(lang: Option<&str>, default: &str) -> Option<String> {
| ^^^^^^^^^^^^^^
Compiling egui-wgpu v0.36.2
Compiling wordcraft-zotero v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/crates/zotero)
Compiling eframe v0.36.2
warning: `wordcraft-engine` (lib) generated 3 warnings
Compiling wordcraft-web v0.9.0 (/mnt/storage/scratch/gyro-full-lock-measure-95ntu6t0/source/apps/wordcraft-web)
Finished `release` profile [optimized] target(s) in 3m 23s
2026-10-24T06:16:16.271064Z INFO applying new distribution
2026-10-24T06:16:16.271692Z INFO success
@@ -0,0 +1,105 @@
{
"note": "read-only observation from full-lock scratch metadata, not a proposed/imported reduced vendor set; compiled normal/build closure remains exactly S0",
"count": 14,
"bytes": 14523104,
"packages": [
{
"name": "cursor-icon",
"version": "1.2.0",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 14,
"bytes": 44329
},
{
"name": "dpi",
"version": "0.1.2",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 11,
"bytes": 64188
},
{
"name": "futures-macro",
"version": "0.3.34",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 12,
"bytes": 41731
},
{
"name": "glifo",
"version": "0.2.0",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 20,
"bytes": 222068
},
{
"name": "ordered-float",
"version": "5.5.0",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 14,
"bytes": 179606
},
{
"name": "pin-project",
"version": "1.1.13",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 209,
"bytes": 476259
},
{
"name": "pin-project-internal",
"version": "1.1.13",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 15,
"bytes": 114911
},
{
"name": "smol_str",
"version": "0.2.2",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 14,
"bytes": 56395
},
{
"name": "spirv",
"version": "0.4.0+sdk-1.4.341.0",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 9,
"bytes": 257440
},
{
"name": "termcolor",
"version": "1.4.1",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 12,
"bytes": 92727
},
{
"name": "tracing",
"version": "0.1.44",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 94,
"bytes": 9827320
},
{
"name": "tracing-attributes",
"version": "0.1.31",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 31,
"bytes": 184696
},
{
"name": "tracing-core",
"version": "0.1.36",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 29,
"bytes": 257879
},
{
"name": "winit",
"version": "0.30.13",
"source": "registry+https://github.com/rust-lang/crates.io-index",
"files": 218,
"bytes": 2703555
}
]
}
@@ -0,0 +1,2 @@
{"atUTC": "2026-10-24T06:10:11.225848+00:00", "processes": [{"pid": 1585414, "nice": 19, "cpus": [12, 13, 14, 15], "name": "trunk"}, {"pid": 1585433, "nice": 19, "cpus": [12, 13, 14, 15], "name": "cargo"}, {"pid": 1589366, "nice": 19, "cpus": [12, 13, 14, 15], "name": "rustc"}, {"pid": 1589563, "nice": 19, "cpus": [12, 13, 14, 15], "name": "rustc"}, {"pid": 1590336, "nice": 19, "cpus": [12, 13, 14, 15], "name": "rustc"}, {"pid": 1590472, "nice": 19, "cpus": [12, 13, 14, 15], "name": "rustc"}]}
{"atUTC": "2026-10-24T06:13:38.818103+00:00", "processes": [{"pid": 1631174, "name": "wasm-opt", "nice": 19, "cpus": [12, 13, 14, 15], "threads": 5}]}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,12 @@
command: cargo metadata --locked --offline --filter-platform wasm32-unknown-unknown --format-version 1
exit: 101
error: failed to select a version for the requirement `glifo = "^0.2.0"` (locked to 0.2.0)
candidate versions found which didn't match: 0.3.0
location searched: directory source `/mnt/storage/scratch/gyro-w2-resolution/cargo-vendor` (which is replacing registry `crates-io`)
required by package `vello_cpu v0.1.0`
... which satisfies dependency `vello_cpu = "^0.1.0"` (locked to 0.1.0) of package `epaint v0.36.2`
... which satisfies dependency `epaint = "^0.36.2"` (locked to 0.36.2) of package `egui v0.36.2`
... which satisfies dependency `egui = "^0.36"` (locked to 0.36.2) of package `wordcraft-web v0.9.0 (/mnt/storage/scratch/gyro-w2-resolution/source/apps/wordcraft-web)`
note: perhaps a crate was updated and forgotten to be re-vendored?
note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
help: if this error is too confusing you may wish to retry without `--offline`
@@ -0,0 +1,11 @@
✔ WordCraft inputs have a verifiable offline source receipt (1793.67392ms)
✔ input verifier refuses altered, missing and unrecorded files (1.797894ms)
✔ included upstream subset equals the pinned protected git tree (51.472281ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1893.050007
@@ -0,0 +1,46 @@
✖ WordCraft inputs have a verifiable offline source receipt (0.933599ms)
✖ input verifier refuses altered, missing and unrecorded files (0.211521ms)
ℹ tests 2
ℹ suites 0
ℹ pass 0
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 46.579384
✖ failing tests:
test at packages/webui/tests/wordcraft-provenance.test.mjs:9:1
✖ WordCraft inputs have a verifiable offline source receipt (0.933599ms)
AssertionError [ERR_ASSERTION]: owned verifier must exist
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-provenance.test.mjs:10:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.start (node:internal/test_runner/test:1262:17)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '==',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-provenance.test.mjs:18:1
✖ input verifier refuses altered, missing and unrecorded files (0.211521ms)
AssertionError [ERR_ASSERTION]: owned verifier must exist
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-provenance.test.mjs:19:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '==',
diff: 'simple'
}
@@ -0,0 +1,94 @@
9f9bffab69f9884213edbfa2d2c634ce49ac32218d5b25353aabc7e45bb2aacd packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes128.blb
562a23e427032b85f7478cb07a33b48aa48381612d2e4bfd2314aadb541a346c packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes192.blb
01653e20fa730900358c240a55db0b843cb93d29b3569866d0a0a5f2fdf6eb54 packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes256.blb
d3743f9748422ecb6e965d8a0b8cdd9daba71f28fa9fa876729b7c111e5849b0 packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_alloc
6a206fd90052ff13cc7eb56aa6cefd9af8ff478badce8acf94005ed8d3c0d468 packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_chain
286754276f1a1e7eae818823f0db1111efaafafb70d1f3cd6ac347333618d454 packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_directory
d37e6ba08c7a4da986b06e8369d92ef81901ca618551a7cc604de39f56ab8f4c packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_minialloc
ea5a3a69882ffc08d79d3c15eeb028a4987c933f740bba630ccab28e8cc792a2 packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_minichain
b587ad479a6bc028b26c93c9d53bce38d1d08f1a2294426e6c10003664158873 packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_open_1
d895b126559ec1f66bd2146d2da0dca79e59d2dfcce2bc41bcd8352cdbf666cf packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_open_2
43dc86944f70e3f146d5f42fed1ba2cd3c07738556dd2d52a445cb630c60333f packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/panics_fuzzed/alloc_panic
73e5cb0e0f1700f8e795ccc4fed2141d8689bebc0cfa7318d38c4c25130c4376 packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/panics_fuzzed/minialloc_panic
b9573cccdb727cd7281940f69e934565c387e9074cbb4949358e20f0ea0e2c77 packages/webui/third_party/wordcraft/cargo-vendor/cipher-0.5.2/tests/data/dummy_stream_cipher.blb
a983af743e3ee4dfb986e4a2283fb790a306afe2c06238491a147e3f24299202 packages/webui/third_party/wordcraft/cargo-vendor/digest-0.11.3/tests/data/fixed_hash_serialization.bin
9e076c34e32a0b0ef35c62ebf6be8b5594a4601e7bcd478b681e9eff1f327973 packages/webui/third_party/wordcraft/cargo-vendor/eframe-0.36.2/data/icon.png
15f55cc0c85a2988d2b4b3a8cdb5d77fdfbaf319e1bb5309d725db9818fb7125 packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/Hack-Regular.ttf
415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5 packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/NotoEmoji-Regular.ttf
80307b8da7649aa4ee4d484b232140e3ce1ec0ca093073d3c53c8f5a5ced7a70 packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/Ubuntu-Light.ttf
f426bec371f484646d002717e2c555a95cd5145e635d83a48bbef83f3abf18ca packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/emoji-icon-font.ttf
215d6eafcce032f917f0559c3f35e575fdfcccd5548df8fed5092bc70cf24812 packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example1.zz
9eafada86c8d8af16b90b280e77fd4aa750fa8fb54e31623dc3aaac8097d0c2f packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example2.zz
bf63f178c0c288e004339e2d3084adce4c43064697b860accf13bb81fa5fa1f2 packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example3.zz
8b4c5972b92b8ee8dc99116e278afb9165276ddb13c0d334c8da2770fd4d1f7d packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/examples/hello_world.txt.gz
87296963e53024a74752179ce7e54087565d358a85d3e65c3b37ef36eaa3d4a6 packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/tests/good-file.gz
efa3341da052f95056314cc6920e02a3da15bdef30234b2552fb407812db5cc6 packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/tests/multi.gz
da0f258edb0afec38714fb3685077c8cb49860d4cf6a9b58259eed6c77212faf packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_md5_rfc2104.blb
f2105dcd15a427b754df3906a6278f3f83f51a45cd5e9198dcd07b41ae7af546 packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha1_wycheproof.blb
c65ff3b3e11abb2d1a3445356efdb15182b8089268183db0f1e3bd7da457faae packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha224_rfc4231.blb
948650052341b8c2104a4512ccbcaa85d33139a2378d0c89bde4274dfc1683e0 packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha256_rfc4231.blb
3ba194af7f11776c9e39164613653810633042a267baec88293a5d9edce07ee5 packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha256_wycheproof.blb
b5a29b1f23a7b417f87048047f0b9e633a97fe076914f2040bcc46fe59ca47fd packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha384_rfc4231.blb
3bfd7098a8e374923bfa99123aacd447e4bf30eb8ff90dbe11441d2336adbe3c packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha384_wycheproof.blb
9161ca8594f57bf3759ac2b49a1ad7fbead54b6747d2e8242aefb9353aa28bea packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha512_rfc4231.blb
55263d9d13a51959ce6e964cd46c6e8ee8aec92ae28f21e02855014ffc6d52b7 packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha512_wycheproof.blb
d63e4d1ebcf3356943b300a99e7ac13fe91ea69b600e180dd08f5fbb445300e4 packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_streebog256_gost.blb
9a722b982d264ecdc6bc0821c5c31a91a45bda6b101b4b824bf0d8200747a362 packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_streebog512_gost.blb
4110169287e5f1b5149ca9f1da1814d32943905bba8030e849d1a3b729a19481 packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sGrey-v2-magic.icc
00c0f94e09127520a17dc0e1d9264b5702081d96dbdb1549ee88e3631ce42a9d packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sGrey-v4.icc
af4efe28f6d311799865f325ba39184a2e978b113ca74124d60af7de22b105f4 packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sRGB-v2-magic.icc
c56e1685d888f5edb92fe07f2750f387f8fe8e91b32ff8fb0b56bfbbb9458353 packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sRGB-v4.icc
fa0fdd2bd4794557672f79ce6b1e33550d4e257e33e4f43d7d48da347ad5eb06 packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/bear-1280x720.jpg
bcb75d3db0a1a5056f4cd5c770ceccdb4cae920f21abb8139b29cd9ad39e3857 packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/bear-1280x720.mp4
ff24fc2957e628cb93bf2e3b83d9109d46ab1e494cd182df6025785ecd7952a2 packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/rhino.png
83174717332326ddc198d9df188a4daec27b8979ba152cebbfc470c793d0bb11 packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/sRGB_v4.icc
e270c2acdeb0754c840de73eb25c61af4504e2463225dba845441ffb9792a8a0 packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/tiger-cmyk.jpg
076e29b410198ce71243d47a3c01629cb80d9494cc56e01e09e127c7950031b4 packages/webui/third_party/wordcraft/cargo-vendor/sha1-0.11.0/tests/data/sha1_kat.blb
f5f4a2f204aeb33bc002e3f7d1e3dfc87998b1834380c84e9d5f0e3a70c90e44 packages/webui/third_party/wordcraft/cargo-vendor/sha1-0.11.0/tests/data/sha1_serialization.bin
0404ce7dbf64488c74237f06c0925468f75539aee9d647461edf3324c7411833 packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha224_kat.blb
6b7164859b4c83edda87ca1bab9b07afb6ba5eae77cc242b04be6ca7f122abba packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha224_serialization.bin
f947b01761a4cd1324d5021852bcec19d07f193ea034b43bf34b08f1fb1bbf2f packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha256_kat.blb
6a44d0e8c9d089de8df7f7e848a016127bb2b85608c73e19a0f898c77a283f19 packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha256_serialization.bin
2fafeb11ed81abf78a33b3e098269b0add361e8855e394293a5d7e5e57fddab9 packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha384_kat.blb
299df90bb78d579d7d303985b1bd9e1a9dd205d48b888d87350dc887511886b4 packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha384_serialization.bin
3c3c0c408eda6d2d264d50bd1fa5c012f1c5dc2f5bf625ca471fcccebd476870 packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_224_kat.blb
0be3e7d9cf7821a4e031e2c5b1609006b15995a4553691f9be311f4a87bd5f70 packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_224_serialization.bin
10dcef0cb0a381d2e4e336e88cb23b38859d3a5c894a3658aaef37a83c058cfb packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_256_kat.blb
fc6735a14cbd66dcd9111021a26fa70373c5dd245272fd4874268a6622f7d97f packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_256_serialization.bin
4963aa09edeb0c39efa94e397551a2b0018f4a3bd5f343e21010a264db8cc2e9 packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_kat.blb
d4ad28878dce9ac24ee8cc27622fc758b9db070406cad37eb89518f33f012604 packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_serialization.bin
88fb7908c4562ad3f3a1180c02115da71efc34a6d3b4f0573360113385cef33c packages/webui/third_party/wordcraft/cargo-vendor/tiff-0.11.3/tests/decodedata-rgb-3c-8b.tiff
a8521588045ed5f1f8b07eecaac06ed3186c644655bfac00dd4507cd316fbdc5 packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/examples/wasm/TTC.ttc
d46bf7270263aff1de7b1be50c67884938bd15cb554c0f50ad9bebb9c7137d0b packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/bitmap.otb
0441303144c314d46ee12cf9742f1dd3fcbcb42700e7c51dba7b1b689c1dd1d7 packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/colr_1.ttf
1e861480ba54c411af09d600e9b0ecf8deb15b8c2929589ac5a84f2038332c18 packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/colr_1_variable.ttf
cb40a3b0aed56dbd2465355ff5ac53ea5e6b567877132844d8f780fd600bdade packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/demo.ttf
a4c8f6daf453fba6d12daeb5e10192839edf930250234309049b4325406b5979 packages/webui/third_party/wordcraft/cargo-vendor/unicode-ident-1.0.26/tests/fst/xid_continue.fst
5e177e91fdf0cc2f117bd66277803aa21bc4d563357f6d81a9d4250456f9fa2f packages/webui/third_party/wordcraft/cargo-vendor/unicode-ident-1.0.26/tests/fst/xid_start.fst
88ff34af8db521e5e2520719706bc24388e7e976ac02dd818b867e0f6a8e0d13 packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.1.0/assets/probe.png
01c87c436d7b3cfaa357dfaad9259f57b4fdcb27a62da9658afb10056ee54bea packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.1.0/assets/probe.rgba
88ff34af8db521e5e2520719706bc24388e7e976ac02dd818b867e0f6a8e0d13 packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.2.0/assets/probe.png
01c87c436d7b3cfaa357dfaad9259f57b4fdcb27a62da9658afb10056ee54bea packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.2.0/assets/probe.rgba
4db9fec917c6cb3196872073e4168d28c4f3e0ad04c5c41865407088abf279e4 packages/webui/third_party/wordcraft/cargo-vendor/winit-0.30.13/examples/data/cross.png
fbeeb71e5d6f24898017739d088acefb522d85108a6f1f96183e60e6b4b1f6e6 packages/webui/third_party/wordcraft/cargo-vendor/winit-0.30.13/examples/data/cross2.png
8f80c21867a59959b84f9ced19ff3aba7bf4e1cf0e2c24dea2c8465c8705c7ca packages/webui/third_party/wordcraft/cargo-vendor/winit-0.30.13/examples/data/gradient.png
4340d72fb8b5d95a10e3b2c02230f1060dff0950a137bd1d830c63dbc020dd45 packages/webui/third_party/wordcraft/cargo-vendor/winit-0.30.13/examples/data/icon.png
254f280f8f1e8914bd12d8bcd3813e5c08083b1b46d8d643c8e2ebe109e75cb8 packages/webui/third_party/wordcraft/cargo-vendor/zlib-rs-0.6.8/src/deflate/test-data/inflate_buf_error.dat
97ad806f526e41546d46365bb3a393145f75b7b1568913db74549ad8b8dba872 packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-Medium.ttf
40d692fce188e4471e2b3cba937be967878f631ad3ebbbdcd587687c7ebe0c82 packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-Regular.ttf
78a843fade9d4612a5567302fb595b56976eb5fcebf4fea5a5912d638bafcde3 packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-SemiBold.ttf
e6fd0d7e91550b3ed2b735d4312474362c4716edc4fc0577a0f61ed782d5aed1 packages/webui/third_party/wordcraft/upstream/assets/fonts/JetBrainsMono-Regular.ttf
9214b9d95e4231c609802815c2646c98174e2102d0d37f88978a7f8e71006e6a packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Bold.ttf
192afd78f0f54a3c69eaf02d43f4d9a821e9d6110e41d3d25d61a7385cd580e4 packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-It.ttf
4644c81b86ec9caaa76b634889968ed3c4f4f52f054855933acc7c2b21e53b0f packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Regular.ttf
a3f4f8dcf343a8f24dc61951de93f3ba1558b15cd250ba24af8a40e957081b7d packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Semibold.ttf
7cf4f4e1ad74f45058d5bc61716b82560442fbdcd9d3654d2dea96bf6c683d86 packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Bold.ttf
7b215b37f8873f5579f3f8d2ded3ca7c588e2f435cd996605ebfc5befe2cd5eb packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-BoldIt.ttf
9d2950a8f1da66e21502c35d646a1d2148e79f9ea43fd2158cf02f5232e7f430 packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-It.ttf
e5a4ee6a3d87bb9024796be390c6771e2a0eb1883dae25effaf57ca01668e24b packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Regular.ttf
36db62940cb5728b12b1802476dc7fcf4c6c519a7bdd476ba23a4e555fc4655f packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Semibold.ttf
66ce9023847dd2cfc5c6ad14b83aaab94e58607fe95258f4f3ac431a23df63f1 packages/webui/third_party/wordcraft/upstream/assets/hyphenation/en-us.dic
8b86aeb06a12a90ba77a60e0d90329272310e244ee5c1f9b161b391280ca79d8 packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-logo-white.png
08fc6d9d3717e8f13417bac6f9025b50e11d1e0b32e9e000883d2fe0c4a0c67b packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-logo.png
5954cc0306e1b9d7beb47097e2e842157113a39d9aba078b57304902687936a9 packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-mark-black.png
9d372157a949c147318561e629b11561c28b7cbc14c84b516a3fe6e84d8fbbad packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-mark.png
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,483 @@
{
"tip": "aebc8d2832001df1ad7d7400dc760f20eb3fa1ec",
"base": "1749728ca6aa7541a78a304c1f10e0c0751809c3",
"paths": 11802,
"binaryPaths": 94,
"binaryBytes": 8921027,
"fullManifest": "agents/gyro/work/queue-310/q248-aebc8d283-paths.sha256",
"fullManifestSha256": "171ad2b0ec282ff7f4aac58e2e8891af13a11dc490330b7c11a5c9d1fe18bbe8",
"binaryManifest": "agents/gyro/work/queue-310/q248-aebc8d283-binaries.sha256",
"binaryManifestSha256": "e46a9b57f4366b15c42d8987561ef5e043a90e701507ea99ecf3c1fe49d9fbd3",
"binaries": [
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes128.blb",
"bytes": 27420,
"sha256": "9f9bffab69f9884213edbfa2d2c634ce49ac32218d5b25353aabc7e45bb2aacd"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes192.blb",
"bytes": 41324,
"sha256": "562a23e427032b85f7478cb07a33b48aa48381612d2e4bfd2314aadb541a346c"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/aes-0.9.3/tests/data/aes256.blb",
"bytes": 49596,
"sha256": "01653e20fa730900358c240a55db0b843cb93d29b3569866d0a0a5f2fdf6eb54"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_alloc",
"bytes": 14106,
"sha256": "d3743f9748422ecb6e965d8a0b8cdd9daba71f28fa9fa876729b7c111e5849b0"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_chain",
"bytes": 16959,
"sha256": "6a206fd90052ff13cc7eb56aa6cefd9af8ff478badce8acf94005ed8d3c0d468"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_directory",
"bytes": 13954,
"sha256": "286754276f1a1e7eae818823f0db1111efaafafb70d1f3cd6ac347333618d454"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_minialloc",
"bytes": 14336,
"sha256": "d37e6ba08c7a4da986b06e8369d92ef81901ca618551a7cc604de39f56ab8f4c"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_minichain",
"bytes": 13992,
"sha256": "ea5a3a69882ffc08d79d3c15eeb028a4987c933f740bba630ccab28e8cc792a2"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_open_1",
"bytes": 1049,
"sha256": "b587ad479a6bc028b26c93c9d53bce38d1d08f1a2294426e6c10003664158873"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/infinite_loops_fuzzed/loop_in_open_2",
"bytes": 13830,
"sha256": "d895b126559ec1f66bd2146d2da0dca79e59d2dfcce2bc41bcd8352cdbf666cf"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/panics_fuzzed/alloc_panic",
"bytes": 16928,
"sha256": "43dc86944f70e3f146d5f42fed1ba2cd3c07738556dd2d52a445cb630c60333f"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cfb-0.15.0/tests/panics_fuzzed/minialloc_panic",
"bytes": 16909,
"sha256": "73e5cb0e0f1700f8e795ccc4fed2141d8689bebc0cfa7318d38c4c25130c4376"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/cipher-0.5.2/tests/data/dummy_stream_cipher.blb",
"bytes": 84,
"sha256": "b9573cccdb727cd7281940f69e934565c387e9074cbb4949358e20f0ea0e2c77"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/digest-0.11.3/tests/data/fixed_hash_serialization.bin",
"bytes": 16,
"sha256": "a983af743e3ee4dfb986e4a2283fb790a306afe2c06238491a147e3f24299202"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/eframe-0.36.2/data/icon.png",
"bytes": 12052,
"sha256": "9e076c34e32a0b0ef35c62ebf6be8b5594a4601e7bcd478b681e9eff1f327973"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/Hack-Regular.ttf",
"bytes": 309408,
"sha256": "15f55cc0c85a2988d2b4b3a8cdb5d77fdfbaf319e1bb5309d725db9818fb7125"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/NotoEmoji-Regular.ttf",
"bytes": 418804,
"sha256": "415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/Ubuntu-Light.ttf",
"bytes": 361676,
"sha256": "80307b8da7649aa4ee4d484b232140e3ce1ec0ca093073d3c53c8f5a5ced7a70"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/epaint_default_fonts-0.36.2/fonts/emoji-icon-font.ttf",
"bytes": 324132,
"sha256": "f426bec371f484646d002717e2c555a95cd5145e635d83a48bbef83f3abf18ca"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example1.zz",
"bytes": 207,
"sha256": "215d6eafcce032f917f0559c3f35e575fdfcccd5548df8fed5092bc70cf24812"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example2.zz",
"bytes": 41,
"sha256": "9eafada86c8d8af16b90b280e77fd4aa750fa8fb54e31623dc3aaac8097d0c2f"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/fdeflate-0.3.7/tests/input-chunking-sensitivity-example3.zz",
"bytes": 52,
"sha256": "bf63f178c0c288e004339e2d3084adce4c43064697b860accf13bb81fa5fa1f2"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/examples/hello_world.txt.gz",
"bytes": 33,
"sha256": "8b4c5972b92b8ee8dc99116e278afb9165276ddb13c0d334c8da2770fd4d1f7d"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/tests/good-file.gz",
"bytes": 6766,
"sha256": "87296963e53024a74752179ce7e54087565d358a85d3e65c3b37ef36eaa3d4a6"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/flate2-1.1.10/tests/multi.gz",
"bytes": 53,
"sha256": "efa3341da052f95056314cc6920e02a3da15bdef30234b2552fb407812db5cc6"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_md5_rfc2104.blb",
"bytes": 246,
"sha256": "da0f258edb0afec38714fb3685077c8cb49860d4cf6a9b58259eed6c77212faf"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha1_wycheproof.blb",
"bytes": 4877,
"sha256": "f2105dcd15a427b754df3906a6278f3f83f51a45cd5e9198dcd07b41ae7af546"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha224_rfc4231.blb",
"bytes": 804,
"sha256": "c65ff3b3e11abb2d1a3445356efdb15182b8089268183db0f1e3bd7da457faae"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha256_rfc4231.blb",
"bytes": 832,
"sha256": "948650052341b8c2104a4512ccbcaa85d33139a2378d0c89bde4274dfc1683e0"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha256_wycheproof.blb",
"bytes": 6155,
"sha256": "3ba194af7f11776c9e39164613653810633042a267baec88293a5d9edce07ee5"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha384_rfc4231.blb",
"bytes": 944,
"sha256": "b5a29b1f23a7b417f87048047f0b9e633a97fe076914f2040bcc46fe59ca47fd"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha384_wycheproof.blb",
"bytes": 7859,
"sha256": "3bfd7098a8e374923bfa99123aacd447e4bf30eb8ff90dbe11441d2336adbe3c"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha512_rfc4231.blb",
"bytes": 1063,
"sha256": "9161ca8594f57bf3759ac2b49a1ad7fbead54b6747d2e8242aefb9353aa28bea"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_sha512_wycheproof.blb",
"bytes": 9650,
"sha256": "55263d9d13a51959ce6e964cd46c6e8ee8aec92ae28f21e02855014ffc6d52b7"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_streebog256_gost.blb",
"bytes": 85,
"sha256": "d63e4d1ebcf3356943b300a99e7ac13fe91ea69b600e180dd08f5fbb445300e4"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/hmac-0.13.0/tests/data/hmac_streebog512_gost.blb",
"bytes": 118,
"sha256": "9a722b982d264ecdc6bc0821c5c31a91a45bda6b101b4b824bf0d8200747a362"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sGrey-v2-magic.icc",
"bytes": 616,
"sha256": "4110169287e5f1b5149ca9f1da1814d32943905bba8030e849d1a3b729a19481"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sGrey-v4.icc",
"bytes": 360,
"sha256": "00c0f94e09127520a17dc0e1d9264b5702081d96dbdb1549ee88e3631ce42a9d"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sRGB-v2-magic.icc",
"bytes": 736,
"sha256": "af4efe28f6d311799865f325ba39184a2e978b113ca74124d60af7de22b105f4"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/krilla-0.8.2/icc/sRGB-v4.icc",
"bytes": 480,
"sha256": "c56e1685d888f5edb92fe07f2750f387f8fe8e91b32ff8fb0b56bfbbb9458353"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/bear-1280x720.jpg",
"bytes": 67710,
"sha256": "fa0fdd2bd4794557672f79ce6b1e33550d4e257e33e4f43d7d48da347ad5eb06"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/bear-1280x720.mp4",
"bytes": 715963,
"sha256": "bcb75d3db0a1a5056f4cd5c770ceccdb4cae920f21abb8139b29cd9ad39e3857"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/rhino.png",
"bytes": 215287,
"sha256": "ff24fc2957e628cb93bf2e3b83d9109d46ab1e494cd182df6025785ecd7952a2"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/sRGB_v4.icc",
"bytes": 60960,
"sha256": "83174717332326ddc198d9df188a4daec27b8979ba152cebbfc470c793d0bb11"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/pdf-writer-0.15.0/examples/tiger-cmyk.jpg",
"bytes": 945216,
"sha256": "e270c2acdeb0754c840de73eb25c61af4504e2463225dba845441ffb9792a8a0"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha1-0.11.0/tests/data/sha1_kat.blb",
"bytes": 235,
"sha256": "076e29b410198ce71243d47a3c01629cb80d9494cc56e01e09e127c7950031b4"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha1-0.11.0/tests/data/sha1_serialization.bin",
"bytes": 92,
"sha256": "f5f4a2f204aeb33bc002e3f7d1e3dfc87998b1834380c84e9d5f0e3a70c90e44"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha224_kat.blb",
"bytes": 179,
"sha256": "0404ce7dbf64488c74237f06c0925468f75539aee9d647461edf3324c7411833"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha224_serialization.bin",
"bytes": 104,
"sha256": "6b7164859b4c83edda87ca1bab9b07afb6ba5eae77cc242b04be6ca7f122abba"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha256_kat.blb",
"bytes": 191,
"sha256": "f947b01761a4cd1324d5021852bcec19d07f193ea034b43bf34b08f1fb1bbf2f"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha256_serialization.bin",
"bytes": 104,
"sha256": "6a44d0e8c9d089de8df7f7e848a016127bb2b85608c73e19a0f898c77a283f19"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha384_kat.blb",
"bytes": 239,
"sha256": "2fafeb11ed81abf78a33b3e098269b0add361e8855e394293a5d7e5e57fddab9"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha384_serialization.bin",
"bytes": 208,
"sha256": "299df90bb78d579d7d303985b1bd9e1a9dd205d48b888d87350dc887511886b4"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_224_kat.blb",
"bytes": 179,
"sha256": "3c3c0c408eda6d2d264d50bd1fa5c012f1c5dc2f5bf625ca471fcccebd476870"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_224_serialization.bin",
"bytes": 208,
"sha256": "0be3e7d9cf7821a4e031e2c5b1609006b15995a4553691f9be311f4a87bd5f70"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_256_kat.blb",
"bytes": 191,
"sha256": "10dcef0cb0a381d2e4e336e88cb23b38859d3a5c894a3658aaef37a83c058cfb"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_256_serialization.bin",
"bytes": 208,
"sha256": "fc6735a14cbd66dcd9111021a26fa70373c5dd245272fd4874268a6622f7d97f"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_kat.blb",
"bytes": 290,
"sha256": "4963aa09edeb0c39efa94e397551a2b0018f4a3bd5f343e21010a264db8cc2e9"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/sha2-0.11.0/tests/data/sha512_serialization.bin",
"bytes": 208,
"sha256": "d4ad28878dce9ac24ee8cc27622fc758b9db070406cad37eb89518f33f012604"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/tiff-0.11.3/tests/decodedata-rgb-3c-8b.tiff",
"bytes": 30180,
"sha256": "88fb7908c4562ad3f3a1180c02115da71efc34a6d3b4f0573360113385cef33c"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/examples/wasm/TTC.ttc",
"bytes": 2608,
"sha256": "a8521588045ed5f1f8b07eecaac06ed3186c644655bfac00dd4507cd316fbdc5"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/bitmap.otb",
"bytes": 2072,
"sha256": "d46bf7270263aff1de7b1be50c67884938bd15cb554c0f50ad9bebb9c7137d0b"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/colr_1.ttf",
"bytes": 21568,
"sha256": "0441303144c314d46ee12cf9742f1dd3fcbcb42700e7c51dba7b1b689c1dd1d7"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/colr_1_variable.ttf",
"bytes": 53096,
"sha256": "1e861480ba54c411af09d600e9b0ecf8deb15b8c2929589ac5a84f2038332c18"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/ttf-parser-0.25.1/tests/fonts/demo.ttf",
"bytes": 400,
"sha256": "cb40a3b0aed56dbd2465355ff5ac53ea5e6b567877132844d8f780fd600bdade"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/unicode-ident-1.0.26/tests/fst/xid_continue.fst",
"bytes": 78779,
"sha256": "a4c8f6daf453fba6d12daeb5e10192839edf930250234309049b4325406b5979"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/unicode-ident-1.0.26/tests/fst/xid_start.fst",
"bytes": 69927,
"sha256": "5e177e91fdf0cc2f117bd66277803aa21bc4d563357f6d81a9d4250456f9fa2f"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.1.0/assets/probe.png",
"bytes": 877,
"sha256": "88ff34af8db521e5e2520719706bc24388e7e976ac02dd818b867e0f6a8e0d13"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.1.0/assets/probe.rgba",
"bytes": 10404,
"sha256": "01c87c436d7b3cfaa357dfaad9259f57b4fdcb27a62da9658afb10056ee54bea"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.2.0/assets/probe.png",
"bytes": 877,
"sha256": "88ff34af8db521e5e2520719706bc24388e7e976ac02dd818b867e0f6a8e0d13"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/vello_common-0.2.0/assets/probe.rgba",
"bytes": 10404,
"sha256": "01c87c436d7b3cfaa357dfaad9259f57b4fdcb27a62da9658afb10056ee54bea"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/winit-0.30.13/examples/data/cross.png",
"bytes": 159,
"sha256": "4db9fec917c6cb3196872073e4168d28c4f3e0ad04c5c41865407088abf279e4"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/winit-0.30.13/examples/data/cross2.png",
"bytes": 129,
"sha256": "fbeeb71e5d6f24898017739d088acefb522d85108a6f1f96183e60e6b4b1f6e6"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/winit-0.30.13/examples/data/gradient.png",
"bytes": 229,
"sha256": "8f80c21867a59959b84f9ced19ff3aba7bf4e1cf0e2c24dea2c8465c8705c7ca"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/winit-0.30.13/examples/data/icon.png",
"bytes": 2950,
"sha256": "4340d72fb8b5d95a10e3b2c02230f1060dff0950a137bd1d830c63dbc020dd45"
},
{
"path": "packages/webui/third_party/wordcraft/cargo-vendor/zlib-rs-0.6.8/src/deflate/test-data/inflate_buf_error.dat",
"bytes": 67008,
"sha256": "254f280f8f1e8914bd12d8bcd3813e5c08083b1b46d8d643c8e2ebe109e75cb8"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-Medium.ttf",
"bytes": 417300,
"sha256": "97ad806f526e41546d46365bb3a393145f75b7b1568913db74549ad8b8dba872"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-Regular.ttf",
"bytes": 411640,
"sha256": "40d692fce188e4471e2b3cba937be967878f631ad3ebbbdcd587687c7ebe0c82"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/Inter-SemiBold.ttf",
"bytes": 419744,
"sha256": "78a843fade9d4612a5567302fb595b56976eb5fcebf4fea5a5912d638bafcde3"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/JetBrainsMono-Regular.ttf",
"bytes": 270224,
"sha256": "e6fd0d7e91550b3ed2b735d4312474362c4716edc4fc0577a0f61ed782d5aed1"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Bold.ttf",
"bytes": 428176,
"sha256": "9214b9d95e4231c609802815c2646c98174e2102d0d37f88978a7f8e71006e6a"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-It.ttf",
"bytes": 315812,
"sha256": "192afd78f0f54a3c69eaf02d43f4d9a821e9d6110e41d3d25d61a7385cd580e4"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Regular.ttf",
"bytes": 431196,
"sha256": "4644c81b86ec9caaa76b634889968ed3c4f4f52f054855933acc7c2b21e53b0f"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSans3-Semibold.ttf",
"bytes": 425904,
"sha256": "a3f4f8dcf343a8f24dc61951de93f3ba1558b15cd250ba24af8a40e957081b7d"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Bold.ttf",
"bytes": 271568,
"sha256": "7cf4f4e1ad74f45058d5bc61716b82560442fbdcd9d3654d2dea96bf6c683d86"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-BoldIt.ttf",
"bytes": 191832,
"sha256": "7b215b37f8873f5579f3f8d2ded3ca7c588e2f435cd996605ebfc5befe2cd5eb"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-It.ttf",
"bytes": 187808,
"sha256": "9d2950a8f1da66e21502c35d646a1d2148e79f9ea43fd2158cf02f5232e7f430"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Regular.ttf",
"bytes": 261868,
"sha256": "e5a4ee6a3d87bb9024796be390c6771e2a0eb1883dae25effaf57ca01668e24b"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/fonts/SourceSerif4-Semibold.ttf",
"bytes": 272088,
"sha256": "36db62940cb5728b12b1802476dc7fcf4c6c519a7bdd476ba23a4e555fc4655f"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/assets/hyphenation/en-us.dic",
"bytes": 432905,
"sha256": "66ce9023847dd2cfc5c6ad14b83aaab94e58607fe95258f4f3ac431a23df63f1"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-logo-white.png",
"bytes": 32161,
"sha256": "8b86aeb06a12a90ba77a60e0d90329272310e244ee5c1f9b161b391280ca79d8"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-logo.png",
"bytes": 31302,
"sha256": "08fc6d9d3717e8f13417bac6f9025b50e11d1e0b32e9e000883d2fe0c4a0c67b"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-mark-black.png",
"bytes": 26793,
"sha256": "5954cc0306e1b9d7beb47097e2e842157113a39d9aba078b57304902687936a9"
},
{
"path": "packages/webui/third_party/wordcraft/upstream/docs/brand/artcraft-mark.png",
"bytes": 24715,
"sha256": "9d372157a949c147318561e629b11561c28b7cbc14c84b516a3fe6e84d8fbbad"
}
]
}
File diff suppressed because it is too large. Load diff
+118
View File
@@ -0,0 +1,118 @@
✖ q248 toolchain CLI with no tools and requirement undefined (43.000087ms)
✖ q248 toolchain CLI with no tools and requirement 0 (37.889158ms)
✖ q248 toolchain CLI with no tools and requirement 1 (39.181148ms)
✖ q248 toolchain CLI with no tools and requirement true (37.017988ms)
✖ q248 toolchain CLI refuses changed pinned-version bytes without requirement (41.616409ms)
✖ q248 unknown CLI operation refuses (30.005092ms)
ℹ tests 6
ℹ suites 0
ℹ pass 0
ℹ fail 6
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 286.414556
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:315:3
✖ q248 toolchain CLI with no tools and requirement undefined (43.000087ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^skip: /. Input:
''
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:323:32)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: '',
expected: /^skip: /,
operator: 'match',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:315:3
✖ q248 toolchain CLI with no tools and requirement 0 (37.889158ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^skip: /. Input:
''
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:323:32)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: '',
expected: /^skip: /,
operator: 'match',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:315:3
✖ q248 toolchain CLI with no tools and requirement 1 (39.181148ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
0 !== 3
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:322:14)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 0,
expected: 3,
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:315:3
✖ q248 toolchain CLI with no tools and requirement true (37.017988ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
0 !== 2
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:322:14)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 0,
expected: 2,
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:328:1
✖ q248 toolchain CLI refuses changed pinned-version bytes without requirement (41.616409ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
0 !== 4
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:335:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 0,
expected: 4,
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:338:1
✖ q248 unknown CLI operation refuses (30.005092ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
0 !== 2
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:341:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 0,
expected: 2,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,41 @@
✔ q248 requirement switch accepts undefined (4.699935ms)
✔ q248 requirement switch accepts (0.152866ms)
✔ q248 requirement switch accepts 0 (0.123725ms)
✔ q248 requirement switch accepts 1 (0.11514ms)
✔ q248 malformed requirement switch refuses instead of skipping (0.382512ms)
✔ q248 absent executable skips routinely and fails when required (5.554151ms)
✔ q248 another tool version is absent for the pinned rebuild (2.206346ms)
✔ q248 pinned version with changed executable always refuses (4.381001ms)
✔ q248 missing wasm target skips routinely but required mode fails (7.201293ms)
✔ q248 changed wasm target support always refuses (7.057597ms)
✔ q248 unrecorded platform refuses even when optional (0.676562ms)
✔ q248 a rebuilt WASM with different bytes refuses (6.961939ms)
✔ q248 malformed pin record refuses even when optional (0.198169ms)
✔ q248 escaping support paths refuse before reading (0.649886ms)
✔ q248 an executable that cannot report its version refuses (4.77915ms)
✔ q248 inherited RUSTFLAGS refuses even in optional mode (0.66811ms)
✔ q248 inherited CARGO_ENCODED_RUSTFLAGS refuses even in optional mode (0.527949ms)
✔ q248 inherited RUSTDOCFLAGS refuses even in optional mode (0.459035ms)
✔ q248 inherited CARGO_BUILD_RUSTFLAGS refuses even in optional mode (0.459345ms)
✔ q248 inherited CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS refuses even in optional mode (0.554757ms)
✔ q248 exact tool bytes and target support permit the rebuild (6.414472ms)
✔ q248 missing rebuilt file refuses (0.844631ms)
✔ q248 extra rebuilt file refuses (0.743958ms)
✔ q248 malformed support hash record refuses (0.551168ms)
✔ q248 unreadable executable object refuses (3.089131ms)
✔ q248 missing compiler support refuses instead of skipping (6.342868ms)
✔ q248 identical rebuilt artifact bytes are accepted (0.905251ms)
✔ q248 toolchain CLI with no tools and requirement undefined (37.453273ms)
✔ q248 toolchain CLI with no tools and requirement 0 (35.080467ms)
✔ q248 toolchain CLI with no tools and requirement 1 (34.042151ms)
✔ q248 toolchain CLI with no tools and requirement true (29.147704ms)
✔ q248 toolchain CLI refuses changed pinned-version bytes without requirement (37.02023ms)
✔ q248 unknown CLI operation refuses (31.491558ms)
ℹ tests 33
ℹ suites 0
ℹ pass 33
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 325.368841
@@ -0,0 +1,470 @@
✖ q248 requirement switch accepts undefined (5.342469ms)
✖ q248 requirement switch accepts (0.241256ms)
✖ q248 requirement switch accepts 0 (0.240955ms)
✖ q248 requirement switch accepts 1 (0.165671ms)
✖ q248 malformed requirement switch refuses instead of skipping (0.202901ms)
✖ q248 absent executable skips routinely and fails when required (0.200122ms)
✖ q248 another tool version is absent for the pinned rebuild (0.193698ms)
✖ q248 pinned version with changed executable always refuses (0.2034ms)
✖ q248 missing wasm target skips routinely but required mode fails (0.199735ms)
✖ q248 changed wasm target support always refuses (0.23943ms)
✖ q248 unrecorded platform refuses even when optional (0.159889ms)
✖ q248 a rebuilt WASM with different bytes refuses (0.179213ms)
✖ q248 malformed pin record refuses even when optional (0.163915ms)
✖ q248 escaping support paths refuse before reading (0.207914ms)
✖ q248 an executable that cannot report its version refuses (0.136987ms)
✖ q248 inherited RUSTFLAGS refuses even in optional mode (0.129662ms)
✖ q248 inherited CARGO_ENCODED_RUSTFLAGS refuses even in optional mode (0.118153ms)
✖ q248 inherited RUSTDOCFLAGS refuses even in optional mode (0.098326ms)
✖ q248 inherited CARGO_BUILD_RUSTFLAGS refuses even in optional mode (0.091901ms)
✖ q248 inherited CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS refuses even in optional mode (0.094663ms)
✖ q248 exact tool bytes and target support permit the rebuild (0.151451ms)
✖ q248 missing rebuilt file refuses (0.16167ms)
✖ q248 extra rebuilt file refuses (0.128484ms)
ℹ tests 23
ℹ suites 0
ℹ pass 0
ℹ fail 23
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 71.845025
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:127:3
✖ q248 requirement switch accepts undefined (5.342469ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:129:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:127:3
✖ q248 requirement switch accepts (0.241256ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:129:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:127:3
✖ q248 requirement switch accepts 0 (0.240955ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:129:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:127:3
✖ q248 requirement switch accepts 1 (0.165671ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:129:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:133:1
✖ q248 malformed requirement switch refuses instead of skipping (0.202901ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:135:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:138:1
✖ q248 absent executable skips routinely and fails when required (0.200122ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:140:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:149:1
✖ q248 another tool version is absent for the pinned rebuild (0.193698ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:151:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:160:1
✖ q248 pinned version with changed executable always refuses (0.2034ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:162:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:171:1
✖ q248 missing wasm target skips routinely but required mode fails (0.199735ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:173:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:182:1
✖ q248 changed wasm target support always refuses (0.23943ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:184:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:193:1
✖ q248 unrecorded platform refuses even when optional (0.159889ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:195:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:202:1
✖ q248 a rebuilt WASM with different bytes refuses (0.179213ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:204:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:212:1
✖ q248 malformed pin record refuses even when optional (0.163915ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:214:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:218:1
✖ q248 escaping support paths refuse before reading (0.207914ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:220:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:228:1
✖ q248 an executable that cannot report its version refuses (0.136987ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:230:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:239:3
✖ q248 inherited RUSTFLAGS refuses even in optional mode (0.129662ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:241:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:239:3
✖ q248 inherited CARGO_ENCODED_RUSTFLAGS refuses even in optional mode (0.118153ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:241:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:239:3
✖ q248 inherited RUSTDOCFLAGS refuses even in optional mode (0.098326ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:241:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:239:3
✖ q248 inherited CARGO_BUILD_RUSTFLAGS refuses even in optional mode (0.091901ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:241:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:239:3
✖ q248 inherited CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS refuses even in optional mode (0.094663ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:241:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:249:1
✖ q248 exact tool bytes and target support permit the rebuild (0.151451ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:251:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:258:1
✖ q248 missing rebuilt file refuses (0.16167ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:260:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:267:1
✖ q248 extra rebuilt file refuses (0.128484ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:269:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,60 @@
✔ pristine vendor deterministically reproduces the recorded filter inventory and patch (117.260998ms)
✔ q248 requirement switch accepts undefined (0.270327ms)
✔ q248 requirement switch accepts (0.136881ms)
✔ q248 requirement switch accepts 0 (0.128193ms)
✔ q248 requirement switch accepts 1 (0.106226ms)
✔ q248 malformed requirement switch refuses instead of skipping (0.363432ms)
✔ q248 absent executable skips routinely and fails when required (6.451497ms)
✔ q248 another tool version is absent for the pinned rebuild (2.127973ms)
✔ q248 pinned version with changed executable always refuses (4.415495ms)
✔ q248 missing wasm target skips routinely but required mode fails (6.905618ms)
✔ q248 changed wasm target support always refuses (6.937083ms)
✔ q248 unrecorded platform refuses even when optional (0.680847ms)
✔ q248 a rebuilt WASM with different bytes refuses (6.555153ms)
✔ q248 malformed pin record refuses even when optional (0.168276ms)
✔ q248 escaping support paths refuse before reading (0.587478ms)
✔ q248 an executable that cannot report its version refuses (4.890701ms)
✔ q248 inherited RUSTFLAGS refuses even in optional mode (0.687694ms)
✔ q248 inherited CARGO_ENCODED_RUSTFLAGS refuses even in optional mode (0.484652ms)
✔ q248 inherited RUSTDOCFLAGS refuses even in optional mode (0.512431ms)
✔ q248 inherited CARGO_BUILD_RUSTFLAGS refuses even in optional mode (0.469008ms)
✔ q248 inherited CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS refuses even in optional mode (0.466476ms)
✔ q248 exact tool bytes and target support permit the rebuild (6.506132ms)
✔ q248 missing rebuilt file refuses (1.058081ms)
✔ q248 extra rebuilt file refuses (1.125685ms)
✔ q248 malformed support hash record refuses (0.50295ms)
✔ q248 unreadable executable object refuses (3.19405ms)
✔ q248 missing compiler support refuses instead of skipping (6.539084ms)
✔ q248 identical rebuilt artifact bytes are accepted (0.652753ms)
✔ q248 toolchain CLI with no tools and requirement undefined (33.068004ms)
✔ q248 toolchain CLI with no tools and requirement 0 (28.823915ms)
✔ q248 toolchain CLI with no tools and requirement 1 (32.852631ms)
✔ q248 toolchain CLI with no tools and requirement true (32.727922ms)
✔ q248 toolchain CLI refuses changed pinned-version bytes without requirement (32.866464ms)
✔ q248 unknown CLI operation refuses (31.795544ms)
✔ q248 builder prepares the approved source without modifying the imports (2351.440096ms)
✔ q248 builder refuses a missing explicit scratch TMPDIR (0.982404ms)
✔ q248 builder refuses an output root inside the repository (0.341878ms)
✔ q248 builder refuses a nonempty build root (0.630373ms)
✔ q248 builder refuses a symlink build root (40.194823ms)
✔ q248 builder refuses ambient ancestor Cargo configuration (1.358355ms)
✔ q248 patch refuses a mismatched recorded digest before applying (0.625853ms)
✔ q248 patch refuses a path outside its recorded input boundary (0.844395ms)
✔ q248 patch refuses an unrecorded source path (0.705332ms)
✔ q248 patch refuses a patch whose context does not apply (4.924684ms)
✔ q248 imported source inventory is exactly the approved 209 plus 14 (1749.03062ms)
✔ q248 normal and build dependency closures accept exactly the reviewed identities (24.137228ms)
✔ q248 a new target dependency is refused (14.790631ms)
✔ q248 a missing target dependency is refused (13.131853ms)
✔ q248 unsupported closure edge refuses (0.325166ms)
✔ q248 malformed closure identity refuses (7.070581ms)
ℹ tests 50
ℹ suites 0
ℹ pass 50
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2842.173131
{"requestedAbsoluteNice": 19, "observedNiceValues": [16, 19], "note": "Observed priority changes are recorded and do not alone stop the run."}
@@ -0,0 +1,212 @@
✖ q248 builder prepares the approved source without modifying the imports (5.783449ms)
✖ q248 builder refuses a missing explicit scratch TMPDIR (0.299989ms)
✖ q248 builder refuses an output root inside the repository (0.233816ms)
✖ q248 builder refuses a nonempty build root (0.224616ms)
✖ q248 builder refuses a symlink build root (0.197374ms)
✖ q248 builder refuses ambient ancestor Cargo configuration (0.201691ms)
✖ q248 patch refuses a mismatched recorded digest before applying (0.169158ms)
✖ q248 patch refuses a path outside its recorded input boundary (0.19232ms)
✖ q248 patch refuses an unrecorded source path (0.24514ms)
✖ q248 patch refuses a patch whose context does not apply (0.26337ms)
ℹ tests 10
ℹ suites 0
ℹ pass 0
ℹ fail 10
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 62.708438
✖ failing tests:
test at packages/webui/tests/wordcraft-build.test.mjs:345:1
✖ q248 builder prepares the approved source without modifying the imports (5.783449ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:347:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:366:1
✖ q248 builder refuses a missing explicit scratch TMPDIR (0.299989ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:367:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:372:1
✖ q248 builder refuses an output root inside the repository (0.233816ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:373:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:376:1
✖ q248 builder refuses a nonempty build root (0.224616ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:377:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:382:1
✖ q248 builder refuses a symlink build root (0.197374ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:383:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:392:1
✖ q248 builder refuses ambient ancestor Cargo configuration (0.201691ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:393:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:402:1
✖ q248 patch refuses a mismatched recorded digest before applying (0.169158ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:403:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:410:1
✖ q248 patch refuses a path outside its recorded input boundary (0.19232ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:411:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:418:1
✖ q248 patch refuses an unrecorded source path (0.24514ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:419:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-build.test.mjs:426:1
✖ q248 patch refuses a patch whose context does not apply (0.26337ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-build.test.mjs:427:52)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
{"requestedAbsoluteNice": 19, "observedNiceValues": [19], "note": "Observed priority changes are recorded and do not alone stop the run."}
@@ -0,0 +1,13 @@
✔ q248 imported source inventory is exactly the approved 209 plus 14 (399.207629ms)
✔ q248 normal and build dependency closures accept exactly the reviewed identities (28.266359ms)
✔ q248 a new target dependency is refused (16.814011ms)
✔ q248 a missing target dependency is refused (13.24187ms)
✔ q248 unsupported closure edge refuses (0.336962ms)
ℹ tests 5
ℹ suites 0
ℹ pass 5
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 506.93841
@@ -0,0 +1,110 @@
✖ q248 imported source inventory is exactly the approved 209 plus 14 (14.283374ms)
✖ q248 normal and build dependency closures accept exactly the reviewed identities (3.97222ms)
✖ q248 a new target dependency is refused (0.23906ms)
✖ q248 a missing target dependency is refused (0.229754ms)
✖ q248 unsupported closure edge refuses (0.20312ms)
ℹ tests 5
ℹ suites 0
ℹ pass 0
ℹ fail 5
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 65.820262
✖ failing tests:
test at packages/webui/tests/wordcraft-provenance.test.mjs:59:1
✖ q248 imported source inventory is exactly the approved 209 plus 14 (14.283374ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
209 !== 223
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-provenance.test.mjs:61:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.start (node:internal/test_runner/test:1262:17)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 209,
expected: 223,
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-provenance.test.mjs:68:1
✖ q248 normal and build dependency closures accept exactly the reviewed identities (3.97222ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-provenance.test.mjs:70:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-provenance.test.mjs:77:1
✖ q248 a new target dependency is refused (0.23906ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-provenance.test.mjs:79:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-provenance.test.mjs:84:1
✖ q248 a missing target dependency is refused (0.229754ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-provenance.test.mjs:86:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/webui/tests/wordcraft-provenance.test.mjs:91:1
✖ q248 unsupported closure edge refuses (0.20312ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'undefined'
- 'function'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gyro-row310/packages/webui/tests/wordcraft-provenance.test.mjs:93:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'undefined',
expected: 'function',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,48 @@
✔ pristine vendor deterministically reproduces the recorded filter inventory and patch (85.764358ms)
✔ q248 requirement switch accepts undefined (0.419983ms)
✔ q248 requirement switch accepts (0.16243ms)
✔ q248 requirement switch accepts 0 (0.322719ms)
✔ q248 requirement switch accepts 1 (0.248478ms)
✔ q248 malformed requirement switch refuses instead of skipping (0.705106ms)
✔ q248 absent executable skips routinely and fails when required (7.024559ms)
✔ q248 another tool version is absent for the pinned rebuild (3.002224ms)
✔ q248 pinned version with changed executable always refuses (5.511673ms)
✔ q248 missing wasm target skips routinely but required mode fails (11.907601ms)
✔ q248 changed wasm target support always refuses (10.396077ms)
✔ q248 unrecorded platform refuses even when optional (0.984323ms)
✔ q248 a rebuilt WASM with different bytes refuses (7.47192ms)
✔ q248 malformed pin record refuses even when optional (0.197361ms)
✔ q248 escaping support paths refuse before reading (0.721448ms)
✔ q248 an executable that cannot report its version refuses (9.639167ms)
✔ q248 inherited RUSTFLAGS refuses even in optional mode (1.197922ms)
✔ q248 inherited CARGO_ENCODED_RUSTFLAGS refuses even in optional mode (0.681243ms)
✔ q248 inherited RUSTDOCFLAGS refuses even in optional mode (0.714469ms)
✔ q248 inherited CARGO_BUILD_RUSTFLAGS refuses even in optional mode (0.591456ms)
✔ q248 inherited CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS refuses even in optional mode (0.553298ms)
✔ q248 exact tool bytes and target support permit the rebuild (11.203467ms)
✔ q248 missing rebuilt file refuses (1.193236ms)
✔ q248 extra rebuilt file refuses (1.492362ms)
✔ q248 malformed support hash record refuses (0.651715ms)
✔ q248 unreadable executable object refuses (4.440836ms)
✔ q248 missing compiler support refuses instead of skipping (13.413098ms)
✔ q248 identical rebuilt artifact bytes are accepted (0.991564ms)
✔ q248 toolchain CLI with no tools and requirement undefined (43.856964ms)
✔ q248 toolchain CLI with no tools and requirement 0 (38.809547ms)
✔ q248 toolchain CLI with no tools and requirement 1 (40.049731ms)
✔ q248 toolchain CLI with no tools and requirement true (35.153136ms)
✔ q248 toolchain CLI refuses changed pinned-version bytes without requirement (40.628809ms)
✔ q248 unknown CLI operation refuses (33.102591ms)
✔ q248 imported source inventory is exactly the approved 209 plus 14 (362.659064ms)
✔ q248 normal and build dependency closures accept exactly the reviewed identities (21.846308ms)
✔ q248 a new target dependency is refused (15.348845ms)
✔ q248 a missing target dependency is refused (13.033303ms)
✔ q248 unsupported closure edge refuses (0.273856ms)
✔ q248 malformed closure identity refuses (7.583249ms)
ℹ tests 40
ℹ suites 0
ℹ pass 40
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 482.999796
@@ -0,0 +1,20 @@
from pathlib import Path
import os,sys,subprocess,time,json
# Only the explicitly CLEARed new WordCraft test files are accepted.
allowed={'packages/webui/tests/wordcraft-build.test.mjs','packages/webui/tests/wordcraft-provenance.test.mjs'}
receipt=sys.argv[1];pattern=sys.argv[2];files=sys.argv[3:]
assert files and set(files)<=allowed
scratch=Path(os.environ['TMPDIR']);(scratch/'home').mkdir(exist_ok=True)
env={'PATH':'/usr/bin:/bin','HOME':str(scratch/'home'),'TMPDIR':str(scratch),'LANG':'C.UTF-8','TZ':'UTC','CARGO_BUILD_JOBS':'4','BINARYEN_CORES':'4','GIT_CONFIG_NOSYSTEM':'1','GIT_CONFIG_GLOBAL':'/dev/null'}
def limits():os.setpriority(os.PRIO_PROCESS,0,19)
observed=set()
with open(receipt,'w') as out:
p=subprocess.Popen(['/usr/bin/node','--test','--test-name-pattern='+pattern,*files],env=env,preexec_fn=limits,stdout=out,stderr=subprocess.STDOUT)
while p.poll() is None:
try:observed.add(os.getpriority(os.PRIO_PROCESS,p.pid))
except ProcessLookupError:pass
time.sleep(0.02)
with open(receipt,'a') as out:out.write('\n'+json.dumps({'requestedAbsoluteNice':19,'observedNiceValues':sorted(observed),'note':'Observed priority changes are recorded and do not alone stop the run.'})+'\n')
print('test exit',p.returncode,'receipt',receipt)
print(Path(receipt).read_text()[-4500:])
sys.exit(p.returncode)
@@ -0,0 +1,26 @@
debug_assertions
panic="abort"
target_abi=""
target_arch="wasm32"
target_endian="little"
target_env=""
target_family="wasm"
target_feature="bulk-memory"
target_feature="multivalue"
target_feature="mutable-globals"
target_feature="nontrapping-fptoint"
target_feature="reference-types"
target_feature="sign-ext"
target_has_atomic="16"
target_has_atomic="32"
target_has_atomic="64"
target_has_atomic="8"
target_has_atomic="ptr"
target_has_atomic_primitive_alignment="16"
target_has_atomic_primitive_alignment="32"
target_has_atomic_primitive_alignment="64"
target_has_atomic_primitive_alignment="8"
target_has_atomic_primitive_alignment="ptr"
target_os="unknown"
target_pointer_width="32"
target_vendor="unknown"
@@ -0,0 +1,416 @@
{
"metadataSha256": "503bcf5a2a6d3fc814b0422bf3658cc3a187b182d2928da11e8ed68519b9d8fb",
"note": "S0 cargo metadata includes workspace feature unification; evidence of a constraint conflict, not exact root-only feature proof",
"edges": [
{
"crate": "eframe-0.36.2",
"feature": "accesskit",
"edge": "egui-winit/accesskit"
},
{
"crate": "eframe-0.36.2",
"feature": "links",
"edge": "egui-winit/links"
},
{
"crate": "eframe-0.36.2",
"feature": "wayland",
"edge": "egui-winit/wayland"
},
{
"crate": "eframe-0.36.2",
"feature": "wayland",
"edge": "glutin?/wayland"
},
{
"crate": "eframe-0.36.2",
"feature": "wayland",
"edge": "glutin-winit?/wayland"
},
{
"crate": "eframe-0.36.2",
"feature": "wgpu_no_default_features",
"edge": "dep:pollster"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "egui-winit/x11"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "glutin?/x11"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "glutin?/glx"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "glutin-winit?/x11"
},
{
"crate": "eframe-0.36.2",
"feature": "x11",
"edge": "glutin-winit?/glx"
},
{
"crate": "rfd-0.17.2",
"feature": "wayland",
"edge": "wayland-backend"
},
{
"crate": "rfd-0.17.2",
"feature": "wayland",
"edge": "wayland-client"
},
{
"crate": "rfd-0.17.2",
"feature": "wayland",
"edge": "wayland-protocols"
},
{
"crate": "rfd-0.17.2",
"feature": "xdg-portal",
"edge": "pollster"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "dx12",
"edge": "wgpu-core-deps-windows-linux-android/dx12"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "gles",
"edge": "wgpu-core-deps-windows-linux-android/gles"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "gles",
"edge": "wgpu-core-deps-emscripten/gles"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "metal",
"edge": "wgpu-core-deps-apple/metal"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "renderdoc",
"edge": "wgpu-core-deps-windows-linux-android/renderdoc"
},
{
"crate": "wgpu-core-30.0.1",
"feature": "vulkan",
"edge": "wgpu-core-deps-windows-linux-android/vulkan"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:bit-set"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:gpu-allocator"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:once_cell"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:range-alloc"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "dep:windows-core"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "gpu-allocator/d3d12"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "once_cell/std"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Devices_DeviceAndDriverInstallation"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Devices_Display"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Direct3D_Dxc"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Direct3D_Fxc"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Direct3D"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Direct3D12"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_DirectComposition"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Dxgi_Common"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Graphics_Gdi"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_Security"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_System_Diagnostics_Debug"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_System_Kernel"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_System_Performance"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_System_Threading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "dx12",
"edge": "windows/Win32_UI_WindowsAndMessaging"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:glutin_wgl_sys"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:khronos-egl"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:ndk-sys"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:objc2"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:wayland-sys"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "dep:windows-result"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows-result/std"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows/Win32_Graphics_Gdi"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows/Win32_Graphics_OpenGL"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows/Win32_System_LibraryLoader"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "gles",
"edge": "windows/Win32_UI_WindowsAndMessaging"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:block2"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-core-foundation"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-core-graphics"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-foundation"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-metal"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:objc2-quartz-core"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:smallvec"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "metal",
"edge": "dep:raw-window-metal"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "renderdoc",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "renderdoc",
"edge": "dep:renderdoc-sys"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:android_system_properties"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:ash"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:libc"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:libloading"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:raw-window-metal"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:smallvec"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "dep:windows"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "gpu-allocator/vulkan"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Devices_Display"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Foundation"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Graphics_Dxgi"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Graphics_Dxgi_Common"
},
{
"crate": "wgpu-hal-30.0.1",
"feature": "vulkan",
"edge": "windows/Win32_Graphics_Gdi"
}
]
}
@@ -0,0 +1,526 @@
[
{
"crate": "aes-0.9.3",
"cfg": "cfg(any(target_arch = \"aarch64\", target_arch = \"x86_64\", target_arch = \"x86\"))",
"kind": "dependencies",
"dependencies": [
"cpufeatures"
]
},
{
"crate": "bytes-1.12.1",
"cfg": "cfg(loom)",
"kind": "dev-dependencies",
"dependencies": [
"loom"
]
},
{
"crate": "cmov-0.5.4",
"cfg": "cfg(any(unix, windows))",
"kind": "dev-dependencies",
"dependencies": [
"proptest"
]
},
{
"crate": "eframe-0.36.2",
"cfg": "cfg(any(target_os = \"macos\"))",
"kind": "dependencies",
"dependencies": [
"objc2",
"objc2-app-kit",
"objc2-foundation"
]
},
{
"crate": "eframe-0.36.2",
"cfg": "cfg(any(target_os = \"windows\"))",
"kind": "dependencies",
"dependencies": [
"windows-sys"
]
},
{
"crate": "eframe-0.36.2",
"cfg": "cfg(not(target_arch = \"wasm32\"))",
"kind": "dependencies",
"dependencies": [
"egui-wgpu",
"egui-winit",
"glutin",
"glutin-winit",
"image",
"pollster",
"winit"
]
},
{
"crate": "eframe-0.36.2",
"cfg": "cfg(not(target_arch = \"wasm32\"))",
"kind": "dev-dependencies",
"dependencies": [
"directories"
]
},
{
"crate": "encoding_rs-0.8.42",
"cfg": "cfg(all(any(target_arch = \"x86_64\", target_arch = \"x86\"), not(all(target_feature = \"avx2\", target_feature = \"bmi1\"))))",
"kind": "dependencies",
"dependencies": [
"multiversion"
]
},
{
"crate": "encoding_rs-0.8.42",
"cfg": "cfg(any(target_arch = \"x86_64\", target_arch = \"x86\"))",
"kind": "dependencies",
"dependencies": [
"core_detect"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(all(any(target_os = \"linux\", target_os = \"android\"), not(any(all(target_os = \"linux\", target_env = \"\"), getrandom_backend = \"custom\", getrandom_backend = \"linux_raw\", getrandom_backend = \"rdrand\", getrandom_backend = \"rndr\"))))",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(all(target_arch = \"wasm32\", target_os = \"wasi\", target_env = \"p2\"))",
"kind": "dependencies",
"dependencies": [
"wasip2"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(all(target_os = \"uefi\", getrandom_backend = \"efi_rng\"))",
"kind": "dependencies",
"dependencies": [
"r-efi"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(any(target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"hurd\", target_os = \"illumos\", target_os = \"cygwin\", all(target_os = \"horizon\", target_arch = \"arm\")))",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(any(target_os = \"haiku\", target_os = \"redox\", target_os = \"nto\", target_os = \"aix\"))",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(any(target_os = \"ios\", target_os = \"visionos\", target_os = \"watchos\", target_os = \"tvos\"))",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(any(target_os = \"macos\", target_os = \"openbsd\", target_os = \"vita\", target_os = \"emscripten\"))",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(target_os = \"netbsd\")",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(target_os = \"solaris\")",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "getrandom-0.3.4",
"cfg": "cfg(target_os = \"vxworks\")",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "half-2.7.1",
"cfg": "cfg(target_arch = \"spirv\")",
"kind": "dependencies",
"dependencies": [
"crunchy"
]
},
{
"crate": "harfrust-0.12.0",
"cfg": "cfg(target_vendor = \"apple\")",
"kind": "dev-dependencies",
"dependencies": [
"objc2-core-foundation",
"objc2-core-text"
]
},
{
"crate": "harfrust-0.13.3",
"cfg": "cfg(target_vendor = \"apple\")",
"kind": "dev-dependencies",
"dependencies": [
"objc2-core-foundation",
"objc2-core-text"
]
},
{
"crate": "hashbrown-0.17.1",
"cfg": "cfg(any())",
"kind": "dependencies",
"dependencies": [
"serde"
]
},
{
"crate": "hashbrown-0.17.1",
"cfg": "cfg(unix)",
"kind": "dev-dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "indexmap-2.14.2",
"cfg": "cfg(any())",
"kind": "dependencies",
"dependencies": [
"serde"
]
},
{
"crate": "parking_lot_core-0.9.12",
"cfg": "cfg(target_os = \"redox\")",
"kind": "dependencies",
"dependencies": [
"redox_syscall"
]
},
{
"crate": "parking_lot_core-0.9.12",
"cfg": "cfg(unix)",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "parking_lot_core-0.9.12",
"cfg": "cfg(windows)",
"kind": "dependencies",
"dependencies": [
"windows-link"
]
},
{
"crate": "png-0.18.1",
"cfg": "cfg(not(target_arch = \"wasm32\"))",
"kind": "dev-dependencies",
"dependencies": [
"criterion"
]
},
{
"crate": "rfd-0.17.2",
"cfg": "cfg(any(target_os = \"linux\", target_os = \"freebsd\", target_os = \"dragonfly\", target_os = \"netbsd\", target_os = \"openbsd\"))",
"kind": "dependencies",
"dependencies": [
"glib-sys",
"gobject-sys",
"gtk-sys",
"libc",
"percent-encoding",
"pollster",
"wayland-backend",
"wayland-client",
"wayland-protocols"
]
},
{
"crate": "rfd-0.17.2",
"cfg": "cfg(target_os = \"macos\")",
"kind": "dependencies",
"dependencies": [
"block2",
"dispatch2",
"objc2",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-foundation"
]
},
{
"crate": "rfd-0.17.2",
"cfg": "cfg(target_os = \"windows\")",
"kind": "dependencies",
"dependencies": [
"windows-sys"
]
},
{
"crate": "serde_core-1.0.229",
"cfg": "cfg(any())",
"kind": "dependencies",
"dependencies": [
"serde_derive"
]
},
{
"crate": "serde_json-1.0.151",
"cfg": "cfg(any())",
"kind": "dependencies",
"dependencies": [
"serde"
]
},
{
"crate": "sha1-0.11.0",
"cfg": "cfg(any(target_arch = \"aarch64\", target_arch = \"x86\", target_arch = \"x86_64\"))",
"kind": "dependencies",
"dependencies": [
"cpufeatures"
]
},
{
"crate": "sha2-0.11.0",
"cfg": "cfg(any(target_arch = \"aarch64\", target_arch = \"x86_64\", target_arch = \"x86\"))",
"kind": "dependencies",
"dependencies": [
"cpufeatures"
]
},
{
"crate": "sys-locale-0.3.2",
"cfg": "cfg(target_os = \"android\")",
"kind": "dependencies",
"dependencies": [
"libc"
]
},
{
"crate": "uuid-1.27.0",
"cfg": "cfg(not(all(target_arch = \"wasm32\", any(target_os = \"unknown\", target_os = \"none\"))))",
"kind": "dependencies",
"dependencies": [
"getrandom",
"rand"
]
},
{
"crate": "uuid-1.27.0",
"cfg": "cfg(not(target_arch = \"wasm32\"))",
"kind": "dev-dependencies",
"dependencies": [
"gungraun"
]
},
{
"crate": "wasm-bindgen-0.2.129",
"cfg": "cfg(all(target_os = \"emscripten\", wasm_bindgen_unstable_tokio))",
"kind": "dev-dependencies",
"dependencies": [
"tokio"
]
},
{
"crate": "wasm-bindgen-0.2.129",
"cfg": "cfg(target_arch = \"wasm64\")",
"kind": "dev-dependencies",
"dependencies": [
"paste",
"serde_derive"
]
},
{
"crate": "wasm-bindgen-futures-0.4.79",
"cfg": "cfg(all(target_os = \"emscripten\", wasm_bindgen_unstable_tokio))",
"kind": "dependencies",
"dependencies": [
"tokio"
]
},
{
"crate": "web-time-1.1.0",
"cfg": "cfg(not(target_family = \"wasm\"))",
"kind": "dev-dependencies",
"dependencies": [
"pollster"
]
},
{
"crate": "wgpu-30.0.1",
"cfg": "cfg(not(target_arch = \"wasm32\"))",
"kind": "dependencies",
"dependencies": [
"smallvec",
"wgpu-core",
"wgpu-hal"
]
},
{
"crate": "wgpu-30.0.1",
"cfg": "cfg(target_os = \"emscripten\")",
"kind": "dependencies",
"dependencies": [
"smallvec",
"wgpu-core",
"wgpu-hal"
]
},
{
"crate": "wgpu-core-30.0.1",
"cfg": "cfg(any(windows, target_os = \"linux\", target_os = \"android\", target_os = \"freebsd\"))",
"kind": "dependencies",
"dependencies": [
"wgpu-core-deps-windows-linux-android"
]
},
{
"crate": "wgpu-core-30.0.1",
"cfg": "cfg(target_os = \"emscripten\")",
"kind": "dependencies",
"dependencies": [
"wgpu-core-deps-emscripten"
]
},
{
"crate": "wgpu-core-30.0.1",
"cfg": "cfg(target_vendor = \"apple\")",
"kind": "dependencies",
"dependencies": [
"wgpu-core-deps-apple"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(all(unix, not(target_vendor = \"apple\"), not(target_family = \"wasm\")))",
"kind": "dependencies",
"dependencies": [
"drm"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(all(windows, not(target_arch = \"aarch64\"), target_env = \"msvc\"))",
"kind": "dependencies",
"dependencies": [
"mach-dxcompiler-rs"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(not(any(target_arch = \"wasm32\", target_os = \"ios\", target_os = \"visionos\", target_env = \"ohos\")))",
"kind": "dev-dependencies",
"dependencies": [
"glutin",
"glutin-winit"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(not(target_arch = \"wasm32\"))",
"kind": "dependencies",
"dependencies": [
"ash",
"gpu-allocator",
"khronos-egl",
"libloading",
"renderdoc-sys",
"smallvec"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(target_os = \"android\")",
"kind": "dependencies",
"dependencies": [
"android_system_properties",
"ndk-sys"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(target_os = \"emscripten\")",
"kind": "dependencies",
"dependencies": [
"khronos-egl",
"libloading"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(target_vendor = \"apple\")",
"kind": "dependencies",
"dependencies": [
"block2",
"bytemuck",
"objc2",
"objc2-core-foundation",
"objc2-core-graphics",
"objc2-foundation",
"objc2-metal",
"objc2-quartz-core",
"raw-window-metal"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(unix)",
"kind": "dependencies",
"dependencies": [
"libc",
"wayland-sys"
]
},
{
"crate": "wgpu-hal-30.0.1",
"cfg": "cfg(windows)",
"kind": "dependencies",
"dependencies": [
"bit-set",
"glutin_wgl_sys",
"once_cell",
"range-alloc",
"windows",
"windows-core",
"windows-result"
]
},
{
"crate": "zerocopy-0.8.61",
"cfg": "cfg(any())",
"kind": "dependencies",
"dependencies": [
"zerocopy-derive"
]
},
{
"crate": "zip-3.0.0",
"cfg": "cfg(fuzzing)",
"kind": "dependencies",
"dependencies": [
"arbitrary"
]
}
]
File diff suppressed because it is too large. Load diff
+12
View File
@@ -1625,3 +1625,15 @@ are never rewritten or removed; corrections are new entries.
2026-10-24T04:29Z | Duckworth (Opus 5.5) | row 208 (193d) second review, guards only, on 4a4bef6c1 (sage-3934) | APPROVE (static), no bus change, every hidden control has a broker refusal, grant hint per-grant and self-only, N1 5 s poll (duckworth-0302) |
2026-10-24T04:27Z | Goldie (a13dd6d5-5e73-4b7d-8318-02abeff24940) | Row265 / #1770 C2-09b rooms | Goldie owns build, Boyd reviews under sage-3915. New goldie/row265 worktree at ec86f2c84, claim rev3814; room verbs/parser/new tests prepared, no old tests changed. Sage-3932 slot: new parser14/14 and rooms18/18 passed; whole bus in progress before refusal mutants, stop rule active.
2026-10-24T04:35Z | Goldie (a13dd6d5-5e73-4b7d-8318-02abeff24940) | Row265 / #1770 verified | First slot stopped at project-runtime import pin. mos-1567 narrowly authorizes pin and pure-source mount correction. sage-3942 rerun: sandbox10/10, parser15/15, rooms18/18, bus957/957, twelve refusal mutants killed/restored SHA71b32ee4, parser15/15 + rooms18/18 again. Slot returned goldie-0034; no further test runs. Boyd reviews RUNNER_FILES alongside rooms; own-branch push/claimant in-review next.
2026-10-24 — Gyro — row 310 / #1824 W2 source import and reproducible restricted web build — started on gyro/row310 at d16958bcf; reading pinned S0 and planning, build/test slot gates apply.
2026-10-24 — Gyro — row 310 / #1824 W2, sage-3992 scratch full-lock sizing/build measurement — extracted 534 cached registry sources, verified exact S0 target/build package sets, offline namespace release retry succeeded in 397.864805 s at nice19/four jobs; outputs pack to 16,720,159 bytes. No full-lock repo import, commit, push or serving. Packaging remains held for Mos/Jason; row stays in-progress.
2026-10-24 — Gyro — row 310 / #1824, sage-4008/4010 223-source measurement — scratch209+14 measured (145,260,334 bytes; source blob pack26,538,894 bytes); extra14 pack1,720,566 bytes; generated scratch lock prunes332 entries with0 added/changed. Build awaits Sage CLEAR after row327 gate. Plain-text results prepared for Gladstone; no crate sources/runtime outputs committed.
2026-10-24 — Gyro — row310 / #1824, sage-4014 223-source release measurement — frozen offline scratch build exit0 in380.674036s at nice19/four jobs; WASM0322beb9... differs from full-lockc1c15050.... Slot released to Sage/Bradford. Gladstone14-source notice concerns inventoried and plain-text notice collection supplemented; no source/runtime adoption or row release.
2026-10-24 — Gyro — row310 supplemental notice recheck gladstone-0027 — recorded four collection/mapping PASS results and independently matched bundle SHA4d8e2aac...; policy/runtime/adoption gates and Vikunja618 hold unchanged. Tracking-only text update; no build or source change.
2026-10-24 — Gyro — row310 Q248 implementation start, sage-4178 targeted unit slot — policy/CLI/provenance red→green40/40; approved223 input/notice/pruned-lock patch prepared uncommitted. No release/browser/full suite or binary push; later stages need CLEAR and621 still blocks landing.
2026-10-24 — Gyro — row310 Q248 policy/input implementation freeze (sage-4197) — local commit prepared from40-tested policy/provenance step;223 source import is approved byQ248, binary manifest review required byrow327 before push. Source-builder/runtime/rebuild/CSP steps remain unfinished; waiting for later CLEAR after224/328.
2026-10-24 — Gyro — row310 local source freeze/binary manifest proof, sage-4202 — aebc8d283 remains unpushed after row327 refusal;94 binaries independently matched original archive/Git authority, table and3 manifests recorded locally. Next fixture run needs CLEAR after224/328; final push/review and621 gates remain held.
2026-10-24 — Gyro — row310 sage-4266/Q48 ruling recovery — recorded package-specific W3C acceptance for cursor-icon1.2.0 and winit0.30.13 and closure of Vikunja621; general S0 list unchanged. Source preparation/restricted runtime remain unfinished; fixture red/green slot requested, no tests/build/push run.
2026-10-24 — Gyro — row310 sage-4270 fixture slot —10 source preparation/patch cases RED for absent APIs, then50/50 targeted GREEN after implementation; observed nice19 RED and16/19 GREEN. Plain-text receipts recorded, slot returned to Sage via gyro-0030. No Cargo/Trunk/browser/full suite or push; full W2 acceptance unfinished.
2026-10-24 — Gyro — row310 sage-4294 lane-B handoff — no run started: preceding fixture step already50/50 at911389399. Reported lane free via gyro-0031; import-derived next fixture boundary and timeout/TMPDIR rules recorded. Own-worktree node/chromium sweep identified only preexisting17:37Z session/MCP processes; no test processes or cleanup kills. No push.
2026-10-24 — Gyro — mos-1631 T3 crash stop — no test/build restarted; remote gyro/row310 verified1749728ca. Unpublished source binaries still require final approved review, so no push bypass. Local implementation and stop handoff committed; own slow read-only push-check terminated after LOG_OK/FF_OK. No merge/queue move/other-thread messages. STOPPED.
@@ -0,0 +1,436 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { existsSync, readFileSync } from 'node:fs';
const build = new URL('../wordcraft/build.mjs', import.meta.url);
test('release build refuses a missing or mismatched pinned tool before compilation', async () => {
assert.ok(existsSync(build), 'owned builder must exist');
const { verifyTools } = await import(build.href);
assert.throws(() => verifyTools({}), /missing.*tool|tool.*missing/);
assert.throws(() => verifyTools({ cargo: process.execPath }), /tool|version|hash/);
});
test('shipped runtime is self-contained and matches every output receipt', async () => {
assert.ok(existsSync(build), 'owned builder must exist');
const { verifyOutputs } = await import(build.href);
const result = verifyOutputs();
assert.ok(result['frame.html']);
assert.ok(result['frame-bootstrap.js']);
assert.ok(result['wordcraft.wasm'].bytes > 0);
const html = readFileSync(new URL('../src/public/wordcraft/frame.html', import.meta.url), 'utf8');
assert.doesNotMatch(html, /<style\b|<script(?![^>]*\bsrc=)|\bstyle=|\bon\w+=|blob:|https?:/i);
});
test('release cfg evaluation follows pinned rustc and refuses inherited flags', async () => {
const builder = await import(build.href);
assert.equal(typeof builder.releaseEnvironment, 'function');
assert.equal(typeof builder.evaluateCfg, 'function');
for (const key of ['RUSTFLAGS', 'CARGO_ENCODED_RUSTFLAGS', 'RUSTDOCFLAGS', 'CARGO_BUILD_RUSTFLAGS', 'CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS']) {
assert.throws(() => builder.releaseEnvironment({ [key]: '--cfg fuzzing' }), /inherited.*flags/i, key);
}
const cfg = 'target_arch="wasm32"\ntarget_os="unknown"\ntarget_feature="bulk-memory"\n';
assert.equal(builder.evaluateCfg('cfg(all(target_arch = "wasm32", not(target_feature = "simd128")))', cfg), true);
assert.equal(builder.evaluateCfg('cfg(any(unix, windows, fuzzing, loom, miri))', cfg), false);
assert.equal(builder.evaluateCfg('cfg(target_feature = "bulk-memory")', cfg), true);
assert.equal(builder.evaluateCfg('cfg(not(miri))', cfg), true);
});
test('pinned compiler reproduces the recorded wasm target cfg', async () => {
const { execFileSync } = await import('node:child_process');
const { releaseEnvironment } = await import(build.href);
const rustc = '/mnt/storage/scratch/louie-wordcraft-toolchain/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/rustc';
const actual = execFileSync(rustc, ['--print', 'cfg', '--target', 'wasm32-unknown-unknown'], { encoding: 'utf8', env: releaseEnvironment(process.env) });
const expected = readFileSync(new URL('../../../agents/gyro/work/queue-310/rustc-wasm32-cfg.txt', import.meta.url), 'utf8');
assert.equal(actual, expected);
});
test('vendor filtering removes only false target sections and their dangling feature edges', async () => {
const builder = await import(build.href);
assert.equal(typeof builder.filterVendorManifest, 'function');
const text = '[package]\nname = "fixture"\nversion = "1.0.0"\n[features]\nportable = ["dep:core", "native?/extra"]\n[dependencies.core]\nversion = "1"\n[target.\'cfg(unix)\'.dependencies.native]\nversion = "1"\noptional = true\n[target.\'cfg(target_arch = "wasm32")\'.dependencies.web]\nversion = "1"\n';
const result = builder.filterVendorManifest(text, 'target_arch="wasm32"\n');
assert.doesNotMatch(result.text, /dependencies\.native/);
assert.match(result.text, /dependencies\.web/);
assert.match(result.text, /portable = \["dep:core"\]/);
assert.deepEqual(result.features.map(f => f.item), ['native?/extra']);
assert.equal(result.sections.length, 1);
assert.equal(result.sections[0].cfg, 'cfg(unix)');
});
test('a dev dependency cannot preserve a removed optional feature dependency', async () => {
const { filterVendorManifest } = await import(build.href);
const input = '[features]\nserde = ["dep:serde"]\n[dev-dependencies.serde]\nversion = "1"\n[target.\'cfg(any())\'.dependencies.serde]\nversion = "1"\noptional = true\n';
const result = filterVendorManifest(input, 'target_arch="wasm32"\n');
assert.match(result.text, /serde = \[\]/);
assert.match(result.text, /\[dev-dependencies\.serde\]/);
});
test('pristine vendor deterministically reproduces the recorded filter inventory and patch', async () => {
const { filterVendorManifest } = await import(build.href);
const { readdirSync, mkdtempSync, writeFileSync, rmSync } = await import('node:fs');
const { tmpdir } = await import('node:os');
const { join } = await import('node:path');
const { execFileSync } = await import('node:child_process');
const root = new URL('../third_party/wordcraft/cargo-vendor/', import.meta.url);
const cfg = JSON.parse(readFileSync(new URL('../wordcraft/toolchain.json', import.meta.url), 'utf8')).rustCfg;
const inventory = [];
let patch = '';
const temporary = mkdtempSync(join(tmpdir(), 'wordcraft-filter-'));
try {
for (const crate of readdirSync(root).sort()) {
const file = new URL(`${crate}/Cargo.toml`, root);
const original = readFileSync(file, 'utf8');
const result = filterVendorManifest(original, cfg);
if (result.text === original) continue;
inventory.push({ crate, sections: result.sections, features: result.features });
const changed = join(temporary, 'Cargo.toml');
writeFileSync(changed, result.text);
try {
execFileSync('diff', ['-u', '--label', `a/cargo-vendor/${crate}/Cargo.toml`, '--label', `b/cargo-vendor/${crate}/Cargo.toml`, file.pathname, changed], { encoding: 'utf8' });
} catch (error) {
assert.equal(error.status, 1);
patch += error.stdout;
}
}
const recorded = JSON.parse(readFileSync(new URL('../third_party/wordcraft/PROVENANCE.json', import.meta.url), 'utf8')).packaging.filterInventory;
assert.deepEqual(inventory, recorded);
const committedPatch = readFileSync(new URL('../wordcraft/patches/source-build.patch', import.meta.url), 'utf8');
assert.ok(committedPatch.endsWith(patch), 'patch must contain exactly the mechanically reproduced vendor changes');
} finally { rmSync(temporary, { recursive: true, force: true }); }
});
// Q248: the lightweight gate is executable even when the pinned Rust stack is absent.
async function q248Fixture() {
const fs = await import('node:fs');
const path = await import('node:path');
const { tmpdir } = await import('node:os');
const { createHash } = await import('node:crypto');
const root = fs.mkdtempSync(path.join(tmpdir(), 'wordcraft-tool-fixture-'));
const bin = path.join(root, 'bin'); fs.mkdirSync(bin);
const versions = { rustc: 'rustc 1.99.1', cargo: 'cargo 1.99.1', trunk: 'trunk 0.22.0', 'wasm-bindgen': 'wasm-bindgen 0.2.129', 'wasm-opt': 'wasm-opt version 131' };
const paths = {}, tools = {};
for (const [name, version] of Object.entries(versions)) {
const bytes = Buffer.from(`#!/bin/sh\nprintf '%s\\n' '${version}'\n`);
paths[name] = path.join(bin, name); fs.writeFileSync(paths[name], bytes, { mode: 0o755 });
tools[name] = { version, sha256: createHash('sha256').update(bytes).digest('hex'), bytes: bytes.length };
}
const supportPath = 'lib/rustlib/wasm32-unknown-unknown/lib/libstd-fixture.rlib';
const support = Buffer.from('pinned wasm target');
fs.mkdirSync(path.dirname(path.join(root, supportPath)), { recursive: true });
fs.writeFileSync(path.join(root, supportPath), support);
const pin = { schema: 1, platform: `${process.platform}-${process.arch}`, target: 'wasm32-unknown-unknown', tools, rustSupport: { [supportPath]: { bytes: support.length, sha256: createHash('sha256').update(support).digest('hex') } } };
return { fs, path, root, paths, pin, supportPath, clean: () => fs.rmSync(root, { recursive: true, force: true }) };
}
for (const [value, expected] of [[undefined, false], ['', false], ['0', false], ['1', true]]) {
test(`q248 requirement switch accepts ${String(value)}`, async () => {
const { requiredWordcraftBuild } = await import(build.href);
assert.equal(typeof requiredWordcraftBuild, 'function');
assert.equal(requiredWordcraftBuild(value === undefined ? {} : { MOSAIC_REQUIRE_WORDCRAFT_BUILD: value }), expected);
});
}
test('q248 malformed requirement switch refuses instead of skipping', async () => {
const { requiredWordcraftBuild } = await import(build.href);
assert.equal(typeof requiredWordcraftBuild, 'function');
for (const value of ['true', 'yes', ' 1', '2']) assert.throws(() => requiredWordcraftBuild({ MOSAIC_REQUIRE_WORDCRAFT_BUILD: value }), /MOSAIC_REQUIRE_WORDCRAFT_BUILD/);
});
test('q248 absent executable skips routinely and fails when required', async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
delete fixture.paths.trunk;
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'absent'); assert.match(result.reason, /trunk/);
assert.equal(rebuildVerdict(result, false), 'skip'); assert.equal(rebuildVerdict(result, true), 'fail');
} finally { fixture.clean(); }
});
test('q248 another tool version is absent for the pinned rebuild', async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
fixture.fs.writeFileSync(fixture.paths.rustc, "#!/bin/sh\nprintf 'rustc 1.98.0\\n'\n", { mode: 0o755 });
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'absent'); assert.match(result.reason, /version/);
assert.equal(rebuildVerdict(result, false), 'skip'); assert.equal(rebuildVerdict(result, true), 'fail');
} finally { fixture.clean(); }
});
test('q248 pinned version with changed executable always refuses', async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
fixture.fs.appendFileSync(fixture.paths.trunk, '# altered\n');
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /hash/);
assert.equal(rebuildVerdict(result, false), 'fail'); assert.equal(rebuildVerdict(result, true), 'fail');
} finally { fixture.clean(); }
});
test('q248 missing wasm target skips routinely but required mode fails', async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
fixture.fs.unlinkSync(fixture.path.join(fixture.root, fixture.supportPath));
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'absent'); assert.match(result.reason, /target/);
assert.equal(rebuildVerdict(result, false), 'skip'); assert.equal(rebuildVerdict(result, true), 'fail');
} finally { fixture.clean(); }
});
test('q248 changed wasm target support always refuses', async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
fixture.fs.appendFileSync(fixture.path.join(fixture.root, fixture.supportPath), 'altered');
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /support.*hash|hash.*support/);
assert.equal(rebuildVerdict(result, false), 'fail');
} finally { fixture.clean(); }
});
test('q248 unrecorded platform refuses even when optional', async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {}, platform: 'unsupported-arch' });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /platform/); assert.equal(rebuildVerdict(result, false), 'fail');
} finally { fixture.clean(); }
});
test('q248 a rebuilt WASM with different bytes refuses', async () => {
const { verifyRebuild, sha256 } = await import(build.href);
assert.equal(typeof verifyRebuild, 'function');
const fixture = await q248Fixture();
try {
const expected = { 'wordcraft.wasm': { bytes: 4, sha256: sha256(Buffer.from('wasm')) } };
fixture.fs.writeFileSync(fixture.path.join(fixture.root, 'wordcraft.wasm'), 'waSm');
assert.throws(() => verifyRebuild(fixture.root, expected), /hash/);
} finally { fixture.clean(); }
});
test('q248 malformed pin record refuses even when optional', async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const result = inspectToolchain({ paths: {}, pin: { schema: 1 }, env: {} });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /pin/); assert.equal(rebuildVerdict(result, false), 'fail');
});
test('q248 escaping support paths refuse before reading', async () => {
const { inspectToolchain } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
fixture.pin.rustSupport['../outside'] = Object.values(fixture.pin.rustSupport)[0];
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /path/);
} finally { fixture.clean(); }
});
test('q248 an executable that cannot report its version refuses', async () => {
const { inspectToolchain } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
fixture.fs.writeFileSync(fixture.paths.trunk, '#!/bin/sh\nexit 9\n', { mode: 0o755 });
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /version/);
} finally { fixture.clean(); }
});
for (const name of ['RUSTFLAGS', 'CARGO_ENCODED_RUSTFLAGS', 'RUSTDOCFLAGS', 'CARGO_BUILD_RUSTFLAGS', 'CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUSTFLAGS']) {
test(`q248 inherited ${name} refuses even in optional mode`, async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: { [name]: '--cfg fuzzing' } });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /inherited.*flags/); assert.equal(rebuildVerdict(result, false), 'fail');
} finally { fixture.clean(); }
});
}
test('q248 exact tool bytes and target support permit the rebuild', async () => {
const { inspectToolchain, rebuildVerdict } = await import(build.href);
assert.equal(typeof inspectToolchain, 'function');
const fixture = await q248Fixture();
try {
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.ok, true, result.reason); assert.equal(rebuildVerdict(result, false), 'run'); assert.equal(rebuildVerdict(result, true), 'run');
} finally { fixture.clean(); }
});
test('q248 missing rebuilt file refuses', async () => {
const { verifyRebuild, sha256 } = await import(build.href);
assert.equal(typeof verifyRebuild, 'function');
const fixture = await q248Fixture();
try {
const dir = fixture.path.join(fixture.root, 'output'); fixture.fs.mkdirSync(dir);
assert.throws(() => verifyRebuild(dir, { 'wordcraft.wasm': { bytes: 4, sha256: sha256(Buffer.from('wasm')) } }), /missing/);
} finally { fixture.clean(); }
});
test('q248 extra rebuilt file refuses', async () => {
const { verifyRebuild, sha256 } = await import(build.href);
assert.equal(typeof verifyRebuild, 'function');
const fixture = await q248Fixture();
try {
const dir = fixture.path.join(fixture.root, 'output'); fixture.fs.mkdirSync(dir);
fixture.fs.writeFileSync(fixture.path.join(dir, 'wordcraft.wasm'), 'wasm'); fixture.fs.writeFileSync(fixture.path.join(dir, 'extra.js'), 'unexpected');
assert.throws(() => verifyRebuild(dir, { 'wordcraft.wasm': { bytes: 4, sha256: sha256(Buffer.from('wasm')) } }), /unrecorded/);
} finally { fixture.clean(); }
});
test('q248 malformed support hash record refuses', async () => {
const { inspectToolchain } = await import(build.href);
const fixture = await q248Fixture();
try {
fixture.pin.rustSupport[fixture.supportPath].sha256 = 'not-a-hash';
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /support.*pin/);
} finally { fixture.clean(); }
});
test('q248 unreadable executable object refuses', async () => {
const { inspectToolchain } = await import(build.href);
const fixture = await q248Fixture();
try {
fixture.paths.trunk = fixture.root;
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /cannot read.*binary/);
} finally { fixture.clean(); }
});
test('q248 missing compiler support refuses instead of skipping', async () => {
const { inspectToolchain } = await import(build.href);
const fixture = await q248Fixture();
try {
fixture.pin.rustSupport['lib/driver.so'] = Object.values(fixture.pin.rustSupport)[0];
const result = inspectToolchain({ paths: fixture.paths, pin: fixture.pin, env: {} });
assert.equal(result.kind, 'refused'); assert.match(result.reason, /cannot read.*support/);
} finally { fixture.clean(); }
});
test('q248 identical rebuilt artifact bytes are accepted', async () => {
const { verifyRebuild, sha256 } = await import(build.href);
const fixture = await q248Fixture();
try {
const dir = fixture.path.join(fixture.root, 'output'); fixture.fs.mkdirSync(dir);
fixture.fs.writeFileSync(fixture.path.join(dir, 'wordcraft.wasm'), 'wasm');
const expected = { 'wordcraft.wasm': { bytes: 4, sha256: sha256(Buffer.from('wasm')) } };
assert.deepEqual(verifyRebuild(dir, expected), expected);
} finally { fixture.clean(); }
});
for (const [value, status] of [[undefined, 0], ['0', 0], ['1', 3], ['true', 2]]) {
test(`q248 toolchain CLI with no tools and requirement ${String(value)}`, async () => {
const { spawnSync } = await import('node:child_process');
const fixture = await q248Fixture();
try {
const env = { PATH: fixture.path.join(fixture.root, 'absent'), TMPDIR: process.env.TMPDIR };
if (value !== undefined) env.MOSAIC_REQUIRE_WORDCRAFT_BUILD = value;
const result = spawnSync(process.execPath, [build.pathname, '--toolchain'], { env, encoding: 'utf8' });
assert.equal(result.status, status, result.stderr);
if (status === 0) assert.match(result.stdout, /^skip: /);
else assert.match(result.stderr, status === 3 ? /^missing:/ : /MOSAIC_REQUIRE_WORDCRAFT_BUILD/);
} finally { fixture.clean(); }
});
}
test('q248 toolchain CLI refuses changed pinned-version bytes without requirement', async () => {
const { spawnSync } = await import('node:child_process');
const fixture = await q248Fixture();
try {
const pin = JSON.parse(readFileSync(new URL('../wordcraft/toolchain.json', import.meta.url), 'utf8'));
fixture.fs.writeFileSync(fixture.paths.rustc, `#!/bin/sh\nprintf '%s\\n' '${pin.tools.rustc.version}'\n`, { mode: 0o755 });
const result = spawnSync(process.execPath, [build.pathname, '--toolchain'], { env: { PATH: fixture.path.dirname(fixture.paths.rustc) }, encoding: 'utf8' });
assert.equal(result.status, 4, result.stderr); assert.match(result.stderr, /^refused:.*hash/);
} finally { fixture.clean(); }
});
test('q248 unknown CLI operation refuses', async () => {
const { spawnSync } = await import('node:child_process');
const result = spawnSync(process.execPath, [build.pathname, '--not-an-operation'], { env: { PATH: '' }, encoding: 'utf8' });
assert.equal(result.status, 2); assert.match(result.stderr, /usage/);
});
// Next CLEAR: fixture-only source preparation, patching and output packaging.
test('q248 builder prepares the approved source without modifying the imports', async () => {
const builder = await import(build.href);
assert.equal(typeof builder.prepareSourceRoot, 'function');
const fixture = await q248Fixture();
try {
const root = fixture.path.join(fixture.root, 'build'); fixture.fs.mkdirSync(root);
const prepared = builder.prepareSourceRoot(root, { env: { TMPDIR: process.env.TMPDIR } });
assert.equal(prepared.sourceRoot, fixture.path.join(root, 'upstream'));
const lock = fixture.fs.readFileSync(fixture.path.join(prepared.sourceRoot, 'Cargo.lock'));
assert.equal(builder.sha256(lock), '3401363e100783dc70c8f5ba09324947c0b6f8562f1ac1cbbc61a0497200c17f');
const receipt = builder.verifyInputs();
for (const item of receipt.packaging.filterInventory) {
const old = JSON.parse(readFileSync(new URL(`../third_party/wordcraft/cargo-vendor/${item.crate}/.cargo-checksum.json`, import.meta.url), 'utf8'));
const actual = JSON.parse(fixture.fs.readFileSync(fixture.path.join(prepared.vendorRoot, item.crate, '.cargo-checksum.json'), 'utf8'));
const manifest = fixture.fs.readFileSync(fixture.path.join(prepared.vendorRoot, item.crate, 'Cargo.toml'));
assert.equal(actual.files['Cargo.toml'], builder.sha256(manifest));
actual.files['Cargo.toml'] = old.files['Cargo.toml'];
assert.deepEqual(actual, old, 'only the edited Cargo.toml checksum may change');
}
} finally { fixture.clean(); }
});
test('q248 builder refuses a missing explicit scratch TMPDIR', async () => {
const builder = await import(build.href); assert.equal(typeof builder.prepareSourceRoot, 'function');
const fixture = await q248Fixture();
try { assert.throws(() => builder.prepareSourceRoot(fixture.path.join(fixture.root, 'build'), { env: {} }), /TMPDIR/); }
finally { fixture.clean(); }
});
test('q248 builder refuses an output root inside the repository', async () => {
const builder = await import(build.href); assert.equal(typeof builder.prepareSourceRoot, 'function');
assert.throws(() => builder.prepareSourceRoot(new URL('../wordcraft/', import.meta.url).pathname, { env: { TMPDIR: process.env.TMPDIR } }), /repository|scratch|TMPDIR/);
});
test('q248 builder refuses a nonempty build root', async () => {
const builder = await import(build.href); assert.equal(typeof builder.prepareSourceRoot, 'function');
const fixture = await q248Fixture();
try { assert.throws(() => builder.prepareSourceRoot(fixture.root, { env: { TMPDIR: process.env.TMPDIR } }), /empty/); }
finally { fixture.clean(); }
});
test('q248 builder refuses a symlink build root', async () => {
const builder = await import(build.href); assert.equal(typeof builder.prepareSourceRoot, 'function');
const fixture = await q248Fixture();
try {
const target = fixture.path.join(fixture.root, 'target'); fixture.fs.mkdirSync(target);
const link = fixture.path.join(fixture.root, 'link'); fixture.fs.symlinkSync(target, link);
assert.throws(() => builder.prepareSourceRoot(link, { env: { TMPDIR: process.env.TMPDIR } }), /symlink/);
assert.deepEqual(fixture.fs.readdirSync(target), []);
} finally { fixture.clean(); }
});
test('q248 builder refuses ambient ancestor Cargo configuration', async () => {
const builder = await import(build.href); assert.equal(typeof builder.prepareSourceRoot, 'function');
const fixture = await q248Fixture();
try {
fixture.fs.mkdirSync(fixture.path.join(fixture.root, '.cargo'));
fixture.fs.writeFileSync(fixture.path.join(fixture.root, '.cargo/config.toml'), '[build]\nrustflags = ["--cfg unexpected"]\n');
const root = fixture.path.join(fixture.root, 'build'); fixture.fs.mkdirSync(root);
assert.throws(() => builder.prepareSourceRoot(root, { env: { TMPDIR: process.env.TMPDIR } }), /ambient.*Cargo|ancestor.*Cargo/);
} finally { fixture.clean(); }
});
test('q248 patch refuses a mismatched recorded digest before applying', async () => {
const builder = await import(build.href); assert.equal(typeof builder.applySourcePatch, 'function');
const fixture = await q248Fixture();
try {
const patch = Buffer.from('not the pinned patch');
assert.throws(() => builder.applySourcePatch(fixture.root, patch, { bytes: patch.length, sha256: '0'.repeat(64) }, []), /patch.*hash|patch.*digest/);
} finally { fixture.clean(); }
});
test('q248 patch refuses a path outside its recorded input boundary', async () => {
const builder = await import(build.href); assert.equal(typeof builder.applySourcePatch, 'function');
const fixture = await q248Fixture();
try {
const patch = Buffer.from('--- a/../escape\n+++ b/../escape\n@@ -1 +1 @@\n-old\n+new\n');
assert.throws(() => builder.applySourcePatch(fixture.root, patch, { bytes: patch.length, sha256: builder.sha256(patch) }, ['../escape']), /patch.*path|patch.*boundary/);
} finally { fixture.clean(); }
});
test('q248 patch refuses an unrecorded source path', async () => {
const builder = await import(build.href); assert.equal(typeof builder.applySourcePatch, 'function');
const fixture = await q248Fixture();
try {
const patch = Buffer.from('--- a/upstream/unrecorded.txt\n+++ b/upstream/unrecorded.txt\n@@ -1 +1 @@\n-old\n+new\n');
assert.throws(() => builder.applySourcePatch(fixture.root, patch, { bytes: patch.length, sha256: builder.sha256(patch) }, []), /unrecorded/);
} finally { fixture.clean(); }
});
test('q248 patch refuses a patch whose context does not apply', async () => {
const builder = await import(build.href); assert.equal(typeof builder.applySourcePatch, 'function');
const fixture = await q248Fixture();
try {
fixture.fs.mkdirSync(fixture.path.join(fixture.root, 'upstream'));
fixture.fs.writeFileSync(fixture.path.join(fixture.root, 'upstream/file.txt'), 'different\n');
const patch = Buffer.from('--- a/upstream/file.txt\n+++ b/upstream/file.txt\n@@ -1 +1 @@\n-old\n+new\n');
assert.throws(() => builder.applySourcePatch(fixture.root, patch, { bytes: patch.length, sha256: builder.sha256(patch) }, ['upstream/file.txt']), /patch.*apply|patch.*context/);
assert.equal(fixture.fs.readFileSync(fixture.path.join(fixture.root, 'upstream/file.txt'), 'utf8'), 'different\n');
} finally { fixture.clean(); }
});
@@ -0,0 +1,99 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync, existsSync, mkdtempSync, writeFileSync, rmSync } from 'node:fs';
import { join } from 'node:path';
import { tmpdir } from 'node:os';
const build = new URL('../wordcraft/build.mjs', import.meta.url);
test('WordCraft inputs have a verifiable offline source receipt', async () => {
assert.ok(existsSync(build), 'owned verifier must exist');
const { verifyInputs } = await import(build.href);
const report = verifyInputs();
assert.equal(report.upstream.commit, 'e05b7fe86f3b85454000dffc321de638d7009817');
assert.equal(report.packages.filter(p => !p.local && p.edge === 'normal').length, 199);
assert.equal(report.packages.filter(p => !p.local && p.edge === 'build-only').length, 10);
});
test('input verifier refuses altered, missing and unrecorded files', async () => {
assert.ok(existsSync(build), 'owned verifier must exist');
const { verifyTree, sha256 } = await import(build.href);
const dir = mkdtempSync(join(tmpdir(), 'wordcraft-integrity-'));
try {
const receipt = { 'source.rs': { sha256: sha256(Buffer.from('reviewed')), bytes: 8 } };
assert.throws(() => verifyTree(dir, receipt), /missing/);
writeFileSync(join(dir, 'source.rs'), 'changed!');
assert.throws(() => verifyTree(dir, receipt), /hash|digest/);
writeFileSync(join(dir, 'source.rs'), 'reviewed');
verifyTree(dir, receipt);
writeFileSync(join(dir, 'extra.rs'), 'unreviewed');
assert.throws(() => verifyTree(dir, receipt), /unrecorded|unexpected/);
} finally { rmSync(dir, { recursive: true, force: true }); }
});
test('included upstream subset equals the pinned protected git tree', async () => {
const { execFileSync } = await import('node:child_process');
const { createHash } = await import('node:crypto');
const receipt = JSON.parse(readFileSync(new URL('../third_party/wordcraft/PROVENANCE.json', import.meta.url), 'utf8'));
const tree = execFileSync('git', ['-C', '/mnt/storage/src/artcraft/wordcraft', 'ls-tree', '-rz', receipt.upstream.commit], { encoding: 'utf8', maxBuffer: 4 * 1024 * 1024 });
const excluded = new Set(receipt.upstream.excludedPaths);
const expected = new Set(Object.keys(receipt.upstream.files));
for (const line of tree.split('\0').filter(Boolean)) {
const [meta, path] = line.split('\t');
const [mode, type, oid] = meta.split(' ');
assert.equal(type, 'blob');
if (excluded.delete(path)) {
assert.doesNotMatch(path, /license|notice|copyright|copying/i);
continue;
}
assert.ok(expected.delete(path), `unrecorded pinned source ${path}`);
assert.ok(mode === '100644' || mode === '100755', 'plain source file only');
const bytes = readFileSync(new URL(`../third_party/wordcraft/upstream/${path}`, import.meta.url));
const actual = createHash('sha1').update(Buffer.from(`blob ${bytes.length}\0`)).update(bytes).digest('hex');
assert.equal(actual, oid, path);
}
assert.equal(expected.size, 0);
assert.equal(excluded.size, 0);
});
test('q248 imported source inventory is exactly the approved 209 plus 14', async () => {
const receipt = JSON.parse(readFileSync(new URL('../third_party/wordcraft/PROVENANCE.json', import.meta.url), 'utf8'));
assert.equal(receipt.packages.filter(p => !p.local).length, 223);
assert.equal(receipt.packages.filter(p => p.edge === 'resolution-only').length, 14);
assert.equal(Object.keys(receipt.noticePackages).length, 223);
assert.equal(receipt.packaging.prunedLockSha256, '3401363e100783dc70c8f5ba09324947c0b6f8562f1ac1cbbc61a0497200c17f');
const { verifyInputs } = await import(build.href);
assert.equal(verifyInputs().packages.length, 238);
});
test('q248 normal and build dependency closures accept exactly the reviewed identities', async () => {
const builder = await import(build.href);
assert.equal(typeof builder.verifyDependencyClosure, 'function');
const receipt = JSON.parse(readFileSync(new URL('../third_party/wordcraft/PROVENANCE.json', import.meta.url), 'utf8'));
for (const edge of ['normal', 'normal,build']) {
const pairs = receipt.packages.filter(p => p.edge !== 'resolution-only' && (edge === 'normal,build' || p.edge === 'normal')).map(p => [p.name, p.version]);
assert.equal(builder.verifyDependencyClosure(pairs, edge), edge === 'normal' ? 214 : 224);
}
});
test('q248 a new target dependency is refused', async () => {
const builder = await import(build.href);
assert.equal(typeof builder.verifyDependencyClosure, 'function');
const receipt = JSON.parse(readFileSync(new URL('../third_party/wordcraft/PROVENANCE.json', import.meta.url), 'utf8'));
const pairs = receipt.packages.filter(p => p.edge === 'normal').map(p => [p.name, p.version]);
assert.throws(() => builder.verifyDependencyClosure([...pairs, ['unreviewed-crate', '1.0.0']], 'normal'), /closure.*added|added.*closure/);
});
test('q248 a missing target dependency is refused', async () => {
const builder = await import(build.href);
assert.equal(typeof builder.verifyDependencyClosure, 'function');
const receipt = JSON.parse(readFileSync(new URL('../third_party/wordcraft/PROVENANCE.json', import.meta.url), 'utf8'));
const pairs = receipt.packages.filter(p => p.edge === 'normal').map(p => [p.name, p.version]);
assert.throws(() => builder.verifyDependencyClosure(pairs.slice(1), 'normal'), /closure.*missing|missing.*closure/);
});
test('q248 unsupported closure edge refuses', async () => {
const builder = await import(build.href);
assert.equal(typeof builder.verifyDependencyClosure, 'function');
assert.throws(() => builder.verifyDependencyClosure([], 'dev'), /edge/);
});
test('q248 malformed closure identity refuses', async () => {
const { verifyDependencyClosure } = await import(build.href);
assert.throws(() => verifyDependencyClosure([['serde']], 'normal'), /invalid dependency closure/);
});
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1 @@
{"files": {".cargo_vcs_info.json": "daafa1d693ed173c378e2cfb0eb804955b9486e85d2bb7c6606cdc4b5a09dc22", "CHANGELOG.md": "07eb75c37058d9db7df104d09ee69d91c96904d857995eff01f2d8504094a9cd", "Cargo.lock": "85073d64212f2621c6ed6379e7bb5cddddc430c2b79c1c5250e9610bb47ccf30", "Cargo.toml": "cd01e2e0c169f5d6c72fdb42e77cf707608dbbb615455676518eba33e8f5bc02", "Cargo.toml.orig": "02750928b55d11d2110957ae426010243e5bd4a93e6453e2b0ebde1df1d87994", "README.md": "b2bb57a4bb7554d7ec0ce918ba31460d4add9f8a81ac502bc96d7b078297c3a1", "src/geometry.rs": "2f2c37da6a856f1463c593bd2c01d07f237951556c3f72594cb05a2561afa7ed", "src/lib.rs": "da99bad8c05747eee4c1cee0850488c4e61170f7f55cbf6b39e79cd4e4a1acbf"}, "package": "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320"}
@@ -0,0 +1,6 @@
{
"git": {
"sha1": "a55d3e1a18bb9ef0e4bccc9083fb13c3e0ad8969"
},
"path_in_vcs": "common"
}
@@ -0,0 +1,503 @@
# Changelog
## [0.24.1](https://github.com/AccessKit/accesskit/compare/accesskit-v0.24.0...accesskit-v0.24.1) (2026-06-12)
### Bug Fixes
* Update pyo3 dependency to 0.29 ([#724](https://github.com/AccessKit/accesskit/issues/724)) ([c9725e2](https://github.com/AccessKit/accesskit/commit/c9725e2bc2094c68ba152c929fb31d4a09e44af5))
## [0.24.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.23.0...accesskit-v0.24.0) (2026-02-01)
### ⚠ BREAKING CHANGES
* Update minimum supported Rust version to 1.85 ([#683](https://github.com/AccessKit/accesskit/issues/683))
### Bug Fixes
* Update minimum supported Rust version to 1.85 ([#683](https://github.com/AccessKit/accesskit/issues/683)) ([f8c22cb](https://github.com/AccessKit/accesskit/commit/f8c22cbb53ce6b1859adeff3c0b7154ad9e1f25e))
## [0.23.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.22.0...accesskit-v0.23.0) (2026-01-15)
### ⚠ BREAKING CHANGES
* Store text decoration style and color in a struct ([#674](https://github.com/AccessKit/accesskit/issues/674))
* Multiple tree support ([#655](https://github.com/AccessKit/accesskit/issues/655))
### Features
* Multiple tree support ([#655](https://github.com/AccessKit/accesskit/issues/655)) ([c16eb80](https://github.com/AccessKit/accesskit/commit/c16eb80c49d14f39e8a7defb1694bf22b8ceed6f))
### Bug Fixes
* Implement the `active_descendant` property ([#675](https://github.com/AccessKit/accesskit/issues/675)) ([863755d](https://github.com/AccessKit/accesskit/commit/863755d6898c7006a5f49c3661a26cb62d837d1b))
### Code Refactoring
* Store text decoration style and color in a struct ([#674](https://github.com/AccessKit/accesskit/issues/674)) ([c2e8487](https://github.com/AccessKit/accesskit/commit/c2e8487d0a243da0d1c996887fb4c9a7e3beacc7))
## [0.22.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.21.1...accesskit-v0.22.0) (2025-12-23)
### ⚠ BREAKING CHANGES
* Drop the redundant "bold" flag ([#660](https://github.com/AccessKit/accesskit/issues/660))
* Use a proper `Color` struct for the color properties ([#663](https://github.com/AccessKit/accesskit/issues/663))
* Change font size and weight to `f32` ([#662](https://github.com/AccessKit/accesskit/issues/662))
* Drop deprecated roles ([#642](https://github.com/AccessKit/accesskit/issues/642))
* Infrastructure for supporting text formatting changes ([#626](https://github.com/AccessKit/accesskit/issues/626))
### Features
* Add GridCell role ([#643](https://github.com/AccessKit/accesskit/issues/643)) ([1e5abca](https://github.com/AccessKit/accesskit/commit/1e5abca737d1ee942c0804fec2c06d3cb08faa94))
* Implement BrailleLabel and BrailleRoleDescription roles ([#638](https://github.com/AccessKit/accesskit/issues/638)) ([0fdcebb](https://github.com/AccessKit/accesskit/commit/0fdcebb55e308e039ec99fbc31e94e8087a69f2d))
* Rename HeaderAsNonLandmark to SectionHeader, FooterAsNonLandmark to SectionFooter ([#635](https://github.com/AccessKit/accesskit/issues/635)) ([dd69526](https://github.com/AccessKit/accesskit/commit/dd695260877cb862ece4c2b7d8607308f5fed608))
### Bug Fixes
* Actually update schemars to version 1 ([#650](https://github.com/AccessKit/accesskit/issues/650)) ([329cadb](https://github.com/AccessKit/accesskit/commit/329cadba6647d9b8d694033affb19b8bd616aa8b))
* Update schemars dependency to version 1 ([#647](https://github.com/AccessKit/accesskit/issues/647)) ([0efca17](https://github.com/AccessKit/accesskit/commit/0efca176ef892b04edbdf19a12594f9cbcbe9ab3))
### Code Refactoring
* Change font size and weight to `f32` ([#662](https://github.com/AccessKit/accesskit/issues/662)) ([ae0ead8](https://github.com/AccessKit/accesskit/commit/ae0ead825298539f08140b3775f0fdbfc17acd13))
* Drop deprecated roles ([#642](https://github.com/AccessKit/accesskit/issues/642)) ([4d46c27](https://github.com/AccessKit/accesskit/commit/4d46c2740631c5fe4f057707b949d12b26931d0b))
* Drop the redundant "bold" flag ([#660](https://github.com/AccessKit/accesskit/issues/660)) ([5958b2a](https://github.com/AccessKit/accesskit/commit/5958b2a9a91ac0b5e6831380d07f107783201a8b))
* Infrastructure for supporting text formatting changes ([#626](https://github.com/AccessKit/accesskit/issues/626)) ([ea23ec4](https://github.com/AccessKit/accesskit/commit/ea23ec424c7dbb8841e03d71b6a15b74264850a9))
* Use a proper `Color` struct for the color properties ([#663](https://github.com/AccessKit/accesskit/issues/663)) ([922e882](https://github.com/AccessKit/accesskit/commit/922e882a8cd9aa372038fb9c66ff57a557e7888d))
## [0.21.1](https://github.com/AccessKit/accesskit/compare/accesskit-v0.21.0...accesskit-v0.21.1) (2025-10-02)
### Bug Fixes
* Fix clippy warnings introduced in 1.89 ([#606](https://github.com/AccessKit/accesskit/issues/606)) ([b2c07d6](https://github.com/AccessKit/accesskit/commit/b2c07d654a8ce6f01e61a79c91f2f9d5a96afdc9))
* Fix link in `ActionData::ScrollHint` documentation ([#598](https://github.com/AccessKit/accesskit/issues/598)) ([28b82e9](https://github.com/AccessKit/accesskit/commit/28b82e9941b10ac0643201b9b3989f0184346216))
* Update pyo3 to 0.26 ([#620](https://github.com/AccessKit/accesskit/issues/620)) ([61e9dcc](https://github.com/AccessKit/accesskit/commit/61e9dccb2c2e035463593aacbac7ae25573a9006))
## [0.21.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.20.0...accesskit-v0.21.0) (2025-07-16)
### ⚠ BREAKING CHANGES
* Implement refactored `ScrollIntoView` action across desktop platforms ([#594](https://github.com/AccessKit/accesskit/issues/594))
### Features
* Implement refactored `ScrollIntoView` action across desktop platforms ([#594](https://github.com/AccessKit/accesskit/issues/594)) ([1d9b74c](https://github.com/AccessKit/accesskit/commit/1d9b74c057051509b3ffbf63afeacfb16f544ff8))
* Let parents declare actions supported on their children ([#593](https://github.com/AccessKit/accesskit/issues/593)) ([70b534b](https://github.com/AccessKit/accesskit/commit/70b534bed168a84b84cc35199588aa8ab784fb43))
## [0.20.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.19.0...accesskit-v0.20.0) (2025-06-26)
### ⚠ BREAKING CHANGES
* Refactor actions for scrolling by discrete units ([#573](https://github.com/AccessKit/accesskit/issues/573))
### Bug Fixes
* impl `From<bool>` for `Toggled` ([#585](https://github.com/AccessKit/accesskit/issues/585)) ([d38776a](https://github.com/AccessKit/accesskit/commit/d38776a014744db849edbfc9e0a7d0378709ed4b))
* Resolve new clippy warning about using variables directly in format strings ([#590](https://github.com/AccessKit/accesskit/issues/590)) ([ccc62b7](https://github.com/AccessKit/accesskit/commit/ccc62b7f1dd32f0c372ba127a1e65c377048f670))
### Code Refactoring
* Refactor actions for scrolling by discrete units ([#573](https://github.com/AccessKit/accesskit/issues/573)) ([fad11a1](https://github.com/AccessKit/accesskit/commit/fad11a1b66340e7be6b2eb00dfd07004451a17eb))
## [0.19.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.18.0...accesskit-v0.19.0) (2025-05-06)
### ⚠ BREAKING CHANGES
* Drop redundant `HasPopup::True` ([#550](https://github.com/AccessKit/accesskit/issues/550))
* Drop unused `Node::is_linked` ([#545](https://github.com/AccessKit/accesskit/issues/545))
* Drop `FrozenNode` ([#496](https://github.com/AccessKit/accesskit/issues/496))
### Bug Fixes
* Improve `NodeId`'s debug representation ([#547](https://github.com/AccessKit/accesskit/issues/547)) ([a47bca1](https://github.com/AccessKit/accesskit/commit/a47bca1e376de7b0a22a7dfe6c23dedad315c449))
* Update pyo3 to 0.24 ([#544](https://github.com/AccessKit/accesskit/issues/544)) ([6338e45](https://github.com/AccessKit/accesskit/commit/6338e45097662bf39994e19a09054c20cb2ee782))
### Code Refactoring
* Drop `FrozenNode` ([#496](https://github.com/AccessKit/accesskit/issues/496)) ([f8c0d0a](https://github.com/AccessKit/accesskit/commit/f8c0d0a6fc9613cf1a2a6d8cfba11ebc892dfeb8))
* Drop redundant `HasPopup::True` ([#550](https://github.com/AccessKit/accesskit/issues/550)) ([56abf17](https://github.com/AccessKit/accesskit/commit/56abf17356e4c7f13f64aaeaca6a63c8f7ede553))
* Drop unused `Node::is_linked` ([#545](https://github.com/AccessKit/accesskit/issues/545)) ([3aab4ac](https://github.com/AccessKit/accesskit/commit/3aab4ac6f0193b8a06d7962f933582a4dbdf0c98))
## [0.18.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.17.1...accesskit-v0.18.0) (2025-03-06)
### ⚠ BREAKING CHANGES
* Drop `Tree::app_name` ([#492](https://github.com/AccessKit/accesskit/issues/492))
### Features
* Android adapter ([#500](https://github.com/AccessKit/accesskit/issues/500)) ([7e65ac7](https://github.com/AccessKit/accesskit/commit/7e65ac77d7e108ac5b9f3722f488a2fdf2e3b3e0))
### Bug Fixes
* Update pyo3 to 0.23 ([#512](https://github.com/AccessKit/accesskit/issues/512)) ([93d3a27](https://github.com/AccessKit/accesskit/commit/93d3a27ac4af60eef4a1faf26392a6f7ff69cf81))
### Code Refactoring
* Drop `Tree::app_name` ([#492](https://github.com/AccessKit/accesskit/issues/492)) ([089794c](https://github.com/AccessKit/accesskit/commit/089794c8f74957e91a19ae3df508e2a892f39ebc))
## [0.17.1](https://github.com/AccessKit/accesskit/compare/accesskit-v0.17.0...accesskit-v0.17.1) (2024-11-23)
### Bug Fixes
* Fix some broken links in the documentation ([#484](https://github.com/AccessKit/accesskit/issues/484)) ([0a51225](https://github.com/AccessKit/accesskit/commit/0a5122561c6f6aca5cf802464220056d763040f8))
## [0.17.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.16.3...accesskit-v0.17.0) (2024-10-31)
### ⚠ BREAKING CHANGES
* Drop the `is_hovered` property ([#479](https://github.com/AccessKit/accesskit/issues/479))
* Rename `name` to `label` and use `value` for label content ([#475](https://github.com/AccessKit/accesskit/issues/475))
* Rename `NodeBuilder` to `Node` and the old `Node` to `FrozenNode` ([#476](https://github.com/AccessKit/accesskit/issues/476))
* Rename `Role::InlineTextBox` to `TextRun` ([#473](https://github.com/AccessKit/accesskit/issues/473))
* Drop `DefaultActionVerb` ([#472](https://github.com/AccessKit/accesskit/issues/472))
* Make the core crate no-std ([#468](https://github.com/AccessKit/accesskit/issues/468))
### Features
* Make the core crate no-std ([#468](https://github.com/AccessKit/accesskit/issues/468)) ([2fa0d3f](https://github.com/AccessKit/accesskit/commit/2fa0d3f5b2b7ac11ef1751c133706f29e548bd6d))
### Bug Fixes
* Drop the `is_hovered` property ([#479](https://github.com/AccessKit/accesskit/issues/479)) ([95dfdb6](https://github.com/AccessKit/accesskit/commit/95dfdb6c88f7d705f6a7283cb8524168a9f542b2))
### Code Refactoring
* Drop `DefaultActionVerb` ([#472](https://github.com/AccessKit/accesskit/issues/472)) ([ef3b003](https://github.com/AccessKit/accesskit/commit/ef3b0038224459094f650368412650bc3b69526b))
* Rename `name` to `label` and use `value` for label content ([#475](https://github.com/AccessKit/accesskit/issues/475)) ([e0053a5](https://github.com/AccessKit/accesskit/commit/e0053a5399929e8e0d4f07aa18de604ed8766ace))
* Rename `NodeBuilder` to `Node` and the old `Node` to `FrozenNode` ([#476](https://github.com/AccessKit/accesskit/issues/476)) ([7d8910e](https://github.com/AccessKit/accesskit/commit/7d8910e35f7bc0543724cc124941a3bd0304bcc0))
* Rename `Role::InlineTextBox` to `TextRun` ([#473](https://github.com/AccessKit/accesskit/issues/473)) ([29fa341](https://github.com/AccessKit/accesskit/commit/29fa34125a811bd3a0f9da579a9f35c9da90bf29))
## [0.16.3](https://github.com/AccessKit/accesskit/compare/accesskit-v0.16.2...accesskit-v0.16.3) (2024-10-08)
### Bug Fixes
* Eliminate duplicate definitions ([#461](https://github.com/AccessKit/accesskit/issues/461)) ([59826d4](https://github.com/AccessKit/accesskit/commit/59826d4500ddfe880181f7087f9fe83ff2209fc4))
## [0.16.2](https://github.com/AccessKit/accesskit/compare/accesskit-v0.16.1...accesskit-v0.16.2) (2024-10-07)
### Bug Fixes
* Don't use a macro to generate Action debug helper function ([#459](https://github.com/AccessKit/accesskit/issues/459)) ([ed1fb73](https://github.com/AccessKit/accesskit/commit/ed1fb7370780c9dd15028cdfd13e2065642bf490))
* Update minimum supported Rust version to 1.75 ([#457](https://github.com/AccessKit/accesskit/issues/457)) ([fc622fe](https://github.com/AccessKit/accesskit/commit/fc622fe7657c80a4eedad6f6cded11d2538b54d5))
## [0.16.1](https://github.com/AccessKit/accesskit/compare/accesskit-v0.16.0...accesskit-v0.16.1) (2024-09-24)
### Bug Fixes
* Improve debug representation of `Node` and `NodeBuilder` ([#452](https://github.com/AccessKit/accesskit/issues/452)) ([119aa1d](https://github.com/AccessKit/accesskit/commit/119aa1dca8fe734112ecbd59568c876b336ccb6c))
## [0.16.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.15.0...accesskit-v0.16.0) (2024-06-29)
### ⚠ BREAKING CHANGES
* Optimize serialization and make it compatible with more data formats ([#437](https://github.com/AccessKit/accesskit/issues/437))
* Rename the `StaticText` role to `Label` ([#434](https://github.com/AccessKit/accesskit/issues/434))
### Code Refactoring
* Optimize serialization and make it compatible with more data formats ([#437](https://github.com/AccessKit/accesskit/issues/437)) ([5a80d3a](https://github.com/AccessKit/accesskit/commit/5a80d3ae46cfe85780d4900f4fa9f4feaba52053))
* Rename the `StaticText` role to `Label` ([#434](https://github.com/AccessKit/accesskit/issues/434)) ([7086bc0](https://github.com/AccessKit/accesskit/commit/7086bc0fad446d3ed4a0fd5eff641a1e75f6c599))
## [0.15.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.14.0...accesskit-v0.15.0) (2024-06-09)
### Features
* Add `author_id` property ([#424](https://github.com/AccessKit/accesskit/issues/424)) ([0d1c56f](https://github.com/AccessKit/accesskit/commit/0d1c56f0bdde58715e1c69f6015df600cb7cb8c1))
### Bug Fixes
* Add explicit cargo features for `enumn` and `pyo3` ([#425](https://github.com/AccessKit/accesskit/issues/425)) ([71ad45b](https://github.com/AccessKit/accesskit/commit/71ad45be1651409ee6918cf835b656e6b5e0fe2d))
## [0.14.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.13.0...accesskit-v0.14.0) (2024-04-30)
### ⚠ BREAKING CHANGES
* Clean up table roles and properties ([#393](https://github.com/AccessKit/accesskit/issues/393))
* Drop `SortDirection::Unsorted` ([#391](https://github.com/AccessKit/accesskit/issues/391))
* Rename `hierarchical_level` to `level` ([#390](https://github.com/AccessKit/accesskit/issues/390))
* Drop `NodeClassSet` ([#389](https://github.com/AccessKit/accesskit/issues/389))
* Rename `Checked` to `Toggled`; drop `ToggleButton` role ([#388](https://github.com/AccessKit/accesskit/issues/388))
### Features
* Add the `owns` relation ([#392](https://github.com/AccessKit/accesskit/issues/392)) ([fd668dd](https://github.com/AccessKit/accesskit/commit/fd668ddc4b64cb05ab3600972b3d3823a037f2d5))
### Bug Fixes
* Increase minimum supported Rust version to `1.70` ([#396](https://github.com/AccessKit/accesskit/issues/396)) ([a8398b8](https://github.com/AccessKit/accesskit/commit/a8398b847aa003de91042ac45e33126fc2cae053))
### Code Refactoring
* Clean up table roles and properties ([#393](https://github.com/AccessKit/accesskit/issues/393)) ([e34dad9](https://github.com/AccessKit/accesskit/commit/e34dad94448a5321ece9def3f2e054aa5f62dd79))
* Drop `NodeClassSet` ([#389](https://github.com/AccessKit/accesskit/issues/389)) ([1b153ed](https://github.com/AccessKit/accesskit/commit/1b153ed51f8421cdba2dc98beca2e8f5f8c781bc))
* Drop `SortDirection::Unsorted` ([#391](https://github.com/AccessKit/accesskit/issues/391)) ([b86f484](https://github.com/AccessKit/accesskit/commit/b86f484b7e6645e63362896b744a71ec758f810d))
* Rename `Checked` to `Toggled`; drop `ToggleButton` role ([#388](https://github.com/AccessKit/accesskit/issues/388)) ([6bc040b](https://github.com/AccessKit/accesskit/commit/6bc040b7cf75cdbd6a019cc380d8dbce804b3c81))
* Rename `hierarchical_level` to `level` ([#390](https://github.com/AccessKit/accesskit/issues/390)) ([2d61e01](https://github.com/AccessKit/accesskit/commit/2d61e01fffff1265b348c141715f6f9b6fe4081b))
## [0.13.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.12.3...accesskit-v0.13.0) (2024-04-14)
### ⚠ BREAKING CHANGES
* New approach to lazy initialization ([#375](https://github.com/AccessKit/accesskit/issues/375))
### Code Refactoring
* New approach to lazy initialization ([#375](https://github.com/AccessKit/accesskit/issues/375)) ([9baebdc](https://github.com/AccessKit/accesskit/commit/9baebdceed7300389b6768815d7ae48f1ce401e4))
## [0.12.3](https://github.com/AccessKit/accesskit/compare/accesskit-v0.12.2...accesskit-v0.12.3) (2024-03-07)
### Bug Fixes
* Derive `PartialOrd` and `Ord` on `NodeId` ([#363](https://github.com/AccessKit/accesskit/issues/363)) ([ce3bba1](https://github.com/AccessKit/accesskit/commit/ce3bba1e043d650c406d8814b4f33e9104199c8b))
* Make `NodeClassSet::new` const ([#368](https://github.com/AccessKit/accesskit/issues/368)) ([11d2968](https://github.com/AccessKit/accesskit/commit/11d2968464d50c3e3f55e9a872d0d454c19e7e51))
## [0.12.2](https://github.com/AccessKit/accesskit/compare/accesskit-v0.12.1...accesskit-v0.12.2) (2024-01-03)
### Bug Fixes
* Bump pyo3; add `rename_all` attribute to enums ([#330](https://github.com/AccessKit/accesskit/issues/330)) ([5a4c6f3](https://github.com/AccessKit/accesskit/commit/5a4c6f399837d67b066451a8fb4d43d03c8acb8b))
* Document the `role_description` node property ([#331](https://github.com/AccessKit/accesskit/issues/331)) ([936fa2c](https://github.com/AccessKit/accesskit/commit/936fa2c23190c5d7cd4eb880612295785a009721))
## [0.12.1](https://github.com/AccessKit/accesskit/compare/accesskit-v0.12.0...accesskit-v0.12.1) (2023-11-04)
### Bug Fixes
* Add missing semicolons when not returning anything ([#303](https://github.com/AccessKit/accesskit/issues/303)) ([38d4de1](https://github.com/AccessKit/accesskit/commit/38d4de1442247e701047d75122a9638a2ed99b1f))
## [0.12.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.11.2...accesskit-v0.12.0) (2023-09-27)
### ⚠ BREAKING CHANGES
* Allow providing app_name, toolkit_name and toolkit_version in Tree, remove parameters from unix adapter constructor ([#291](https://github.com/AccessKit/accesskit/issues/291))
* Make `ActionHandler::do_action` take `&mut self` ([#296](https://github.com/AccessKit/accesskit/issues/296))
* Clean up roles and properties ([#289](https://github.com/AccessKit/accesskit/issues/289))
* Drop next/previous focus properties ([#288](https://github.com/AccessKit/accesskit/issues/288))
* Drop `Tree::root_scroller` ([#279](https://github.com/AccessKit/accesskit/issues/279))
* Decouple in-tree focus from host window/view focus ([#278](https://github.com/AccessKit/accesskit/issues/278))
* Switch to simple unsigned 64-bit integer for node IDs ([#276](https://github.com/AccessKit/accesskit/issues/276))
### Features
* Add role for terminals ([#282](https://github.com/AccessKit/accesskit/issues/282)) ([ddbef37](https://github.com/AccessKit/accesskit/commit/ddbef37158b57f56217317b480e40d58f83a9c24))
* Allow providing app_name, toolkit_name and toolkit_version in Tree, remove parameters from unix adapter constructor ([#291](https://github.com/AccessKit/accesskit/issues/291)) ([5313860](https://github.com/AccessKit/accesskit/commit/531386023257150f49b5e4be942f359855fb7cb6))
### Bug Fixes
* Drop `Tree::root_scroller` ([#279](https://github.com/AccessKit/accesskit/issues/279)) ([fc6c4e0](https://github.com/AccessKit/accesskit/commit/fc6c4e0091d5b257a3869a468fca144a1453cebc))
* Drop next/previous focus properties ([#288](https://github.com/AccessKit/accesskit/issues/288)) ([d35c7c1](https://github.com/AccessKit/accesskit/commit/d35c7c149a650dfedf1b031c0668adad585659fa))
* Support the pyo3 crate in all public enums ([#270](https://github.com/AccessKit/accesskit/issues/270)) ([9b12d0c](https://github.com/AccessKit/accesskit/commit/9b12d0c3d828d4c847510b611d891872c4666984))
### Code Refactoring
* Clean up roles and properties ([#289](https://github.com/AccessKit/accesskit/issues/289)) ([4fc9c55](https://github.com/AccessKit/accesskit/commit/4fc9c55c91812472593923d93ff89d75ff305ee4))
* Decouple in-tree focus from host window/view focus ([#278](https://github.com/AccessKit/accesskit/issues/278)) ([d360d20](https://github.com/AccessKit/accesskit/commit/d360d20cf951e7643b81a5303006c9f7daa5bd56))
* Make `ActionHandler::do_action` take `&mut self` ([#296](https://github.com/AccessKit/accesskit/issues/296)) ([4fc7846](https://github.com/AccessKit/accesskit/commit/4fc7846d732d61fb45c023060ebab96801a0053e))
* Switch to simple unsigned 64-bit integer for node IDs ([#276](https://github.com/AccessKit/accesskit/issues/276)) ([3eadd48](https://github.com/AccessKit/accesskit/commit/3eadd48ec47854faa94a94ebf910ec08f514642f))
## [0.11.2](https://github.com/AccessKit/accesskit/compare/accesskit-v0.11.1...accesskit-v0.11.2) (2023-08-08)
### Bug Fixes
* Support the enumn crate in all public enums ([#264](https://github.com/AccessKit/accesskit/issues/264)) ([b9b3cd1](https://github.com/AccessKit/accesskit/commit/b9b3cd18fccdd6526fb4f58c13eb91599452a3d6))
## [0.11.1](https://github.com/AccessKit/accesskit/compare/accesskit-v0.11.0...accesskit-v0.11.1) (2023-07-30)
### Bug Fixes
* Fix broken intra-doc-link. ([#262](https://github.com/AccessKit/accesskit/issues/262)) ([63c1715](https://github.com/AccessKit/accesskit/commit/63c17152d1eb8ae6ff19c2bc4a6756372bc490c2))
## [0.11.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.10.1...accesskit-v0.11.0) (2023-03-29)
### Features
* Add C bindings ([#230](https://github.com/AccessKit/accesskit/issues/230)) ([7f7f4c7](https://github.com/AccessKit/accesskit/commit/7f7f4c755890ab8210a5a8bf8e237ba6a51dd205))
## [0.10.1](https://github.com/AccessKit/accesskit/compare/accesskit-v0.10.0...accesskit-v0.10.1) (2023-02-20)
### Bug Fixes
* Set appropriate representations on all public types that will be exposed via FFI ([54e82f6](https://github.com/AccessKit/accesskit/commit/54e82f673f5c7b46d9077fe5f946305800862bf0))
## [0.10.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.9.0...accesskit-v0.10.0) (2023-02-12)
### ⚠ BREAKING CHANGES
* Move thread synchronization into platform adapters; drop parking_lot ([#212](https://github.com/AccessKit/accesskit/issues/212))
### Code Refactoring
* Move thread synchronization into platform adapters; drop parking_lot ([#212](https://github.com/AccessKit/accesskit/issues/212)) ([5df52e5](https://github.com/AccessKit/accesskit/commit/5df52e5545faddf6a51905409013c2f5be23981e))
## [0.9.0](https://github.com/AccessKit/accesskit/compare/accesskit-v0.8.1...accesskit-v0.9.0) (2023-02-05)
### ⚠ BREAKING CHANGES
* Make `Node` opaque and optimize it for size ([#205](https://github.com/AccessKit/accesskit/issues/205))
### Code Refactoring
* Make `Node` opaque and optimize it for size ([#205](https://github.com/AccessKit/accesskit/issues/205)) ([4811152](https://github.com/AccessKit/accesskit/commit/48111521439b76c1a8687418a4b20f9b705eac6d))
## [0.8.1](https://github.com/AccessKit/accesskit/compare/accesskit-v0.8.0...accesskit-v0.8.1) (2022-12-04)
### Documentation
* Fix outdated documentation for `TreeUpdate` ([#182](https://github.com/AccessKit/accesskit/issues/182)) ([dd658c7](https://github.com/AccessKit/accesskit/commit/dd658c70df55b2234a0346220362b0b9a40bb41d))
## [0.8.0](https://www.github.com/AccessKit/accesskit/compare/accesskit-v0.7.0...accesskit-v0.8.0) (2022-11-17)
### ⚠ BREAKING CHANGES
* Be opinionated about coordinates after all (#151)
### Code Refactoring
* Be opinionated about coordinates after all ([#151](https://www.github.com/AccessKit/accesskit/issues/151)) ([91a29a1](https://www.github.com/AccessKit/accesskit/commit/91a29a1bf99bca39e9a00a744025533924e45190))
## [0.7.0](https://www.github.com/AccessKit/accesskit/compare/accesskit-v0.6.1...accesskit-v0.7.0) (2022-11-11)
### ⚠ BREAKING CHANGES
* Text range support (#145)
* Drop the `ignored` field and implement generic filtered tree traversal (#143)
### Features
* Text range support ([#145](https://www.github.com/AccessKit/accesskit/issues/145)) ([455e6f7](https://www.github.com/AccessKit/accesskit/commit/455e6f73bc058644d299c06eeeda9cc4cbe8844f))
### Code Refactoring
* Drop the `ignored` field and implement generic filtered tree traversal ([#143](https://www.github.com/AccessKit/accesskit/issues/143)) ([a4befe6](https://www.github.com/AccessKit/accesskit/commit/a4befe6e8a5afbe4a52dfd09eb87fdf2078d6c1d))
### [0.6.1](https://www.github.com/AccessKit/accesskit/compare/accesskit-v0.6.0...accesskit-v0.6.1) (2022-10-10)
### Bug Fixes
* **common:** Restore compatibility with Rust 1.61 ([#139](https://www.github.com/AccessKit/accesskit/issues/139)) ([d8c6b16](https://www.github.com/AccessKit/accesskit/commit/d8c6b166c83796bfd6d748df60136029a9ec81d2))
## [0.6.0](https://www.github.com/AccessKit/accesskit/compare/accesskit-v0.5.1...accesskit-v0.6.0) (2022-10-09)
### ⚠ BREAKING CHANGES
* Wrap `TreeUpdate` nodes in `Arc` (#135)
* Store node ID in `TreeUpdate`, not `accesskit::Node` (#132)
### Bug Fixes
* Don't try to optimize tree updates with unchanged nodes ([#138](https://www.github.com/AccessKit/accesskit/issues/138)) ([7721719](https://www.github.com/AccessKit/accesskit/commit/7721719fb0ab90bf41cc30dd0469c7de90228fe9))
### Code Refactoring
* Store node ID in `TreeUpdate`, not `accesskit::Node` ([#132](https://www.github.com/AccessKit/accesskit/issues/132)) ([0bb86dd](https://www.github.com/AccessKit/accesskit/commit/0bb86ddb298cb5a253a91f07be0bad8b84b2fda3))
* Wrap `TreeUpdate` nodes in `Arc` ([#135](https://www.github.com/AccessKit/accesskit/issues/135)) ([907bc18](https://www.github.com/AccessKit/accesskit/commit/907bc1820b80d95833b6c5c3acaa2a8a4e93a6c2))
### [0.5.1](https://www.github.com/AccessKit/accesskit/compare/accesskit-v0.5.0...accesskit-v0.5.1) (2022-10-03)
### Bug Fixes
* **common:** Write a README specifically for the accesskit crate ([#130](https://www.github.com/AccessKit/accesskit/issues/130)) ([0c2f5cf](https://www.github.com/AccessKit/accesskit/commit/0c2f5cf71bdacf3142bff77defea36eeb2b4e1e9)), closes [#129](https://www.github.com/AccessKit/accesskit/issues/129)
## [0.5.0](https://www.github.com/AccessKit/accesskit/compare/accesskit-v0.4.0...accesskit-v0.5.0) (2022-09-23)
### ⚠ BREAKING CHANGES
* Basic live regions (#128)
### Features
* Basic live regions ([#128](https://www.github.com/AccessKit/accesskit/issues/128)) ([03d745b](https://www.github.com/AccessKit/accesskit/commit/03d745b891147175bde2693cc10b96a2f6e31f39))
### Bug Fixes
* **common:** Enable the serde feature when the schemars feature is turned on ([#122](https://www.github.com/AccessKit/accesskit/issues/122)) ([126b6e1](https://www.github.com/AccessKit/accesskit/commit/126b6e13294bee2b4c905a78147b49d763a61d05))
* **common:** Skip `ActionRequest::data` if it is `None` during serialization ([#123](https://www.github.com/AccessKit/accesskit/issues/123)) ([2d88ea8](https://www.github.com/AccessKit/accesskit/commit/2d88ea8518c99692beacfb955ef0bd4f388a4908))
## [0.4.0](https://www.github.com/AccessKit/accesskit/compare/accesskit-v0.3.0...accesskit-v0.4.0) (2022-07-22)
### ⚠ BREAKING CHANGES
* String indices are always in UTF-8 code units (#114)
* Drop unused tree IDs (#113)
* Switch to NonZeroU128 for NodeIDs (#99)
### Features
* **common:** Conversion from `NonZeroU64` to `NodeId` ([#112](https://www.github.com/AccessKit/accesskit/issues/112)) ([b7adfb9](https://www.github.com/AccessKit/accesskit/commit/b7adfb906cb09107be71a148b5199ba87df2a6b3))
### Bug Fixes
* **common:** Various documentation fixes and improvements ([#111](https://www.github.com/AccessKit/accesskit/issues/111)) ([4d27234](https://www.github.com/AccessKit/accesskit/commit/4d27234195e96de65bf55869877405cb5e45f6fc))
* Migrate to 2021 edition ([#115](https://www.github.com/AccessKit/accesskit/issues/115)) ([f2333c8](https://www.github.com/AccessKit/accesskit/commit/f2333c8ce17d46aab6fc190338ab4cfcf8569f9e))
* Switch to NonZeroU128 for NodeIDs ([#99](https://www.github.com/AccessKit/accesskit/issues/99)) ([25a1a52](https://www.github.com/AccessKit/accesskit/commit/25a1a52c4562b163bfcc8c625a233c00a41aacf2))
### Code Refactoring
* Drop unused tree IDs ([#113](https://www.github.com/AccessKit/accesskit/issues/113)) ([ca60770](https://www.github.com/AccessKit/accesskit/commit/ca607702cee13c93fe538d2faec88e474261f7ab))
* String indices are always in UTF-8 code units ([#114](https://www.github.com/AccessKit/accesskit/issues/114)) ([386ca0a](https://www.github.com/AccessKit/accesskit/commit/386ca0a89c42fd201843f617b2fd6b6d1de77f59))
## [0.3.0](https://www.github.com/AccessKit/accesskit/compare/accesskit-v0.2.0...accesskit-v0.3.0) (2021-12-29)
### ⚠ BREAKING CHANGES
* Drop `TreeUpdate::clear` (#96)
### Code Refactoring
* Drop `TreeUpdate::clear` ([#96](https://www.github.com/AccessKit/accesskit/issues/96)) ([38f520b](https://www.github.com/AccessKit/accesskit/commit/38f520b960c6db7b3927b369aee206ee6bc5e8aa))
@@ -0,0 +1,281 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "accesskit"
version = "0.24.1"
dependencies = [
"enumn",
"pyo3",
"schemars",
"serde",
"serde_json",
"uuid",
]
[[package]]
name = "dyn-clone"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
[[package]]
name = "enumn"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "heck"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "itoa"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
[[package]]
name = "libc"
version = "0.2.169"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
[[package]]
name = "memchr"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "once_cell"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "portable-atomic"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2"
[[package]]
name = "proc-macro2"
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
"unicode-ident",
]
[[package]]
name = "pyo3"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
dependencies = [
"libc",
"once_cell",
"portable-atomic",
"pyo3-build-config",
"pyo3-ffi",
"pyo3-macros",
]
[[package]]
name = "pyo3-build-config"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
dependencies = [
"target-lexicon",
]
[[package]]
name = "pyo3-ffi"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
dependencies = [
"libc",
"pyo3-build-config",
]
[[package]]
name = "pyo3-macros"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
dependencies = [
"proc-macro2",
"pyo3-macros-backend",
"quote",
"syn",
]
[[package]]
name = "pyo3-macros-backend"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
dependencies = [
"heck",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "quote"
version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
dependencies = [
"proc-macro2",
]
[[package]]
name = "ref-cast"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
dependencies = [
"ref-cast-impl",
]
[[package]]
name = "ref-cast-impl"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "ryu"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
[[package]]
name = "schemars"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289"
dependencies = [
"dyn-clone",
"ref-cast",
"schemars_derive",
"serde",
"serde_json",
"uuid",
]
[[package]]
name = "schemars_derive"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "301858a4023d78debd2353c7426dc486001bddc91ae31a76fb1f55132f7e2633"
dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
"syn",
]
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_derive_internals"
version = "0.29.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.145"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
"serde_core",
]
[[package]]
name = "syn"
version = "2.0.87"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "target-lexicon"
version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
[[package]]
name = "unicode-ident"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
[[package]]
name = "uuid"
version = "1.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
dependencies = [
"serde",
]
@@ -0,0 +1,89 @@
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
#
# When uploading crates to the registry Cargo will automatically
# "normalize" Cargo.toml files for maximal compatibility
# with all versions of Cargo and also rewrite `path` dependencies
# to registry (e.g., crates.io) dependencies.
#
# If you are reading this file be aware that the original Cargo.toml
# will likely look very different (and much more reasonable).
# See Cargo.toml.orig for the original contents.
[package]
edition = "2024"
rust-version = "1.85"
name = "accesskit"
version = "0.24.1"
authors = ["The AccessKit contributors"]
build = false
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "UI accessibility infrastructure across platforms"
readme = "README.md"
keywords = [
"gui",
"ui",
"accessibility",
]
categories = ["gui"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/AccessKit/accesskit"
resolver = "2"
[package.metadata.docs.rs]
features = [
"schemars",
"serde",
]
[features]
enumn = ["dep:enumn"]
pyo3 = ["dep:pyo3"]
schemars = [
"dep:schemars",
"dep:serde_json",
"serde",
"schemars/uuid1",
]
serde = [
"dep:serde",
"enumn",
"uuid/serde",
]
[lib]
name = "accesskit"
path = "src/lib.rs"
[dependencies.enumn]
version = "0.1.6"
optional = true
[dependencies.pyo3]
version = "0.29"
optional = true
[dependencies.schemars]
version = "1"
optional = true
[dependencies.serde]
version = "1.0"
features = [
"alloc",
"derive",
]
optional = true
default-features = false
[dependencies.serde_json]
version = "1.0"
optional = true
default-features = false
[dependencies.uuid]
version = "1"
default-features = false
@@ -0,0 +1,30 @@
[package]
name = "accesskit"
version = "0.24.1"
authors.workspace = true
license.workspace = true
description = "UI accessibility infrastructure across platforms"
categories.workspace = true
keywords = ["gui", "ui", "accessibility"]
repository.workspace = true
readme = "README.md"
edition.workspace = true
rust-version.workspace = true
[package.metadata.docs.rs]
features = ["schemars", "serde"]
[dependencies]
enumn = { version = "0.1.6", optional = true }
pyo3 = { version = "0.29", optional = true }
schemars = { version = "1", optional = true }
serde = { version = "1.0", default-features = false, features = ["alloc", "derive"], optional = true }
serde_json = { version = "1.0", default-features = false, optional = true }
uuid = { version = "1", default-features = false }
[features]
enumn = ["dep:enumn"]
pyo3 = ["dep:pyo3"]
serde = ["dep:serde", "enumn", "uuid/serde"]
schemars = ["dep:schemars", "dep:serde_json", "serde", "schemars/uuid1"]
@@ -0,0 +1,13 @@
# AccessKit
This is the shared cross-platform crate for [AccessKit](https://accesskit.dev/). It defines the data structures that represent an accessibility tree, and the trait for handling action requests from assistive technologies.
To use AccessKit in your application or toolkit, you will also need a platform adapter. The following platform adapters are currently available:
* [accesskit_windows](https://crates.io/crates/accesskit_windows): exposes an AccessKit tree on Windows using the UI Automation API
* [accesskit_macos](https://crates.io/crates/accesskit_macos): exposes an AccessKit tree on MacOS through the Cocoa `NSAccessibility` protocol
* [accesskit_unix](https://crates.io/crates/accesskit_unix): exposes an AccessKit tree on Linux and Unix systems through the AT-SPI protocol
* [accesskit_android](https://crates.io/crates/accesskit_android): exposes an AccessKit tree on Android through the Java-based Android accessibility API
* [accesskit_winit](https://crates.io/crates/accesskit_winit): wraps other platform adapters for use with the [winit](https://crates.io/crates/winit) windowing library
Some platform adapters include simple examples.
@@ -0,0 +1,866 @@
// Copyright 2023 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
// Derived from kurbo.
// Copyright 2018 The kurbo Authors.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
use core::{
fmt,
ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign},
};
/// A 2D affine transform. Derived from [kurbo](https://github.com/linebender/kurbo).
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(C)]
pub struct Affine([f64; 6]);
impl Affine {
/// The identity transform.
pub const IDENTITY: Affine = Affine::scale(1.0);
/// A transform that is flipped on the y-axis. Useful for converting between
/// y-up and y-down spaces.
pub const FLIP_Y: Affine = Affine::new([1.0, 0., 0., -1.0, 0., 0.]);
/// A transform that is flipped on the x-axis.
pub const FLIP_X: Affine = Affine::new([-1.0, 0., 0., 1.0, 0., 0.]);
/// Construct an affine transform from coefficients.
///
/// If the coefficients are `(a, b, c, d, e, f)`, then the resulting
/// transformation represents this augmented matrix:
///
/// ```text
/// | a c e |
/// | b d f |
/// | 0 0 1 |
/// ```
///
/// Note that this convention is transposed from PostScript and
/// Direct2D, but is consistent with the
/// [Wikipedia](https://en.wikipedia.org/wiki/Affine_transformation)
/// formulation of affine transformation as augmented matrix. The
/// idea is that `(A * B) * v == A * (B * v)`, where `*` is the
/// [`Mul`](core::ops::Mul) trait.
#[inline]
pub const fn new(c: [f64; 6]) -> Affine {
Affine(c)
}
/// An affine transform representing uniform scaling.
#[inline]
pub const fn scale(s: f64) -> Affine {
Affine([s, 0.0, 0.0, s, 0.0, 0.0])
}
/// An affine transform representing non-uniform scaling
/// with different scale values for x and y
#[inline]
pub const fn scale_non_uniform(s_x: f64, s_y: f64) -> Affine {
Affine([s_x, 0.0, 0.0, s_y, 0.0, 0.0])
}
/// An affine transform representing translation.
#[inline]
pub fn translate<V: Into<Vec2>>(p: V) -> Affine {
let p = p.into();
Affine([1.0, 0.0, 0.0, 1.0, p.x, p.y])
}
/// Creates an affine transformation that takes the unit square to the given rectangle.
///
/// Useful when you want to draw into the unit square but have your output fill any rectangle.
/// In this case push the `Affine` onto the transform stack.
pub fn map_unit_square(rect: Rect) -> Affine {
Affine([rect.width(), 0., 0., rect.height(), rect.x0, rect.y0])
}
/// Get the coefficients of the transform.
#[inline]
pub fn as_coeffs(self) -> [f64; 6] {
self.0
}
/// Compute the determinant of this transform.
pub fn determinant(self) -> f64 {
self.0[0] * self.0[3] - self.0[1] * self.0[2]
}
/// Compute the inverse transform.
///
/// Produces NaN values when the determinant is zero.
pub fn inverse(self) -> Affine {
let inv_det = self.determinant().recip();
Affine([
inv_det * self.0[3],
-inv_det * self.0[1],
-inv_det * self.0[2],
inv_det * self.0[0],
inv_det * (self.0[2] * self.0[5] - self.0[3] * self.0[4]),
inv_det * (self.0[1] * self.0[4] - self.0[0] * self.0[5]),
])
}
/// Compute the bounding box of a transformed rectangle.
///
/// Returns the minimal `Rect` that encloses the given `Rect` after affine transformation.
/// If the transform is axis-aligned, then this bounding box is "tight", in other words the
/// returned `Rect` is the transformed rectangle.
///
/// The returned rectangle always has non-negative width and height.
pub fn transform_rect_bbox(self, rect: Rect) -> Rect {
let p00 = self * Point::new(rect.x0, rect.y0);
let p01 = self * Point::new(rect.x0, rect.y1);
let p10 = self * Point::new(rect.x1, rect.y0);
let p11 = self * Point::new(rect.x1, rect.y1);
Rect::from_points(p00, p01).union(Rect::from_points(p10, p11))
}
/// Is this map finite?
#[inline]
pub fn is_finite(&self) -> bool {
self.0[0].is_finite()
&& self.0[1].is_finite()
&& self.0[2].is_finite()
&& self.0[3].is_finite()
&& self.0[4].is_finite()
&& self.0[5].is_finite()
}
/// Is this map NaN?
#[inline]
pub fn is_nan(&self) -> bool {
self.0[0].is_nan()
|| self.0[1].is_nan()
|| self.0[2].is_nan()
|| self.0[3].is_nan()
|| self.0[4].is_nan()
|| self.0[5].is_nan()
}
}
impl Default for Affine {
#[inline]
fn default() -> Affine {
Affine::IDENTITY
}
}
impl Mul<Point> for Affine {
type Output = Point;
#[inline]
fn mul(self, other: Point) -> Point {
Point::new(
self.0[0] * other.x + self.0[2] * other.y + self.0[4],
self.0[1] * other.x + self.0[3] * other.y + self.0[5],
)
}
}
impl Mul for Affine {
type Output = Affine;
#[inline]
fn mul(self, other: Affine) -> Affine {
Affine([
self.0[0] * other.0[0] + self.0[2] * other.0[1],
self.0[1] * other.0[0] + self.0[3] * other.0[1],
self.0[0] * other.0[2] + self.0[2] * other.0[3],
self.0[1] * other.0[2] + self.0[3] * other.0[3],
self.0[0] * other.0[4] + self.0[2] * other.0[5] + self.0[4],
self.0[1] * other.0[4] + self.0[3] * other.0[5] + self.0[5],
])
}
}
impl MulAssign for Affine {
#[inline]
fn mul_assign(&mut self, other: Affine) {
*self = self.mul(other);
}
}
impl Mul<Affine> for f64 {
type Output = Affine;
#[inline]
fn mul(self, other: Affine) -> Affine {
Affine([
self * other.0[0],
self * other.0[1],
self * other.0[2],
self * other.0[3],
self * other.0[4],
self * other.0[5],
])
}
}
/// A 2D point. Derived from [kurbo](https://github.com/linebender/kurbo).
#[derive(Clone, Copy, Default, PartialEq)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(C)]
pub struct Point {
/// The x coordinate.
pub x: f64,
/// The y coordinate.
pub y: f64,
}
impl Point {
/// The point (0, 0).
pub const ZERO: Point = Point::new(0., 0.);
/// The point at the origin; (0, 0).
pub const ORIGIN: Point = Point::new(0., 0.);
/// Create a new `Point` with the provided `x` and `y` coordinates.
#[inline]
pub const fn new(x: f64, y: f64) -> Self {
Point { x, y }
}
/// Convert this point into a `Vec2`.
#[inline]
pub const fn to_vec2(self) -> Vec2 {
Vec2::new(self.x, self.y)
}
}
impl From<(f64, f64)> for Point {
#[inline]
fn from(v: (f64, f64)) -> Point {
Point { x: v.0, y: v.1 }
}
}
impl From<Point> for (f64, f64) {
#[inline]
fn from(v: Point) -> (f64, f64) {
(v.x, v.y)
}
}
impl Add<Vec2> for Point {
type Output = Point;
#[inline]
fn add(self, other: Vec2) -> Self {
Point::new(self.x + other.x, self.y + other.y)
}
}
impl AddAssign<Vec2> for Point {
#[inline]
fn add_assign(&mut self, other: Vec2) {
*self = Point::new(self.x + other.x, self.y + other.y);
}
}
impl Sub<Vec2> for Point {
type Output = Point;
#[inline]
fn sub(self, other: Vec2) -> Self {
Point::new(self.x - other.x, self.y - other.y)
}
}
impl SubAssign<Vec2> for Point {
#[inline]
fn sub_assign(&mut self, other: Vec2) {
*self = Point::new(self.x - other.x, self.y - other.y);
}
}
impl Add<(f64, f64)> for Point {
type Output = Point;
#[inline]
fn add(self, (x, y): (f64, f64)) -> Self {
Point::new(self.x + x, self.y + y)
}
}
impl AddAssign<(f64, f64)> for Point {
#[inline]
fn add_assign(&mut self, (x, y): (f64, f64)) {
*self = Point::new(self.x + x, self.y + y);
}
}
impl Sub<(f64, f64)> for Point {
type Output = Point;
#[inline]
fn sub(self, (x, y): (f64, f64)) -> Self {
Point::new(self.x - x, self.y - y)
}
}
impl SubAssign<(f64, f64)> for Point {
#[inline]
fn sub_assign(&mut self, (x, y): (f64, f64)) {
*self = Point::new(self.x - x, self.y - y);
}
}
impl Sub<Point> for Point {
type Output = Vec2;
#[inline]
fn sub(self, other: Point) -> Vec2 {
Vec2::new(self.x - other.x, self.y - other.y)
}
}
impl fmt::Debug for Point {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({:?}, {:?})", self.x, self.y)
}
}
/// A rectangle. Derived from [kurbo](https://github.com/linebender/kurbo).
#[derive(Clone, Copy, Default, PartialEq)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(C)]
pub struct Rect {
/// The minimum x coordinate (left edge).
pub x0: f64,
/// The minimum y coordinate (top edge in y-down spaces).
pub y0: f64,
/// The maximum x coordinate (right edge).
pub x1: f64,
/// The maximum y coordinate (bottom edge in y-down spaces).
pub y1: f64,
}
impl From<(Point, Point)> for Rect {
fn from(points: (Point, Point)) -> Rect {
Rect::from_points(points.0, points.1)
}
}
impl From<(Point, Size)> for Rect {
fn from(params: (Point, Size)) -> Rect {
Rect::from_origin_size(params.0, params.1)
}
}
impl Add<Vec2> for Rect {
type Output = Rect;
#[inline]
fn add(self, v: Vec2) -> Rect {
Rect::new(self.x0 + v.x, self.y0 + v.y, self.x1 + v.x, self.y1 + v.y)
}
}
impl Sub<Vec2> for Rect {
type Output = Rect;
#[inline]
fn sub(self, v: Vec2) -> Rect {
Rect::new(self.x0 - v.x, self.y0 - v.y, self.x1 - v.x, self.y1 - v.y)
}
}
impl fmt::Debug for Rect {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if f.alternate() {
write!(
f,
"Rect {{ origin: {:?}, size: {:?} }}",
self.origin(),
self.size()
)
} else {
write!(
f,
"Rect {{ x0: {:?}, y0: {:?}, x1: {:?}, y1: {:?} }}",
self.x0, self.y0, self.x1, self.y1
)
}
}
}
impl Rect {
/// The empty rectangle at the origin.
pub const ZERO: Rect = Rect::new(0., 0., 0., 0.);
/// A new rectangle from minimum and maximum coordinates.
#[inline]
pub const fn new(x0: f64, y0: f64, x1: f64, y1: f64) -> Rect {
Rect { x0, y0, x1, y1 }
}
/// A new rectangle from two points.
///
/// The result will have non-negative width and height.
#[inline]
pub fn from_points(p0: impl Into<Point>, p1: impl Into<Point>) -> Rect {
let p0 = p0.into();
let p1 = p1.into();
Rect::new(p0.x, p0.y, p1.x, p1.y).abs()
}
/// A new rectangle from origin and size.
///
/// The result will have non-negative width and height.
#[inline]
pub fn from_origin_size(origin: impl Into<Point>, size: impl Into<Size>) -> Rect {
let origin = origin.into();
Rect::from_points(origin, origin + size.into().to_vec2())
}
/// Create a new `Rect` with the same size as `self` and a new origin.
#[inline]
pub fn with_origin(self, origin: impl Into<Point>) -> Rect {
Rect::from_origin_size(origin, self.size())
}
/// Create a new `Rect` with the same origin as `self` and a new size.
#[inline]
pub fn with_size(self, size: impl Into<Size>) -> Rect {
Rect::from_origin_size(self.origin(), size)
}
/// The width of the rectangle.
///
/// Note: nothing forbids negative width.
#[inline]
pub fn width(&self) -> f64 {
self.x1 - self.x0
}
/// The height of the rectangle.
///
/// Note: nothing forbids negative height.
#[inline]
pub fn height(&self) -> f64 {
self.y1 - self.y0
}
/// Returns the minimum value for the x-coordinate of the rectangle.
#[inline]
pub fn min_x(&self) -> f64 {
self.x0.min(self.x1)
}
/// Returns the maximum value for the x-coordinate of the rectangle.
#[inline]
pub fn max_x(&self) -> f64 {
self.x0.max(self.x1)
}
/// Returns the minimum value for the y-coordinate of the rectangle.
#[inline]
pub fn min_y(&self) -> f64 {
self.y0.min(self.y1)
}
/// Returns the maximum value for the y-coordinate of the rectangle.
#[inline]
pub fn max_y(&self) -> f64 {
self.y0.max(self.y1)
}
/// The origin of the rectangle.
///
/// This is the top left corner in a y-down space and with
/// non-negative width and height.
#[inline]
pub fn origin(&self) -> Point {
Point::new(self.x0, self.y0)
}
/// The size of the rectangle.
#[inline]
pub fn size(&self) -> Size {
Size::new(self.width(), self.height())
}
/// Take absolute value of width and height.
///
/// The resulting rect has the same extents as the original, but is
/// guaranteed to have non-negative width and height.
#[inline]
pub fn abs(&self) -> Rect {
let Rect { x0, y0, x1, y1 } = *self;
Rect::new(x0.min(x1), y0.min(y1), x0.max(x1), y0.max(y1))
}
/// The area of the rectangle.
#[inline]
pub fn area(&self) -> f64 {
self.width() * self.height()
}
/// Whether this rectangle has zero area.
///
/// Note: a rectangle with negative area is not considered empty.
#[inline]
pub fn is_empty(&self) -> bool {
self.area() == 0.0
}
/// Returns `true` if `point` lies within `self`.
#[inline]
pub fn contains(&self, point: Point) -> bool {
point.x >= self.x0 && point.x < self.x1 && point.y >= self.y0 && point.y < self.y1
}
/// The smallest rectangle enclosing two rectangles.
///
/// Results are valid only if width and height are non-negative.
#[inline]
pub fn union(&self, other: Rect) -> Rect {
Rect::new(
self.x0.min(other.x0),
self.y0.min(other.y0),
self.x1.max(other.x1),
self.y1.max(other.y1),
)
}
/// Compute the union with one point.
///
/// This method includes the perimeter of zero-area rectangles.
/// Thus, a succession of `union_pt` operations on a series of
/// points yields their enclosing rectangle.
///
/// Results are valid only if width and height are non-negative.
pub fn union_pt(&self, pt: Point) -> Rect {
Rect::new(
self.x0.min(pt.x),
self.y0.min(pt.y),
self.x1.max(pt.x),
self.y1.max(pt.y),
)
}
/// The intersection of two rectangles.
///
/// The result is zero-area if either input has negative width or
/// height. The result always has non-negative width and height.
#[inline]
pub fn intersect(&self, other: Rect) -> Rect {
let x0 = self.x0.max(other.x0);
let y0 = self.y0.max(other.y0);
let x1 = self.x1.min(other.x1);
let y1 = self.y1.min(other.y1);
Rect::new(x0, y0, x1.max(x0), y1.max(y0))
}
}
/// A 2D size. Derived from [kurbo](https://github.com/linebender/kurbo).
#[derive(Clone, Copy, Default, PartialEq)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(C)]
pub struct Size {
/// The width.
pub width: f64,
/// The height.
pub height: f64,
}
impl Size {
/// A size with zero width or height.
pub const ZERO: Size = Size::new(0., 0.);
/// Create a new `Size` with the provided `width` and `height`.
#[inline]
pub const fn new(width: f64, height: f64) -> Self {
Size { width, height }
}
/// Convert this size into a [`Vec2`], with `width` mapped to `x` and `height`
/// mapped to `y`.
#[inline]
pub const fn to_vec2(self) -> Vec2 {
Vec2::new(self.width, self.height)
}
}
impl fmt::Debug for Size {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}W×{:?}H", self.width, self.height)
}
}
impl MulAssign<f64> for Size {
#[inline]
fn mul_assign(&mut self, other: f64) {
*self = Size {
width: self.width * other,
height: self.height * other,
};
}
}
impl Mul<Size> for f64 {
type Output = Size;
#[inline]
fn mul(self, other: Size) -> Size {
other * self
}
}
impl Mul<f64> for Size {
type Output = Size;
#[inline]
fn mul(self, other: f64) -> Size {
Size {
width: self.width * other,
height: self.height * other,
}
}
}
impl DivAssign<f64> for Size {
#[inline]
fn div_assign(&mut self, other: f64) {
*self = Size {
width: self.width / other,
height: self.height / other,
};
}
}
impl Div<f64> for Size {
type Output = Size;
#[inline]
fn div(self, other: f64) -> Size {
Size {
width: self.width / other,
height: self.height / other,
}
}
}
impl Add<Size> for Size {
type Output = Size;
#[inline]
fn add(self, other: Size) -> Size {
Size {
width: self.width + other.width,
height: self.height + other.height,
}
}
}
impl AddAssign<Size> for Size {
#[inline]
fn add_assign(&mut self, other: Size) {
*self = *self + other;
}
}
impl Sub<Size> for Size {
type Output = Size;
#[inline]
fn sub(self, other: Size) -> Size {
Size {
width: self.width - other.width,
height: self.height - other.height,
}
}
}
impl SubAssign<Size> for Size {
#[inline]
fn sub_assign(&mut self, other: Size) {
*self = *self - other;
}
}
impl From<(f64, f64)> for Size {
#[inline]
fn from(v: (f64, f64)) -> Size {
Size {
width: v.0,
height: v.1,
}
}
}
impl From<Size> for (f64, f64) {
#[inline]
fn from(v: Size) -> (f64, f64) {
(v.width, v.height)
}
}
/// A 2D vector. Derived from [kurbo](https://github.com/linebender/kurbo).
///
/// This is intended primarily for a vector in the mathematical sense,
/// but it can be interpreted as a translation, and converted to and
/// from a point (vector relative to the origin) and size.
#[derive(Clone, Copy, Default, Debug, PartialEq)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(C)]
pub struct Vec2 {
/// The x-coordinate.
pub x: f64,
/// The y-coordinate.
pub y: f64,
}
impl Vec2 {
/// The vector (0, 0).
pub const ZERO: Vec2 = Vec2::new(0., 0.);
/// Create a new vector.
#[inline]
pub const fn new(x: f64, y: f64) -> Vec2 {
Vec2 { x, y }
}
/// Convert this vector into a `Point`.
#[inline]
pub const fn to_point(self) -> Point {
Point::new(self.x, self.y)
}
/// Convert this vector into a `Size`.
#[inline]
pub const fn to_size(self) -> Size {
Size::new(self.x, self.y)
}
}
impl From<(f64, f64)> for Vec2 {
#[inline]
fn from(v: (f64, f64)) -> Vec2 {
Vec2 { x: v.0, y: v.1 }
}
}
impl From<Vec2> for (f64, f64) {
#[inline]
fn from(v: Vec2) -> (f64, f64) {
(v.x, v.y)
}
}
impl Add for Vec2 {
type Output = Vec2;
#[inline]
fn add(self, other: Vec2) -> Vec2 {
Vec2 {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
impl AddAssign for Vec2 {
#[inline]
fn add_assign(&mut self, other: Vec2) {
*self = Vec2 {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
impl Sub for Vec2 {
type Output = Vec2;
#[inline]
fn sub(self, other: Vec2) -> Vec2 {
Vec2 {
x: self.x - other.x,
y: self.y - other.y,
}
}
}
impl SubAssign for Vec2 {
#[inline]
fn sub_assign(&mut self, other: Vec2) {
*self = Vec2 {
x: self.x - other.x,
y: self.y - other.y,
}
}
}
impl Mul<f64> for Vec2 {
type Output = Vec2;
#[inline]
fn mul(self, other: f64) -> Vec2 {
Vec2 {
x: self.x * other,
y: self.y * other,
}
}
}
impl MulAssign<f64> for Vec2 {
#[inline]
fn mul_assign(&mut self, other: f64) {
*self = Vec2 {
x: self.x * other,
y: self.y * other,
};
}
}
impl Mul<Vec2> for f64 {
type Output = Vec2;
#[inline]
fn mul(self, other: Vec2) -> Vec2 {
other * self
}
}
impl Div<f64> for Vec2 {
type Output = Vec2;
/// Note: division by a scalar is implemented by multiplying by the reciprocal.
///
/// This is more efficient but has different roundoff behavior than division.
#[inline]
#[allow(clippy::suspicious_arithmetic_impl)]
fn div(self, other: f64) -> Vec2 {
self * other.recip()
}
}
impl DivAssign<f64> for Vec2 {
#[inline]
fn div_assign(&mut self, other: f64) {
self.mul_assign(other.recip());
}
}
impl Neg for Vec2 {
type Output = Vec2;
#[inline]
fn neg(self) -> Vec2 {
Vec2 {
x: -self.x,
y: -self.y,
}
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1 @@
{"files": {".cargo_vcs_info.json": "08071a308400282ad18ca2de0df6d1f2dc270475f69aa483740ce311af3f63e0", "CHANGELOG.md": "04fa29ec6eb6b05b706247ecac2cbc7075792dbfcea0bf52715782cf42132e94", "Cargo.lock": "3e44ced212a9e7ddc0a5450bcebb48ec67f32a058529856458efa36415554e53", "Cargo.toml": "8f30dbd092f3acc475b9d339736cd7b64c6489bc47cd234a7f2232fc52e2d490", "Cargo.toml.orig": "077df9094ac86443a4d05305f74782bd237c1f15fa39640463e4c62e9e4a310a", "LICENSE-0BSD": "861399f8c21c042b110517e76dc6b63a2b334276c8cf17412fc3c8908ca8dc17", "LICENSE-APACHE": "8ada45cd9f843acf64e4722ae262c622a2b3b3007c7310ef36ac1061a30f6adb", "LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3", "README.md": "cd955d5d6a49161e6f7a04df4a5963581b66ed43fd5096b2dedca8e295efe4f9", "RELEASE_PROCESS.md": "a86cd10fc70f167f8d00e9e4ce0c6b4ebdfa1865058390dffd1e0ad4d3e68d9d", "benches/bench.rs": "d67bef1c7f36ed300a8fbcf9d50b9dfdead1fd340bf87a4d47d99a0c1c042c04", "src/algo.rs": "932c2bc591d13fe4470185125617b5aaa660a3898f23b553acc85df0bf49dded", "src/lib.rs": "4acd41668fe30daffa37084e7e223f268957b816afc1864ffb3f5d6d7adf0890"}, "package": "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"}
@@ -0,0 +1,6 @@
{
"git": {
"sha1": "89a031a0f42eeff31c70dc598b398cbf31f1680f"
},
"path_in_vcs": ""
}
@@ -0,0 +1,84 @@
# Changelog
All notable changes to this project will be documented in this file.
---
## [2.0.1](https://github.com/Frommi/miniz_oxide/compare/2.0.0..2.0.1) - 2025-06-09
### Other
- Remove `compiler-builtins` from `rustc-dep-of-std` dependencies - ([7cdbd39](https://github.com/Frommi/miniz_oxide/commit/7cdbd3925a7f61cc075f44367b5d383861571b0a)) - Trevor Gross
---
## [2.0.0](https://github.com/Frommi/miniz_oxide/compare/1.0.2..2.0.0) - 2024-08-04
First release of adler2 - fork of adler crate as the original is unmaintained and archived
##### Changes since last version of Adler:
### Bug Fixes
- **(core)** change to rust 2021 edition, update repository info and links, update author info - ([867b115](https://github.com/Frommi/miniz_oxide/commit/867b115bad79bf62098f2acccc81bf53ec5a125d)) - oyvindln
- **(core)** simplify some code and fix benches - ([128fb9c](https://github.com/Frommi/miniz_oxide/commit/128fb9cb6cad5c3a54fb0b6c68549d80b79a1fe0)) - oyvindln
### Changelog of original adler crate
---
## [1.0.2 - 2021-02-26](https://github.com/jonas-schievink/adler/releases/tag/v1.0.2)
- Fix doctest on big-endian systems ([#9]).
[#9]: https://github.com/jonas-schievink/adler/pull/9
## [1.0.1 - 2020-11-08](https://github.com/jonas-schievink/adler/releases/tag/v1.0.1)
### Fixes
- Fix documentation on docs.rs.
## [1.0.0 - 2020-11-08](https://github.com/jonas-schievink/adler/releases/tag/v1.0.0)
### Fixes
- Fix `cargo test --no-default-features` ([#5]).
### Improvements
- Extended and clarified documentation.
- Added more rustdoc examples.
- Extended CI to test the crate with `--no-default-features`.
### Breaking Changes
- `adler32_reader` now takes its generic argument by value instead of as a `&mut`.
- Renamed `adler32_reader` to `adler32`.
## [0.2.3 - 2020-07-11](https://github.com/jonas-schievink/adler/releases/tag/v0.2.3)
- Process 4 Bytes at a time, improving performance by up to 50% ([#2]).
## [0.2.2 - 2020-06-27](https://github.com/jonas-schievink/adler/releases/tag/v0.2.2)
- Bump MSRV to 1.31.0.
## [0.2.1 - 2020-06-27](https://github.com/jonas-schievink/adler/releases/tag/v0.2.1)
- Add a few `#[inline]` annotations to small functions.
- Fix CI badge.
- Allow integration into libstd.
## [0.2.0 - 2020-06-27](https://github.com/jonas-schievink/adler/releases/tag/v0.2.0)
- Support `#![no_std]` when using `default-features = false`.
- Improve performance by around 7x.
- Support Rust 1.8.0.
- Improve API naming.
## [0.1.0 - 2020-06-26](https://github.com/jonas-schievink/adler/releases/tag/v0.1.0)
Initial release.
[#2]: https://github.com/jonas-schievink/adler/pull/2
[#5]: https://github.com/jonas-schievink/adler/pull/5
@@ -0,0 +1,16 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "adler2"
version = "2.0.1"
dependencies = [
"rustc-std-workspace-core",
]
[[package]]
name = "rustc-std-workspace-core"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1956f5517128a2b6f23ab2dadf1a976f4f5b27962e7724c2bf3d45e539ec098c"
@@ -0,0 +1,91 @@
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
#
# When uploading crates to the registry Cargo will automatically
# "normalize" Cargo.toml files for maximal compatibility
# with all versions of Cargo and also rewrite `path` dependencies
# to registry (e.g., crates.io) dependencies.
#
# If you are reading this file be aware that the original Cargo.toml
# will likely look very different (and much more reasonable).
# See Cargo.toml.orig for the original contents.
[package]
edition = "2021"
name = "adler2"
version = "2.0.1"
authors = [
"Jonas Schievink <[email protected]>",
"oyvindln <[email protected]>",
]
build = false
exclude = [".*"]
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "A simple clean-room implementation of the Adler-32 checksum"
documentation = "https://docs.rs/adler2/"
readme = "README.md"
keywords = [
"checksum",
"integrity",
"hash",
"adler32",
"zlib",
]
categories = ["algorithms"]
license = "0BSD OR MIT OR Apache-2.0"
repository = "https://github.com/oyvindln/adler2"
[package.metadata.docs.rs]
rustdoc-args = ["--cfg=docsrs"]
[package.metadata.release]
no-dev-version = true
pre-release-commit-message = "Release {{version}}"
tag-message = "{{version}}"
[[package.metadata.release.pre-release-replacements]]
file = "CHANGELOG.md"
replace = """
## Unreleased
No changes.
## [{{version}} - {{date}}](https://github.com/jonas-schievink/adler/releases/tag/v{{version}})
"""
search = """
## Unreleased
"""
[[package.metadata.release.pre-release-replacements]]
file = "README.md"
replace = 'adler = "{{version}}"'
search = 'adler = "[a-z0-9\\.-]+"'
[[package.metadata.release.pre-release-replacements]]
file = "src/lib.rs"
replace = "https://docs.rs/adler/{{version}}"
search = 'https://docs.rs/adler/[a-z0-9\.-]+'
[features]
default = ["std"]
rustc-dep-of-std = ["core"]
std = []
[lib]
name = "adler2"
path = "src/lib.rs"
[[bench]]
name = "bench"
path = "benches/bench.rs"
harness = false
[dependencies.core]
version = "1.0.0"
optional = true
package = "rustc-std-workspace-core"
[dev-dependencies]
@@ -0,0 +1,71 @@
[package]
name = "adler2"
version = "2.0.1"
authors = ["Jonas Schievink <[email protected]>", "oyvindln <[email protected]>"]
description = "A simple clean-room implementation of the Adler-32 checksum"
documentation = "https://docs.rs/adler2/"
repository = "https://github.com/oyvindln/adler2"
keywords = ["checksum", "integrity", "hash", "adler32", "zlib"]
categories = ["algorithms"]
readme = "README.md"
license = "0BSD OR MIT OR Apache-2.0"
edition = "2021"
exclude = [".*"]
[[bench]]
name = "bench"
harness = false
[dependencies]
# Internal features, only used when building as part of libstd, not part of the
# stable interface of this crate.
core = { version = '1.0.0', optional = true, package = 'rustc-std-workspace-core' }
[dev-dependencies]
## Messes with minimum rust version and drags in deps just for running tests
## so just comment out for now and enable manually when needed for enabling benches
## criterion = "0.3.2"
[features]
# Disable default features to enable `#![no_std]` support.
default = ["std"]
std = []
# Internal feature, only used when building as part of libstd, not part of the
# stable interface of this crate.
rustc-dep-of-std = ['core']
[package.metadata.docs.rs]
rustdoc-args = [ "--cfg=docsrs" ]
# cargo-release configuration
[package.metadata.release]
tag-message = "{{version}}"
no-dev-version = true
pre-release-commit-message = "Release {{version}}"
# Change the changelog's `Unreleased` section to refer to this release and
# prepend a new `Unreleased` section
[[package.metadata.release.pre-release-replacements]]
file = "CHANGELOG.md"
search = "## Unreleased\n"
replace = """
## Unreleased
No changes.
## [{{version}} - {{date}}](https://github.com/jonas-schievink/adler/releases/tag/v{{version}})
"""
# Bump the version inside the example manifest in `README.md`
[[package.metadata.release.pre-release-replacements]]
file = "README.md"
search = 'adler = "[a-z0-9\\.-]+"'
replace = 'adler = "{{version}}"'
# Bump the version referenced by the `html_root_url` attribute in `lib.rs`
[[package.metadata.release.pre-release-replacements]]
file = "src/lib.rs"
search = "https://docs.rs/adler/[a-z0-9\\.-]+"
replace = "https://docs.rs/adler/{{version}}"
@@ -0,0 +1,12 @@
Copyright (C) Jonas Schievink <[email protected]>
Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
https://www.apache.org/licenses/LICENSE-2.0
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
@@ -0,0 +1,23 @@
Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without
limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice
shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,46 @@
# Adler-32 checksums for Rust
This is a fork of the adler crate as the [original](https://github.com/jonas-schievink/adler) has been archived and is no longer updated by it's author
[![crates.io](https://img.shields.io/crates/v/adler.svg)](https://crates.io/crates/adler)
[![docs.rs](https://docs.rs/adler/badge.svg)](https://docs.rs/adler/)
![CI](https://github.com/jonas-schievink/adler/workflows/CI/badge.svg)
This crate provides a simple implementation of the Adler-32 checksum, used in
the zlib compression format.
Please refer to the [changelog](CHANGELOG.md) to see what changed in the last
releases.
## Features
- Permissively licensed (0BSD) clean-room implementation.
- Zero dependencies.
- Zero `unsafe`.
- Decent performance (3-4 GB/s) (see note).
- Supports `#![no_std]` (with `default-features = false`).
## Usage
Add an entry to your `Cargo.toml`:
```toml
[dependencies]
adler2 = "2.0.0"
```
Check the [API Documentation](https://docs.rs/adler/) for how to use the
crate's functionality.
## Rust version support
Currently, this crate supports all Rust versions starting at Rust 1.56.0.
Bumping the Minimum Supported Rust Version (MSRV) is *not* considered a breaking
change, but will not be done without good reasons. The latest 3 stable Rust
versions will always be supported no matter what.
## Performance
Due to the way the algorithm works this crate and the fact that it's not possible to use explicit simd in safe rust currently, this crate benefits drastically from being compiled with newer cpu instructions enabled (using e.g ```RUSTFLAGS=-C target-feature'+sse4.1``` or ```-C target-cpu=x86-64-v2```/```-C target-cpu=x86-64-v3``` arguments depending on what cpu support is being targeted.)
Judging by the crate benchmarks, on a Ryzen 5600, compiling with SSE 4.1 (enabled in x86-64-v2 feature level) enabled can give a ~50-150% speedup, enabling the LZCNT instruction (enabled in x86-64-v3 feature level) can give a further ~50% speedup,
@@ -0,0 +1,13 @@
# What to do to publish a new release
1. Ensure all notable changes are in the changelog under "Unreleased".
2. Execute `cargo release <level>` to bump version(s), tag and publish
everything. External subcommand, must be installed with `cargo install
cargo-release`.
`<level>` can be one of `major|minor|patch`. If this is the first release
(`0.1.0`), use `minor`, since the version starts out as `0.0.0`.
3. Go to the GitHub releases, edit the just-pushed tag. Copy the release notes
from the changelog.
@@ -0,0 +1,109 @@
extern crate adler2;
extern crate criterion;
use adler2::{adler32_slice, Adler32};
use criterion::{criterion_group, criterion_main, Criterion, Throughput};
fn simple(c: &mut Criterion) {
{
const SIZE: usize = 100;
let mut group = c.benchmark_group("simple-100b");
group.throughput(Throughput::Bytes(SIZE as u64));
group.bench_function("zeroes-100", |bencher| {
bencher.iter(|| {
adler32_slice(&[0; SIZE]);
});
});
group.bench_function("ones-100", |bencher| {
bencher.iter(|| {
adler32_slice(&[0xff; SIZE]);
});
});
}
{
const SIZE: usize = 1024;
let mut group = c.benchmark_group("simple-1k");
group.throughput(Throughput::Bytes(SIZE as u64));
group.bench_function("zeroes-1k", |bencher| {
bencher.iter(|| {
adler32_slice(&[0; SIZE]);
});
});
group.bench_function("ones-1k", |bencher| {
bencher.iter(|| {
adler32_slice(&[0xff; SIZE]);
});
});
}
{
const SIZE: usize = 1024 * 1024;
let mut group = c.benchmark_group("simple-1m");
group.throughput(Throughput::Bytes(SIZE as u64));
group.bench_function("zeroes-1m", |bencher| {
bencher.iter(|| {
adler32_slice(&[0; SIZE]);
});
});
group.bench_function("ones-1m", |bencher| {
bencher.iter(|| {
adler32_slice(&[0xff; SIZE]);
});
});
}
}
fn chunked(c: &mut Criterion) {
const SIZE: usize = 16 * 1024 * 1024;
let data = vec![0xAB; SIZE];
let mut group = c.benchmark_group("chunked-16m");
group.throughput(Throughput::Bytes(SIZE as u64));
group.bench_function("5552", |bencher| {
bencher.iter(|| {
let mut h = Adler32::new();
for chunk in data.chunks(5552) {
h.write_slice(chunk);
}
h.checksum()
});
});
group.bench_function("8k", |bencher| {
bencher.iter(|| {
let mut h = Adler32::new();
for chunk in data.chunks(8 * 1024) {
h.write_slice(chunk);
}
h.checksum()
});
});
group.bench_function("64k", |bencher| {
bencher.iter(|| {
let mut h = Adler32::new();
for chunk in data.chunks(64 * 1024) {
h.write_slice(chunk);
}
h.checksum()
});
});
group.bench_function("1m", |bencher| {
bencher.iter(|| {
let mut h = Adler32::new();
for chunk in data.chunks(1024 * 1024) {
h.write_slice(chunk);
}
h.checksum()
});
});
}
criterion_group!(benches, simple, chunked);
criterion_main!(benches);
@@ -0,0 +1,155 @@
use crate::Adler32;
use std::ops::{AddAssign, MulAssign, RemAssign};
impl Adler32 {
pub(crate) fn compute(&mut self, bytes: &[u8]) {
// The basic algorithm is, for every byte:
// a = (a + byte) % MOD
// b = (b + a) % MOD
// where MOD = 65521.
//
// For efficiency, we can defer the `% MOD` operations as long as neither a nor b overflows:
// - Between calls to `write`, we ensure that a and b are always in range 0..MOD.
// - We use 32-bit arithmetic in this function.
// - Therefore, a and b must not increase by more than 2^32-MOD without performing a `% MOD`
// operation.
//
// According to Wikipedia, b is calculated as follows for non-incremental checksumming:
// b = n×D1 + (n−1)×D2 + (n−2)×D3 + ... + Dn + n*1 (mod 65521)
// Where n is the number of bytes and Di is the i-th Byte. We need to change this to account
// for the previous values of a and b, as well as treat every input Byte as being 255:
// b_inc = n×255 + (n-1)×255 + ... + 255 + n*65520
// Or in other words:
// b_inc = n*65520 + n(n+1)/2*255
// The max chunk size is thus the largest value of n so that b_inc <= 2^32-65521.
// 2^32-65521 = n*65520 + n(n+1)/2*255
// Plugging this into an equation solver since I can't math gives n = 5552.18..., so 5552.
//
// On top of the optimization outlined above, the algorithm can also be parallelized with a
// bit more work:
//
// Note that b is a linear combination of a vector of input bytes (D1, ..., Dn).
//
// If we fix some value k<N and rewrite indices 1, ..., N as
//
// 1_1, 1_2, ..., 1_k, 2_1, ..., 2_k, ..., (N/k)_k,
//
// then we can express a and b in terms of sums of smaller sequences kb and ka:
//
// ka(j) := D1_j + D2_j + ... + D(N/k)_j where j <= k
// kb(j) := (N/k)*D1_j + (N/k-1)*D2_j + ... + D(N/k)_j where j <= k
//
// a = ka(1) + ka(2) + ... + ka(k) + 1
// b = k*(kb(1) + kb(2) + ... + kb(k)) - 1*ka(2) - ... - (k-1)*ka(k) + N
//
// We use this insight to unroll the main loop and process k=4 bytes at a time.
// The resulting code is highly amenable to SIMD acceleration, although the immediate speedups
// stem from increased pipeline parallelism rather than auto-vectorization.
//
// This technique is described in-depth (here:)[https://software.intel.com/content/www/us/\
// en/develop/articles/fast-computation-of-fletcher-checksums.html]
const MOD: u32 = 65521;
const CHUNK_SIZE: usize = 5552 * 4;
let mut a = u32::from(self.a);
let mut b = u32::from(self.b);
let mut a_vec = U32X4([0; 4]);
let mut b_vec = a_vec;
let (bytes, remainder) = bytes.split_at(bytes.len() - bytes.len() % 4);
// iterate over 4 bytes at a time
let chunk_iter = bytes.chunks_exact(CHUNK_SIZE);
let remainder_chunk = chunk_iter.remainder();
for chunk in chunk_iter {
for byte_vec in chunk.chunks_exact(4) {
let val = U32X4::from(byte_vec);
a_vec += val;
b_vec += a_vec;
}
b += CHUNK_SIZE as u32 * a;
a_vec %= MOD;
b_vec %= MOD;
b %= MOD;
}
// special-case the final chunk because it may be shorter than the rest
for byte_vec in remainder_chunk.chunks_exact(4) {
let val = U32X4::from(byte_vec);
a_vec += val;
b_vec += a_vec;
}
b += remainder_chunk.len() as u32 * a;
a_vec %= MOD;
b_vec %= MOD;
b %= MOD;
// combine the sub-sum results into the main sum
b_vec *= 4;
b_vec.0[1] += MOD - a_vec.0[1];
b_vec.0[2] += (MOD - a_vec.0[2]) * 2;
b_vec.0[3] += (MOD - a_vec.0[3]) * 3;
for &av in a_vec.0.iter() {
a += av;
}
for &bv in b_vec.0.iter() {
b += bv;
}
// iterate over the remaining few bytes in serial
for &byte in remainder.iter() {
a += u32::from(byte);
b += a;
}
self.a = (a % MOD) as u16;
self.b = (b % MOD) as u16;
}
}
#[derive(Copy, Clone)]
struct U32X4([u32; 4]);
impl U32X4 {
#[inline]
fn from(bytes: &[u8]) -> Self {
U32X4([
u32::from(bytes[0]),
u32::from(bytes[1]),
u32::from(bytes[2]),
u32::from(bytes[3]),
])
}
}
impl AddAssign<Self> for U32X4 {
#[inline]
fn add_assign(&mut self, other: Self) {
// Implement this in a primitive manner to help out the compiler a bit.
self.0[0] += other.0[0];
self.0[1] += other.0[1];
self.0[2] += other.0[2];
self.0[3] += other.0[3];
}
}
impl RemAssign<u32> for U32X4 {
#[inline]
fn rem_assign(&mut self, quotient: u32) {
self.0[0] %= quotient;
self.0[1] %= quotient;
self.0[2] %= quotient;
self.0[3] %= quotient;
}
}
impl MulAssign<u32> for U32X4 {
#[inline]
fn mul_assign(&mut self, rhs: u32) {
self.0[0] *= rhs;
self.0[1] *= rhs;
self.0[2] *= rhs;
self.0[3] *= rhs;
}
}
@@ -0,0 +1,287 @@
//! Adler-32 checksum implementation.
//!
//! This implementation features:
//!
//! - Permissively licensed (0BSD) clean-room implementation.
//! - Zero dependencies.
//! - Zero `unsafe`.
//! - Decent performance (3-4 GB/s).
//! - `#![no_std]` support (with `default-features = false`).
#![doc(html_root_url = "https://docs.rs/adler2/2.0.0")]
// Deny a few warnings in doctests, since rustdoc `allow`s many warnings by default
#![doc(test(attr(deny(unused_imports, unused_must_use))))]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![warn(missing_debug_implementations)]
#![forbid(unsafe_code)]
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(not(feature = "std"))]
extern crate core as std;
mod algo;
use std::hash::Hasher;
#[cfg(feature = "std")]
use std::io::{self, BufRead};
/// Adler-32 checksum calculator.
///
/// An instance of this type is equivalent to an Adler-32 checksum: It can be created in the default
/// state via [`new`] (or the provided `Default` impl), or from a precalculated checksum via
/// [`from_checksum`], and the currently stored checksum can be fetched via [`checksum`].
///
/// This type also implements `Hasher`, which makes it easy to calculate Adler-32 checksums of any
/// type that implements or derives `Hash`. This also allows using Adler-32 in a `HashMap`, although
/// that is not recommended (while every checksum is a hash function, they are not necessarily a
/// good one).
///
/// # Examples
///
/// Basic, piecewise checksum calculation:
///
/// ```
/// use adler2::Adler32;
///
/// let mut adler = Adler32::new();
///
/// adler.write_slice(&[0, 1, 2]);
/// adler.write_slice(&[3, 4, 5]);
///
/// assert_eq!(adler.checksum(), 0x00290010);
/// ```
///
/// Using `Hash` to process structures:
///
/// ```
/// use std::hash::Hash;
/// use adler2::Adler32;
///
/// #[derive(Hash)]
/// struct Data {
/// byte: u8,
/// word: u16,
/// big: u64,
/// }
///
/// let mut adler = Adler32::new();
///
/// let data = Data { byte: 0x1F, word: 0xABCD, big: !0 };
/// data.hash(&mut adler);
///
/// // hash value depends on architecture endianness
/// if cfg!(target_endian = "little") {
/// assert_eq!(adler.checksum(), 0x33410990);
/// }
/// if cfg!(target_endian = "big") {
/// assert_eq!(adler.checksum(), 0x331F0990);
/// }
///
/// ```
///
/// [`new`]: #method.new
/// [`from_checksum`]: #method.from_checksum
/// [`checksum`]: #method.checksum
#[derive(Debug, Copy, Clone)]
pub struct Adler32 {
a: u16,
b: u16,
}
impl Adler32 {
/// Creates a new Adler-32 instance with default state.
#[inline]
pub fn new() -> Self {
Self::default()
}
/// Creates an `Adler32` instance from a precomputed Adler-32 checksum.
///
/// This allows resuming checksum calculation without having to keep the `Adler32` instance
/// around.
///
/// # Example
///
/// ```
/// # use adler2::Adler32;
/// let parts = [
/// "rust",
/// "acean",
/// ];
/// let whole = adler2::adler32_slice(b"rustacean");
///
/// let mut sum = Adler32::new();
/// sum.write_slice(parts[0].as_bytes());
/// let partial = sum.checksum();
///
/// // ...later
///
/// let mut sum = Adler32::from_checksum(partial);
/// sum.write_slice(parts[1].as_bytes());
/// assert_eq!(sum.checksum(), whole);
/// ```
#[inline]
pub const fn from_checksum(sum: u32) -> Self {
Adler32 {
a: sum as u16,
b: (sum >> 16) as u16,
}
}
/// Returns the calculated checksum at this point in time.
#[inline]
pub fn checksum(&self) -> u32 {
(u32::from(self.b) << 16) | u32::from(self.a)
}
/// Adds `bytes` to the checksum calculation.
///
/// If efficiency matters, this should be called with Byte slices that contain at least a few
/// thousand Bytes.
pub fn write_slice(&mut self, bytes: &[u8]) {
self.compute(bytes);
}
}
impl Default for Adler32 {
#[inline]
fn default() -> Self {
Adler32 { a: 1, b: 0 }
}
}
impl Hasher for Adler32 {
#[inline]
fn finish(&self) -> u64 {
u64::from(self.checksum())
}
fn write(&mut self, bytes: &[u8]) {
self.write_slice(bytes);
}
}
/// Calculates the Adler-32 checksum of a byte slice.
///
/// This is a convenience function around the [`Adler32`] type.
///
/// [`Adler32`]: struct.Adler32.html
pub fn adler32_slice(data: &[u8]) -> u32 {
let mut h = Adler32::new();
h.write_slice(data);
h.checksum()
}
/// Calculates the Adler-32 checksum of a `BufRead`'s contents.
///
/// The passed `BufRead` implementor will be read until it reaches EOF (or until it reports an
/// error).
///
/// If you only have a `Read` implementor, you can wrap it in `std::io::BufReader` before calling
/// this function.
///
/// # Errors
///
/// Any error returned by the reader are bubbled up by this function.
///
/// # Examples
///
/// ```no_run
/// # fn run() -> Result<(), Box<dyn std::error::Error>> {
/// use adler2::adler32;
///
/// use std::fs::File;
/// use std::io::BufReader;
///
/// let file = File::open("input.txt")?;
/// let mut file = BufReader::new(file);
///
/// adler32(&mut file)?;
/// # Ok(()) }
/// # fn main() { run().unwrap() }
/// ```
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
pub fn adler32<R: BufRead>(mut reader: R) -> io::Result<u32> {
let mut h = Adler32::new();
loop {
let len = {
let buf = reader.fill_buf()?;
if buf.is_empty() {
return Ok(h.checksum());
}
h.write_slice(buf);
buf.len()
};
reader.consume(len);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn zeroes() {
assert_eq!(adler32_slice(&[]), 1);
assert_eq!(adler32_slice(&[0]), 1 | 1 << 16);
assert_eq!(adler32_slice(&[0, 0]), 1 | 2 << 16);
assert_eq!(adler32_slice(&[0; 100]), 0x00640001);
assert_eq!(adler32_slice(&[0; 1024]), 0x04000001);
assert_eq!(adler32_slice(&[0; 1024 * 1024]), 0x00f00001);
}
#[test]
fn ones() {
assert_eq!(adler32_slice(&[0xff; 1024]), 0x79a6fc2e);
assert_eq!(adler32_slice(&[0xff; 1024 * 1024]), 0x8e88ef11);
}
#[test]
fn mixed() {
assert_eq!(adler32_slice(&[1]), 2 | 2 << 16);
assert_eq!(adler32_slice(&[40]), 41 | 41 << 16);
assert_eq!(adler32_slice(&[0xA5; 1024 * 1024]), 0xd5009ab1);
}
/// Example calculation from https://en.wikipedia.org/wiki/Adler-32.
#[test]
fn wiki() {
assert_eq!(adler32_slice(b"Wikipedia"), 0x11E60398);
}
#[test]
fn resume() {
let mut adler = Adler32::new();
adler.write_slice(&[0xff; 1024]);
let partial = adler.checksum();
assert_eq!(partial, 0x79a6fc2e); // from above
adler.write_slice(&[0xff; 1024 * 1024 - 1024]);
assert_eq!(adler.checksum(), 0x8e88ef11); // from above
// Make sure that we can resume computing from the partial checksum via `from_checksum`.
let mut adler = Adler32::from_checksum(partial);
adler.write_slice(&[0xff; 1024 * 1024 - 1024]);
assert_eq!(adler.checksum(), 0x8e88ef11); // from above
}
#[cfg(feature = "std")]
#[test]
fn bufread() {
use std::io::BufReader;
fn test(data: &[u8], checksum: u32) {
// `BufReader` uses an 8 KB buffer, so this will test buffer refilling.
let mut buf = BufReader::new(data);
let real_sum = adler32(&mut buf).unwrap();
assert_eq!(checksum, real_sum);
}
test(&[], 1);
test(&[0; 1024], 0x04000001);
test(&[0; 1024 * 1024], 0x00f00001);
test(&[0xA5; 1024 * 1024], 0xd5009ab1);
}
}
Loaded 100 of 11866 files, more files were not shown because too many files have changed in this diff. Show more