# Chez test harness

The correctness gate for jolt on Chez (epic jolt-cf1q). Correctness is judged
against the JVM-sourced conformance spec — no Janet decides pass/fail. The spec
itself lives in `test/conformance/` (see its `SPEC.md`); this directory holds the
Chez runners and unit tests.

## The spec corpus

- `corpus.edn` — the contract: ~2920 rows `{:suite :label :expected :actual}`,
  with `:expected` sourced from reference JVM Clojure. Valid as both EDN and Janet
  data. Generated by `test/conformance/regen-corpus.clj` (the answers) over the
  case list from `extract-corpus.janet` (the `:actual` strings, pulled from
  `test/spec/*.janet` and `conformance-test.janet`).
- `extract-corpus.janet` — re-derives the case list when spec rows change. Writes
  only when `JOLT_EXTRACT_CORPUS_OUT` is set, so a gate run never clobbers the
  JVM-sourced `corpus.edn`. After re-deriving, re-source the answers with
  `regen-corpus.clj`.

## The standing gate

`run-corpus-zero-janet.janet` runs every corpus case through the zero-Janet
spine: read → analyze → IR → emit → eval, all on Chez (the analyzer is
`jolt.analyzer` cross-compiled to Scheme over `host-contract.ss`). Each result is
compared by value-equality against the JVM `:expected`. A `known-fail` allowlist
covers cases jolt can't match because Chez has no JVM host (Java classes, arrays,
`BigDecimal`, opaque host-object printers, …); the gate fails only on a NEW
divergence or if the pass count drops below the floor.

    JOLT_CHEZ_ZEROJANET_CORPUS=1 janet test/chez/run-corpus-zero-janet.janet
    JOLT_CORPUS_LIMIT=200 …            # every-Nth stride, fast iteration

Floor: 2678 (`JOLT_CHEZ_ZJ_FLOOR` overrides). Raise it as host gaps close.

## Unit tests

`_*.janet` drive `bin/joltc` (the pure-Chez CLI; `JOLT_BIN` overrides) one
subprocess per case and compare the last stdout line against a baked expected
value. `:throws` asserts a non-zero exit. Each file targets one area —
`_type`/`_class`/`_seqpred` (taxonomy + predicates), `_str`/`_strns`/`_reader`
(strings + reader), `_io`/`_ioreader`/`_insttime`/`_javastatic` (host interop),
`_dynbind`/`_var_meta`/`_ns` (vars + namespaces), `_atomwatch`/`_walk`/`_dotform`
/`_stdlib` (refs, walk, dot-forms, stdlib). Run one with
`janet test/chez/_type.janet`.

## Self-host gates

- `spine-test.janet` — the zero-Janet compile/eval spine end to end.
- `cli-test.janet` — `bin/joltc -e` behavior.
- `bootstrap-test.janet` — `host/chez/bootstrap.ss` rebuilds the prelude + image
  from source on Chez and matches the checked-in seed (`host/chez/seed/`).
- `fixpoint-test.janet` — the on-Chez compiler reproduces itself (stage2 == stage3,
  prelude pstage3 == pstage4).

## Bench

`bench-pipeline.janet` (opt-in via `JOLT_CHEZ_BENCH=1`) times fib + mandelbrot
through the real pipeline against the spike ceiling. Skipped in the gate.

All Chez runners skip cleanly when `chez` is not on PATH.
