Add feature documentation: whatsnew, rocks, update distrib formatting

ober

08c32b370a9b268223804d0c3c6de0c61734ecba

diff --git a/docs/distrib.md b/docs/distrib.md
index 648412a..56df926 100644
--- a/docs/distrib.md
+++ b/docs/distrib.md
@@ -473,18 +473,18 @@ Move a running actor (state + mailbox) from one node to another without downtime
 
 Build in this order — each builds on the previous:
 
-| Priority | Feature | Module | Dependencies | Effort |
-|----------|---------|--------|--------------|--------|
-| **P1** | Worker Pool | `(std net worker-pool)` | tcp, fasl, transport | ~400 lines |
-| **P1** | Service Discovery | `(std net discovery)` | tcp, actor/registry | ~300 lines |
-| **P1** | Task Queue | `(std net task-queue)` | worker-pool, fasl | ~400 lines |
-| **P2** | Pub/Sub | `(std net pubsub)` | tcp, fasl | ~350 lines |
-| **P2** | Code Shipping | `(std net code-ship)` | worker-pool, compile | ~250 lines |
-| **P2** | Distributed Tracing | `(std debug distributed-trace)` | actor/protocol | ~300 lines |
-| **P3** | DHT | `(std net dht)` | tcp, discovery | ~500 lines |
-| **P3** | Raft Consensus | `(std actor consensus)` | tcp, fasl | ~500 lines |
-| **P3** | Stream Processing | `(std stream distributed)` | pubsub, task-queue | ~600 lines |
-| **P3** | Actor Migration | `(std actor migrate)` | checkpoint, transport | ~350 lines |
+| Priority | Feature             | Module                          | Dependencies          | Effort     |
+|----------|---------------------|---------------------------------|-----------------------|------------|
+| **P1**   | Worker Pool         | `(std net worker-pool)`         | tcp, fasl, transport  | ~400 lines |
+| **P1**   | Service Discovery   | `(std net discovery)`           | tcp, actor/registry   | ~300 lines |
+| **P1**   | Task Queue          | `(std net task-queue)`          | worker-pool, fasl     | ~400 lines |
+| **P2**   | Pub/Sub             | `(std net pubsub)`              | tcp, fasl             | ~350 lines |
+| **P2**   | Code Shipping       | `(std net code-ship)`           | worker-pool, compile  | ~250 lines |
+| **P2**   | Distributed Tracing | `(std debug distributed-trace)` | actor/protocol        | ~300 lines |
+| **P3**   | DHT                 | `(std net dht)`                 | tcp, discovery        | ~500 lines |
+| **P3**   | Raft Consensus      | `(std actor consensus)`         | tcp, fasl             | ~500 lines |
+| **P3**   | Stream Processing   | `(std stream distributed)`      | pubsub, task-queue    | ~600 lines |
+| **P3**   | Actor Migration     | `(std actor migrate)`           | checkpoint, transport | ~350 lines |
 
 ## The End Goal
 
diff --git a/docs/rocks.md b/docs/rocks.md
new file mode 100644
index 0000000..4608d23
--- /dev/null
+++ b/docs/rocks.md
@@ -0,0 +1,409 @@
+# World-Class REPL & Standard Library Expansion
+
+## 1. SLIME-Inspired REPL (`lib/std/repl.sls`)
+
+The REPL went from a basic 425-line read-eval-print loop to a **1500-line interactive powerhouse** modeled after Emacs SLIME for Common Lisp.
+
+**Why it rocks:** Common Lisp developers rave about SLIME because it makes the language *feel alive*. Jerboa now has that same energy:
+
+- **Value history** (`*`, `**`, `***`, `$1`, `$2`...) — Never lose a computed result. Refer back to any previous value by number. This is the #1 thing people miss when moving from CL to other Schemes.
+- **Deep object inspector** — Drill into any value: hashtables show entries, records show fields, closures show captured names. Essential for understanding complex data at the REPL.
+- **Function tracing** — Wrap any function to see calls/returns with args. Debug without adding print statements.
+- **Built-in profiling & benchmarking** — Measure wall time, CPU time, memory allocation, GC pressure. No external tools needed.
+- **Tab completion** — Complete any symbol in the environment. Makes discovery effortless.
+- **Inline documentation** — `,doc car` gives you docs instantly. Register your own with `register-doc!`.
+- **Apropos search** — `,apropos string` finds every symbol containing "string". Perfect for exploration.
+- **Data engineering commands** — `,table` for formatted tables, `,stats` for descriptive statistics, `,freq` for frequency tables, `,json` for JSON output. Turn your REPL into a data workbench.
+- **Balanced paren check** — Correctly handles strings and comments, so `")"` inside a string doesn't confuse it.
+- **Persistent history** — Saved to `~/.jerboa_history` across sessions.
+
+---
+
+## 2. SWANK-Like TCP Server (`lib/std/repl/server.sls`)
+
+A TCP server that speaks an s-expression protocol, enabling **editor integration**.
+
+**Why it rocks:** This is the bridge between jerboa and editors like Emacs. Any editor that can open a TCP socket can:
+
+- Evaluate code remotely and get structured results
+- Get tab completions
+- Look up documentation
+- Expand macros
+- Navigate the filesystem
+- Query memory usage and thread info
+
+The protocol uses `(id method args...) → (id :ok result)` — dead simple to implement on the editor side. Port discovery via `~/.jerboa-repl-port` means editors auto-connect. Multi-threaded so multiple editor connections work simultaneously.
+
+---
+
+## 3. REPL Middleware (`lib/std/repl/middleware.sls`)
+
+An extensibility layer for the REPL — register custom commands, printers, input transformers, and eval hooks.
+
+**Why it rocks:** Every REPL eventually needs customization. Instead of forking the REPL code, middleware lets users:
+
+- Add `,mycommand` commands without touching core REPL code
+- Register custom pretty-printers for their record types
+- Transform input (e.g., `!ls` → `(system "ls")`)
+- Hook into pre/post eval for logging, timing, or side effects
+- Customize the prompt
+
+This is the pattern that made Express.js and Rack successful — composable middleware.
+
+---
+
+## 4. Notebook System (`lib/std/repl/notebook.sls`)
+
+Jupyter-style literate programming for Scheme. Save REPL sessions as executable `.ss.nb` files with markdown documentation.
+
+**Why it rocks:** Data scientists live in notebooks. This brings that workflow to Scheme:
+
+- Mix code cells with markdown documentation
+- Capture outputs alongside code
+- Export to HTML (shareable reports) or Markdown (documentation)
+- Record live sessions — start recording, do your work, stop, save
+- Files are valid Scheme — you can `load` them directly
+
+---
+
+## 5. Shell Execution (`lib/std/os/shell.sls`)
+
+High-level shell command execution with multiple output modes.
+
+**Why it rocks:** Every scripting language needs easy shell access. This gives you:
+
+- `(shell "ls -la")` — just get stdout as a string
+- `(shell! "make build")` — raise on failure (fail-fast scripting)
+- `(shell/lines "ls")` — get a list of lines (no manual splitting)
+- `(shell/status cmd)` — get stdout, stderr, AND exit code separately
+- `(shell-pipe "ls" "grep .ss" "wc -l")` — Unix pipes as function args
+- `(shell-env cmd alist)` — run with custom environment
+- `(shell-async cmd)` — background execution with later collection
+
+Replaces 50 lines of `open-process-ports` boilerplate with one-liners.
+
+---
+
+## 6. Template Engine (`lib/std/text/template.sls`)
+
+Mustache-inspired string templates with sections, iteration, and conditionals.
+
+**Why it rocks:** Code generation, email templates, report formatting — templates are everywhere. This handles:
+
+- `{{name}}` variable substitution
+- `{{#items}}...{{/items}}` iteration over lists
+- `{{#flag}}...{{/flag}}` conditional sections
+- `{{^empty}}fallback{{/empty}}` inverted sections
+- Compile once, render many times (fast)
+- Works with both symbol and string alist keys
+
+No external dependencies. No regex. Just clean recursive-descent parsing.
+
+---
+
+## 7. Memoization (`lib/std/misc/memo.sls`)
+
+Memoization with TTL expiry, LRU eviction, and cache introspection.
+
+**Why it rocks:** Memoization is the easiest performance win in functional programming, but most implementations are toy-level. This one is production-grade:
+
+- `(memo fn)` — simple unbounded memoization
+- `(memo/lru 1000 fn)` — evicts least-recently-used when cache exceeds size
+- `(memo/ttl 60 fn)` — entries expire after N seconds (perfect for API caching)
+- `(memo/lru+ttl 1000 60 fn)` — combined: bounded AND time-limited
+- `(memo-stats fn)` — hit rate, miss count (is your cache actually helping?)
+- `(defmemo (fib n) ...)` — syntax sugar for the common case
+
+---
+
+## 8. Retry with Backoff (`lib/std/misc/retry.sls`)
+
+Exponential backoff, jitter, predicates, and circuit breaker pattern.
+
+**Why it rocks:** Networks fail. APIs return 503. Databases go down. Without retry logic, your program crashes at 3am. This gives you:
+
+- `(retry thunk 5 1.0)` — simple retry with fixed delay
+- `(retry/backoff thunk policy)` — exponential backoff with jitter (prevents thundering herd)
+- `(retry/predicate thunk pred)` — only retry on specific exceptions
+- **Circuit breaker** — after N failures, stop trying for a cooldown period. Prevents cascading failures in distributed systems.
+
+The circuit breaker alone would be a separate library in most ecosystems.
+
+---
+
+## 9. Time Utilities (`lib/std/time.sls`)
+
+High-level time operations that Chez doesn't provide out of the box.
+
+**Why it rocks:** Chez has `current-time` but nothing user-friendly. Now you get:
+
+- `(current-timestamp)` — ISO 8601 string, ready for logs and APIs
+- `(elapsed thunk)` — measure how long something takes in one call
+- `(time-it "label" thunk)` — print wall + CPU time (like Gerbil's `time`)
+- `(duration->string 3661)` — "1h 1m" (human-readable, auto-scales from μs to days)
+- **Stopwatch** with lap timing — perfect for benchmarking multi-phase operations
+- **Throttle/debounce** — rate-limit function calls (UI patterns, API clients)
+- `(with-timeout 5.0 thunk)` — kill long-running operations
+
+---
+
+## 10. Result Monad (`lib/std/misc/result.sls`)
+
+Railway-oriented programming without exceptions.
+
+**Why it rocks:** Exceptions are great for unexpected errors but terrible for expected ones (validation, parsing, user input). Result types let you:
+
+- Chain operations that might fail: `(result-> (ok input) (result-map parse) (result-bind validate))`
+- Never forget to handle errors (the type forces you)
+- Collect errors from multiple operations: `(results-collect list-of-results)`
+- Convert between exceptions and results: `(try->result thunk)`
+- Pattern match cleanly: `(result-fold r on-ok on-err)`
+
+This is the pattern that makes Rust, Haskell, and Elixir code so robust.
+
+---
+
+## 11. Glob Pattern Matching (`lib/std/text/glob.sls`)
+
+File glob patterns: `*`, `**`, `?`, `[a-z]`, `[!abc]`.
+
+**Why it rocks:** Every time you need to filter files, you reinvent glob matching. Now it's a library:
+
+- `(glob-match? "*.ss" "hello.ss")` — pure pattern matching (no filesystem)
+- `(glob-filter "*.ss" file-list)` — filter a list
+- `(glob-expand "src/**/*.ss")` — actual filesystem expansion with recursive `**`
+- `(glob->regex-string pattern)` — convert to regex for interop
+
+Handles all the edge cases: `**` crosses directories, `*` doesn't, character classes with ranges and negation.
+
+---
+
+## 12. Data Validation (`lib/std/misc/validate.sls`)
+
+Composable validators with structured error messages.
+
+**Why it rocks:** Input validation is tedious and error-prone. Combinators make it declarative:
+
+```scheme
+(define check-user
+  (v-record
+    (list (cons 'name (v-and (v-required "name") (v-min-length "name" 1)))
+          (cons 'email (v-and (v-required "email") (v-pattern "email" "@")))
+          (cons 'age (v-and (v-integer "age") (v-range "age" 0 150))))))
+
+(check-user '((name . "Alice") (email . "a@b.com") (age . 30)))
+; => (values #t '())
+```
+
+Validators compose with `v-and`/`v-or`, work on records/alists, validate collections with `v-each`, and return all errors at once (not just the first one).
+
+---
+
+## 13. Double-Ended Queue (`lib/std/misc/deque.sls`)
+
+O(1) amortized push/pop on both ends using the classic two-list technique.
+
+**Why it rocks:** Lists are great but you can only efficiently access one end. Deques give you both ends, which is essential for:
+
+- BFS algorithms
+- Sliding window problems
+- Work-stealing schedulers
+- Undo/redo stacks
+
+Plus: `deque-map`, `deque-filter`, `list->deque`, bounded mode.
+
+---
+
+## 14. Path Utilities (`lib/std/os/path-util.sls`)
+
+Higher-level filesystem operations that Chez doesn't provide.
+
+**Why it rocks:** Chez has `directory-list` and `file-exists?` but no recursive operations. Now:
+
+- `(path-walk dir proc)` — Python's `os.walk` for Scheme
+- `(path-find dir predicate)` — find files matching any condition
+- `(path-glob dir "*.ss")` — find by glob pattern
+- `(with-temp-directory proc)` — scoped temp dirs with automatic cleanup
+- `(ensure-directory "a/b/c")` — `mkdir -p` equivalent
+- `(copy-file src dst)` — binary-safe file copy
+
+---
+
+## 15. Text Diff (`lib/std/text/diff.sls`)
+
+LCS-based line diff with unified output and edit distance.
+
+**Why it rocks:** Testing, debugging, and version comparison all need diff:
+
+- `(diff-lines old new)` — structured diff as `(keep/add/remove line)` entries
+- `(diff-unified "a" "b" old new)` — standard unified diff format
+- `(edit-distance "kitten" "sitting")` — Levenshtein distance for fuzzy matching
+- `(diff-apply old hunks)` — apply a diff to reconstruct the new version
+- `(diff-summary hunks)` — count additions, deletions, unchanged
+
+---
+
+## 16. Ring Buffer (`lib/std/misc/ringbuf.sls`)
+
+Fixed-size circular buffer with O(1) operations.
+
+**Why it rocks:** Ring buffers are the backbone of:
+
+- Log rotation (keep last N log entries)
+- Audio/signal processing (sliding windows)
+- Network packet buffers
+- Rate calculation (keep last N timestamps)
+
+When full, new elements silently overwrite the oldest. No allocation, no GC pressure, constant memory.
+
+---
+
+## 17. C-Style Printf (`lib/std/text/printf.sls`)
+
+`%d`, `%s`, `%f`, `%x`, `%o`, `%b`, `%e` with width, precision, padding, and alignment.
+
+**Why it rocks:** Chez's `format` is powerful but uses `~a`/`~s` syntax that nobody outside Scheme knows. When porting C/Python/Go code, you want familiar format strings:
+
+```scheme
+(sprintf "%08x" 255)           ; => "000000ff"
+(sprintf "%-20s|" "hello")     ; => "hello               |"
+(sprintf "%.2f" 3.14159)       ; => "3.14"
+(sprintf "%+d" 42)             ; => "+42"
+```
+
+Also: `cprintf` for stdout, `fprintf*` for ports, `format-one` for single values.
+
+---
+
+## 18. Binary Heap (`lib/std/misc/heap.sls`)
+
+Min-heap and max-heap priority queue with O(log n) operations.
+
+**Why it rocks:** Priority queues are essential for:
+
+- Dijkstra's algorithm
+- Task scheduling (run highest-priority job next)
+- Event-driven simulation
+- Top-K problems
+- Merge K sorted lists
+
+```scheme
+(define h (list->heap < '(5 3 1 4 2)))
+(heap->sorted-list h)  ; => (1 2 3 4 5)
+```
+
+Auto-growing backing array, works with any comparator.
+
+---
+
+## 19. LRU Cache (`lib/std/misc/lru-cache.sls`)
+
+O(1) get/put/evict using hash table + doubly-linked list.
+
+**Why it rocks:** The classic interview question, implemented properly:
+
+- `(lru-cache-get cache key)` — O(1) lookup
+- `(lru-cache-put! cache key value)` — O(1) insert with automatic eviction
+- Hit/miss stats with hit rate calculation
+- Key/value iteration in MRU-to-LRU order
+- Thread-safe for read-heavy workloads
+
+More efficient than `memo/lru` when you need a standalone cache without function wrapping.
+
+---
+
+## 20. Event Emitter (`lib/std/misc/event-emitter.sls`)
+
+Node.js-style pub/sub for decoupled architecture.
+
+**Why it rocks:** When module A needs to notify module B without importing it, events are the answer:
+
+- `(on ee 'data handler)` — persistent listener
+- `(once ee 'ready handler)` — fire once then auto-remove
+- `(emit ee 'data 42)` — fire all handlers
+- `(off ee 'data)` — unsubscribe
+
+Error isolation: one handler crashing doesn't prevent others from running. Essential for plugin architectures and reactive programming.
+
+---
+
+## 21. Trie / Prefix Tree (`lib/std/misc/trie.sls`)
+
+Efficient string prefix operations for autocomplete and search.
+
+**Why it rocks:** The REPL completion engine uses linear search. A trie makes prefix lookup O(k) where k is the prefix length, regardless of dictionary size:
+
+- `(trie-prefix-search t "str")` — all words starting with "str"
+- `(trie-autocomplete t "he" 10)` — top 10 completions
+- `(trie-search t "hello")` — exact membership test
+- `(trie-starts-with? t "hel")` — any word with this prefix?
+
+Perfect for command-line autocompletion, spell checking, and IP routing tables.
+
+---
+
+## 22. Token Bucket Rate Limiter (`lib/std/misc/rate-limiter.sls`)
+
+Industry-standard rate limiting algorithm.
+
+**Why it rocks:** When calling external APIs, you need to respect rate limits or get banned:
+
+- Tokens refill at a constant rate
+- Burst capacity for short spikes
+- `try-acquire` for non-blocking check
+- `acquire!` for blocking wait
+- `with-rate-limit` for clean wrapping
+
+Used by AWS, Google Cloud, and every major API gateway. Now available in Scheme.
+
+---
+
+## 23. Resource Pool (`lib/std/misc/pool.sls`)
+
+Thread-safe generic resource pool with acquire/release semantics.
+
+**Why it rocks:** Database connections, HTTP clients, file handles — any expensive resource benefits from pooling:
+
+- Creates resources on demand up to max-size
+- Reuses idle resources instead of creating new ones
+- Blocks when pool is exhausted (backpressure)
+- `pool-with-resource` guarantees release via `dynamic-wind`
+- `pool-drain!` for graceful shutdown
+
+---
+
+## 24. Finite State Machine (`lib/std/misc/state-machine.sls`)
+
+Declarative FSM with transitions, guards, actions, and history.
+
+**Why it rocks:** State machines are the right abstraction for protocols, UI flows, and workflow engines:
+
+```scheme
+(define door (make-state-machine 'locked
+  `((locked   (unlock) unlocked ,log-unlock)
+    (unlocked (open)   opened   ,log-open)
+    (opened   (close)  unlocked ,log-close)
+    (unlocked (lock)   locked   ,log-lock))))
+```
+
+- Declarative transition table (data, not code)
+- Actions fire on transitions
+- Guards can prevent transitions conditionally
+- Full transition history for debugging
+- `sm-can-send?` for UI enable/disable logic
+- On-transition callbacks for cross-cutting concerns
+
+---
+
+## Test Coverage
+
+Every module has comprehensive tests:
+
+| Batch | Tests | Modules |
+|-------|-------|---------|
+| REPL  | 91    | repl, server, middleware, notebook |
+| Batch 3 | 94  | shell, template, memo, retry, time |
+| Batch 4 | 128 | result, glob, validate, deque, path-util |
+| Batch 5 | 105 | diff, ringbuf, printf, heap, lru-cache |
+| Batch 6 | 70  | event-emitter, trie, rate-limiter, pool, state-machine |
+| **Total** | **488+** | **25 new modules** |
diff --git a/docs/whatsnew.md b/docs/whatsnew.md
new file mode 100644
index 0000000..c129a0d
--- /dev/null
+++ b/docs/whatsnew.md
@@ -0,0 +1,603 @@
+# What's New in Jerboa: 30 Features for Gerbil-to-Jerboa Translation
+
+This release adds 10 translator enhancements and 20 standard library modules to make porting Gerbil projects to Jerboa dramatically easier. Every feature was identified from real-world analysis of 43 gerbil-* repositories and Chez Scheme 10.4.0 capabilities.
+
+All 30 features are tested (202 passing tests in `tests/test-better.ss`).
+
+---
+
+## Translator Enhancements
+
+### 1. Method Dispatch: `{method obj args}` → `(~ obj method args)`
+
+Gerbil's curly-brace method dispatch syntax is now automatically translated. This was the single biggest blocker for OOP-heavy ports like gerbil-litehtml (100+ uses) and gerbil-origin (200+).
+
+```scheme
+;; Gerbil source
+{draw canvas x y}
+{get-value widget}
+
+;; After translation
+(~ canvas draw x y)
+(~ widget get-value)
+```
+
+Handles nested braces, multi-argument calls, and ignores single-element braces (which aren't method dispatch). The translator tracks brace depth to avoid false matches inside strings.
+
+### 2. Defrules Macro Translation
+
+Gerbil's `defrules` and `defrule` have an extra empty `()` literals list that jerboa's version doesn't need. The translator now strips it automatically.
+
+```scheme
+;; Gerbil
+(defrules my-macro ()
+  ((_ x) (+ x 1))
+  ((_ x y) (+ x y)))
+
+;; After translation
+(defrules my-macro
+  ((_ x) (+ x 1))
+  ((_ x y) (+ x y)))
+```
+
+Affects 15+ projects with macro libraries.
+
+### 3. Enhanced Defstruct: Parent & Mutable Fields
+
+`translate-defstruct` now emits proper `(parent ...)` clauses and `(mutable field)` annotations, enabling struct inheritance chains to translate correctly.
+
+```scheme
+;; Gerbil
+(defstruct (colored-point point) (color))
+
+;; After translation
+(define-record-type colored-point
+  (parent point)
+  (fields (mutable color)))
+```
+
+50+ structs across Gerbil projects use inheritance or mutable fields.
+
+### 4. Hash Literal Pass-Through
+
+Verified that Gerbil's `(hash (key val) ...)` and `(hash-eq ...)` forms pass through unchanged, since jerboa's core already provides matching constructors. No surprises when porting hash-heavy code.
+
+### 5. Exception Handling: `with-catch` → `with-exception-catcher`
+
+Gerbil's `(with-catch handler thunk)` is now translated to jerboa's `(with-exception-catcher handler thunk)`. The `try`/`catch`/`finally` forms pass through unchanged.
+
+```scheme
+;; Gerbil
+(with-catch
+  (lambda (e) (display "error"))
+  (lambda () (dangerous-operation)))
+
+;; After translation
+(with-exception-catcher
+  (lambda (e) (display "error"))
+  (lambda () (dangerous-operation)))
+```
+
+### 6. Export Form Translation
+
+Handles Gerbil's export extensions that go beyond R6RS:
+
+```scheme
+;; struct-out expands to constructor, predicate, and type name
+(export (struct-out point) helper-fn)
+;; → (export make-point point? point helper-fn)
+
+;; rename-out becomes R6RS rename
+(export (rename-out (internal-name external-name)))
+;; → (export (rename (internal-name external-name)))
+```
+
+### 7–9. Pass-Through Verification (for-loops, match, spawn)
+
+Verified that jerboa's existing APIs for `(std iter)` for-loops, `match` patterns, and `spawn`/`spawn/name` concurrency forms are already compatible with Gerbil's syntax. No translation needed — they just work. This covers 228 `(std iter)` imports, 500+ match expressions, and 460 spawn call sites across Gerbil projects.
+
+### 10. Package-to-Library: Full File Structure Translation
+
+Transforms a complete Gerbil file structure into an R6RS library form:
+
+```scheme
+;; Gerbil file
+(package: :foo/bar)
+(export func1 func2)
+(import :std/sugar)
+(namespace: bar)
+(define (func1 x) x)
+(define (func2 y) y)
+
+;; After translation
+(library (foo bar)
+  (export func1 func2)
+  (import (std sugar))
+  (define (func1 x) x)
+  (define (func2 y) y))
+```
+
+Strips `namespace:` directives, converts `package:` paths to library names, and assembles the R6RS library wrapper. Every Gerbil file needs this for a full port.
+
+---
+
+## New Standard Library Modules
+
+### 11. `(std misc pqueue)` — Priority Queue
+
+Binary heap priority queue with custom comparators. Useful for scheduling, graph algorithms, and event-driven systems.
+
+```scheme
+(import (std misc pqueue))
+
+(define pq (make-pqueue))          ;; min-heap by default
+(pqueue-push! pq 5)
+(pqueue-push! pq 1)
+(pqueue-push! pq 3)
+(pqueue-peek pq)                   ;; → 1
+(pqueue-pop! pq)                   ;; → 1
+(pqueue-pop! pq)                   ;; → 3
+(pqueue->list pq)                  ;; → (5)
+
+;; Max-heap
+(define max-pq (make-pqueue >))
+(pqueue-push! max-pq 1)
+(pqueue-push! max-pq 5)
+(pqueue-pop! max-pq)               ;; → 5
+```
+
+### 12. `(std misc barrier)` — Thread Barrier
+
+Cyclic barrier for coordinating parallel threads. All parties must call `barrier-wait!` before any can proceed. Automatically resets for reuse.
+
+```scheme
+(import (std misc barrier))
+
+(define b (make-barrier 3))  ;; 3 threads must arrive
+
+;; In each of 3 threads:
+(barrier-wait! b)  ;; blocks until all 3 arrive
+;; ... all threads continue together ...
+;; barrier automatically resets — cyclic
+```
+
+### 13. `(std misc timeout)` — Timeout Operations
+
+Leverages Chez Scheme's unique **engine system** for preemptive time-slicing. Gambit has nothing comparable. Engines provide tick-based fuel at compiler-inserted safe points, giving timeout control without spawning extra threads.
+
+```scheme
+(import (std misc timeout))
+
+;; Run with a 1-second time limit
+(with-timeout 1.0 'timed-out
+  (lambda () (compute-something-expensive)))
+;; → result if fast enough, or 'timed-out
+
+;; Procedural variant returning two values
+(let-values ([(result timed-out?) (call-with-timeout 2.0
+               (lambda () (fetch-data)))])
+  (if timed-out?
+      (log "operation timed out")
+      (process result)))
+```
+
+### 14. `(std misc func)` — Functional Combinators
+
+Core functional utilities that every Gerbil project uses but were scattered across codebases:
+
+```scheme
+(import (std misc func))
+
+;; Function composition
+((compose add1 add1) 0)            ;; → 2
+((compose1 string->number string-upcase) "42")
+
+;; Partial application
+((curry + 10) 5)                   ;; → 15
+((flip cons) 'a 'b)               ;; → (b . a)
+
+;; Predicate combinators
+((conjoin positive? even?) 4)      ;; → #t (both true)
+((disjoin zero? negative?) -1)     ;; → #t (either true)
+((negate odd?) 4)                  ;; → #t
+
+;; Memoization
+(define fib (memo-proc (lambda (n) ...)))
+
+;; Apply multiple functions to same input
+((juxt add1 sub1) 5)              ;; → (6 4)
+((constantly 42) 'anything)        ;; → 42
+(identity 42)                      ;; → 42
+```
+
+### 15. `(std misc repr)` — Object Representation (Pre-existing)
+
+Already existed in jerboa. Custom print representations for user-defined types.
+
+### 16. `(std event)` — First-Class Synchronizable Events
+
+Gerbil-compatible event system for concurrent programming. Events are first-class values that can be combined and synchronized.
+
+```scheme
+(import (std event))
+
+;; Synchronize on the first ready event
+(sync (timeout-evt 1.0)
+      (channel-recv-evt ch))
+
+;; Combine events — first ready wins
+(define evt (choice (always-evt 'default)
+                    (timeout-evt 5.0)))
+(sync evt)                         ;; → 'default (immediately)
+
+;; Transform event results
+(define doubled (wrap (always-evt 5) (lambda (x) (* x 2))))
+(sync doubled)                     ;; → 10
+
+;; Select with index
+(let-values ([(idx result) (select evt1 evt2 evt3)])
+  (printf "event ~a fired with ~a~n" idx result))
+```
+
+### 17. `(std stxutil)` — Syntax Utilities for Macro Writers
+
+Helpers for working with syntax objects — essential for any project defining macros:
+
+```scheme
+(import (std stxutil))
+
+;; Syntax object accessors
+(stx-car #'(a b c))               ;; → #'a
+(stx-cdr #'(a b c))               ;; → #'(b c)
+(stx-null? #'())                   ;; → #t
+(stx-pair? #'(a b))               ;; → #t
+(stx-length #'(a b c))            ;; → 3
+
+;; Conversion
+(stx->datum #'hello)              ;; → 'hello
+(stx-e #'42)                      ;; → 42
+(stx-identifier? #'foo)           ;; → #t
+
+;; Iteration
+(stx-map stx-e #'(1 2 3))        ;; → '(1 2 3)
+
+;; Generate unique identifiers
+(genident)                         ;; → fresh identifier
+
+;; Sequential with-syntax (each binding sees previous)
+(with-syntax* ([a #'1] [b #'2])
+  (list (syntax->datum #'a) (syntax->datum #'b)))
+;; → '(1 2)
+```
+
+### 18. `(std contract)` — Design by Contract
+
+Pre/post-condition checking for defensive programming at API boundaries:
+
+```scheme
+(import (std contract))
+
+;; Quick argument validation
+(check-argument string? name 'my-func)
+;; Raises contract-violation? if name isn't a string
+
+;; Define with pre/post conditions
+(define/contract (safe-divide a b)
+  (pre: (number? a) (number? b) (not (zero? b)))
+  (post: number?)
+  (/ a b))
+
+(safe-divide 10 2)                ;; → 5
+(safe-divide 10 0)                ;; → ERROR: precondition failed
+
+;; Function contracts (wraps an existing function)
+(define safe-add ((-> number? number? number?) +))
+(safe-add 1 2)                    ;; → 3
+(safe-add "a" 2)                  ;; → ERROR: argument failed predicate
+```
+
+### 19. `(std misc rwlock)` — Read-Write Lock (Pre-existing)
+
+Already existed in jerboa. Multiple-reader/single-writer lock with `with-read-lock`/`with-write-lock` macros.
+
+### 20. `(std misc symbol)` — Symbol Utilities
+
+Symbol manipulation matching Gerbil patterns, essential for code generation and macros:
+
+```scheme
+(import (std misc symbol))
+
+(symbol-append 'make- 'point)      ;; → make-point
+(symbol-append 'a 'b 'c)          ;; → abc
+(make-symbol 'foo '-bar)           ;; → foo-bar
+
+;; Keyword interconversion
+(symbol->keyword 'name)            ;; → name:
+(keyword->symbol 'name:)           ;; → name
+
+;; Gensym detection
+(interned-symbol? 'hello)          ;; → #t
+(interned-symbol? (gensym))        ;; → #f
+```
+
+---
+
+## Chez Scheme Power Features
+
+These exploit capabilities unique to Chez Scheme that Gambit simply doesn't have.
+
+### 21. `(std engine)` — Preemptive Evaluation Engines
+
+Chez's engine system provides cooperative preemption at compiler-inserted safe points. No other Scheme has this. Perfect for sandboxed evaluation, resource limiting, and REPL timeouts.
+
+```scheme
+(import (std engine))
+
+;; Create and run an engine with fuel
+(define eng (make-eval-engine (lambda () (fib 40))))
+(engine-run eng 1000000)           ;; returns #t if completed
+(engine-result eng)                ;; → the result
+
+;; Evaluate with a time budget
+(let-values ([(result done?) (timed-eval 2.0 (lambda () (fib 35)))])
+  (if done? (printf "result: ~a~n" result)
+      (printf "ran out of time~n")))
+
+;; Evaluate with exact fuel (ticks)
+(let-values ([(result done?) (fuel-eval 500000 (lambda () (* 6 7)))])
+  result)                          ;; → 42
+```
+
+### 22. `(std fasl)` — Fast-Load Binary Serialization
+
+Chez's FASL format is much faster than JSON/S-expression serialization for large data structures. Handles cycles and shared structure correctly.
+
+```scheme
+(import (std fasl))
+
+;; In-memory round-trip
+(define data '(hello (world 42) #(1 2 3)))
+(define bv (fasl->bytevector data))
+(bytevector->fasl bv)              ;; → (hello (world 42) #(1 2 3))
+
+;; File persistence
+(fasl-file-write "/tmp/cache.fasl" my-big-data)
+(define restored (fasl-file-read "/tmp/cache.fasl"))
+```
+
+### 23. `(std inspect)` — Runtime Inspection
+
+Exposes Chez's inspector API for debugging, giving you deep visibility into any runtime value:
+
+```scheme
+(import (std inspect))
+
+;; Type identification
+(object-type-name 42)              ;; → fixnum
+(object-type-name "hello")         ;; → string
+(object-type-name car)             ;; → procedure
+
+;; Deep inspection
+(inspect-object '(1 2 3))
+;; → ((type . pair) (length . 3) (proper? . #t) (car . 1) (cdr . (2 3)))
+
+;; Record inspection
+(define-record-type point (fields x y))
+(inspect-record (make-point 3 4))
+;; → ((type . point) (fields . ((x . 3) (y . 4))))
+
+;; Procedure arity
+(procedure-arity car)              ;; → (1)
+(procedure-arity +)                ;; → variadic
+
+;; GC statistics
+(live-object-counts)               ;; → ((pair . 12345) (vector . 678) ...)
+```
+
+### 24. `(std ephemeron)` — Ephemeron Tables
+
+Chez's ephemerons are GC-aware weak references stronger than weak pairs. An ephemeron's value is only traced if its key is reachable through non-ephemeron paths. Perfect for caches that don't leak memory.
+
+```scheme
+(import (std ephemeron))
+
+;; Hash table where entries vanish when key is GC'd
+(define cache (make-ephemeron-eq-hashtable))
+(let ([key (cons 'a 'b)])
+  (hashtable-set! cache key (expensive-computation))
+  (hashtable-ref cache key #f))    ;; → the result
+;; After key becomes unreachable, entry is automatically GC'd
+
+;; Low-level ephemeron pairs
+(define ep (ephemeron-pair 'key 'val))
+(ephemeron-key ep)                 ;; → key
+(ephemeron-value ep)               ;; → val
+```
+
+### 25. `(std ftype)` — Foreign Type Definitions
+
+Chez's ftype system is far more expressive than Gambit's `c-define-type`, supporting bit fields, unions, endianness control, and nested structs:
+
+```scheme
+(import (std ftype))
+
+;; Define a C-compatible struct
+(define-ftype point (struct [x int] [y int]))
+
+;; Allocate and use
+(define size (ftype-sizeof point))
+(define p (make-ftype-pointer point (foreign-alloc size)))
+(ftype-set! point (x) p 10)
+(ftype-set! point (y) p 20)
+(ftype-ref point (x) p)           ;; → 10
+(ftype-ref point (y) p)           ;; → 20
+(foreign-free (ftype-pointer-address p))
+```
+
+### 26. `(std compress lz4)` — LZ4 Compression
+
+Bytevector compression API (currently a length-prefixed placeholder; swap in real liblz4 FFI for production use):
+
+```scheme
+(import (std compress lz4))
+
+(define data (string->utf8 "hello world"))
+(define compressed (lz4-compress data))
+(lz4-decompress compressed)       ;; → original bytevector
+```
+
+### 27. `(std profile)` — Profiling Utilities
+
+Programmatic access to Chez's timing and allocation statistics (Chez has `(time expr)` but no programmatic API):
+
+```scheme
+(import (std profile))
+
+;; Full profile
+(let-values ([(result stats) (with-profile (lambda () (fib 30)))])
+  (printf "result: ~a~n" result)
+  (printf "wall: ~ams, cpu: ~ams, bytes: ~a~n"
+          (cdr (assq 'wall-ms stats))
+          (cdr (assq 'cpu-ms stats))
+          (cdr (assq 'bytes-allocated stats))))
+
+;; Quick timing with label
+(time-it "fibonacci" (lambda () (fib 30)))
+;; prints: fibonacci: 45ms (44ms cpu, 1024 bytes allocated)
+
+;; Just measure wall time
+(let-values ([(result ms) (with-timing (lambda () (sort < big-list)))])
+  (printf "sorted in ~ams~n" ms))
+
+;; Count allocation
+(allocation-count (lambda () (make-vector 1000000)))
+```
+
+---
+
+## Quality of Life
+
+### 28. `(std misc hash-more)` — Extended Hash Table Operations
+
+Hash operations that appear constantly in Gerbil code but were missing from jerboa:
+
+```scheme
+(import (std misc hash-more))
+
+(define ht (make-hashtable equal-hash equal?))
+(hashtable-set! ht 'a 1)
+(hashtable-set! ht 'b 2)
+(hashtable-set! ht 'c 3)
+
+;; Filter entries
+(hash-filter (lambda (k v) (> v 1)) ht)
+;; → hashtable with {b: 2, c: 3}
+
+;; Map over values
+(hash-map/values add1 ht)
+;; → hashtable with {a: 2, b: 3, c: 4}
+
+;; Safe lookup with default
+(hash-ref/default ht 'missing 0)   ;; → 0
+
+;; Convert to alist
+(hash->alist ht)                   ;; → ((a . 1) (b . 2) (c . 3))
+
+;; Merge with conflict resolution
+(hash-union h1 h2)                 ;; h2 values win on conflict
+(hash-union h1 h2 (lambda (k v1 v2) (+ v1 v2)))  ;; sum conflicts
+
+;; Intersection
+(hash-intersect h1 h2)            ;; only keys in both
+
+;; Queries
+(hash-count (lambda (k v) (even? v)) ht)  ;; → 1
+(hash-any (lambda (k v) (= v 3)) ht)      ;; → #t
+(hash-every (lambda (k v) (> v 0)) ht)    ;; → #t
+```
+
+### 29. `(std misc string-more)` — Extended String Operations
+
+String utilities from Gerbil's `:std/misc/string` that every project uses:
+
+```scheme
+(import (std misc string-more))
+
+;; Prefix/suffix/contains
+(string-prefix? "hel" "hello")     ;; → #t
+(string-suffix? "llo" "hello")     ;; → #t
+(string-contains? "ell" "hello")   ;; → #t
+
+;; Trimming and joining
+(string-trim-both "  hello  ")     ;; → "hello"
+(string-join '("a" "b" "c") ", ")  ;; → "a, b, c"
+
+;; Repetition and padding
+(string-repeat "ab" 3)             ;; → "ababab"
+(string-pad-left "42" 5 #\0)      ;; → "00042"
+(string-pad-right "hi" 5)         ;; → "hi   "
+
+;; Search
+(string-index "hello" #\l)        ;; → 2
+(string-index-right "hello" #\l)  ;; → 3
+(string-count "hello" #\l)        ;; → 2
+
+;; Functional take/drop
+(string-take-while "aaabbb" (lambda (c) (char=? c #\a)))  ;; → "aaa"
+(string-drop-while "aaabbb" (lambda (c) (char=? c #\a)))  ;; → "bbb"
+```
+
+### 30. `(std misc list-more)` — Extended List Operations
+
+List operations from Gerbil for data transformation pipelines:
+
+```scheme