Clean up codebase: rename stdlib layer, strip porting residue, fix tooling

Rename src/jolt -> stdlib (the runtime-loaded layer; jolt-core stays the
seed-baked layer) and update the loader / emit-image / doc paths. Drop dead
code: the spike/ experiments, the duplicate clojuredocs-export.edn (json moves
to tools/), the Janet-era jolt.http binding, and the orphaned
persistent_vector.clj whose ns/path didn't even match.

Strip porting residue from comments and docstrings across host/chez, jolt-core,
stdlib, tests, and docs: internal issue ids, "Phase N" markers, and the "vs
Janet" historical exposition, leaving present-tense descriptions and the real
JVM-Clojure semantic contrasts. Same pass over the corpus suite labels. The seed
is unchanged (docstrings/comments aren't emitted), so the self-host fixpoint and
corpus are untouched.

Port tools/spec_coverage.py off the dead janet probe to bin/joltc and regenerate
coverage.md; drop the dead :host/janet rule from certify.clj and regenerate the
conformance profile. Add docs/host-interop.md (the JVM shims and how to register
your own host class from a library) and a writing-style note in CLAUDE.md.

Stabilize the four racy concurrency corpus cases (future-cancel and agent
send/send-off): give the future a sleeping body and the agent a slow action, so
cancel reliably catches an in-flight future and deref reliably reads the
pre-update snapshot. They certify deterministically now, so drop their :flaky
allowlist entries and the orphaned legend.
This commit is contained in:
Yogthos 2026-06-22 22:18:00 -04:00
parent c18f8087f0
commit 33eff7c7d8
112 changed files with 970 additions and 1621 deletions

View file

@ -12,29 +12,29 @@ sources, and process: [`../rfc/0001-language-specification.md`](../rfc/0001-lang
| Doc | Content | Status |
|---|---|---|
| [`00-front-matter.md`](00-front-matter.md) | conformance terms, entry format, host classification | drafted |
| `01-evaluation.md``08-macros.md` | see chapter plan in front matter | planned |
| [`02-reader.md`](02-reader.md) | token grammar + reader-macro catalog | drafted |
| `01`, `04``08` | see chapter plan in front matter | planned |
| [`03-special-forms.md`](03-special-forms.md) | special-form catalog + normative exemplars (`if`, `let*`) | exemplars |
| [`09-core-library.md`](09-core-library.md) | per-var entry format + exemplars (`first`, `reduce`, `parse-uuid`) | exemplars |
| [`coverage.md`](coverage.md) | generated dashboard over the 694-var surface | generated |
| [`../grammar.ebnf`](../grammar.ebnf) | reader surface syntax (EBNF), companion to `02-reader.md` | reference |
Regenerate the dashboard after surface changes:
`python3 tools/spec_coverage.py` (requires `clojuredocs-export.json` in the
repo root and a working jolt checkout).
`python3 tools/spec_coverage.py` (reads `tools/clojuredocs-export.json` and
probes a working jolt checkout via `bin/joltc`).
## Current numbers (2026-06-10)
## Current numbers (2026-06-22)
Of the 694 `clojure.core` vars in the ClojureDocs inventory:
Of the 694 `clojure.core` vars in the ClojureDocs inventory, jolt interns 574.
Broadly:
- **380** implemented in jolt *and* exercised by the behavioral suites
- **154** implemented but not directly tested — each gets a test with its spec entry
- **35** portable but missing from jolt (`parse-long`/`parse-double`/
`parse-boolean`, `update-keys`/`update-vals`, `macroexpand`, `time`,
`partitionv`/`partitionv-all`/`splitv-at`, `with-redefs`, `with-open`,
reader fns, ns-introspection stragglers, …) — tracked as implementation gaps
- **22** resolvable in code but invisible to ns introspection
(`resolve`/`ns-publics` can't see seed-fallback names like `compare`,
`gensym`, `type`) — a conformance finding in its own right
- the rest classified host/JVM/concurrency (see dashboard)
- **568** implemented in jolt *and* exercised by the behavioral suites
- **6** implemented but not directly tested — each gets a test with its spec entry
- **6** portable but absent from jolt's resolvable surface (the REPL history
vars `*1`/`*2`/`*3`/`*e`, plus `letfn`/`re-groups`, which work but aren't
interned where `resolve` can see them) — tracked as gaps
- the rest classified host/JVM/concurrency (see the dashboard for the full
per-var breakdown — it is the source of truth)
## How this connects to the test suites

View file

@ -1,21 +1,21 @@
# Appendix A — Coverage Dashboard (generated)
Generated 2026-06-10 by `tools/spec_coverage.py` — do not edit by hand.
Generated 2026-06-22 by `tools/spec_coverage.py` — do not edit by hand.
Surface: **694** clojure.core vars (ClojureDocs export; 648 with
community examples). jolt interns 564 of them.
community examples). jolt interns 574 of them.
| Status | Count | Meaning |
|---|---|---|
| implemented+tested | 564 | in jolt and exercised by spec/conformance |
| implemented-untested | 0 | in jolt, no direct test — spec entries will add them |
| implemented+tested | 568 | in jolt and exercised by spec/conformance |
| implemented-untested | 6 | in jolt, no direct test — spec entries will add them |
| resolvable-not-interned | 0 | works in code but invisible to ns introspection (conformance finding) |
| missing-portable | 0 | portable semantics, jolt lacks it — implementation gap |
| special-form | 15 | specified in §3, not a library var |
| dynamic-var | 29 | classification needed: portable default vs host-dependent |
| agents-taps | 22 | out of scope pending concurrency design note |
| missing-portable | 6 | portable semantics, jolt lacks it — implementation gap |
| special-form | 16 | specified in §3, not a library var |
| dynamic-var | 24 | classification needed: portable default vs host-dependent |
| agents-taps | 16 | out of scope pending concurrency design note |
| stm-refs | 11 | out of scope pending concurrency design note |
| jvm-specific | 53 | catalogued, not specified |
| jvm-specific | 47 | catalogued, not specified |
Classifications are initial and mechanical — reclassifying is an ordinary
spec change. A var is *Verified* only when its §9 entry exists and carries no
@ -27,12 +27,12 @@ UNVERIFIED field; that column will be added as entries land.
|---|---|---|
| `*` | implemented+tested | ✓ |
| `*'` | implemented+tested | ✓ |
| `*1` | implemented+tested | ✓ |
| `*2` | implemented+tested | ✓ |
| `*3` | implemented+tested | ✓ |
| `*1` | missing-portable | ✓ |
| `*2` | missing-portable | ✓ |
| `*3` | missing-portable | ✓ |
| `*agent*` | dynamic-var | ✓ |
| `*allow-unresolved-vars*` | dynamic-var | ✓ |
| `*assert*` | dynamic-var | ✓ |
| `*assert*` | implemented+tested | ✓ |
| `*clojure-version*` | implemented+tested | ✓ |
| `*command-line-args*` | dynamic-var | ✓ |
| `*compile-files*` | dynamic-var | ✓ |
@ -40,21 +40,21 @@ UNVERIFIED field; that column will be added as entries land.
| `*compiler-options*` | dynamic-var | ✓ |
| `*data-readers*` | dynamic-var | ✓ |
| `*default-data-reader-fn*` | dynamic-var | ✓ |
| `*e` | implemented+tested | ✓ |
| `*err*` | dynamic-var | ✓ |
| `*e` | missing-portable | ✓ |
| `*err*` | implemented-untested | ✓ |
| `*file*` | dynamic-var | ✓ |
| `*flush-on-newline*` | dynamic-var | |
| `*fn-loader*` | dynamic-var | |
| `*in*` | implemented+tested | |
| `*math-context*` | dynamic-var | |
| `*ns*` | implemented+tested | ✓ |
| `*out*` | dynamic-var | ✓ |
| `*out*` | implemented-untested | ✓ |
| `*print-dup*` | dynamic-var | ✓ |
| `*print-length*` | dynamic-var | ✓ |
| `*print-level*` | dynamic-var | ✓ |
| `*print-meta*` | dynamic-var | ✓ |
| `*print-namespace-maps*` | dynamic-var | ✓ |
| `*print-readably*` | dynamic-var | ✓ |
| `*print-readably*` | implemented+tested | ✓ |
| `*read-eval*` | dynamic-var | ✓ |
| `*reader-resolver*` | dynamic-var | |
| `*repl*` | dynamic-var | |
@ -63,7 +63,7 @@ UNVERIFIED field; that column will be added as entries land.
| `*unchecked-math*` | implemented+tested | ✓ |
| `*use-context-classloader*` | dynamic-var | ✓ |
| `*verbose-defrecords*` | dynamic-var | |
| `*warn-on-reflection*` | dynamic-var | ✓ |
| `*warn-on-reflection*` | implemented-untested | ✓ |
| `+` | implemented+tested | ✓ |
| `+'` | implemented+tested | ✓ |
| `-` | implemented+tested | ✓ |
@ -77,7 +77,7 @@ UNVERIFIED field; that column will be added as entries land.
| `->VecSeq` | jvm-specific | |
| `-cache-protocol-fn` | jvm-specific | |
| `-reset-methods` | jvm-specific | |
| `.` | implemented+tested | ✓ |
| `.` | special-form | ✓ |
| `..` | implemented+tested | ✓ |
| `/` | implemented+tested | ✓ |
| `<` | implemented+tested | ✓ |
@ -98,8 +98,8 @@ UNVERIFIED field; that column will be added as entries land.
| `add-classpath` | jvm-specific | ✓ |
| `add-tap` | agents-taps | ✓ |
| `add-watch` | implemented+tested | ✓ |
| `agent` | agents-taps | ✓ |
| `agent-error` | agents-taps | ✓ |
| `agent` | implemented+tested | ✓ |
| `agent-error` | implemented+tested | ✓ |
| `agent-errors` | agents-taps | |
| `aget` | implemented+tested | ✓ |
| `alength` | implemented+tested | ✓ |
@ -131,7 +131,7 @@ UNVERIFIED field; that column will be added as entries land.
| `assoc-in` | implemented+tested | ✓ |
| `associative?` | implemented+tested | ✓ |
| `atom` | implemented+tested | ✓ |
| `await` | agents-taps | ✓ |
| `await` | implemented-untested | ✓ |
| `await-for` | agents-taps | ✓ |
| `await1` | agents-taps | |
| `bases` | jvm-specific | ✓ |
@ -183,7 +183,7 @@ UNVERIFIED field; that column will be added as entries land.
| `chunk-rest` | implemented+tested | ✓ |
| `chunked-seq?` | implemented+tested | ✓ |
| `class` | implemented+tested | ✓ |
| `class?` | jvm-specific | ✓ |
| `class?` | implemented+tested | ✓ |
| `clear-agent-errors` | agents-taps | |
| `clojure-version` | implemented+tested | ✓ |
| `coll?` | implemented+tested | ✓ |
@ -375,13 +375,13 @@ UNVERIFIED field; that column will be added as entries land.
| `lazy-cat` | implemented+tested | ✓ |
| `lazy-seq` | implemented+tested | ✓ |
| `let` | implemented+tested | ✓ |
| `letfn` | implemented+tested | ✓ |
| `letfn` | missing-portable | ✓ |
| `line-seq` | implemented+tested | ✓ |
| `list` | implemented+tested | ✓ |
| `list*` | implemented+tested | ✓ |
| `list?` | implemented+tested | ✓ |
| `load` | jvm-specific | ✓ |
| `load-file` | jvm-specific | ✓ |
| `load` | implemented+tested | ✓ |
| `load-file` | implemented-untested | ✓ |
| `load-reader` | jvm-specific | ✓ |
| `load-string` | implemented+tested | ✓ |
| `loaded-libs` | jvm-specific | ✓ |
@ -464,10 +464,10 @@ UNVERIFIED field; that column will be added as entries land.
| `partition-by` | implemented+tested | ✓ |
| `partitionv` | implemented+tested | |
| `partitionv-all` | implemented+tested | |
| `pcalls` | jvm-specific | ✓ |
| `pcalls` | implemented+tested | ✓ |
| `peek` | implemented+tested | ✓ |
| `persistent!` | implemented+tested | ✓ |
| `pmap` | jvm-specific | ✓ |
| `pmap` | implemented+tested | ✓ |
| `pop` | implemented+tested | ✓ |
| `pop!` | implemented+tested | ✓ |
| `pop-thread-bindings` | implemented+tested | |
@ -496,7 +496,7 @@ UNVERIFIED field; that column will be added as entries land.
| `proxy-name` | jvm-specific | |
| `proxy-super` | implemented+tested | ✓ |
| `push-thread-bindings` | implemented+tested | |
| `pvalues` | jvm-specific | ✓ |
| `pvalues` | implemented+tested | ✓ |
| `qualified-ident?` | implemented+tested | ✓ |
| `qualified-keyword?` | implemented+tested | ✓ |
| `qualified-symbol?` | implemented+tested | ✓ |
@ -512,7 +512,7 @@ UNVERIFIED field; that column will be added as entries land.
| `rational?` | implemented+tested | ✓ |
| `rationalize` | implemented+tested | ✓ |
| `re-find` | implemented+tested | ✓ |
| `re-groups` | implemented+tested | ✓ |
| `re-groups` | missing-portable | ✓ |
| `re-matcher` | implemented+tested | ✓ |
| `re-matches` | implemented+tested | ✓ |
| `re-pattern` | implemented+tested | ✓ |
@ -558,7 +558,7 @@ UNVERIFIED field; that column will be added as entries land.
| `reset-vals!` | implemented+tested | ✓ |
| `resolve` | implemented+tested | ✓ |
| `rest` | implemented+tested | ✓ |
| `restart-agent` | agents-taps | ✓ |
| `restart-agent` | implemented-untested | ✓ |
| `resultset-seq` | jvm-specific | ✓ |
| `reverse` | implemented+tested | ✓ |
| `reversible?` | implemented+tested | ✓ |
@ -568,8 +568,8 @@ UNVERIFIED field; that column will be added as entries land.
| `satisfies?` | implemented+tested | ✓ |
| `second` | implemented+tested | ✓ |
| `select-keys` | implemented+tested | ✓ |
| `send` | agents-taps | ✓ |
| `send-off` | agents-taps | ✓ |
| `send` | implemented+tested | ✓ |
| `send-off` | implemented+tested | ✓ |
| `send-via` | agents-taps | ✓ |
| `seq` | implemented+tested | ✓ |
| `seq-to-map-for-destructuring` | implemented+tested | ✓ |