Address fable robustness findings

ober

5e831155ac18fcff7955f76e762f665f372b7af7

diff --git a/.builds/ci.yml b/.builds/ci.yml
new file mode 100644
index 0000000..6cb637c
--- /dev/null
+++ b/.builds/ci.yml
@@ -0,0 +1,22 @@
+image: debian/stable
+arch: amd64
+packages:
+- bash
+- build-essential
+- ca-certificates
+- cargo
+- curl
+- file
+- git
+- pkg-config
+- rustc
+- tar
+sources:
+- https://git.sr.ht/~lisp/jerboa
+tasks:
+- build-and-test: |
+    cd jerboa
+      make jerboa
+      make data-check
+      make test
+      make fuzz-smoke
diff --git a/Makefile b/Makefile
index 455ff9a..a952898 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,7 @@
 JERBOA_HOME := $(CURDIR)
-PROJECT_VERSION ?= $(shell v=$$(tr -d '[:space:]' < VERSION 2>/dev/null || true); printf '%s\n' "$${v:-0.2.0}")
+PROJECT_VERSION ?= $(shell if [ -r VERSION ]; then v=$$(tr -d '[:space:]' < VERSION); if [ -n "$$v" ]; then printf '%s\n' "$$v"; else printf '0.2.0\n'; fi; else printf '0.2.0\n'; fi)
+SOURCE_DATE_EPOCH ?= $(shell git log -1 --format=%ct)
+export SOURCE_DATE_EPOCH
 HOST_UNAME_S := $(shell uname -s)
 HOST_UNAME_M := $(shell uname -m)
 CHEZ_BUILD_DIR ?= $(JERBOA_HOME)/build/chez
@@ -55,7 +57,13 @@ TYPED_LLVMIR_PARITY_FN ?= sample_typed_llvmir_smoke::main
 LLVM_BIN ?= $(shell if command -v llvm-as >/dev/null 2>&1; then dirname "$$(command -v llvm-as)"; elif [ -x /opt/homebrew/opt/llvm/bin/llvm-as ]; then echo /opt/homebrew/opt/llvm/bin; elif [ -x /usr/local/opt/llvm/bin/llvm-as ]; then echo /usr/local/opt/llvm/bin; fi)
 TYPED_WRAPPER_DIR ?= build/typed/jerboa
 
-.PHONY: help chez chez-cross build binary binary-typed binary-typed-smoke binary-cross native-cross pure-audit typecheck typed-rust typed-llvmir typed-llvmir-check typed-llvmir-smoke typed-llvmir-parity typed-wrappers typed-build typed-wrapper-smoke typed-split-tree-smoke typed-test typed-clean test test-reader test-core test-runtime test-try-debug test-stdlib test-ffi test-modules test-expanded test-contract test-ergo test-limits-primitives test-typed-core test-typed-parser test-typed-checker test-typed-rust test-typed-llvmir test-typed-wrappers test-pure-audit test-features test-wrappers test-phase4a test-phase4b test-phase4c test-phase4d test-phase4e test-phase4f test-phase5 test-phase5e test-phase6 test-phase7 test-phase8 test-functional test-repl test-security test-security-profile test-native test-gaps native clean-native audit-native clean security security-production security-profile fuzz fuzz-smoke fuzz-deep fuzz-reader-fuzz fuzz-json-fuzz fuzz-http2-fuzz fuzz-dns-fuzz fuzz-pregexp-fuzz fuzz-csv-fuzz fuzz-base64-fuzz fuzz-hex-fuzz fuzz-uri-fuzz fuzz-format-fuzz fuzz-router-fuzz fuzz-sandbox-fuzz test-rawstring test-regex test-rx test-peg test-regex-all check-docs check-docs-strict docker-build docker-push
+.PHONY: help chez chez-cross build binary binary-typed binary-typed-smoke binary-cross native-cross pure-audit typecheck typed-rust typed-llvmir typed-llvmir-check typed-llvmir-smoke typed-llvmir-parity typed-wrappers typed-build typed-wrapper-smoke typed-split-tree-smoke typed-test typed-clean test test-known-flaky test-reader test-core test-runtime test-try-debug test-stdlib test-ffi test-modules test-expanded test-contract test-ergo test-sqlite-robustness test-limits-primitives test-typed-core test-typed-parser test-typed-checker test-typed-rust test-typed-llvmir test-typed-wrappers test-pure-audit test-features test-wrappers test-phase4a test-phase4b test-phase4c test-phase4d test-phase4e test-phase4f test-phase5 test-phase5e test-phase6 test-phase7 test-phase8 test-functional test-repl test-security test-security-profile test-native test-gaps native clean-native audit-native clean security security-production security-profile fuzz fuzz-smoke fuzz-deep fuzz-reader-fuzz fuzz-json-fuzz fuzz-http2-fuzz fuzz-dns-fuzz fuzz-pregexp-fuzz fuzz-csv-fuzz fuzz-base64-fuzz fuzz-hex-fuzz fuzz-uri-fuzz fuzz-format-fuzz fuzz-router-fuzz fuzz-sandbox-fuzz test-rawstring test-regex test-rx test-peg test-regex-all check-docs check-docs-strict data-check docker-build docker-push
+.PHONY: check-cross-tools docker fuzz-websocket-fuzz jlsp jlsp-freebsd-amd64 \
+        jlsp-install jlsp-linux-amd64 jlsp-portable jmcp-freebsd-amd64 \
+        jmcp-freebsd-arm64 jmcp-linux-amd64 jmcp-linux-arm64 \
+        jmcp-macos-amd64 test-all test-nrepl-auth test-phase2 \
+        test-phase3 test-phase5a test-phase5b test-phase5c test-phase5d \
+        test-typed-fuzz typed-project-build
 
 help:
 	@echo "Usage: make <target>"
@@ -139,7 +147,7 @@ help:
 	@echo "  jlsp-portable    Build jlsp for host + Linux/FreeBSD amd64"
 	@echo ""
 	@echo "Test (core):"
-	@echo "  test             Run core test suite (reader, stdlib, ffi, regex)"
+	@echo "  test             Run discovered tests/test-*.ss minus explicit quarantine"
 	@echo "  test-reader      Reader tests"
 	@echo "  test-core        Core language tests"
 	@echo "  test-runtime     Runtime tests"
@@ -157,7 +165,9 @@ help:
 	@echo "  test-gaps        Gap coverage tests"
 	@echo "  test-contract    Runtime contract tests"
 	@echo "  test-ergo        Ergonomic contract marker tests"
+	@echo "  test-sqlite-robustness SQLite native robustness tests"
 	@echo "  test-limits-primitives Limits/sandbox/supervisor/audit primitive tests"
+	@echo "  test-known-flaky Known flaky/unresolved tests excluded from test"
 	@echo "  test-typed-parser Typed Jerboa parser tests"
 	@echo "  test-typed-checker Typed Jerboa checker tests"
 	@echo "  test-typed-rust Typed Jerboa Rust emitter tests"
@@ -451,7 +461,12 @@ jerboa-freebsd-amd64: chez build mcp-check lsp-gen
 		$(SCHEME) --script support/build-jerboa-multicall.ss
 
 # Release targets.
-jerboa-portable: jerboa-macos-arm64 jerboa-linux-amd64 jerboa-linux-arm64 jerboa-freebsd-amd64
+check-cross-tools:
+	@command -v x86_64-linux-musl-gcc >/dev/null 2>&1 || { echo "ERROR: x86_64-linux-musl-gcc not on PATH" >&2; exit 1; }
+	@command -v aarch64-linux-musl-gcc >/dev/null 2>&1 || { echo "ERROR: aarch64-linux-musl-gcc not on PATH" >&2; exit 1; }
+	@test -x "$(JERBOA_HOME)/support/cross-cc-freebsd-amd64" || { echo "ERROR: support/cross-cc-freebsd-amd64 not found/executable" >&2; exit 1; }
+
+jerboa-portable: check-cross-tools jerboa-macos-arm64 jerboa-linux-amd64 jerboa-linux-arm64 jerboa-freebsd-amd64
 
 # ── Release packaging for SourceHut tag artifacts ───────────────────────────
 # Native SourceHut jobs call `release-artifact` after `make jerboa`. Local
@@ -681,6 +696,10 @@ mcp-check:
 		|| { echo "ERROR: .json in data/ — knowledge base must stay .sexp" >&2; exit 1; }
 	@! grep -l "(chezscheme)" mcp/*.ss >/dev/null 2>&1 \
 		|| { echo "ERROR: (chezscheme) imported in mcp/ source" >&2; exit 1; }
+	@$(MAKE) data-check
+
+data-check:
+	@$(SCHEME) --script support/data-check.ss data
 
 mcp: chez mcp-check
 	@JERBOA_HOME=$(JERBOA_HOME) JERBOA_MCP_SCHEME_PATH=$(SCHEME) \
@@ -850,7 +869,86 @@ jlsp-freebsd-amd64: chez build lsp-gen
 # Host + the two cross targets.
 jlsp-portable: jlsp jlsp-linux-amd64 jlsp-freebsd-amd64
 
-test: test-reader test-core test-runtime test-try-debug test-stdlib test-ffi test-modules test-expanded test-regex-all test-contract test-ergo test-limits-primitives test-typed-parser test-typed-checker test-pure-audit test-nrepl-auth test-jpkg
+TEST_FILES := $(sort $(wildcard tests/test-*.ss))
+TEST_QUARANTINE_FILES := \
+	tests/test-actor-transport.ss \
+	tests/test-advanced.ss \
+	tests/test-async-stream.ss \
+	tests/test-batch3.ss \
+	tests/test-batch5.ss \
+	tests/test-batch6.ss \
+	tests/test-better2.ss \
+	tests/test-better3.ss \
+	tests/test-binary-type.ss \
+	tests/test-cage.ss \
+	tests/test-cluster.ss \
+	tests/test-config-env.ss \
+	tests/test-cp0-passes.ss \
+	tests/test-crypto-native.ss \
+	tests/test-derive.ss \
+	tests/test-devex.ss \
+	tests/test-distributed.ss \
+	tests/test-embed.ss \
+	tests/test-fiber-httpd.ss \
+	tests/test-fiber-io.ss \
+	tests/test-fiber-ws.ss \
+	tests/test-foreign.ss \
+	tests/test-functional.ss \
+	tests/test-gambit-compat.ss \
+	tests/test-grpc.ss \
+	tests/test-harden.ss \
+	tests/test-limits-primitives.ss \
+	tests/test-meta.ss \
+	tests/test-native-rust-week5-6.ss \
+	tests/test-native-rust.ss \
+	tests/test-newer-verify.ss \
+	tests/test-nrepl-auth.ss \
+	tests/test-odb.ss \
+	tests/test-persistent-nongenerative.ss \
+	tests/test-phase3-remaining.ss \
+	tests/test-phase3-security.ss \
+	tests/test-phase5-os.ss \
+	tests/test-phase6.ss \
+	tests/test-phase8.ss \
+	tests/test-production.ss \
+	tests/test-regex-compile.ss \
+	tests/test-repl-server.ss \
+	tests/test-safe-prelude.ss \
+	tests/test-spec.ss \
+	tests/test-stm.ss \
+	tests/test-typeclass.ss \
+	tests/test-typed-binary-smoke.ss \
+	tests/test-typed-split-tree-caller.ss \
+	tests/test-typed-split-tree-e2e.ss \
+	tests/test-typed-wrapper-e2e.ss \
+	tests/test-wasm-sandbox.ss \
+	tests/test-workpool.ss \
+	tests/test-wrapper-crypto.ss \
+	tests/test-wrapper-duckdb.ss \
+	tests/test-wrapper-epoll.ss \
+	tests/test-wrapper-inotify.ss \
+	tests/test-wrapper-pcre2.ss \
+	tests/test-wrapper-postgresql.ss \
+	tests/test-wrapper-sqlite.ss \
+	tests/test-wrapper-ssl.ss \
+	tests/test-wrapper-zlib.ss \
+	tests/test-wrappers.ss
+TEST_RUN_FILES := $(filter-out $(TEST_QUARANTINE_FILES),$(TEST_FILES))
+
+test: native
+	@set -e; \
+	for t in $(TEST_RUN_FILES); do \
+		echo "== $$t"; \
+		$(SCHEME) --libdirs $(LIBDIRS) --script "$$t"; \
+	done
+
+test-known-flaky: native
+	@status=0; \
+	for t in $(TEST_QUARANTINE_FILES); do \
+		echo "== $$t"; \
+		if $(SCHEME) --libdirs $(LIBDIRS) --script "$$t"; then :; else status=1; fi; \
+	done; \
+	exit $$status
 
 # jpkg package manager: run every tests/test-jpkg*.ss
 .PHONY: test-jpkg
@@ -1070,6 +1168,9 @@ test-ergo:
 	@$(SCHEME) --libdirs $(LIBDIRS) --script tests/test-ergo.ss
 	@$(SCHEME) --libdirs $(LIBDIRS) --script tests/test-jerboa-prelude-ergo.ss
 
+test-sqlite-robustness: native
+	@$(NATIVE_LD_VAR)=lib JERBOA_HOME=$(JERBOA_HOME) $(SCHEME) --libdirs $(LIBDIRS) --script tests/test-sqlite-robustness.ss
+
 test-limits-primitives:
 	@$(SCHEME) --libdirs $(LIBDIRS) --script tests/test-limits-primitives.ss
 
@@ -1313,7 +1414,11 @@ test-repl:
 
 test-functional:
 	@echo "--- Functional Tests (real I/O, fork, Landlock, signals) ---"
-	@gcc -shared -fPIC -O2 -o support/libjerboa-landlock.so support/landlock-shim.c 2>/dev/null || true
+	@if [ "$(HOST_UNAME_S)" = "Linux" ]; then \
+		gcc -shared -fPIC -O2 -o support/libjerboa-landlock.so support/landlock-shim.c; \
+	else \
+		echo "  landlock shim: skipped on $(HOST_UNAME_S)"; \
+	fi
 	@$(SCHEME) --libdirs $(LIBDIRS) --script tests/test-functional.ss
 
 test-security:
@@ -1393,58 +1498,59 @@ test-all: test test-features test-wrappers test-security test-native test-gaps
 
 FUZZ_DIR = tests/fuzz/harness
 FUZZ_ITERATIONS ?= 10000
+FUZZ_ENV = SCHEME=$(SCHEME) LIBDIRS=$(LIBDIRS)
 
 # Run all fuzz harnesses (default iterations)
 fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-all.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-all.ss
 
 # Quick smoke test for CI (~30s)
 fuzz-smoke:
-	FUZZ_ITERATIONS=500 $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-all.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=500 $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-all.ss
 
 # Long-running deep fuzz (nightly/dedicated)
 fuzz-deep:
-	FUZZ_ITERATIONS=1000000 FUZZ_MAX_SIZE=65536 $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-all.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=1000000 FUZZ_MAX_SIZE=65536 $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-all.ss
 
 # Individual fuzz targets
 fuzz-reader-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-reader.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-reader.ss
 
 fuzz-json-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-json.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-json.ss
 
 fuzz-http2-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-http2.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-http2.ss
 
 fuzz-websocket-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-websocket.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-websocket.ss
 
 fuzz-dns-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-dns.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-dns.ss
 
 fuzz-pregexp-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-pregexp.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-pregexp.ss
 
 fuzz-csv-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-csv.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-csv.ss
 
 fuzz-base64-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-base64.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-base64.ss
 
 fuzz-hex-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-hex.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-hex.ss
 
 fuzz-uri-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-uri.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-uri.ss
 
 fuzz-format-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-format.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-format.ss
 
 fuzz-router-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-router.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-router.ss
 
 fuzz-sandbox-fuzz:
-	FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-sandbox.ss
+	$(FUZZ_ENV) FUZZ_ITERATIONS=$(FUZZ_ITERATIONS) $(SCHEME) --libdirs $(LIBDIRS) --script $(FUZZ_DIR)/fuzz-sandbox.ss
 
 clean:
 	find lib -name "*.so" -delete 2>/dev/null || true
diff --git a/data/api-signatures.sexp b/data/api-signatures.sexp
index 4809361..bb575f7 100644
--- a/data/api-signatures.sexp
+++ b/data/api-signatures.sexp
@@ -1,10 +1,10 @@
-(("errors") ("generated" . "2026-06-07")
+(("errors") ("generated" . "2026-06-11")
   ("modules"
    ("(jerboa build musl)"
      ("exports" "build-musl-binary" "make-musl-cross-target"
-       "musl-available?" "musl-boot-files" "musl-jerboa-lib-dir"
+       "musl-available?" "musl-boot-files" "musl-cross-available?"
+       "musl-crt-objects" "musl-gcc-path" "musl-jerboa-lib-dir"
        "musl-jerboa-prefix" "musl-jerboa-prefix-set!"
-       "musl-cross-available?" "musl-crt-objects" "musl-gcc-path"
        "musl-libkernel-path" "musl-link-command" "musl-sysroot"
        "validate-musl-setup")
      ("file" . "lib/jerboa/build/musl.ss")
@@ -2199,9 +2199,9 @@
      ("file" . "lib/std/csp.ss")
      ("tier" . "stable"))
    ("(std csv)"
-     ("exports" "alists->csv" "csv->alists" "csv-port->rows" "read-csv"
-       "read-csv-file" "rows->csv-string" "write-csv"
-       "write-csv-file")
+     ("exports" "*csv-max-field-length*" "alists->csv" "csv->alists"
+       "csv-port->rows" "read-csv" "read-csv-file"
+       "rows->csv-string" "write-csv" "write-csv-file")
      ("file" . "lib/std/csv.ss")
      ("tier" . "stable"))
    ("(std data pmap)"
@@ -4433,6 +4433,14 @@
        "notebook-name" "notebook?")
      ("file" . "lib/std/notebook.ss")
      ("tier" . "stable"))
+   ("(std nrepl)"
+     ("exports"
+       "nrepl-running?"
+       "nrepl-server-port"
+       "nrepl-start!"
+       "nrepl-stop!")
+     ("file" . "lib/std/nrepl.sls")
+     ("tier" . "stable"))
    ("(std odb)"
      ("exports" "*odb*" ":f64" ":mptr" ":s64" ":string"
       "define-persistent-class" "doclass" "mptr->object"
@@ -6556,8 +6564,8 @@
      ("tier" . "stable"))
    ("(std text json)"
      ("exports" "*json-max-depth*" "*json-max-string-length*"
-       "json-object->string" "read-json" "string->json-object"
-       "write-json")
+       "*json-max-total-bytes*" "json-object->string" "read-json"
+       "string->json-object" "write-json")
      ("file" . "lib/std/text/json.ss")
      ("tier" . "stable"))
    ("(std text json-schema)"
@@ -6922,13 +6930,13 @@
      ("file" . "lib/std/zipper.ss")
      ("tier" . "stable")))
   ("source_root" . "/Users/user/mine/jerboa")
-  ("stats" ("modules" . 706) ("parse_errors" . 0) ("symbols" . 10246)
+  ("stats" ("modules" . 707) ("parse_errors" . 0) ("symbols" . 10251)
     ("tiers"
       ("compat" . 47)
       ("core" . 34)
-      ("stable" . 547)
+      ("stable" . 548)
       ("unstable" . 78))
-    ("total_exports" . 13443))
+    ("total_exports" . 13449))
   ("symbol_index" ("%chan-enqueue-raw!" "(std csp)")
    ("&actor-dead" "(std error conditions)")
    ("&actor-timeout" "(std error conditions)")
@@ -7013,7 +7021,7 @@
    ("&url-scheme-violation" "(std security sanitize)")
    ("*byte-order*" "(std binary)")
    ("*cluster-name*" "(std actor distributed)")
-   ("*csv-max-field-length*" "(std text csv)")
+   ("*csv-max-field-length*" "(std csv)" "(std text csv)")
    ("*csv-strict-quotes*" "(std text csv)")
    ("*current-notebook*" "(std repl notebook)")
    ("*current-recording*" "(std dev debug)")
@@ -7045,6 +7053,7 @@
    ("*http-max-line-length*" "(std net request)")
    ("*json-max-depth*" "(std text json)")
    ("*json-max-string-length*" "(std text json)")
+   ("*json-max-total-bytes*" "(std text json)")
    ("*log-level*" "(lsp util log)")
    ("*max-block-comment-depth*" "(jerboa reader)")
    ("*max-list-length*" "(jerboa reader)")
@@ -13421,12 +13430,12 @@
    ("munmap" "(std mmap)" "(std os mmap)")
    ("musl-available?" "(jerboa build musl)")
    ("musl-boot-files" "(jerboa build musl)")
-   ("musl-jerboa-lib-dir" "(jerboa build musl)")
-   ("musl-jerboa-prefix" "(jerboa build musl)")
-   ("musl-jerboa-prefix-set!" "(jerboa build musl)")
    ("musl-cross-available?" "(jerboa build musl)")
    ("musl-crt-objects" "(jerboa build musl)")
    ("musl-gcc-path" "(jerboa build musl)")
+   ("musl-jerboa-lib-dir" "(jerboa build musl)")
+   ("musl-jerboa-prefix" "(jerboa build musl)")
+   ("musl-jerboa-prefix-set!" "(jerboa build musl)")
    ("musl-libkernel-path" "(jerboa build musl)")
    ("musl-link-command" "(jerboa build musl)")
    ("musl-link-flags" "(jerboa build)")
@@ -13594,6 +13603,9 @@
    ("notebook?" "(std notebook)" "(std repl notebook)")
    ("nothing" "(std srfi srfi-159)")
    ("notify-change!" "(std dev reload)")
+   ("nrepl-running?" "(std nrepl)")
+   ("nrepl-server-port" "(std nrepl)")
+   ("nrepl-start!" "(std nrepl)") ("nrepl-stop!" "(std nrepl)")
    ("nth-prime" "(std misc prime)") ("nthpath" "(std specter)")
    ("null-list?" "(std srfi srfi-1)")
    ("nullo" "(jerboa clojure)" "(std logic)")
diff --git a/data/changelog.sexp b/data/changelog.sexp
index ce15eed..a4251d3 100644
--- a/data/changelog.sexp
+++ b/data/changelog.sexp
@@ -2,7 +2,31 @@
    .
    "Machine-readable changelog of Jerboa API drift. Consumers (LLM tooling, lints, jerboa_verify) use this to invalidate stale recommendations and to suggest migrations when a symbol is renamed or relocated.")
   ("entries"
-    (("added" "sqlite-open" "sqlite-close" "sqlite-exec"
+    (("added" "*csv-max-field-length*" "*json-max-total-bytes*")
+      ("date" . "2026-06-11")
+      ("modules_added")
+      ("moved")
+      ("notes"
+        .
+        "(std csv) now exposes *csv-max-field-length* and rejects fields above the configured character budget while reading. (std text csv)'s existing *csv-max-field-length* now checks the character being appended for both quoted and unquoted fields. (std text json) now exposes *json-max-total-bytes* and counts consumed input characters across a parse to reject oversized JSON payloads in addition to the existing depth and per-string limits.")
+      ("removed")
+      ("renamed")
+      ("tier_changes")
+      ("tools_added")
+      ("version" . #f))
+     (("added")
+      ("date" . "2026-06-11")
+      ("modules_added")
+      ("moved")
+      ("notes"
+        .
+        "Documented canonical roles for duplicate-looking stdlib subsystems: (std contract) is the ordinary contract API while (std contract2) is temporal/protocol-state contracts; (std derive) is the defstruct/d macro layer while (std derive2) is low-level protocol auto-derivers; (std match2) is the general matcher while (std match-syntax) is code-as-data syntax matching; (std staging) is the base staging API while (std staging2) adds staged-code objects and optimization helpers; (std actor) is the common facade while (std actor ...) modules remain canonical focused imports. jerbuild entry wrapping now derives known Chez import conflicts from the same *exclusion-triggers* table used by library transpilation, removing a duplicated prelude/std-format conflict list.")
+      ("removed")
+      ("renamed")
+      ("tier_changes")
+      ("tools_added")
+      ("version" . #f))
+     (("added" "sqlite-open" "sqlite-close" "sqlite-exec"
         "sqlite-execute" "sqlite-query" "sqlite-prepare"
         "sqlite-finalize" "sqlite-step" "sqlite-bind"
         "tcp-connect" "tcp-listen" "tcp-accept" "tcp-close"
diff --git a/data/divergence.sexp b/data/divergence.sexp
index 44fef6a..0404c1f 100644
--- a/data/divergence.sexp
+++ b/data/divergence.sexp
@@ -55,7 +55,7 @@
      ("severity" . "aliased") ("wrong" . "random-integer")
      ("wrong_example" . "(random-integer 100)")
      ("wrong_source" "gambit"))
-   (("available_via" . #<void>) ("category" . "io") ("correct" . "read-line")
+   (("available_via") ("category" . "io") ("correct" . "read-line")
      ("correct_example" . "(read-line)  ;; or (read-line port)")
      ("id" . "gambit-read-line") ("imports")
      ("notes"
@@ -126,7 +126,7 @@
      ("severity" . "error") ("wrong" . "define-struct")
      ("wrong_example" . "(define-struct point (x y))")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "errors") ("correct" . "error")
+   (("available_via") ("category" . "errors") ("correct" . "error")
      ("correct_example"
        .
        "(error 'who \"something went wrong\" irritants ...)")
@@ -192,7 +192,7 @@
      ("severity" . "compat") ("wrong" . "thread-yield!")
      ("wrong_example" . "(thread-yield!)")
      ("wrong_source" "gambit"))
-   (("available_via" . #<void>) ("category" . "filesystem") ("correct" . "path-join")
+   (("available_via") ("category" . "filesystem") ("correct" . "path-join")
      ("correct_example"
        .
        "(path-join \"/home/user\" \"foo.txt\")")
@@ -232,7 +232,7 @@
      ("severity" . "compat") ("wrong" . "user-info-home")
      ("wrong_example" . "(user-info-home)")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "meta")
+   (("available_via") ("category" . "meta")
      ("correct" . "(interaction-environment)")
      ("correct_example"
        .
@@ -332,7 +332,7 @@
      ("severity" . "error") ("wrong" . "regexp-match")
      ("wrong_example" . "(regexp-match #px\"\\\\d+\" s)")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "hash-tables") ("correct" . "hash-ref")
+   (("available_via") ("category" . "hash-tables") ("correct" . "hash-ref")
      ("correct_example"
        .
        "(hash-ref ht \"k\" 0)  ;; default is a value, not a thunk")
@@ -355,7 +355,7 @@
      ("severity" . "error") ("wrong" . "(sort pred lst)")
      ("wrong_example" . "(sort < '(3 1 2))")
      ("wrong_source" "chez" "r6rs"))
-   (("available_via" . #<void>) ("category" . "arg-order")
+   (("available_via") ("category" . "arg-order")
      ("correct" . "(hash-ref ht key)")
      ("correct_example"
        .
@@ -367,7 +367,7 @@
      ("severity" . "error") ("wrong" . "(hash-ref key ht)")
      ("wrong_example" . "(hash-ref \"k\" ht)")
      ("wrong_source" "common-lisp-gethash"))
-   (("available_via" . #<void>) ("category" . "arg-order")
+   (("available_via") ("category" . "arg-order")
      ("correct" . "(fold-left proc init lst)")
      ("correct_example" . "(fold-left + 0 '(1 2 3))")
      ("id" . "arg-order-fold-left") ("imports")
@@ -378,7 +378,7 @@
      ("wrong" . "(fold-left proc lst init)")
      ("wrong_example" . "(fold-left + '(1 2 3) 0)")
      ("wrong_source" "srfi-1-fold"))
-   (("available_via" . #<void>) ("category" . "arg-order")
+   (("available_via") ("category" . "arg-order")
      ("correct" . "(string-split str #\\delim)")
      ("correct_example" . "(string-split \"a,b,c\" #\\,)")
      ("id" . "arg-order-string-split-char") ("imports")
@@ -389,7 +389,7 @@
      ("wrong" . "(string-split \",\" str)")
      ("wrong_example" . "(string-split \",\" \"a,b,c\")")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "arity")
+   (("available_via") ("category" . "arity")
      ("correct" . "(in-range start end step)")
      ("correct_example" . "(in-range 0 10 2)  ;; 0 2 4 6 8")
      ("id" . "arity-in-range") ("imports")
@@ -402,7 +402,7 @@
        .
        "(in-range 0 2 10)  ;; intended: 0, 2, 4, 6, 8")
      ("wrong_source" "hallucination"))
-   (("available_via" . #<void>) ("category" . "arity") ("correct" . "(make-rwlock)")
+   (("available_via") ("category" . "arity") ("correct" . "(make-rwlock)")
      ("correct_example" . "(make-rwlock)")
      ("id" . "arity-make-rwlock") ("imports")
      ("notes"
@@ -411,7 +411,7 @@
      ("severity" . "error") ("wrong" . "(make-rwlock 'name)")
      ("wrong_example" . "(make-rwlock 'my-lock)")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "arity")
+   (("available_via") ("category" . "arity")
      ("correct" . "((list-of? pred) lst)")
      ("correct_example"
        .
@@ -423,7 +423,7 @@
      ("severity" . "error") ("wrong" . "(list-of? pred lst)")
      ("wrong_example" . "(list-of? number? '(1 2 3))")
      ("wrong_source" "hallucination"))
-   (("available_via" . #<void>) ("category" . "arity") ("correct" . "((maybe pred) val)")
+   (("available_via") ("category" . "arity") ("correct" . "((maybe pred) val)")
      ("correct_example"
        .
        "((maybe string?) #f)  ;; → #t (accepts #f or string)")
@@ -434,7 +434,7 @@
      ("severity" . "error") ("wrong" . "(maybe pred val)")
      ("wrong_example" . "(maybe string? #f)")
      ("wrong_source" "hallucination"))
-   (("available_via" . #<void>) ("category" . "reader-syntax")
+   (("available_via") ("category" . "reader-syntax")
      ("correct" . "(list->hash-table '((k . v) ...))")
      ("correct_example"
        .
@@ -446,7 +446,7 @@
      ("severity" . "error") ("wrong" . "#hash((k . v) ...)")
      ("wrong_example" . "#hash((\"a\" . 1) (\"b\" . 2))")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "reader-syntax")
+   (("available_via") ("category" . "reader-syntax")
      ("correct" . "(import (jerboa prelude))")
      ("correct_example" . "(import (jerboa prelude))\n(def x 1)")
      ("id" . "racket-lang-header") ("imports")
@@ -509,7 +509,7 @@
      ("severity" . "error") ("wrong" . "fn")
      ("wrong_example" . "(fn [x] (* x 2))")
      ("wrong_source" "clojure"))
-   (("available_via" . #<void>) ("category" . "records") ("correct" . "defstruct")
+   (("available_via") ("category" . "records") ("correct" . "defstruct")
      ("correct_example" . "(defstruct point (x y))")
      ("id" . "r7rs-define-record-type") ("imports")
      ("notes"
@@ -523,13 +523,13 @@
        .
        "(define-record-type point (mk-point x y) point? (x point-x) (y point-y))")
      ("wrong_source" "r7rs"))
-   (("available_via" . #<void>) ("category" . "records") ("correct" . "defstruct")
+   (("available_via") ("category" . "records") ("correct" . "defstruct")
      ("correct_example" . "(defstruct point (x y))")
      ("id" . "racket-struct") ("imports") ("severity" . "error")
      ("wrong" . "(struct name (field ...))")
      ("wrong_example" . "(struct point (x y))")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "modules") ("correct" . "plain .ss program")
+   (("available_via") ("category" . "modules") ("correct" . "plain .ss program")
      ("correct_example"
        .
        "(import (jerboa prelude))\n(def (f x) x)")
@@ -545,7 +545,7 @@
        .
        "(library (my-lib) (export f) (import (rnrs)) (define (f x) x))")
      ("wrong_source" "r6rs"))
-   (("available_via" . #<void>) ("category" . "modules") ("correct" . "(std sort)")
+   (("available_via") ("category" . "modules") ("correct" . "(std sort)")
      ("correct_example" . "(import (std sort) (std text json))")
      ("id" . "gerbil-module-path") ("imports")
      ("notes"
@@ -554,7 +554,7 @@
      ("severity" . "warning") ("wrong" . ":std/sort")
      ("wrong_example" . "(import :std/sort :std/text/json)")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "bytevectors") ("correct" . "bytevector")
+   (("available_via") ("category" . "bytevectors") ("correct" . "bytevector")
      ("correct_example" . "(make-bytevector 10 0)")
      ("id" . "gambit-u8vector") ("imports")
      ("notes"
@@ -575,7 +575,7 @@
      ("severity" . "warning") ("wrong" . "chain")
      ("wrong_example" . "(chain x f g h)")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "iterators") ("correct" . "for/collect")
+   (("available_via") ("category" . "iterators") ("correct" . "for/collect")
      ("correct_example"
        .
        "(for/collect ((x '(1 2 3))) (* x x))  ;; → (1 4 9)")
@@ -587,7 +587,7 @@
      ("wrong" . "(for/list ((x lst)) body)")
      ("wrong_example" . "(for/list ((x '(1 2 3))) (* x x))")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "iterators")
+   (("available_via") ("category" . "iterators")
      ("correct" . "(list->vector (for/collect ...))")
      ("correct_example"
        .
@@ -599,7 +599,7 @@
      ("severity" . "error") ("wrong" . "(for/vector ...)")
      ("wrong_example" . "(for/vector ((x lst)) (* x x))")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "hash-tables")
+   (("available_via") ("category" . "hash-tables")
      ("correct" . "(list->hash-table '((k . v) ...))")
      ("correct_example"
        .
@@ -608,13 +608,13 @@
      ("wrong" . "(hash k v ...)")
      ("wrong_example" . "(hash \"a\" 1 \"b\" 2)")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "hash-tables")
+   (("available_via") ("category" . "hash-tables")
      ("correct" . "make-hash-table")
      ("correct_example" . "(make-hash-table)")
      ("id" . "racket-make-hash") ("imports")
      ("severity" . "error") ("wrong" . "(make-hash)")
      ("wrong_example" . "(make-hash)") ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "hash-tables")
+   (("available_via") ("category" . "hash-tables")
      ("correct"
        .
        "(make-hashtable equal-hash equal?) or make-hash-table")
@@ -628,7 +628,7 @@
      ("severity" . "warning") ("wrong" . "(make-eqv-hashtable)")
      ("wrong_example" . "(make-eqv-hashtable)")
      ("wrong_source" "r6rs"))
-   (("available_via" . #<void>) ("category" . "io") ("correct" . "(displayln x)")
+   (("available_via") ("category" . "io") ("correct" . "(displayln x)")
      ("correct_example"
        .
        "(displayln \"hi\")  ;; uses current-output-port")
@@ -641,7 +641,7 @@
        .
        "(displayln \"hi\" (current-output-port))")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "pattern-matching")
+   (("available_via") ("category" . "pattern-matching")
      ("correct" . "(cons a b) in match")
      ("correct_example"
        .
@@ -673,7 +673,7 @@
      ("severity" . "error") ("wrong" . "error-object?")
      ("wrong_example" . "(error-object? e)")
      ("wrong_source" "r7rs"))
-   (("available_via" . #<void>) ("category" . "binding") ("correct" . "nested when-let")
+   (("available_via") ("category" . "binding") ("correct" . "nested when-let")
      ("correct_example"
        .
        "(when-let (x (find))\n  (when-let (y (lookup x))\n    (use y)))")
@@ -687,7 +687,7 @@
        .
        "(when-let* ((x (find)) (y (lookup x))) (use y))")
      ("wrong_source" "racket" "clojure"))
-   (("available_via" . #<void>) ("category" . "definitions")
+   (("available_via") ("category" . "definitions")
      ("correct"
        .
        "(lambda args body) OR (lambda (x . rest) body)")
@@ -704,7 +704,7 @@
        .
        "(lambda args (length args))  ;; works but unusual")
      ("wrong_source" "scheme-standard"))
-   (("available_via" . #<void>) ("category" . "parameters")
+   (("available_via") ("category" . "parameters")
      ("correct" . "parameterize with parens")
      ("correct_example"
        .
@@ -729,7 +729,7 @@
      ("severity" . "warning") ("wrong" . "let*-values")
      ("wrong_example" . "(let*-values (((a b) (f))) ...)")
      ("wrong_source" "r6rs" "r7rs"))
-   (("available_via" . #<void>) ("category" . "hash-tables")
+   (("available_via") ("category" . "hash-tables")
      ("correct" . "make-hash-table + hash-put!/hash-ref")
      ("correct_example"
        .
@@ -762,7 +762,7 @@
      ("severity" . "compat") ("wrong" . "hash-table-keys")
      ("wrong_example" . "(hash-table-keys ht)")
      ("wrong_source" "srfi-69"))
-   (("available_via" . #<void>) ("category" . "hash-tables") ("correct" . "hash-get")
+   (("available_via") ("category" . "hash-tables") ("correct" . "hash-get")
      ("correct_example"
        .
        "(hash-get ht \"k\")  ;; #f if missing, no error")
@@ -773,7 +773,7 @@
      ("severity" . "error") ("wrong" . "(get coll k)")
      ("wrong_example" . "(get ht \"k\")")
      ("wrong_source" "clojure"))
-   (("available_via" . #<void>) ("category" . "hash-tables")
+   (("available_via") ("category" . "hash-tables")
      ("correct" . "hash-put! (mutates)")
      ("correct_example" . "(hash-put! ht \"k\" v)")
      ("id" . "clojure-assoc") ("imports")
@@ -797,7 +797,7 @@
      ("severity" . "compat") ("wrong" . "count")
      ("wrong_example" . "(count lst)")
      ("wrong_source" "clojure"))
-   (("available_via" . #<void>) ("category" . "lists") ("correct" . "car / cdr")
+   (("available_via") ("category" . "lists") ("correct" . "car / cdr")
      ("correct_example"
        .
        "(car '(1 2 3))  ;; 1\n(cdr '(1 2 3))  ;; (2 3)")
@@ -808,7 +808,7 @@
      ("severity" . "error") ("wrong" . "(first lst), (rest lst)")
      ("wrong_example" . "(first '(1 2 3))")
      ("wrong_source" "clojure"))
-   (("available_via" . #<void>) ("category" . "hash-tables")
+   (("available_via") ("category" . "hash-tables")
      ("correct" . "list->hash-table")
      ("correct_example"
        .
@@ -829,13 +829,13 @@
      ("severity" . "error") ("wrong" . "nil")
      ("wrong_example" . "(if (= x nil) ...)")
      ("wrong_source" "clojure" "common-lisp"))
-   (("available_via" . #<void>) ("category" . "values") ("correct" . "#t / #f")
+   (("available_via") ("category" . "values") ("correct" . "#t / #f")
      ("correct_example" . "(if flag #t #f)")
      ("id" . "clojure-true-false") ("imports")
      ("severity" . "error") ("wrong" . "true, false")
      ("wrong_example" . "(if flag true false)")
      ("wrong_source" "clojure" "javascript"))
-   (("available_via" . #<void>) ("category" . "binding")
+   (("available_via") ("category" . "binding")
      ("correct"
        .
        "(match ...)  or (apply (lambda (a b) ...) lst)")
@@ -853,7 +853,7 @@
      ("severity" . "error") ("wrong" . "when-not")
      ("wrong_example" . "(when-not x body)")
      ("wrong_source" "clojure"))
-   (("available_via" . #<void>) ("category" . "modules")
+   (("available_via") ("category" . "modules")
      ("correct" . "N/A for .ss programs")
      ("correct_example"
        .
@@ -865,13 +865,13 @@
      ("severity" . "error") ("wrong" . "(provide name ...)")
      ("wrong_example" . "(provide foo bar)")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "modules") ("correct" . "import")
+   (("available_via") ("category" . "modules") ("correct" . "import")
      ("correct_example" . "(import (std misc list))")
      ("id" . "racket-require") ("imports") ("severity" . "error")
      ("wrong" . "(require module)")
      ("wrong_example" . "(require racket/list)")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "modules")
+   (("available_via") ("category" . "modules")
      ("correct" . "(rename (only (mod) x) (x y))")
      ("correct_example"
        .
@@ -884,7 +884,7 @@
      ("wrong" . "import renaming works as R7RS")
      ("wrong_example" . "(import (rename (foo) (old new)))")
      ("wrong_source" "r7rs"))
-   (("available_via" . #<void>) ("category" . "io") ("correct" . "pp (1-arg)")
+   (("available_via") ("category" . "io") ("correct" . "pp (1-arg)")
      ("correct_example"
        .
        "(pp form)  ;; writes to current-output-port")
@@ -895,7 +895,7 @@
      ("severity" . "warning") ("wrong" . "(pp obj port)")
      ("wrong_example" . "(pp form (current-output-port))")
      ("wrong_source" "gambit"))
-   (("available_via" . #<void>) ("category" . "io") ("correct" . "displayln")
+   (("available_via") ("category" . "io") ("correct" . "displayln")
      ("correct_example" . "(displayln \"x\")")
      ("id" . "sicp-newline-paren") ("imports")
      ("notes"
@@ -904,7 +904,7 @@
      ("severity" . "warning") ("wrong" . "(newline)")
      ("wrong_example" . "(display \"x\") (newline)")
      ("wrong_source" "scheme-standard"))
-   (("available_via" . #<void>) ("category" . "predicates")
+   (("available_via") ("category" . "predicates")
      ("correct" . "null? only for '()")
      ("correct_example"
        .
@@ -919,7 +919,7 @@
        .
        "(null? \"\")  ;; #f, not the emptiness test for strings")
      ("wrong_source" "scheme-standard"))
-   (("available_via" . #<void>) ("category" . "methods")
+   (("available_via") ("category" . "methods")
      ("correct" . "(defmethod (method (self type)) body)")
      ("correct_example"
        .
@@ -932,7 +932,7 @@
      ("wrong" . "(defmethod {method obj} body)")
      ("wrong_example" . "(defmethod {area shape} (* 3 3))")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "records") ("correct" . "accessor functions")
+   (("available_via") ("category" . "records") ("correct" . "accessor functions")
      ("correct_example"
        .
        "(point-x p)  ;; generated by defstruct\n;; or using dot-access:\n(using (p point : point?) p.x)")
@@ -940,7 +940,7 @@
      ("severity" . "error") ("wrong" . "&slot-ref, slot-ref")
      ("wrong_example" . "(slot-ref obj 'x)")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "binding")
+   (("available_via") ("category" . "binding")
      ("correct" . "standard scheme let")
      ("correct_example" . "(let ((x 1) (y 2)) (+ x y))")
      ("id" . "emacs-lisp-let-binding") ("imports")
@@ -951,7 +951,7 @@
      ("wrong" . "(let ((x 1)) body)  ;; comma patterns etc.")
      ("wrong_example" . "(let ((x 1) (y 2)) ,x)")
      ("wrong_source" "emacs-lisp"))
-   (("available_via" . #<void>) ("category" . "strings") ("correct" . "string-contains")
+   (("available_via") ("category" . "strings") ("correct" . "string-contains")
      ("correct_example"
        .
        "(string-contains str sub)  ;; index or #f")
@@ -960,7 +960,7 @@
      ("wrong" . "string-search, string-search-forward")
      ("wrong_example" . "(string-search sub str)")
      ("wrong_source" "srfi-13"))
-   (("available_via" . #<void>) ("category" . "internals") ("correct" . "public operator")
+   (("available_via") ("category" . "internals") ("correct" . "public operator")
      ("correct_example"
        .
        "(+ 1 2)  ;; or (fx+ 1 2) if importing (chezscheme) fixnum ops")
@@ -970,7 +970,7 @@
        "## is Gambit's namespace for unsafe/internal ops. Chez uses fx+/fx-/fx* via (chezscheme) for fixnum specifics.")
      ("severity" . "error") ("wrong" . "##prefixed internals")
      ("wrong_example" . "(##fx+ 1 2)") ("wrong_source" "gambit"))
-   (("available_via" . #<void>) ("category" . "bytevectors")
+   (("available_via") ("category" . "bytevectors")
      ("correct" . "(subbytes bv start end) or slice")
      ("correct_example"
        .
@@ -983,7 +983,7 @@
      ("wrong" . "(bytevector-copy bv start end)")
      ("wrong_example" . "(bytevector-copy bv 0 10)")
      ("wrong_source" "r6rs"))
-   (("available_via" . #<void>) ("category" . "io") ("correct" . "get-string-n")
+   (("available_via") ("category" . "io") ("correct" . "get-string-n")
      ("correct_example"
        .
        "(get-string-n port 100)  ;; R6RS: port first, count second")
@@ -992,7 +992,7 @@
      ("severity" . "error") ("wrong" . "(read-string k port)")
      ("wrong_example" . "(read-string 100 port)")
      ("wrong_source" "r7rs"))
-   (("available_via" . #<void>) ("category" . "io") ("correct" . "put-string")
+   (("available_via") ("category" . "io") ("correct" . "put-string")
      ("correct_example"
        .
        "(put-string port \"hi\")  ;; R6RS: port first")
@@ -1000,7 +1000,7 @@
      ("severity" . "error") ("wrong" . "(write-string s port)")
      ("wrong_example" . "(write-string \"hi\" port)")
      ("wrong_source" "r7rs"))
-   (("available_via" . #<void>) ("category" . "vectors")
+   (("available_via") ("category" . "vectors")
      ("correct" . "(make-vector n fill)")
      ("correct_example" . "(make-vector 10 0)")
      ("id" . "gambit-make-vector-init") ("imports")
@@ -1015,7 +1015,7 @@
        .
        "(make-vector 10)  ;; contents unspecified")
      ("wrong_source" "scheme-standard"))
-   (("available_via" . #<void>) ("category" . "typing") ("correct" . "(: expr pred?)")
+   (("available_via") ("category" . "typing") ("correct" . "(: expr pred?)")
      ("correct_example"
        .
        "(: value number?)  ;; checked cast, raises if pred fails")
@@ -1026,7 +1026,7 @@
      ("severity" . "warning") ("wrong" . "(:: binding ...)")
      ("wrong_example" . "(: foo : Number)")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "pattern-matching")
+   (("available_via") ("category" . "pattern-matching")
      ("correct" . "(=> fn var)")
      ("correct_example"
        .
@@ -1065,7 +1065,7 @@
      ("severity" . "warning") ("wrong" . "with-semaphore")
      ("wrong_example" . "(with-semaphore sem body)")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "concurrency")
+   (("available_via") ("category" . "concurrency")
      ("correct" . "make-thread + thread-start!")
      ("correct_example"
        .
@@ -1074,7 +1074,7 @@
      ("severity" . "error") ("wrong" . "(spawn thunk)")
      ("wrong_example" . "(spawn (lambda () ...))")
      ("wrong_source" "gambit"))
-   (("available_via" . #<void>) ("category" . "concurrency")
+   (("available_via") ("category" . "concurrency")
      ("correct" . "(std concur) or (std csp)")
      ("correct_example"
        .
@@ -1087,7 +1087,7 @@
      ("wrong" . "make-channel, channel-put, channel-get")
      ("wrong_example" . "(def ch (make-channel))")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "logging")
+   (("available_via") ("category" . "logging")
      ("correct" . "(std logger) in Jerboa")
      ("correct_example"
        .
@@ -1097,7 +1097,7 @@
      ("wrong" . "log-debug, log-info via (gerbil/std/logger)")
      ("wrong_example" . "(log-info \"starting\")")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "formatting") ("correct" . "~a ~s ~d ~%")
+   (("available_via") ("category" . "formatting") ("correct" . "~a ~s ~d ~%")
      ("correct_example"
        .
        "(format \"~a is ~s\" x y)  ;; ~a=display ~s=write ~%=newline")
@@ -1111,7 +1111,7 @@
        "(format \"~v\" x)  ;; Racket-specific directives")
      ("wrong_example" . "(format \"~v is ~s\" x y)")
      ("wrong_source" "racket"))
-   (("available_via" . #<void>) ("category" . "formatting")
+   (("available_via") ("category" . "formatting")
      ("correct" . "(printf \"...~%\" ...)")
      ("correct_example" . "(printf \"hi~%\")")
      ("id" . "gerbil-printf-newline") ("imports")
@@ -1119,7 +1119,7 @@
      ("severity" . "error") ("wrong" . "(printf \"...~n\" ...)")
      ("wrong_example" . "(printf \"hi~n\")")
      ("wrong_source" "gerbil" "racket"))
-   (("available_via" . #<void>) ("category" . "bitwise") ("correct" . "these work")
+   (("available_via") ("category" . "bitwise") ("correct" . "these work")
      ("correct_example"
        .
        "(bitwise-and #xff x)  ;; Chez uses #x not 0x for hex")
@@ -1131,7 +1131,7 @@
      ("wrong" . "bitwise-and, bitwise-or, bitwise-xor")
      ("wrong_example" . "(bitwise-and 0xff x)")
      ("wrong_source" "r6rs"))
-   (("available_via" . #<void>) ("category" . "literals") ("correct" . "#xff")
+   (("available_via") ("category" . "literals") ("correct" . "#xff")
      ("correct_example" . "(* #xff 2)  ;; 510")
      ("id" . "js-0x-hex") ("imports")
      ("notes"
@@ -1140,7 +1140,7 @@
      ("severity" . "error") ("wrong" . "0xff hex literal")
      ("wrong_example" . "(* 0xff 2)")
      ("wrong_source" "c" "javascript"))
-   (("available_via" . #<void>) ("category" . "io") ("correct" . "with-output-to-string")
+   (("available_via") ("category" . "io") ("correct" . "with-output-to-string")
      ("correct_example"
        .
        "(with-output-to-string (lambda () body))")
@@ -1154,7 +1154,7 @@
        "with-destination, with-input-from-string defaults")
      ("wrong_example" . "(with-destination #f body)")
      ("wrong_source" "gerbil"))
-   (("available_via" . #<void>) ("category" . "strings")
+   (("available_via") ("category" . "strings")
      ("correct" . "(str ...) or format")
      ("correct_example"
        .
@@ -1190,7 +1190,7 @@
      ("severity" . "error") ("wrong" . "string-ends-with?")
      ("wrong_example" . "(string-ends-with? \"hello\" \"lo\")")
      ("wrong_source" "hallucination"))
-   (("available_via" . #<void>) ("category" . "strings")
+   (("available_via") ("category" . "strings")
      ("correct" . "string-contains with char-as-string")
      ("correct_example"
        .
@@ -1203,13 +1203,13 @@
      ("wrong" . "(string-index str char)")
      ("wrong_example" . "(string-index \"hello\" #\\l)")
      ("wrong_source" "gerbil" "srfi-13"))
-   (("available_via" . #<void>) ("category" . "strings") ("correct" . "substring")
+   (("available_via") ("category" . "strings") ("correct" . "substring")
      ("correct_example" . "(substring \"hello\" 1 3)  ;; \"el\"")
      ("id" . "clojure-subs") ("imports") ("severity" . "error")
      ("wrong" . "(subs s start end)")
      ("wrong_example" . "(subs \"hello\" 1 3)")
      ("wrong_source" "clojure"))