jolt/test/conformance/known-divergences.edn
Yogthos 6abbea3835 Fix 4 clojure.core bugs surfaced by JVM certification
The corpus certifier (test/conformance) flagged four cases where jolt's
hand-written :expected matched a real defect rather than Clojure. Fixed in the
jolt-core overlay, corrected the spec :expected, re-certified against JVM Clojure:

- ex-message: returns nil for a non-throwable (dropped the lenient string branch);
  still returns the message for ex-info. (jolt-l8e8)
- munge: preserves the argument's type — a symbol munges to a symbol, not a string.
  (jolt-hc35)
- print: (print nil) emits "nil", not "" (top-level nil guard; str yields "").
  (jolt-pqio)
- bounded-count: uses the counted? fast path (full count), else counts up to n via
  seq — was (min n (count coll)), wrong for counted colls. Added an uncounted-coll
  spec case. (jolt-2507)

Removed the 4 :bug entries from known-divergences.edn (now certified), regenerated
corpus + profile, re-minted the Chez bootstrap seed (clojure.core changed). Gates:
Janet 155/0, JVM certify clean, both Chez corpus gates 2534 (floors raised),
bootstrap 6/6, fixpoint intact.
2026-06-20 11:06:33 -04:00

224 lines
8.3 KiB
Clojure

{:doc
"Known divergences of test/chez/corpus.edn :expected from JVM Clojure, classified. Most are deliberate jolt-specific or host-model differences (-> :features in conformance inc3). :bug entries are genuine and tracked. The certifier (certify.clj) gates on NEW (unlisted) divergences only. Keyed by [suite label].",
:legend
{:numeric-model
"jolt is all-double: no Ratio/BigDecimal/float; (/ 1 2)=>0.5, 3.0 prints 3",
:concurrency-model
"Janet isolated-heap snapshot futures/agents/pmap; atoms snapshot, not shared",
:host-model
"no JVM host: classes->name strings, no Java arrays, type->symbol, *in* is a map, inline-impl extenders, duck-typed with-open close",
:reader-model
"jolt reader features (:jolt) + syntax-quote literal collapse (spec 2.4 S25); map source-order preserved",
:printer-model
"jolt printer renders transients/atoms/print-method overrides differently from JVM #object",
:strictness
"jolt is intentionally stricter: throws on odd assoc! args / defn with no param vector",
:impl-detail
"representation detail: syntax-quote yields a list? (JVM yields a Cons)"},
:entries
[{:suite "clojure.core / futures — predicates",
:label "cancel an in-flight future returns true",
:category :concurrency-model,
:flaky true}
{:suite "clojure.core / futures — snapshot (copy) semantics",
:label "captured atom is snapshotted, not shared",
:category :concurrency-model}
{:suite "clojure.core / pmap family",
:label "snapshot semantics",
:category :concurrency-model}
{:suite "state / agents (synchronous shim)",
:label "send applies",
:category :concurrency-model}
{:suite "state / agents (synchronous shim)",
:label "send-off applies",
:category :concurrency-model}
{:suite "core / extenders",
:label "lists extended type",
:category :host-model}
{:suite "core / extenders",
:label "seq of tags",
:category :host-model}
{:suite "core / with-open",
:label "close on throw",
:category :host-model}
{:suite "host-interop / class tokens & readers",
:label "class name evaluates to canonical string",
:category :host-model}
{:suite "host-interop / exception + HashMap shims",
:label "getMessage on a thrown string",
:category :host-model}
{:suite "io / *in* + with-in-str + read-line",
:label "*in* is bound",
:category :host-model}
{:suite "metadata / def metadata",
:label "^Type tag on var",
:category :host-model}
{:suite "metadata / type hints",
:label "symbol hint -> :tag",
:category :host-model}
{:suite "predicates / compare, type, any? (stage 3)",
:label "type of record",
:category :host-model}
{:suite "predicates / tagged-value (Phase 4)",
:label "chunked-seq? always false",
:category :host-model}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "bean is the map",
:category :host-model}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "class keyword",
:category :host-model}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "class number",
:category :host-model}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "class string",
:category :host-model}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "definterface defines",
:category :host-model}
{:suite "untested / JVM-shape stubs (documented jolt behavior)",
:label "proxy resolves nil",
:category :host-model}
{:suite "untested / array stubs (vectors + host buffers)",
:label "boolean-array",
:category :host-model}
{:suite "untested / array stubs (vectors + host buffers)",
:label "double-array",
:category :host-model}
{:suite "untested / array stubs (vectors + host buffers)",
:label "float-array",
:category :host-model}
{:suite "untested / array stubs (vectors + host buffers)",
:label "int-array",
:category :host-model}
{:suite "untested / array stubs (vectors + host buffers)",
:label "into-array",
:category :host-model}
{:suite "untested / array stubs (vectors + host buffers)",
:label "long-array",
:category :host-model}
{:suite "untested / array stubs (vectors + host buffers)",
:label "short-array",
:category :host-model}
{:suite "untested / array stubs (vectors + host buffers)",
:label "to-array",
:category :host-model}
{:suite "untested / chunk family (eager equivalents) + cat",
:label "chunk round-trip",
:category :host-model}
{:suite "untested / ns + REPL machinery",
:label "*in* bound",
:category :host-model}
{:suite "untested / ns + REPL machinery",
:label "ns-imports empty user",
:category :host-model}
{:suite "untested / unchecked-* are plain ops",
:label "unchecked-char",
:category :host-model}
{:suite "macros / defmacro",
:label "macroexpand-1",
:category :impl-detail}
{:suite "clojure.core / leaf batch (complement fnil munge etc.)",
:label "bigdec",
:category :numeric-model}
{:suite
"conformance / native-op parity (compile emits janet ops at guarded arities)",
:label "native unary div",
:category :numeric-model}
{:suite "numbers / arithmetic",
:label "divide to fraction",
:category :numeric-model}
{:suite "numbers / literal syntax",
:label "bigdec int M",
:category :numeric-model}
{:suite "numbers / literal syntax",
:label "bigdec suffix M",
:category :numeric-model}
{:suite "numbers / literal syntax",
:label "neg ratio",
:category :numeric-model}
{:suite "numbers / literal syntax",
:label "ratio -> double",
:category :numeric-model}
{:suite "numbers / literal syntax",
:label "ratio 3/4",
:category :numeric-model}
{:suite "numbers / printing of inf & nan",
:label "inf inside coll",
:category :numeric-model}
{:suite "numbers / printing of inf & nan",
:label "pr-str Infinity",
:category :numeric-model}
{:suite "reader / scalar literals",
:label "bigdec suffix M",
:category :numeric-model}
{:suite "reader / scalar literals",
:label "ratio -> double",
:category :numeric-model}
{:suite "untested / primed + division + bit ops",
:label "/ ratio-as-double",
:category :numeric-model}
{:suite "untested / typed coercion views",
:label "double",
:category :numeric-model}
{:suite "untested / typed coercion views",
:label "float",
:category :numeric-model}
{:suite "untested / unchecked-* are plain ops",
:label "unchecked-double",
:category :numeric-model}
{:suite "untested / unchecked-* are plain ops",
:label "unchecked-float",
:category :numeric-model}
{:suite "io / cold tagged types via print-method",
:label "transient map",
:category :printer-model}
{:suite "io / cold tagged types via print-method",
:label "transient vector",
:category :printer-model}
{:suite "io / print-method multimethod",
:label "defmethod fires through prn",
:category :printer-model}
{:suite "io / print-method multimethod",
:label "defmethod overrides a record, top level",
:category :printer-model}
{:suite "io / cold tagged types via print-method",
:label "atom override fires nested",
:category :reader-model}
{:suite "io / print-method multimethod",
:label "defmethod fires nested in a map",
:category :reader-model}
{:suite "maps / literal construction",
:label "source order through syntax-quote",
:category :reader-model}
{:suite "reader / dispatch & sugar",
:label "reader cond :jolt",
:category :reader-model}
{:suite "reader / dispatch & sugar",
:label "reader cond no match",
:category :reader-model}
{:suite "reader / dispatch & sugar",
:label "reader cond splice",
:category :reader-model}
{:suite "reader / dispatch & sugar",
:label "reader cond splice no match",
:category :reader-model}
{:suite "reader / dispatch & sugar",
:label "reader conditional",
:category :reader-model}
{:suite "reader / syntax-quote literal collapse (spec 2.4 S25)",
:label "bool nested",
:category :reader-model}
{:suite "reader / syntax-quote literal collapse (spec 2.4 S25)",
:label "nil nested",
:category :reader-model}
{:suite "forms / fn",
:label "no param vector",
:category :strictness}
{:suite "transient / assoc! odd args throw",
:label "map dangling key",
:category :strictness}
{:suite "transient / assoc! odd args throw",
:label "vector dangling",
:category :strictness}]}