When this matters
Use this contract when a run must be compared, replayed, or audited. “Same input” is incomplete until source bytes, runtime identity, resource profile, and observed channels are all named. A resource profile is the named set of limits a run works under and reports against.
Read the example
A deterministic run is not a promise to finish every program. Each way of running Lispex today has named input, output, transition, and control limits, but those limits do not count every traversal, exact-number operation, allocation, rendering, or diagnostic. A hostile loop or allocation-heavy rule can therefore exceed the semantic coverage of the current profile. Wall-clock duration is operational evidence, not a guest semantic value.
How to reason about it
- The observed channels are stdout bytes, diagnostic bytes, exit status, warning order, the resource report, the projected form of the result value, and artifact or provenance identity where applicable.
- Native and WebAssembly can have different pinned limits while still reporting clean profile-specific resource outcomes.
- Replay fixes source, runner identity, limits, and which observations count before comparing bytes.
Choose quickly
| Fix before comparison | Why it matters | Example observation |
|---|---|---|
| source and input bytes | text normalization would change identity | value or diagnostic bytes |
| runner and profile | limits and the covered part of the language are named | exit status and resource report |
| which observations count | unobserved host details stay outside the claim | stdout and warning order |
| corpus and baseline | outcome cannot choose the test set | agree, mismatch, not-comparable |
| artifact identity where used | evidence must name what was checked | receipt or a short fingerprint of the engine bytes |
A common mistake
Wall-clock timeout alone is not a semantic resource report.
Current boundaries
- Agreement across one fixed set of comparisons is not whole-language equivalence or proof of no divergence.
- Running your source directly through the built-in interpreter and running it through the virtual machine that executes prepared instructions both assume the rule source is trusted. Neither is built to contain hostile source, and neither provides deterministic counters for total work or total allocation.
- A timeout, a killed worker process, the host running out of memory, a panic, or a trap is an operational interruption or an engine fault. It yields no decision and no receipt you can pass on.
Keep going
Runtime Backends explains each runner and where it came from. Checked Surfaces shows exactly what the maintained comparisons cover.