Backends are implementation paths behind one checked source contract. The interpreter is the reference execution path; Rust, Python, and web artifacts are products of the shared resolved and typed unit, not separate language dialects.
Contract and components
run executes the interpreter. Default Rust lowering uses the boxed runtime; --backend native first tries the proven whole-unit scalar path, then keeps the boxed application envelope while replacing eligible top-level functions with native helpers. Exact Bytes and ByteBuffer parameters and locals can use checked native length, read, slice, write, fill, copy, and snapshot leaves. A direct binary field on a checker-proven read-only record parameter is projected once into the same bounded path. Unproved records, nested projections, captures, dynamic calls, generics, defaults, variadics, concurrency, and extern modules remain boxed. Native build compiles generated Rust through cargo. --target python writes program.py with topaz_py_rt.py. web emits a raw-WASM package and web-worker adds worker/client glue.
Workflow
Start with check, establish expected output with run, then build the target. Inspect generated code only as an artifact: user programs remain Topaz and imports remain canonical Topaz module syntax. Differential tests compare declared observable outputs, faults, diagnostics, and projections rather than internal object layout.
When native selection matters, add --native-report-json <path> to a checked native emit or build. The deterministic topaz.native-lowering-report.v1 document lists each top-level function as native, hybrid-native, or boxed, with a stable reason for a boxed decision. Writing the report does not change normal output or generated artifacts.
The binary hot path reuses the same checked operations as the boxed runtime. Bounds faults, fixed length, overlapping self-copy, validation before mutation, and immutable snapshots therefore keep the same observable contract; unsupported shapes fall back instead of guessing.
Current support
Direct execution, Rust output, and Python output are tested together across the current grammar and standard-library families. Raw WASM and web-worker builds provide the browser deployment paths. The status page records any feature that is available only on a particular target.
The deterministic Codec.deflateFixedCompress leaf is shared by direct execution, generated Rust, raw Web, Web Worker, and the Playground. Generated Python does not yet carry an exact implementation, so its emitter reports a source-located error before writing an artifact.
Codec.zlibFixedCompress uses the same supported routes and wraps those exact raw bytes with the fixed RFC 1950 header and Adler-32 trailer. Generated Python rejects it at the same pre-artifact boundary.
The deterministic Codec.reedSolomon255223Protect leaf uses the same supported route set and produces exact systematic RS(255,223) codewords. Generated Python rejects it at the same pre-artifact boundary.
The non-cryptographic Hash.crc32 leaf is shared by direct execution, generated Rust, generated Python, raw Web, Web Worker, and the Playground. Every route returns the same unsigned CRC-32/ISO-HDLC integer.
Lispex integration artifact
One canonical Lispex-in-Topaz source is executed by the interpreter, generated Rust, generated Python, and Web routes. The implementation has its own UTF-8 reader and normalizer, uses one explicit machine for lexical state, numeric operations, tail calls, control transfer, and primitive dispatch, and routes every supported guest call through the common dispatcher. Host apply, eval, control, and callback fallback are not part of the supported path.
Internal integration evidence records a bounded four-route check surface. LIT currently supports 84 of 205 primitive capability rows and six of 18 guest-calling rows; unsupported rows fail loudly. These routes are variants of one Topaz-written LIT source, not independent implementations, and no source-independence claim is made. The integration artifact is not part of the installer or language surface.
Boundaries and limitations
Concurrent task ordering is unspecified, so programs must not depend on a particular interleaving. Binary codec support differs by target; raw fixed-Huffman compression, fixed zlib, and RS(255,223) protection are the explicit generated-Python exceptions. If an output target cannot preserve a supported feature, the build must report an error instead of silently changing the program.
Command reference
topaz run main.tpz
topaz emit main.tpz --out-dir rust-out
topaz build main.tpz --backend native --out-dir native-out
topaz build --root . --locked --backend native --native-report-json native-report.json --out-dir native-out
topaz build main.tpz --target python --out-dir python-out