A 62-case jolt-vs-JVM probe across seq type identity, chunking granularity, eagerness, and realization timing. Findings: the whole producer family is lazy at construction (no eager bugs remain), and the 26 divergences fall into two classes that diverge by representation, not value. Lock in the laziness contract as certified corpus rows: construction=0 for keep/keep-indexed/map-indexed/distinct/partition-by/partition-all/ interpose/interleave/take-nth/reductions/tree-seq/replace, sequence realizes 1, next realizes 2, rest realizes 1. Pin the two accepted divergence classes (allowlisted, gate-guarded): - seq-type-model: jolt reifies seqs as PersistentList/LazySeq vs JVM's Cons/Iterate/LongRange/Repeat/Cycle/ChunkedSeq/StringSeq/KeySeq/RSeq/ ArraySeq/SubVector (jolt-aei7) - chunking-model: unchunked, realizes one where JVM realizes a 32-chunk; mapcat/dedupe fully lazy at construction (jolt-mm6v) known-divergences.edn gains both categories; SPEC.md documents the seq semantics contract. Data/doc only, no re-mint. certify 0 new / 0 stale. |
||
|---|---|---|
| .. | ||
| certify.clj | ||
| known-divergences.edn | ||
| profile.edn | ||
| README.md | ||
| regen-corpus.clj | ||
| SPEC.md | ||
Conformance: certifying the corpus against reference Clojure
See SPEC.md for the full host-neutral language-spec contract: the corpus schema, conformance levels, the feature profile, and how to host jolt on a new runtime. This README covers the certification tooling specifically.
The corpus (test/chez/corpus.edn) is jolt's host-neutral behavioral suite — one
row per case: {:suite :label :expected :actual}, where :actual is a Clojure
source expression and :expected its result (or :throws). The runtime harness
(host/chez/run-corpus.ss, invoked by make corpus) replays it on Chez and
compares by value-equality.
Every :expected is sourced from reference JVM Clojure, so the corpus is both a
regression suite and a specification certified against Clojure rather than
against its authors' beliefs. This directory holds the certification tooling that
closes that gap.
What's here
-
certify.clj— runs every corpus row's:actualand:expectedthrough reference JVM Clojure (each in a freshusernamespace, output/stdin sunk, a 5s per-case watchdog) and compares with Clojure's=. It buckets each row:certified/certified-throws— jolt's:expectedmatches real Clojuredivergent— both evaluate but jolt's:expecteddisagrees with Clojurethrows-mismatch— jolt and Clojure disagree on whether it throwsjvm-error—:actualisn't runnable on vanilla Clojure (host-coupled / jolt-specific) — informational, not certifiableread-error/timeout— won't read on the JVM reader, or ran too long
-
known-divergences.edn— every current divergence, classified. Most are deliberate jolt-specific or host-model deltas (see:legend): the all-double numeric model, snapshot-heap concurrency, the no-JVM host model, jolt reader features, the jolt printer, intentional strictness. A few are genuine:bugentries with a tracked bead. These categories become the:featuresflags in conformance inc3.
make certify is the gate wrapper. It skips cleanly when clojure (JVM) is not
installed; otherwise it runs certify.clj and fails the build on a NEW
(unclassified) divergence or a stale allowlist entry. Flaky entries (JVM
result is timing-dependent, e.g. future-cancel) are tolerated either way.
Running
make certify # the gate wrapper (skips if clojure absent)
clojure -M test/conformance/certify.clj # gate directly (exit≠0 on new/stale)
clojure -M test/conformance/certify.clj test/chez/corpus.edn --edn /tmp/report.edn # full machine-readable report
Current state
Of ~2740 vanilla-certifiable rows, >2730 match reference Clojure exactly; the handful of divergences are all classified (deliberate deltas plus a few tracked bugs). The corpus is trustworthy as a spec, with the host-specific deltas made explicit rather than hidden.
Adding / changing cases
When you add corpus rows or change behavior, re-run the certifier. A NEW divergence
means either a real bug (file it, tag the allowlist entry :bug + :bead) or a
deliberate delta (classify it). A stale entry means a divergence was fixed — remove
it from known-divergences.edn.