Merge jerb-mcp into jerboa: build MCP server + jmcp binary from make

ober

5dc568260471f8f585b747fda46e91270bec9332

diff --git a/.gitignore b/.gitignore
index b7dc1b5..835bd8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,6 +41,11 @@
 /jerbuild.wp.so
 /jerbuild-*
 
+# `make jmcp` / `make jmcp-portable` outputs (self-contained MCP binary).
+# Build artifact rebuilt from mcp/ + data/; intermediates land in build/jmcp/.
+/jmcp
+/jmcp-*
+
 # `make native-cross` outputs (per-target Rust dylibs)
 /lib-cross/
 
diff --git a/Makefile b/Makefile
index ec9538c..d5c9f18 100644
--- a/Makefile
+++ b/Makefile
@@ -59,6 +59,14 @@ help:
 	@echo "  audit-native     Run cargo audit on Rust native library"
 	@echo "  pure-audit       Scan jerboa-* repos for non-pure runtime surfaces"
 	@echo ""
+	@echo "MCP server (jerboa-mcp + jmcp binary):"
+	@echo "  mcp              Compile-check the MCP server (mcp/server.ss)"
+	@echo "  mcp-run          Run the MCP server from source over stdio"
+	@echo "  mcp-test         Run the MCP protocol test suite from source"
+	@echo "  jmcp             Build self-contained ./jmcp (embeds data/*.sexp)"
+	@echo "  jmcp-portable    Build jmcp for {macOS,Linux,FreeBSD} x {amd64,arm64}"
+	@echo "  mcp-test-binary  Run protocol tests against the built ./jmcp"
+	@echo ""
 	@echo "Test (core):"
 	@echo "  test             Run core test suite (reader, stdlib, ffi, regex)"
 	@echo "  test-reader      Reader tests"
@@ -361,6 +369,115 @@ binary-cross: chez build chez-cross
 	CC="$(CROSS_CC)" \
 	support/build-binary.sh $(BINARY_ENTRY) $(BINARY_OUTPUT)-$(CHEZ_TARGET_MACHINE)
 
+# ── MCP server (jerboa-mcp) + jmcp self-contained binary ─────────────────────
+# mcp/server.ss is the pure-Jerboa MCP server; data/*.sexp (cookbooks,
+# features, api-signatures, security rules, …) is its knowledge base. `make
+# jmcp` embeds the current data/ into a self-contained ./jmcp, so the binary is
+# always rebuilt from this repo — there is no separate MCP repo to update.
+# Re-run `make jmcp` after data/ changes (e.g. new howto/feature entries) to
+# ship the updated knowledge base.
+MCP_ENTRY = mcp/server.ss
+MCP_TEST  = mcp/test/protocol-test.ss
+.PHONY: mcp mcp-run mcp-test mcp-test-binary mcp-check jmcp jmcp-portable \
+        jmcp-macos-amd64 jmcp-linux-amd64 jmcp-linux-arm64 \
+        jmcp-freebsd-amd64 jmcp-freebsd-arm64
+
+# Source hygiene scoped to the MCP tree. Jerboa proper legitimately uses .sls
+# and (chezscheme); only mcp/*.ss must stay pure Jerboa and data/ stays .sexp.
+mcp-check:
+	@test "$$(find mcp -name '*.sls' | wc -l | tr -d ' ')" = "0" \
+		|| { echo "ERROR: .sls under mcp/ — server must stay pure Jerboa" >&2; exit 1; }
+	@test "$$(find data -name '*.json' | wc -l | tr -d ' ')" = "0" \
+		|| { 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; }
+
+mcp: chez mcp-check
+	@JERBOA_HOME=$(JERBOA_HOME) JERBOA_MCP_SCHEME_PATH=$(SCHEME) \
+		$(SCHEME) --libdirs $(LIBDIRS) --script $(MCP_ENTRY) < /dev/null
+	@echo "mcp: server compile-check OK"
+
+mcp-run:
+	@JERBOA_HOME=$(JERBOA_HOME) JERBOA_MCP_SCHEME_PATH=$(SCHEME) \
+		$(SCHEME) --libdirs $(LIBDIRS) --script $(MCP_ENTRY)
+
+mcp-test: chez mcp-check
+	@JERBOA_MCP_MODE=full JERBOA_HOME=$(JERBOA_HOME) JERBOA_MCP_SCHEME_PATH=$(SCHEME) \
+		$(SCHEME) --libdirs $(LIBDIRS) --script $(MCP_TEST)
+
+mcp-test-binary: jmcp mcp-check
+	@JERBOA_MCP_MODE=full JERBOA_MCP_SERVER=$(JERBOA_HOME)/jmcp \
+		JERBOA_MCP_REPO=/tmp/jerboa-mcp-no-data \
+		JERBOA_HOME=$(JERBOA_HOME) JERBOA_MCP_SCHEME_PATH=$(SCHEME) \
+		$(SCHEME) --libdirs $(LIBDIRS) --script $(MCP_TEST)
+
+# Native self-contained binary for the host (./jmcp). Embeds data/*.sexp.
+jmcp: chez build mcp-check
+	@echo "=== Building native ./jmcp (host) ==="
+	@JERBOA_HOME=$(JERBOA_HOME) SCHEME=$(SCHEME) JMCP_OUTPUT=jmcp mcp/build-jmcp.sh
+
+# Cross-built binaries reuse jerboa's own cross prefixes (.chez-cross-<m>) and
+# xpatch (build/chez/xc-<m>/s/xpatch). The native host build (make jmcp) covers
+# macOS arm64; the targets below cover the other five.
+jmcp-macos-amd64: chez build mcp-check
+	@test -d "$(JERBOA_HOME)/.chez-cross-ta6osx" || { echo "ERROR: .chez-cross-ta6osx not found (make chez-cross CHEZ_TARGET_MACHINE=ta6osx CROSS_CC='cc -arch x86_64')" >&2; exit 1; }
+	@test -f "$(CHEZ_BUILD_DIR)/xc-ta6osx/s/xpatch" || { echo "ERROR: ta6osx xpatch not found" >&2; exit 1; }
+	@echo "=== Cross-building jmcp-macos-amd64 ==="
+	@JERBOA_HOME=$(JERBOA_HOME) SCHEME=$(SCHEME) CC="cc -arch x86_64" \
+		JMCP_OUTPUT=jmcp-macos-amd64 JMCP_MACHINE=ta6osx JMCP_TARGET_OS=macos \
+		JMCP_CROSS_PREFIX=$(JERBOA_HOME)/.chez-cross-ta6osx \
+		JMCP_XPATCH=$(CHEZ_BUILD_DIR)/xc-ta6osx/s/xpatch \
+		mcp/build-jmcp.sh
+
+jmcp-linux-amd64: chez build mcp-check
+	@command -v x86_64-linux-musl-gcc >/dev/null 2>&1 || { echo "ERROR: x86_64-linux-musl-gcc not on PATH" >&2; exit 1; }
+	@test -d "$(JERBOA_HOME)/.chez-cross-ta6le" || { echo "ERROR: .chez-cross-ta6le not found (make chez-cross CHEZ_TARGET_MACHINE=ta6le CROSS_CC=x86_64-linux-musl-gcc)" >&2; exit 1; }
+	@test -f "$(CHEZ_BUILD_DIR)/xc-ta6le/s/xpatch" || { echo "ERROR: ta6le xpatch not found" >&2; exit 1; }
+	@echo "=== Cross-building jmcp-linux-amd64 ==="
+	@JERBOA_HOME=$(JERBOA_HOME) SCHEME=$(SCHEME) CC=x86_64-linux-musl-gcc \
+		JMCP_OUTPUT=jmcp-linux-amd64 JMCP_MACHINE=ta6le JMCP_TARGET_OS=linux \
+		JMCP_STATIC=1 JMCP_DLOPEN_STUBS=1 \
+		JMCP_CROSS_PREFIX=$(JERBOA_HOME)/.chez-cross-ta6le \
+		JMCP_XPATCH=$(CHEZ_BUILD_DIR)/xc-ta6le/s/xpatch \
+		mcp/build-jmcp.sh
+
+jmcp-linux-arm64: chez build mcp-check
+	@command -v aarch64-linux-musl-gcc >/dev/null 2>&1 || { echo "ERROR: aarch64-linux-musl-gcc not on PATH" >&2; exit 1; }
+	@test -d "$(JERBOA_HOME)/.chez-cross-tarm64le" || { echo "ERROR: .chez-cross-tarm64le not found (make chez-cross CHEZ_TARGET_MACHINE=tarm64le CROSS_CC=aarch64-linux-musl-gcc)" >&2; exit 1; }
+	@test -f "$(CHEZ_BUILD_DIR)/xc-tarm64le/s/xpatch" || { echo "ERROR: tarm64le xpatch not found" >&2; exit 1; }
+	@echo "=== Cross-building jmcp-linux-arm64 ==="
+	@JERBOA_HOME=$(JERBOA_HOME) SCHEME=$(SCHEME) CC=aarch64-linux-musl-gcc \
+		JMCP_OUTPUT=jmcp-linux-arm64 JMCP_MACHINE=tarm64le JMCP_TARGET_OS=linux \
+		JMCP_STATIC=1 JMCP_DLOPEN_STUBS=1 \
+		JMCP_CROSS_PREFIX=$(JERBOA_HOME)/.chez-cross-tarm64le \
+		JMCP_XPATCH=$(CHEZ_BUILD_DIR)/xc-tarm64le/s/xpatch \
+		mcp/build-jmcp.sh
+
+jmcp-freebsd-amd64: chez build mcp-check
+	@test -x "$(JERBOA_HOME)/support/cross-cc-freebsd-amd64" || { echo "ERROR: support/cross-cc-freebsd-amd64 not found/executable" >&2; exit 1; }
+	@test -d "$(JERBOA_HOME)/.chez-cross-ta6fb" || { echo "ERROR: .chez-cross-ta6fb not found (make chez-cross CHEZ_TARGET_MACHINE=ta6fb CROSS_CC=...)" >&2; exit 1; }
+	@test -f "$(CHEZ_BUILD_DIR)/xc-ta6fb/s/xpatch" || { echo "ERROR: ta6fb xpatch not found" >&2; exit 1; }
+	@echo "=== Cross-building jmcp-freebsd-amd64 ==="
+	@JERBOA_HOME=$(JERBOA_HOME) SCHEME=$(SCHEME) CC="$(JERBOA_HOME)/support/cross-cc-freebsd-amd64" \
+		JMCP_OUTPUT=jmcp-freebsd-amd64 JMCP_MACHINE=ta6fb JMCP_TARGET_OS=freebsd \
+		JMCP_CROSS_PREFIX=$(JERBOA_HOME)/.chez-cross-ta6fb \
+		JMCP_XPATCH=$(CHEZ_BUILD_DIR)/xc-ta6fb/s/xpatch \
+		mcp/build-jmcp.sh
+
+jmcp-freebsd-arm64: chez build mcp-check
+	@test -x "$(JERBOA_HOME)/support/cross-cc-freebsd-arm64" || { echo "ERROR: support/cross-cc-freebsd-arm64 not found/executable" >&2; exit 1; }
+	@test -d "$(JERBOA_HOME)/.chez-cross-tarm64fb" || { echo "ERROR: .chez-cross-tarm64fb not found (make chez-cross CHEZ_TARGET_MACHINE=tarm64fb CROSS_CC=...)" >&2; exit 1; }
+	@test -f "$(CHEZ_BUILD_DIR)/xc-tarm64fb/s/xpatch" || { echo "ERROR: tarm64fb xpatch not found" >&2; exit 1; }
+	@echo "=== Cross-building jmcp-freebsd-arm64 ==="
+	@JERBOA_HOME=$(JERBOA_HOME) SCHEME=$(SCHEME) CC="$(JERBOA_HOME)/support/cross-cc-freebsd-arm64" \
+		JMCP_OUTPUT=jmcp-freebsd-arm64 JMCP_MACHINE=tarm64fb JMCP_TARGET_OS=freebsd \
+		JMCP_CROSS_PREFIX=$(JERBOA_HOME)/.chez-cross-tarm64fb \
+		JMCP_XPATCH=$(CHEZ_BUILD_DIR)/xc-tarm64fb/s/xpatch \
+		mcp/build-jmcp.sh
+
+# All six: host (macOS arm64) + the five cross targets.
+jmcp-portable: jmcp jmcp-macos-amd64 jmcp-linux-amd64 jmcp-linux-arm64 jmcp-freebsd-amd64 jmcp-freebsd-arm64
+
 test: test-reader test-core test-runtime 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
 
 typecheck:
diff --git a/data/api-signatures.sexp b/data/api-signatures.sexp
new file mode 100644
index 0000000..2fc6f19
--- /dev/null
+++ b/data/api-signatures.sexp
@@ -0,0 +1,26243 @@
+(("errors") ("generated" . "2026-04-22")
+  ("modules"
+   ("(jerboa build musl)"
+     ("exports" "build-musl-binary" "make-musl-cross-target"
+       "musl-available?" "musl-boot-files" "musl-chez-lib-dir"
+       "musl-chez-prefix" "musl-chez-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.sls")
+     ("tier" . "core"))
+   ("(jerboa build)"
+     ("exports" "build-binary" "build-boot-file" "build-project"
+      "build-release" "build-static-binary" "compile-for-target"
+      "compile-modules-parallel" "compute-file-hash"
+      "cross-target-ar" "cross-target-arch" "cross-target-cc"
+      "cross-target-os" "cross-target?" "file->c-array"
+      "generate-main-c" "link-static-archives" "make-cross-target"
+      "module-changed?" "musl-link-flags" "static-link-flags"
+      "target-linux-aarch64" "target-linux-x64"
+      "target-macos-aarch64" "target-macos-x64" "trace-imports"
+      "tree-shake-imports" "wpo-compile")
+     ("file" . "lib/jerboa/build.sls")
+     ("tier" . "core"))
+   ("(jerboa cache)"
+     ("exports" "cache-clear!" "cache-directory" "cache-key" "cache-lookup"
+       "cache-stats" "cache-store!" "with-compilation-cache")
+     ("file" . "lib/jerboa/cache.sls")
+     ("tier" . "core"))
+   ("(jerboa cloj)"
+     ("exports"
+       "activate-cloj-reader!"
+       "fn-literal"
+       "reader-cloj-mode")
+     ("file" . "lib/jerboa/cloj.sls")
+     ("tier" . "core"))
+   ("(jerboa clojure)"
+     ("exports" "*method-tables*" "*struct-types*" "->" "->>"
+      "->>?" "->?" "1+" "1-" ":" "<...>" "<>" "==" "=?"
+      "ContractViolation" "Datafiable" "Error" "Navigable"
+      "absento" "acons" "activate-cloj-reader!" "add-watch!"
+      "aget" "agetq" "agetv" "aif" "alist" "alist->hash-table"
+      "alist->plist*" "alist?" "alists->csv" "and-then" "any"
+      "append-map" "append1" "appendo" "apply-dynamic-bindings"
+      "arem" "arem!" "aremq" "aremq!" "aremv" "aremv!" "as->"
+      "aset" "aset!" "asetq" "asetq!" "asetv" "asetv!" "assert!"
+      "assoc" "assoc!" "assoc-in" "assoc-in!" "atom" "atom?"
+      "awhen" "begin-ffi" "bind-method!" "binding" "bound-fn"
+      "butlast" "c-declare" "c-lambda" "call-method"
+      "call-with-list-builder" "capture"
+      "capture-dynamic-bindings" "caro" "catch" "cdro" "chain"
+      "chain-and" "clj-delay" "clj-force" "clj-future"
+      "clj-promise" "comp" "compare-and-set!" "complement"
+      "compose" "compose1" "cond->" "cond->>" "conda" "conde"
+      "condu" "conj" "conj!" "conjoin" "cons*" "conso"
+      "constantly" "contains?" "count" "csv->alists"
+      "csv-port->rows" "curry" "curryn" "cut" "cute" "cycle"
+      "datafy" "date->string" "datetime->alist" "datetime->epoch"
+      "datetime->iso8601" "datetime->julian" "datetime->string"
+      "datetime-add" "datetime-clamp" "datetime-day"
+      "datetime-diff" "datetime-floor-day" "datetime-floor-hour"
+      "datetime-floor-month" "datetime-hour" "datetime-max"
+      "datetime-min" "datetime-minute" "datetime-month"
+      "datetime-nanosecond" "datetime-now" "datetime-offset"
+      "datetime-second" "datetime-subtract" "datetime-truncate"
+      "datetime-utc-now" "datetime-year" "datetime<=?"
+      "datetime<?" "datetime=?" "datetime>=?" "datetime>?"
+      "datetime?" "day-of-week" "day-of-year" "days-in-month"
+      "dec" "def" "def*" "def-dynamic" "defclass"
+      "define-active-pattern" "define-c-lambda" "define-enum"
+      "define-match-type" "define-rx" "define-sealed-hierarchy"
+      "define-values" "defmethod" "defn" "defrecord" "defrule"
+      "defrules" "defstruct" "delay?" "delete-duplicates/hash"
+      "deliver" "deref" "dfn" "difference" "directory-exists?"
+      "disj" "disjoin" "displayln" "dissoc" "dissoc!" "distinct"
+      "dlet" "doall" "dorun" "dotimes" "doto" "drop" "drop-last"
+      "drop-until" "drop-while" "duplicates" "duration"
+      "duration-nanoseconds" "duration-seconds" "duration?"
+      "empty?" "epoch->datetime" "eprintf" "eql?" "err"
+      "err->list" "err?" "error-irritants" "error-message"
+      "error-trace" "every" "every-consecutive?" "every-pred"
+      "ex-cause" "ex-data" "ex-info" "ex-info?" "ex-message"
+      "fail" "false?" "filter-err" "filter-map" "filter-ok"
+      "finally" "first" "first-and-only" "flatten"
+      "flatten-result" "flatten1" "flip" "fn-literal" "fnil" "for"
+      "for-each!" "for/and" "for/collect" "for/fold" "for/or"
+      "force-output" "format" "fprintf" "frequencies" "fresh"
+      "future-cancel" "future-cancelled?" "future-done?" "future?"
+      "get" "get-in" "group-by" "group-consecutive"
+      "group-n-consecutive" "group-same" "hash" "hash->list"
+      "hash->plist" "hash-clear!" "hash-copy" "hash-eq-literal"
+      "hash-find" "hash-fold" "hash-for-each" "hash-get"
+      "hash-has-key?" "hash-key?" "hash-keys" "hash-length"
+      "hash-literal" "hash-map" "hash-merge" "hash-merge!"
+      "hash-put!" "hash-ref" "hash-remove!" "hash-set"
+      "hash-table-set!" "hash-table?" "hash-update!" "hash-values"
+      "identity" "if-let" "imap" "imap-has?" "imap-hash"
+      "imap-ref" "imap-set" "imap=?" "imap?" "in-bytes" "in-chars"
+      "in-hash-keys" "in-hash-pairs" "in-hash-values" "in-imap"
+      "in-imap-keys" "in-imap-pairs" "in-imap-values" "in-indexed"
+      "in-lines" "in-list" "in-naturals" "in-port" "in-producer"
+      "in-pset" "in-range" "in-string" "in-vector" "inc"
+      "interleave" "interpose" "intersection" "into" "iota"
+      "iterate" "iterate-n" "ivec" "ivec-length" "ivec-ref"
+      "ivec-set" "json-object->string" "julian->datetime" "juxt"
+      "keep" "keys" "keyword->string" "keyword?" "last"
+      "last-pair" "lazy->list" "lazy-all?" "lazy-any?"
+      "lazy-append" "lazy-chunk" "lazy-concat" "lazy-cons"
+      "lazy-count" "lazy-cycle" "lazy-drop" "lazy-drop-while"
+      "lazy-filter" "lazy-first" "lazy-flatten" "lazy-fold"
+      "lazy-for-each" "lazy-force" "lazy-interleave"
+      "lazy-interpose" "lazy-iterate" "lazy-map" "lazy-mapcat"
+      "lazy-nil" "lazy-nil?" "lazy-nth" "lazy-partition"
+      "lazy-range" "lazy-realize" "lazy-realized?" "lazy-repeat"
+      "lazy-rest" "lazy-seq?" "lazy-take" "lazy-take-while"
+      "lazy-zip" "leap-year?" "length<=?" "length<=n?" "length<?"
+      "length<n?" "length=?" "length=n?" "length>=?" "length>=n?"
+      "length>?" "length>n?" "let-alist" "let-hash" "list*"
+      "list->hash-table" "list->lazy" "list->pqueue" "list-of?"
+      "loop" "lvar" "lvar?" "make-date" "make-datetime"
+      "make-duration" "make-hash-set" "make-hash-table"
+      "make-hash-table-eq" "make-keyword" "make-shared"
+      "make-time" "map-err" "map-invert" "map-ok" "map-results"
+      "map/car" "mapcat" "match" "match/strict" "max-key" "maybe"
+      "membero" "memo-proc" "memoize" "merge" "merge-with" "meta"
+      "meta-wrapped?" "min-key" "nav" "negate" "nested-empty-like"
+      "nested-get" "next" "nil?" "nullo" "ok" "ok->list" "ok?"
+      "or-else" "pairo" "parse-date" "parse-datetime" "parse-time"
+      "partial" "partition" "partition-all" "partition-by"
+      "path-absolute?" "path-directory" "path-expand"
+      "path-extension" "path-join" "path-normalize"
+      "path-strip-directory" "path-strip-extension" "peek"
+      "persistent!" "persistent-map?" "persistent-queue"
+      "persistent-set" "persistent-set->list"
+      "persistent-set-contains?" "persistent-set-hash"
+      "persistent-set?" "pget" "pgetq" "pgetv" "plist->alist*"
+      "plist->hash-table" "pop" "pop!" "pp" "pp-to-string" "ppd"
+      "ppd-to-string" "pprint" "pqueue->list" "pqueue-conj"
+      "pqueue-count" "pqueue-empty" "pqueue-empty?" "pqueue-peek"
+      "pqueue-pop" "pqueue?" "pr" "pr-str" "prem" "prem!" "premq"
+      "premq!" "premv" "premv!" "printf" "println" "prn" "prn-str"
+      "promise?" "pset" "pset!" "psetq" "psetq!" "psetv" "psetv!"
+      "push!" "r-drop" "r-filter" "r-flatten" "r-fold" "r-foldcat"
+      "r-map" "r-mapcat" "r-reduce" "r-remove" "r-take"
+      "r-take-while" "random-integer" "range" "rassoc" "re"
+      "re-find-all" "re-fold" "re-groups" "re-match-end"
+      "re-match-full" "re-match-group" "re-match-groups"
+      "re-match-named" "re-match-start" "re-match?" "re-replace"
+      "re-replace-all" "re-search" "re-split" "re?"
+      "read-all-as-lines" "read-all-as-string" "read-csv"
+      "read-csv-file" "read-file-lines" "read-file-string"
+      "read-json" "read-line" "reader-cloj-mode" "realized?"
+      "recur" "reduce" "reduce-kv" "reductions" "regex-match"
+      "regex-replace" "regex-replace-all" "regex-search"
+      "register-struct-type!" "reify" "remove-watch!" "repeat"
+      "repeatedly" "require" "reset!" "rest" "result->option"
+      "result->values" "result?" "results-partition"
+      "rows->csv-string" "run" "run*" "rx" "s-and" "s-assert"
+      "s-cat" "s-check-fn" "s-coll-of" "s-conform" "s-def"
+      "s-double-in" "s-enum" "s-exercise" "s-explain"
+      "s-explain-str" "s-fdef" "s-get-spec" "s-int-in" "s-keys"
+      "s-keys-opt" "s-map-of" "s-nilable" "s-or" "s-pred"
+      "s-tuple" "s-valid?" "select-keys" "seq" "seq->list"
+      "seq-butlast" "seq-concat" "seq-count" "seq-distinct"
+      "seq-drop" "seq-drop-while" "seq-empty?" "seq-every?"
+      "seq-filter" "seq-first" "seq-flatten" "seq-frequencies"
+      "seq-group-by" "seq-interleave" "seq-interpose" "seq-into"
+      "seq-keep" "seq-last" "seq-map" "seq-map-indexed"
+      "seq-mapcat" "seq-nth" "seq-partition" "seq-partition-all"
+      "seq-partition-by" "seq-reduce" "seq-remove" "seq-rest"
+      "seq-reverse" "seq-second" "seq-some" "seq-sort"
+      "seq-sort-by" "seq-take" "seq-take-while" "seq-zip"
+      "seq-zipmap" "seqable?" "sequence-results" "set" "set-index"
+      "set-join" "set-project" "set-rename" "set-select" "set?"
+      "shared-cas!" "shared-ref" "shared-set!" "shared-swap!"
+      "shared-update!" "shared?" "slice" "snoc" "some" "some->"
+      "some->>" "some-fn" "some?" "sort" "sort!" "sorted-set"
+      "sorted-set->list" "sorted-set-add" "sorted-set-by"
+      "sorted-set-contains?" "sorted-set-empty" "sorted-set-fold"
+      "sorted-set-max" "sorted-set-min" "sorted-set-range"
+      "sorted-set-remove" "sorted-set-size" "sorted-set?" "split"
+      "split-at" "split-with" "stable-sort" "stable-sort!" "str"
+      "str/blank?" "str/capitalize" "str/clj-index-of"
+      "str/ends-with?" "str/escape" "str/includes?" "str/join"
+      "str/lower-case" "str/re-quote-replacement" "str/replace"
+      "str/replace-first" "str/reverse" "str/split"
+      "str/split-lines" "str/starts-with?" "str/trim"
+      "str/trim-newline" "str/triml" "str/trimr" "str/upper-case"
+      "string->json-object" "string->keyword" "string->transit"
+      "string-contains" "string-empty?" "string-find"
+      "string-find-all" "string-index" "string-join" "string-map"
+      "string-match?" "string-prefix?" "string-split"
+      "string-suffix?" "string-trim" "strip-meta"
+      "struct-field-ref" "struct-field-set!" "struct-predicate"
+      "struct-type-info" "subset?" "succeed" "superset?" "swap!"
+      "take" "take-last" "take-until" "take-while" "time->string"
+      "transient" "transient?" "transit->string" "transit-decode"
+      "transit-encode" "transit-instant" "transit-instant?"
+      "transit-keyword" "transit-keyword?" "transit-read"
+      "transit-symbol" "transit-symbol?" "transit-uri"
+      "transit-uri?" "transit-uuid" "transit-uuid?"
+      "transit-write" "true?" "try" "try-result" "try-result*"
+      "union" "unique" "until" "unwind-protect" "unwrap"
+      "unwrap-err" "unwrap-or" "unwrap-or-else" "update"
+      "update-in" "update-in!" "using" "vals" "vary-meta" "vderef"
+      "vec" "vector*" "volatile!" "volatile?" "vreset!" "vswap!"
+      "when-let" "when/list" "while" "with-catch" "with-id"
+      "with-input-from-string" "with-list-builder" "with-lock"
+      "with-meta" "with-output-to-string" "with-resource"
+      "write-csv" "write-csv-file" "write-file-string"
+      "write-json" "zip" "zipmap" "~")
+     ("file" . "lib/jerboa/clojure.sls")
+     ("tier" . "compat"))
+   ("(jerboa core)"
+     ("exports" "*method-tables*" "*struct-types*" "1+" "1-" "any"
+      "arithmetic-shift" "bind-method!" "bytes->string"
+      "call-method" "call-with-input-string"
+      "call-with-output-string" "catch"
+      "condition-variable-broadcast!" "condition-variable-signal!"
+      "condition-variable-specific"
+      "condition-variable-specific-set!" "condition-variable?"
+      "copy-file" "create-directory" "create-directory*"
+      "current-thread" "def" "def*" "defclass" "defmethod"
+      "defrule" "defrules" "defstruct" "delete" "directory-files"
+      "display-continuation-backtrace" "display-exception"
+      "displayln" "drop" "error-irritants" "error-message"
+      "error-trace" "every" "f64vector-length" "f64vector-ref"
+      "f64vector-set!" "file-info" "file-info-device"
+      "file-info-group" "file-info-inode"
+      "file-info-last-access-time"
+      "file-info-last-modification-time" "file-info-mode"
+      "file-info-owner" "file-info-size" "file-info-type"
+      "filter-map" "finally" "force-output" "getenv" "getpid"
+      "hash" "hash->list" "hash->plist" "hash-clear!" "hash-copy"
+      "hash-eq" "hash-eq-literal" "hash-find" "hash-fold"
+      "hash-for-each" "hash-get" "hash-key?" "hash-keys"
+      "hash-length" "hash-literal" "hash-map" "hash-merge"
+      "hash-merge!" "hash-put!" "hash-ref" "hash-remove!"
+      "hash-table?" "hash-update!" "hash-values"
+      "input-port-timeout-set!" "iota" "keyword->string"
+      "keyword-arg-ref" "keyword?" "last" "last-pair" "let-hash"
+      "list->hash-table" "list->u8vector"
+      "make-condition-variable" "make-f64vector" "make-hash-table"
+      "make-hash-table-eq" "make-keyword" "make-mutex"
+      "make-mutex-gambit" "make-thread" "match" "mutex-lock!"
+      "mutex-name" "mutex-specific" "mutex-specific-set!"
+      "mutex-unlock!" "mutex?" "object->string"
+      "open-input-process" "open-process"
+      "output-port-timeout-set!" "path-absolute?" "path-directory"
+      "path-expand" "path-extension" "path-join" "path-normalize"
+      "path-strip-directory" "path-strip-extension"
+      "path-strip-trailing-directory-separator"
+      "plist->hash-table" "process-status" "random-bytes"
+      "random-integer" "read-line" "read-string" "read-u8"
+      "register-struct-type!" "setenv" "spawn" "spawn/group"
+      "spawn/name" "string->bytes" "string->keyword"
+      "string-empty?" "string-map" "string-split" "string-subst"
+      "struct-field-ref" "struct-field-set!" "struct-out"
+      "struct-predicate" "struct-type-info" "subu8vector" "take"
+      "thread-done?" "thread-interrupt!" "thread-join!"
+      "thread-mailbox-next" "thread-name" "thread-receive"
+      "thread-send" "thread-sleep!" "thread-specific"
+      "thread-specific-set!" "thread-start!" "thread-terminate!"
+      "thread-yield!" "thread?" "time->seconds" "try" "u8vector"
+      "u8vector->list" "u8vector-length" "u8vector-ref"
+      "u8vector-set!" "until" "user-info" "user-info-home"
+      "user-name" "while" "with-exception-catcher" "write-u8" "~")
+     ("file" . "lib/jerboa/core.sls")
+     ("tier" . "core"))
+   ("(jerboa cross)"
+     ("exports" "abi-name" "cc-flags-for-target" "cross-config-cc"
+      "cross-config-cflags" "cross-config-sysroot"
+      "cross-config-target-arch" "cross-config-target-os"
+      "cross-config-valid?" "cross-config?" "detect-host-config"
+      "endianness-for-target" "make-cross-config"
+      "normalize-path-sep" "platform-string"
+      "pointer-size-for-target" "target-arch-aarch64?"
+      "target-arch-riscv64?" "target-arch-x86-64?"
+      "target-os-linux?" "target-os-macos?" "target-os-windows?")
+     ("file" . "lib/jerboa/cross.sls")
+     ("tier" . "core"))
+   ("(jerboa embed)"
+     ("exports" "make-sandbox" "make-sandbox-config" "sandbox-call"
+       "sandbox-config?" "sandbox-define!" "sandbox-environment"
+       "sandbox-error-irritants" "sandbox-error-message"
+       "sandbox-error?" "sandbox-eval" "sandbox-eval-string"
+       "sandbox-import!" "sandbox-ref" "sandbox-reset!" "sandbox?"
+       "with-sandbox")
+     ("file" . "lib/jerboa/embed.sls")
+     ("tier" . "core"))
+   ("(jerboa ffi)"
+     ("exports" "begin-ffi" "c-declare" "c-lambda"
+       "define-c-lambda" "ffi-type-map" "load-shared-object*")
+     ("file" . "lib/jerboa/ffi.sls")
+     ("tier" . "core"))
+   ("(jerboa hot)"
+     ("exports" "file-modified?" "file-mtimes" "make-reloader"
+       "reload-result-error" "reload-result-file"
+       "reload-result-success?" "reload-result?" "reloader-check!"
+       "reloader-force-stale!" "reloader-on-error!"
+       "reloader-on-reload!" "reloader-reload!" "reloader-unwatch!"
+       "reloader-watch!" "reloader-watched" "reloader?"
+       "with-reloader")
+     ("file" . "lib/jerboa/hot.sls")
+     ("tier" . "core"))
+   ("(jerboa lock)"
+     ("exports" "lock-entry-deps" "lock-entry-hash" "lock-entry-name"
+       "lock-entry-version" "lock-entry?" "lockfile->sexp"
+       "lockfile-add!" "lockfile-diff" "lockfile-entries"
+       "lockfile-has?" "lockfile-lookup" "lockfile-merge"
+       "lockfile-read" "lockfile-remove!" "lockfile-write"
+       "lockfile?" "make-lock-entry" "make-lockfile"
+       "sexp->lockfile")
+     ("file" . "lib/jerboa/lock.sls")
+     ("tier" . "core"))
+   ("(jerboa pkg)"
+     ("exports" "constraint-satisfied?" "dep-name"
+      "dep-version-constraint" "dep?" "dependency-order"
+      "make-dep" "make-manifest" "make-package" "manifest-add"
+      "manifest-lookup" "manifest-packages" "manifest-remove"
+      "manifest?" "package-author" "package-deps"
+      "package-description" "package-name" "package-version"
+      "package?" "resolve-deps" "version->list" "version-compare"
+      "version<?" "version=?" "version>=?")
+     ("file" . "lib/jerboa/pkg.sls")
+     ("tier" . "core"))
+   ("(jerboa prelude clean)"
+     ("exports" "*method-tables*" "*struct-types*"
+      "ContractViolation" "Error" "aget" "agetq" "agetv"
+      "alist->hash-table" "any" "aset!" "asetq!" "asetv!"
+      "assert!" "begin-ffi" "bind-method!" "c-declare" "c-lambda"
+      "call-method" "catch" "chain" "chain-and" "def" "def*"
+      "defclass" "define-active-pattern" "define-c-lambda"
+      "define-match-type" "define-sealed-hierarchy" "defmethod"
+      "defrule" "defrules" "defstruct" "displayln" "drop"
+      "eprintf" "error-irritants" "error-message" "error-trace"
+      "every" "filter-map" "finally" "flatten" "group-by"
+      "hash->list" "hash->plist" "hash-clear!" "hash-copy"
+      "hash-eq-literal" "hash-find" "hash-fold" "hash-for-each"
+      "hash-get" "hash-key?" "hash-keys" "hash-length"
+      "hash-literal" "hash-map" "hash-merge" "hash-merge!"
+      "hash-put!" "hash-ref" "hash-remove!" "hash-update!"
+      "hash-values" "json-object->string" "keyword->string"
+      "keyword?" "last-pair" "let-hash" "list->hash-table"
+      "make-hash-table-eq" "make-keyword" "match" "match/strict"
+      "path-directory" "path-expand" "path-join" "path-normalize"
+      "path-strip-directory" "path-strip-extension" "pget" "pgetq"
+      "pgetv" "plist->hash-table" "read-all-as-lines"
+      "read-all-as-string" "read-file-lines" "read-file-string"
+      "read-json" "register-struct-type!" "snoc" "stable-sort"
+      "stable-sort!" "string->json-object" "string->keyword"
+      "string-contains" "string-empty?" "string-index"
+      "string-join" "string-prefix?" "string-split"
+      "string-suffix?" "string-trim" "struct-field-ref"
+      "struct-field-set!" "struct-predicate" "struct-type-info"
+      "take" "try" "unique" "until" "while" "write-file-string"
+      "write-json" "zip" "~")
+     ("file" . "lib/jerboa/prelude/clean.sls")
+     ("tier" . "core"))
+   ("(jerboa prelude safe)"
+     ("exports" "&jerboa" "&sandbox-error" "*default-timeout*"
+      "*fasl-allow-procedures*" "*fasl-max-byte-size*"
+      "*fasl-max-object-count*" "*method-tables*" "*safe-mode*"
+      "*sandbox-landlock*" "*sandbox-seccomp*" "*sandbox-timeout*"
+      "*struct-types*" "1+" "1-" "ContractViolation" "Error"
+      "aget" "agetq" "agetv" "alist->hash-table" "any" "aset!"
+      "asetq!" "asetv!" "assert!" "bind-method!" "call-method"
+      "call-with-resource" "call-with-safe-input-file"
+      "call-with-safe-output-file" "catch" "chain" "chain-and"
+      "connection-refused?" "connection-timeout?"
+      "db-connection-error?" "db-constraint-violation?"
+      "db-error?" "db-query-error?" "def" "def*" "defclass"
+      "defmethod" "defrule" "defrules" "defstruct" "displayln"
+      "drop" "eprintf" "error-irritants" "error-message"
+      "error-trace" "every" "filter-map" "finally" "flatten"
+      "format" "fprintf" "group-by" "hash->list" "hash->plist"
+      "hash-clear!" "hash-copy" "hash-eq-literal" "hash-find"
+      "hash-fold" "hash-for-each" "hash-get" "hash-key?"
+      "hash-keys" "hash-length" "hash-literal" "hash-map"
+      "hash-merge" "hash-merge!" "hash-put!" "hash-ref"
+      "hash-remove!" "hash-table?" "hash-update!" "hash-values"
+      "iota" "jerboa-condition-subsystem" "jerboa-condition?"
+      "json-object->string" "keyword->string" "keyword?"
+      "last-pair" "let-hash" "list->hash-table" "make-hash-table"
+      "make-hash-table-eq" "make-keyword" "make-sandbox-config"
+      "match" "network-error?" "open-safe-input-file"
+      "open-safe-output-file" "parallel" "parse-error?"
+      "path-absolute?" "path-directory" "path-expand"
+      "path-extension" "path-join" "path-normalize"
+      "path-strip-directory" "path-strip-extension" "pget" "pgetq"
+      "pgetv" "plist->hash-table" "printf" "race"
+      "read-all-as-lines" "read-all-as-string" "read-file-lines"
+      "read-file-string" "read-json" "register-resource-cleanup!"
+      "register-safe-record-type!" "register-struct-type!"
+      "resource-already-closed?" "resource-error?"
+      "resource-exhausted?" "resource-leak?" "run-safe"
+      "run-safe-eval" "safe-fasl-read" "safe-fasl-read-bytevector"
+      "safe-fasl-write" "safe-fasl-write-bytevector"
+      "sandbox-config-capabilities" "sandbox-config-landlock"
+      "sandbox-config-seccomp" "sandbox-config-timeout"
+      "sandbox-config?" "sandbox-error-detail"
+      "sandbox-error-phase" "sandbox-error?" "scope-spawn"
+      "scope-spawn-named" "snoc" "sort" "sort!" "sqlite-bind"
+      "sqlite-close" "sqlite-exec" "sqlite-execute"
+      "sqlite-finalize" "sqlite-open" "sqlite-prepare"
+      "sqlite-query" "sqlite-step" "stable-sort" "stable-sort!"
+      "string->json-object" "string->keyword" "string-contains"
+      "string-empty?" "string-index" "string-join"
+      "string-prefix?" "string-split" "string-suffix?"
+      "string-trim" "struct-field-ref" "struct-field-set!"
+      "struct-predicate" "struct-type-info" "take" "task-await"
+      "task-cancel" "task-done?" "task-name" "task-result" "task?"
+      "tcp-accept" "tcp-close" "tcp-connect" "tcp-listen"
+      "tcp-read" "tcp-write" "tcp-write-string" "timeout-error?"
+      "try" "unique" "unregister-safe-record-type!" "until"
+      "while" "with-input-from-string" "with-output-to-string"
+      "with-resource" "with-resource1" "with-task-scope"
+      "with-timeout" "write-file-string" "write-json" "zip" "~")
+     ("file" . "lib/jerboa/prelude/safe.sls")
+     ("tier" . "core"))
+   ("(jerboa prelude)"
+     ("exports" "*method-tables*" "*struct-types*" "->" "->>"
+      "->>?" "->?" "1+" "1-" ":" "<...>" "<>" "ContractViolation"
+      "Error" "acons" "add-watch!" "aget" "agetq" "agetv" "aif"
+      "alist" "alist->hash-table" "alist->plist*" "alist?"
+      "alists->csv" "and-then" "any" "append-map" "append1" "arem"
+      "arem!" "aremq" "aremq!" "aremv" "aremv!" "as->" "aset"
+      "aset!" "asetq" "asetq!" "asetv" "asetv!" "assert!"
+      "assoc-in" "assoc-in!" "atom" "atom-deref" "atom-reset!"
+      "atom-swap!" "atom-update!" "atom?" "awhen" "begin-ffi"
+      "bind-method!" "butlast" "c-declare" "c-lambda"
+      "call-method" "call-with-list-builder" "capture" "catch"
+      "chain" "chain-and" "comp" "compare-and-set!" "complement"
+      "compose" "compose1" "cond->" "cond->>" "conjoin"
+      "constantly" "cpu-count" "csv->alists" "csv-port->rows"
+      "curry" "curryn" "cut" "cute" "date->string"
+      "datetime->alist" "datetime->epoch" "datetime->iso8601"
+      "datetime->julian" "datetime->string" "datetime-add"
+      "datetime-clamp" "datetime-day" "datetime-diff"
+      "datetime-floor-day" "datetime-floor-hour"
+      "datetime-floor-month" "datetime-hour" "datetime-max"
+      "datetime-min" "datetime-minute" "datetime-month"
+      "datetime-nanosecond" "datetime-now" "datetime-offset"
+      "datetime-second" "datetime-subtract" "datetime-truncate"
+      "datetime-utc-now" "datetime-year" "datetime<=?"
+      "datetime<?" "datetime=?" "datetime>=?" "datetime>?"
+      "datetime?" "day-of-week" "day-of-year" "days-in-month"
+      "def" "def*" "defclass" "define-active-pattern"
+      "define-c-lambda" "define-enum" "define-match-type"
+      "define-rx" "define-sealed-hierarchy" "define-values"
+      "defmethod" "defn" "defrecord" "defrule" "defrules"
+      "defstruct" "delete-duplicates/hash" "deref"
+      "directory-exists?" "disjoin" "displayln" "distinct"
+      "dotimes" "drop" "drop-last" "drop-until" "drop-while"
+      "duplicates" "duration" "duration-nanoseconds"
+      "duration-seconds" "duration?" "epoch->datetime" "eprintf"
+      "eql?" "err" "err->list" "err?" "error-irritants"
+      "error-message" "error-trace" "every" "every-consecutive?"
+      "every-pred" "filter-err" "filter-map" "filter-ok" "finally"
+      "first-and-only" "flatten" "flatten-result" "flatten1"
+      "flip" "fnil" "for" "for-each!" "for/and" "for/collect"
+      "for/fold" "for/or" "force-output" "format" "fprintf"
+      "frequencies" "get-in" "group-by" "group-consecutive"
+      "group-n-consecutive" "group-same" "hash->list"
+      "hash->plist" "hash-clear!" "hash-copy" "hash-eq-literal"
+      "hash-find" "hash-fold" "hash-for-each" "hash-get"
+      "hash-has-key?" "hash-key?" "hash-keys" "hash-length"
+      "hash-literal" "hash-map" "hash-merge" "hash-merge!"
+      "hash-put!" "hash-ref" "hash-remove!" "hash-set"
+      "hash-table-set!" "hash-table?" "hash-update!" "hash-values"
+      "identity" "if-let" "in-bytes" "in-chars" "in-hash-keys"
+      "in-hash-pairs" "in-hash-values" "in-indexed" "in-lines"
+      "in-list" "in-naturals" "in-port" "in-producer" "in-range"
+      "in-string" "in-vector" "interleave" "interpose" "iota"
+      "iterate-n" "json-object->string" "julian->datetime" "juxt"
+      "keep" "keyword->string" "keyword?" "last-pair" "leap-year?"
+      "length<=?" "length<=n?" "length<?" "length<n?" "length=?"
+      "length=n?" "length>=?" "length>=n?" "length>?" "length>n?"
+      "let-alist" "let-hash" "list->hash-table" "list-of?"
+      "make-date" "make-datetime" "make-duration"
+      "make-hash-table" "make-hash-table-eq" "make-keyword"
+      "make-shared" "make-time" "map-err" "map-ok" "map-results"
+      "map/car" "mapcat" "match" "match/strict" "maybe"
+      "memo-proc" "meta" "meta-wrapped?" "negate"
+      "nested-empty-like" "nested-get" "ok" "ok->list" "ok?"
+      "or-else" "parse-date" "parse-datetime" "parse-time"
+      "partial" "partition" "partition-all" "partition-by"
+      "path-absolute?" "path-directory" "path-expand"
+      "path-extension" "path-join" "path-normalize"
+      "path-strip-directory" "path-strip-extension" "pget" "pgetq"
+      "pgetv" "plist->alist*" "plist->hash-table" "pop!" "pp"
+      "pp-to-string" "ppd" "ppd-to-string" "pprint" "prem" "prem!"
+      "premq" "premq!" "premv" "premv!" "printf" "processor-count"
+      "pset" "pset!" "psetq" "psetq!" "psetv" "psetv!" "push!"
+      "random-integer" "rassoc" "re" "re-find-all" "re-fold"
+      "re-groups" "re-match-end" "re-match-full" "re-match-group"
+      "re-match-groups" "re-match-named" "re-match-start"
+      "re-match?" "re-replace" "re-replace-all" "re-search"
+      "re-split" "re?" "read-all-as-lines" "read-all-as-string"
+      "read-csv" "read-csv-file" "read-file-lines"
+      "read-file-string" "read-json" "read-line" "reductions"
+      "regex-match" "regex-replace" "regex-replace-all"
+      "regex-search" "register-struct-type!" "remove-watch!"
+      "reset!" "result->option" "result->values" "result?"
+      "results-partition" "rows->csv-string" "rx"
+      "sequence-results" "shared-cas!" "shared-ref" "shared-set!"
+      "shared-swap!" "shared-update!" "shared?" "slice" "snoc"
+      "some" "some->" "some->>" "some-fn" "sort" "sort!" "split"
+      "split-at" "split-with" "stable-sort" "stable-sort!" "str"
+      "string->json-object" "string->keyword" "string-contains"
+      "string-empty?" "string-find" "string-find-all"
+      "string-index" "string-join" "string-map" "string-match?"
+      "string-prefix?" "string-split" "string-suffix?"
+      "string-trim" "strip-meta" "struct-field-ref"
+      "struct-field-set!" "struct-predicate" "struct-type-info"
+      "swap!" "take" "take-last" "take-until" "take-while"
+      "time->string" "try" "try-result" "try-result*" "unique"
+      "until" "unwind-protect" "unwrap" "unwrap-err" "unwrap-or"
+      "unwrap-or-else" "update-in" "update-in!" "using"
+      "vary-meta" "vderef" "volatile!" "volatile?" "vreset!"
+      "vswap!" "when-let" "when/list" "while" "with-catch"
+      "with-id" "with-input-from-string" "with-list-builder"
+      "with-lock" "with-meta" "with-output-to-string"
+      "with-resource" "write-csv" "write-csv-file"
+      "write-file-string" "write-json" "zip" "~")
+     ("file" . "lib/jerboa/prelude.sls")
+     ("tier" . "core"))
+   ("(jerboa reader)"
+     ("exports" "*max-block-comment-depth*" "*max-list-length*"
+      "*max-read-depth*" "*max-string-length*"
+      "*max-symbol-length*" "annotated-datum"
+      "annotated-datum-source" "annotated-datum-value"
+      "annotated-datum?" "jerboa-read" "jerboa-read-all"
+      "jerboa-read-file" "jerboa-read-string"
+      "make-annotated-datum" "make-source-location"
+      "reader-cloj-mode" "source-location"
+      "source-location-column" "source-location-line"
+      "source-location-path" "source-location?")
+     ("file" . "lib/jerboa/reader.sls")
+     ("tier" . "core"))
+   ("(jerboa registry)"
+     ("exports" "*package-dir*" "*registry-file*" "installed-packages"
+       "package-install!" "package-installed?" "package-uninstall!"
+       "package-update!" "registry-lookup" "registry-search")
+     ("file" . "lib/jerboa/registry.sls")
+     ("tier" . "core"))
+   ("(jerboa runtime)"
+     ("exports" "*method-tables*" "*struct-types*" "1+" "1-"
+      "bind-method!" "call-method" "cons*" "displayln"
+      "error-irritants" "error-message" "error-trace" "hash->list"
+      "hash->plist" "hash-clear!" "hash-copy" "hash-eq" "hash-eq?"
+      "hash-find" "hash-fold" "hash-for-each" "hash-get"
+      "hash-key?" "hash-keys" "hash-length" "hash-map"
+      "hash-merge" "hash-merge!" "hash-put!" "hash-ref"
+      "hash-remove!" "hash-set" "hash-table?" "hash-update!"
+      "hash-values" "iota" "keyword->string" "keyword-arg-ref"
+      "keyword?" "last-pair" "list->hash-table" "make-hash-table"
+      "make-hash-table-eq" "make-keyword" "make-list"
+      "plist->hash-table" "raise" "register-struct-type!"
+      "string->keyword" "struct-field-ref" "struct-field-set!"
+      "struct-predicate" "struct-type-info" "void"
+      "with-exception-handler" "~")
+     ("file" . "lib/jerboa/runtime.sls")
+     ("tier" . "core"))
+   ("(jerboa translator)"
+     ("exports" "default-transforms" "make-translator"
+      "translate-brackets" "translate-define-values"
+      "translate-defrules" "translate-defstruct"
+      "translate-export" "translate-file" "translate-for-loops"
+      "translate-gerbil-void" "translate-hash-bang"
+      "translate-hash-operations" "translate-imports"
+      "translate-keywords" "translate-let-hash"
+      "translate-match-patterns" "translate-method-dispatch"
+      "translate-package-to-library" "translate-parameterize"
+      "translate-spawn-forms" "translate-try-catch"
+      "translate-using")
+     ("file" . "lib/jerboa/translator.sls")
+     ("tier" . "core"))
+   ("(jerboa wasm closure)"
+     ("exports" "free-variables" "lambda-lift" "lambda-params")
+     ("file" . "lib/jerboa/wasm/closure.sls")
+     ("tier" . "unstable"))
+   ("(jerboa wasm codegen)"
+     ("exports" "compile-expr" "compile-program"
+      "context-add-func!" "context-add-local!"
+      "context-block-depth" "context-func-index"
+      "context-local-index" "context-pop-block!"
+      "context-push-block!" "make-compile-context"
+      "make-wasm-export" "make-wasm-func" "make-wasm-import"
+      "make-wasm-module" "make-wasm-type" "scheme->wasm-type"
+      "wasm-export-func" "wasm-export-global" "wasm-export-index"
+      "wasm-export-kind" "wasm-export-memory" "wasm-export-name"
+      "wasm-export-table" "wasm-func-body" "wasm-func-locals"
+      "wasm-func?" "wasm-import-desc" "wasm-import-module"
+      "wasm-import-name" "wasm-module-add-data!"
+      "wasm-module-add-element!" "wasm-module-add-export!"
+      "wasm-module-add-function!" "wasm-module-add-global!"
+      "wasm-module-add-import!" "wasm-module-add-memory!"
+      "wasm-module-add-table!" "wasm-module-add-tag!"
+      "wasm-module-add-type!" "wasm-module-data-segments"
+      "wasm-module-elements" "wasm-module-encode"
+      "wasm-module-exports" "wasm-module-functions"
+      "wasm-module-globals" "wasm-module-imports"
+      "wasm-module-memories" "wasm-module-set-start!"
+      "wasm-module-start" "wasm-module-tables" "wasm-module-tags"
+      "wasm-module-types" "wasm-module?" "wasm-type-params"
+      "wasm-type-results")
+     ("file" . "lib/jerboa/wasm/codegen.sls")
+     ("tier" . "unstable"))
+   ("(jerboa wasm format)"
+     ("exports" "bytevector-builder-append-bv!"
+      "bytevector-builder-append-u8!" "bytevector-builder-build"
+      "bytevector-builder-length" "decode-f32" "decode-f64"
+      "decode-i32-leb128" "decode-i64-leb128" "decode-string"
+      "decode-u32-leb128" "encode-f32" "encode-f64"
+      "encode-i32-leb128" "encode-i64-leb128" "encode-string"
+      "encode-u32-leb128" "make-bytevector-builder"
+      "wasm-catch-all-kind" "wasm-catch-all-ref-kind"
+      "wasm-catch-kind" "wasm-catch-ref-kind"
+      "wasm-composite-array" "wasm-composite-func"
+      "wasm-composite-struct" "wasm-fb-array-copy"
+      "wasm-fb-array-fill" "wasm-fb-array-get"
+      "wasm-fb-array-get-s" "wasm-fb-array-get-u"
+      "wasm-fb-array-init-data" "wasm-fb-array-init-elem"
+      "wasm-fb-array-len" "wasm-fb-array-new"
+      "wasm-fb-array-new-data" "wasm-fb-array-new-default"
+      "wasm-fb-array-new-elem" "wasm-fb-array-new-fixed"
+      "wasm-fb-array-set" "wasm-fb-br-on-cast"
+      "wasm-fb-br-on-cast-fail" "wasm-fb-extern-externalize"
+      "wasm-fb-extern-internalize" "wasm-fb-i31-get-s"
+      "wasm-fb-i31-get-u" "wasm-fb-ref-cast"
+      "wasm-fb-ref-cast-null" "wasm-fb-ref-i31" "wasm-fb-ref-test"
+      "wasm-fb-ref-test-null" "wasm-fb-struct-get"
+      "wasm-fb-struct-get-s" "wasm-fb-struct-get-u"
+      "wasm-fb-struct-new" "wasm-fb-struct-new-default"
+      "wasm-fb-struct-set" "wasm-fc-data-drop" "wasm-fc-elem-drop"
+      "wasm-fc-i32-trunc-sat-f32-s" "wasm-fc-i32-trunc-sat-f32-u"
+      "wasm-fc-i32-trunc-sat-f64-s" "wasm-fc-i32-trunc-sat-f64-u"
+      "wasm-fc-i64-trunc-sat-f32-s" "wasm-fc-i64-trunc-sat-f32-u"
+      "wasm-fc-i64-trunc-sat-f64-s" "wasm-fc-i64-trunc-sat-f64-u"
+      "wasm-fc-memory-copy" "wasm-fc-memory-fill"
+      "wasm-fc-memory-init" "wasm-fc-table-copy"
+      "wasm-fc-table-fill" "wasm-fc-table-grow"
+      "wasm-fc-table-init" "wasm-fc-table-size" "wasm-magic"
+      "wasm-opcode-block" "wasm-opcode-br" "wasm-opcode-br-if"
+      "wasm-opcode-br-table" "wasm-opcode-call"
+      "wasm-opcode-call-indirect" "wasm-opcode-catch"
+      "wasm-opcode-catch-all" "wasm-opcode-delegate"
+      "wasm-opcode-drop" "wasm-opcode-else" "wasm-opcode-end"
+      "wasm-opcode-f32-abs" "wasm-opcode-f32-add"
+      "wasm-opcode-f32-ceil" "wasm-opcode-f32-const"
+      "wasm-opcode-f32-convert-i32-s"
+      "wasm-opcode-f32-convert-i32-u"
+      "wasm-opcode-f32-convert-i64-s"
+      "wasm-opcode-f32-convert-i64-u" "wasm-opcode-f32-copysign"
+      "wasm-opcode-f32-demote-f64" "wasm-opcode-f32-div"
+      "wasm-opcode-f32-eq" "wasm-opcode-f32-floor"
+      "wasm-opcode-f32-ge" "wasm-opcode-f32-gt"
+      "wasm-opcode-f32-le" "wasm-opcode-f32-load"
+      "wasm-opcode-f32-lt" "wasm-opcode-f32-max"
+      "wasm-opcode-f32-min" "wasm-opcode-f32-mul"
+      "wasm-opcode-f32-ne" "wasm-opcode-f32-nearest"
+      "wasm-opcode-f32-neg" "wasm-opcode-f32-reinterpret-i32"
+      "wasm-opcode-f32-sqrt" "wasm-opcode-f32-store"
+      "wasm-opcode-f32-sub" "wasm-opcode-f32-trunc"
+      "wasm-opcode-f64-abs" "wasm-opcode-f64-add"
+      "wasm-opcode-f64-ceil" "wasm-opcode-f64-const"
+      "wasm-opcode-f64-convert-i32-s"
+      "wasm-opcode-f64-convert-i32-u"
+      "wasm-opcode-f64-convert-i64-s"
+      "wasm-opcode-f64-convert-i64-u" "wasm-opcode-f64-copysign"
+      "wasm-opcode-f64-div" "wasm-opcode-f64-eq"
+      "wasm-opcode-f64-floor" "wasm-opcode-f64-ge"
+      "wasm-opcode-f64-gt" "wasm-opcode-f64-le"
+      "wasm-opcode-f64-load" "wasm-opcode-f64-lt"
+      "wasm-opcode-f64-max" "wasm-opcode-f64-min"
+      "wasm-opcode-f64-mul" "wasm-opcode-f64-ne"
+      "wasm-opcode-f64-nearest" "wasm-opcode-f64-neg"
+      "wasm-opcode-f64-promote-f32"
+      "wasm-opcode-f64-reinterpret-i64" "wasm-opcode-f64-sqrt"
+      "wasm-opcode-f64-store" "wasm-opcode-f64-sub"
+      "wasm-opcode-f64-trunc" "wasm-opcode-global-get"
+      "wasm-opcode-global-set" "wasm-opcode-i32-add"
+      "wasm-opcode-i32-and" "wasm-opcode-i32-clz"
+      "wasm-opcode-i32-const" "wasm-opcode-i32-ctz"
+      "wasm-opcode-i32-div-s" "wasm-opcode-i32-div-u"
+      "wasm-opcode-i32-eq" "wasm-opcode-i32-eqz"
+      "wasm-opcode-i32-extend16-s" "wasm-opcode-i32-extend8-s"
+      "wasm-opcode-i32-ge-s" "wasm-opcode-i32-ge-u"
+      "wasm-opcode-i32-gt-s" "wasm-opcode-i32-gt-u"
+      "wasm-opcode-i32-le-s" "wasm-opcode-i32-le-u"
+      "wasm-opcode-i32-load" "wasm-opcode-i32-load16-s"
+      "wasm-opcode-i32-load16-u" "wasm-opcode-i32-load8-s"
+      "wasm-opcode-i32-load8-u" "wasm-opcode-i32-lt-s"
+      "wasm-opcode-i32-lt-u" "wasm-opcode-i32-mul"
+      "wasm-opcode-i32-ne" "wasm-opcode-i32-or"
+      "wasm-opcode-i32-popcnt" "wasm-opcode-i32-reinterpret-f32"
+      "wasm-opcode-i32-rem-s" "wasm-opcode-i32-rem-u"
+      "wasm-opcode-i32-rotl" "wasm-opcode-i32-rotr"
+      "wasm-opcode-i32-shl" "wasm-opcode-i32-shr-s"
+      "wasm-opcode-i32-shr-u" "wasm-opcode-i32-store"
+      "wasm-opcode-i32-store16" "wasm-opcode-i32-store8"
+      "wasm-opcode-i32-sub" "wasm-opcode-i32-trunc-f32-s"
+      "wasm-opcode-i32-trunc-f32-u" "wasm-opcode-i32-trunc-f64-s"
+      "wasm-opcode-i32-trunc-f64-u" "wasm-opcode-i32-wrap-i64"
+      "wasm-opcode-i32-xor" "wasm-opcode-i64-add"
+      "wasm-opcode-i64-and" "wasm-opcode-i64-clz"
+      "wasm-opcode-i64-const" "wasm-opcode-i64-ctz"
+      "wasm-opcode-i64-div-s" "wasm-opcode-i64-div-u"
+      "wasm-opcode-i64-eq" "wasm-opcode-i64-eqz"
+      "wasm-opcode-i64-extend-i32-s"
+      "wasm-opcode-i64-extend-i32-u" "wasm-opcode-i64-extend16-s"
+      "wasm-opcode-i64-extend32-s" "wasm-opcode-i64-extend8-s"
+      "wasm-opcode-i64-ge-s" "wasm-opcode-i64-ge-u"
+      "wasm-opcode-i64-gt-s" "wasm-opcode-i64-gt-u"
+      "wasm-opcode-i64-le-s" "wasm-opcode-i64-le-u"
+      "wasm-opcode-i64-load" "wasm-opcode-i64-load16-s"
+      "wasm-opcode-i64-load16-u" "wasm-opcode-i64-load32-s"
+      "wasm-opcode-i64-load32-u" "wasm-opcode-i64-load8-s"
+      "wasm-opcode-i64-load8-u" "wasm-opcode-i64-lt-s"
+      "wasm-opcode-i64-lt-u" "wasm-opcode-i64-mul"
+      "wasm-opcode-i64-ne" "wasm-opcode-i64-or"
+      "wasm-opcode-i64-popcnt" "wasm-opcode-i64-reinterpret-f64"
+      "wasm-opcode-i64-rem-s" "wasm-opcode-i64-rem-u"
+      "wasm-opcode-i64-rotl" "wasm-opcode-i64-rotr"
+      "wasm-opcode-i64-shl" "wasm-opcode-i64-shr-s"
+      "wasm-opcode-i64-shr-u" "wasm-opcode-i64-store"
+      "wasm-opcode-i64-store16" "wasm-opcode-i64-store32"
+      "wasm-opcode-i64-store8" "wasm-opcode-i64-sub"
+      "wasm-opcode-i64-trunc-f32-s" "wasm-opcode-i64-trunc-f32-u"
+      "wasm-opcode-i64-trunc-f64-s" "wasm-opcode-i64-trunc-f64-u"
+      "wasm-opcode-i64-xor" "wasm-opcode-if"
+      "wasm-opcode-local-get" "wasm-opcode-local-set"
+      "wasm-opcode-local-tee" "wasm-opcode-loop"
+      "wasm-opcode-memory-grow" "wasm-opcode-memory-size"
+      "wasm-opcode-nop" "wasm-opcode-ref-func"
+      "wasm-opcode-ref-is-null" "wasm-opcode-ref-null"
+      "wasm-opcode-rethrow" "wasm-opcode-return"
+      "wasm-opcode-return-call" "wasm-opcode-return-call-indirect"
+      "wasm-opcode-select" "wasm-opcode-select-t"
+      "wasm-opcode-table-get" "wasm-opcode-table-set"
+      "wasm-opcode-throw" "wasm-opcode-throw-ref"
+      "wasm-opcode-try" "wasm-opcode-try-table"
+      "wasm-opcode-unreachable" "wasm-prefix-fb" "wasm-prefix-fc"
+      "wasm-section-code" "wasm-section-custom"
+      "wasm-section-data" "wasm-section-data-count"
+      "wasm-section-element" "wasm-section-export"
+      "wasm-section-function" "wasm-section-global"
+      "wasm-section-import" "wasm-section-memory"
+      "wasm-section-start" "wasm-section-table" "wasm-section-tag"
+      "wasm-section-type" "wasm-type-anyref" "wasm-type-arrayref"
+      "wasm-type-eqref" "wasm-type-externref" "wasm-type-f32"
+      "wasm-type-f64" "wasm-type-funcref" "wasm-type-i31ref"
+      "wasm-type-i32" "wasm-type-i64" "wasm-type-noneref"
+      "wasm-type-nullexternref" "wasm-type-nullfuncref"
+      "wasm-type-nullref" "wasm-type-rec" "wasm-type-structref"
+      "wasm-type-sub" "wasm-type-sub-final" "wasm-type-void"
+      "wasm-version")
+     ("file" . "lib/jerboa/wasm/format.sls")
+     ("tier" . "unstable"))
+   ("(jerboa wasm gc)"
+     ("exports"
+       "gc-all-forms"
+       "gc-allocator-forms"
+       "gc-memory-grow-forms"
+       "gc-root-stack-forms")
+     ("file" . "lib/jerboa/wasm/gc.sls")
+     ("tier" . "unstable"))
+   ("(jerboa wasm runtime)"
+     ("exports" "make-wasm-array" "make-wasm-i31"
+      "make-wasm-runtime" "make-wasm-store" "make-wasm-struct"
+      "make-wasm-tag" "make-wasm-trap" "wasm-array-data"
+      "wasm-array-type-idx" "wasm-array?" "wasm-decode-module"
+      "wasm-i31-value" "wasm-i31?" "wasm-instance-exports"
+      "wasm-instance?" "wasm-module-sections" "wasm-run-start"
+      "wasm-runtime-call" "wasm-runtime-global-ref"
+      "wasm-runtime-global-set!" "wasm-runtime-load"
+      "wasm-runtime-memory" "wasm-runtime-memory-ref"
+      "wasm-runtime-memory-set!" "wasm-runtime-memory-size"
+      "wasm-runtime-set-fuel!"
+      "wasm-runtime-set-import-validator!"
+      "wasm-runtime-set-max-depth!"
+      "wasm-runtime-set-max-memory-pages!"
+      "wasm-runtime-set-max-module-size!"
+      "wasm-runtime-set-max-stack!" "wasm-runtime?"
+      "wasm-store-instantiate" "wasm-store?" "wasm-struct-fields"
+      "wasm-struct-type-idx" "wasm-struct?" "wasm-tag-type-idx"
+      "wasm-tag?" "wasm-trap-message" "wasm-trap?"
+      "wasm-validate-module")
+     ("file" . "lib/jerboa/wasm/runtime.sls")
+     ("tier" . "unstable"))
+   ("(jerboa wasm scheme-runtime)"
+     ("exports" "runtime-all-forms" "runtime-arithmetic-forms"
+       "runtime-bytevector-forms" "runtime-closure-forms"
+       "runtime-closure-type-forms" "runtime-comparison-forms"
+       "runtime-conversion-forms" "runtime-display-forms"
+       "runtime-equality-forms" "runtime-io-forms"
+       "runtime-list-forms" "runtime-result-forms"
+       "runtime-string-forms" "runtime-vector-forms")
+     ("file" . "lib/jerboa/wasm/scheme-runtime.sls")
+     ("tier" . "unstable"))
+   ("(jerboa wasm values)"
+     ("exports" "BYTEVECTOR-HEADER-PAYLOAD"
+      "CLOSURE-HEADER-PAYLOAD" "FIXNUM-MASK" "FIXNUM-MAX"
+      "FIXNUM-MIN" "FIXNUM-TAG" "FLONUM-PAYLOAD-SIZE"
+      "GLOBAL-ARENA-BASE" "GLOBAL-HEAP-END" "GLOBAL-HEAP-PTR"
+      "GLOBAL-ROOT-SP" "GLOBAL-SYMBOL-TABLE"
+      "HASHTABLE-HEADER-PAYLOAD" "HEADER-GC-BIT"
+      "HEADER-SIZE-MASK" "HEADER-TYPE-MASK" "HEADER-TYPE-SHIFT"
+      "HEAP-ALIGN" "HEAP-BASE" "IMM-EOF" "IMM-FALSE" "IMM-NIL"
+      "IMM-TRUE" "IMM-VOID" "MEM-HEAP-START" "MEM-IO-BASE"
+      "MEM-IO-SIZE" "MEM-ROOT-STACK-BASE" "MEM-ROOT-STACK-SIZE"
+      "MEM-STATIC-BASE" "MEM-STATIC-SIZE" "PAIR-PAYLOAD-SIZE"
+      "STRING-HEADER-PAYLOAD" "SYMBOL-HEADER-PAYLOAD"
+      "TYPE-BYTEVECTOR" "TYPE-CLOSURE" "TYPE-FLONUM"
+      "TYPE-HASHTABLE" "TYPE-PAIR" "TYPE-RECORD" "TYPE-STRING"
+      "TYPE-SYMBOL" "TYPE-VECTOR" "VECTOR-HEADER-PAYLOAD"
+      "make-fixnum-const" "make-imm-const" "tagged-fixnum"
+      "value-accessor-forms" "value-constructor-forms"
+      "value-global-forms" "value-memory-forms"
+      "value-predicate-forms" "value-tag-forms")
+     ("file" . "lib/jerboa/wasm/values.sls")
+     ("tier" . "unstable"))
+   ("(std actor bounded)"
+     ("exports" "&mailbox-full" "bounded-send" "default-mailbox-config"
+       "mailbox-config-capacity" "mailbox-config-strategy"
+       "mailbox-config?" "mailbox-full-actor-id"
+       "mailbox-full-condition?" "mailbox-full?" "mailbox-size"
+       "make-mailbox-config" "make-mailbox-full"
+       "spawn-bounded-actor" "spawn-bounded-actor/linked")
+     ("file" . "lib/std/actor/bounded.sls")
+     ("tier" . "stable"))
+   ("(std actor checkpoint)"
+     ("exports" "checkpoint-actor-mailbox" "checkpoint-age"
+       "checkpoint-manager-path" "checkpoint-manager-register!"
+       "checkpoint-manager-restore" "checkpoint-manager-start!"
+       "checkpoint-manager-stop!" "checkpoint-manager?"
+       "checkpoint-serializable?" "checkpoint-value"
+       "delete-old-checkpoints" "deserialize-value"
+       "list-checkpoints" "make-checkpoint-manager"
+       "restore-actor-mailbox" "restore-value" "serialize-value")
+     ("file" . "lib/std/actor/checkpoint.sls")
+     ("tier" . "stable"))
+   ("(std actor cluster)"
+     ("exports" "cluster-join!" "cluster-leave!"
+      "cluster-node-by-name" "cluster-nodes" "current-node"
+      "distributed-supervisor?" "dsupervisor-handle-node-failure!"
+      "dsupervisor-start-child!" "dsupervisor-stop-child!"
+      "dsupervisor-which-children" "make-distributed-supervisor"
+      "node-alive?" "node-id" "node-name" "node?" "on-node-join"
+      "on-node-leave" "remote-register!" "remote-unregister!"
+      "remote-whereis" "start-node!" "stop-node!"