Start with the ordinary runtime
You do not need a companion to run Lispex:
lispex rule.lspxThis uses the built-in Rust tree interpreter. It remains the default, semantic reference, and recovery route. Install a companion only when you deliberately need the exact Topaz VM or an admitted Topaz AOT compiler.
Fetch an official companion
Native contains an exact, immutable route catalog. The current catalog has two macOS ARM64 entries: the Topaz 5.11 VM and the exact Topaz 5.11 compiler used by Lispex AOT. Choose a new absolute destination:
lispex routes fetch \
--route topaz-vm \
--target aarch64-apple-darwin \
--out /absolute/tools/lispex-topaz-vmThe command accepts no URL, mirror, channel, version, registry, or catalog override. It follows no redirect and checks the response length, SHA-256, canonical stored-ZIP shape, every installed file, and the closed Topaz product identity before publishing the destination. An unsupported target fails before network access.
Fetching does not register or select the route. Continue at
Use the product explicitly and pass
/absolute/tools/lispex-topaz-vm/product yourself.
Fetch the compiler companion separately when you intend to build an AOT product:
lispex routes fetch \
--route aot-compiler \
--target aarch64-apple-darwin \
--out /absolute/tools/lispex-aot-compilerIts closed product contains the exact compiler and release manifest, not a
Rust toolchain. aot build still requires both the installed compiler
executable and a caller-selected absolute Rust tool directory:
lispex aot build \
--source rule.lspx \
--topaz-compiler /absolute/tools/lispex-aot-compiler/product/bin/topaz-bin \
--rust-tool-bin /absolute/rust/bin \
--out /absolute/products/rule-aotInstall a handed-off archive offline
Obtain these two immutable local files from the same provider handoff:
- a canonical
lispex.route-catalog/v1file and its exact SHA-256; - the stored-ZIP archive named by the exact route and target entry.
The catalog is a closed allowlist. It names the provider product, language
mode, manifest digest, archive digest and length, and every installed file.
Lispex does not search a checkout, PATH, a package registry, the network, or
another catalog.
Install one exact entry
Choose a new absolute destination that does not exist:
lispex routes install \
--route topaz-vm \
--target aarch64-apple-darwin \
--catalog /absolute/handoff/routes.json \
--catalog-sha256 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
--archive /absolute/handoff/topaz-vm-aarch64-apple-darwin.zip \
--out /absolute/tools/lispex-topaz-vmReplace the sample digest with the digest delivered alongside your exact catalog. The command reads local files only. On success it prints the same canonical receipt written to:
/absolute/tools/lispex-topaz-vm/
├── installation.json
└── product/installation.json is a canonical lispex.route-installation/v1 receipt. It
contains no absolute path or timestamp, so moving the unchanged directory
preserves its identity. The product/ directory remains closed for the
existing exact product validator.
For an admitted AOT compiler archive, change --route:
lispex routes install \
--route aot-compiler \
--target aarch64-apple-darwin \
--catalog /absolute/handoff/routes.json \
--catalog-sha256 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
--archive /absolute/handoff/lispex-topaz-aot-compiler-aarch64-apple-darwin.zip \
--out /absolute/tools/lispex-aot-compilerOnly the macOS ARM64 compiler has a complete admitted installed-product and AOT build court. Linux, Windows, and macOS Intel compiler cells are absent. An AOT compiler companion does not include Rust, a linker, an SDK, or system libraries, and Lispex never substitutes another target.
Use the product explicitly
Installation never registers a route or changes the default. Supply the closed product root again:
lispex routes inventory \
--topaz-vm /absolute/tools/lispex-topaz-vm/productYou can then create a path-free lock and diagnose it:
lispex routes lock \
--route topaz-vm \
--topaz-vm /absolute/tools/lispex-topaz-vm/product \
--out topaz-route.json
lispex routes doctor \
--selection topaz-route.json \
--topaz-vm /absolute/tools/lispex-topaz-vm/productIf you relocate the installation, pass the new absolute product/ path.
Neither the lock nor the installation receipt remembers a filesystem path.
Run the complete installed journey
After building the AOT product, inventory both optional routes and create one lock for each:
lispex routes inventory \
--topaz-vm /absolute/tools/lispex-topaz-vm/product \
--aot-product /absolute/products/rule-aot
lispex routes lock --route aot \
--aot-product /absolute/products/rule-aot \
--out aot-route.jsonUse routes measure --samples 1 for one bounded four-route comparison, then
execute only the chosen lock:
lispex routes run \
--selection aot-route.json \
--aot-product /absolute/products/rule-aot \
--input input.datum \
rule.lspxYou can move the VM installation or finished AOT product. Supply its new
absolute root to routes doctor and routes run; do not rewrite the lock.
Doctor revalidates the bytes at that root, while the unchanged lock proves
that selection identity never depended on its former path. The maintained
portable route journey
shows fetch, build, inventory, locks, doctor, bounded measurement, locked
execution, and relocation together.
What the archive is allowed to contain
Lispex accepts only one canonical, uncompressed stored-ZIP shape. It rejects compression, Zip64, descriptors, encryption, timestamps, extras, comments, directories, duplicate or unsorted names, path traversal, absolute paths, backslashes, symbolic links, special files, excess files or bytes, and every digest mismatch. It writes through a private sibling stage and publishes only to a destination that still does not exist.
Exit 2 means command usage is wrong, exit 1 means an identity or canonical contract was rejected, and exit 3 means local I/O, a resource bound, or no-clobber publication failed. A failure does not try another entry, target, version, path, or execution route.
Security boundary
A valid catalog and installation receipt establish exact byte integrity for
installation. They do not establish that the provider is trustworthy, the
program is correct, the route agrees with Rust, or an external action is
authorized. Catalogs, archives, receipts, manifests, and route results cannot
enter Vouch evidence or a decision gate.
The canonical receipt records automatic_fallback:false; this is a boundary,
not a request to try a different route.
Keep going
Use the runtime chooser for the simple default and the route doctor before any locked advanced execution.