Clean feature backlog and implement tooling fixes

ober

c8411750761bc9a1ece8b82178c34f2aae21968c

diff --git a/data/api-signatures.sexp b/data/api-signatures.sexp
index 9dba2d6..fbedc49 100644
--- a/data/api-signatures.sexp
+++ b/data/api-signatures.sexp
@@ -1,4 +1,4 @@
-(("errors") ("generated" . "2026-07-15")
+(("errors") ("generated" . "2026-07-16")
   ("modules"
    ("(jerboa build musl)"
      ("exports" "build-musl-binary" "make-musl-cross-target"
@@ -3709,11 +3709,13 @@
      ("file" . "lib/std/misc/retry.ss")
      ("tier" . "stable"))
    ("(std misc ringbuf)"
-     ("exports" "make-ringbuf" "ringbuf->list" "ringbuf-capacity"
-       "ringbuf-clear!" "ringbuf-empty?" "ringbuf-for-each"
-       "ringbuf-full?" "ringbuf-peek" "ringbuf-peek-newest"
-       "ringbuf-pop!" "ringbuf-push!" "ringbuf-ref" "ringbuf-size"
-       "ringbuf?")
+     ("exports" "make-ring" "make-ringbuf" "ring-append!"
+      "ring-capacity" "ring-newest-offset" "ring-oldest-offset"
+      "ring-size" "ring-slice-from" "ring?" "ringbuf->list"
+      "ringbuf-capacity" "ringbuf-clear!" "ringbuf-empty?"
+      "ringbuf-for-each" "ringbuf-full?" "ringbuf-peek"
+      "ringbuf-peek-newest" "ringbuf-pop!" "ringbuf-push!"
+      "ringbuf-ref" "ringbuf-size" "ringbuf?")
      ("file" . "lib/std/misc/ringbuf.ss")
      ("tier" . "stable"))
    ("(std misc rwlock)"
@@ -7075,13 +7077,13 @@
      ("file" . "lib/std/zipper.ss")
      ("tier" . "stable")))
   ("source_root" . "/Users/user/mine/jerboa")
-  ("stats" ("modules" . 718) ("parse_errors" . 0) ("symbols" . 10476)
+  ("stats" ("modules" . 718) ("parse_errors" . 0) ("symbols" . 10485)
     ("tiers"
       ("compat" . 47)
       ("core" . 38)
       ("stable" . 555)
       ("unstable" . 78))
-    ("total_exports" . 13703))
+    ("total_exports" . 13712))
   ("symbol_index" ("%chan-enqueue-raw!" "(std csp)")
    ("&actor-dead" "(std error conditions)")
    ("&actor-timeout" "(std error conditions)")
@@ -13282,6 +13284,7 @@
    ("make-resource-leak" "(std error conditions)")
    ("make-restricted-environment" "(std security restrict)")
    ("make-retry-policy" "(std misc retry)")
+   ("make-ring" "(std misc ringbuf)")
    ("make-ringbuf" "(std misc ringbuf)")
    ("make-rng" "(std proptest)")
    ("make-root-capability" "(std capability)")
@@ -15873,9 +15876,16 @@
    ("rights" "(std clojure zip)")
    ("ring->response" "(std net ring)")
    ("ring-app" "(std net ring)")
+   ("ring-append!" "(std misc ringbuf)")
+   ("ring-capacity" "(std misc ringbuf)")
+   ("ring-newest-offset" "(std misc ringbuf)")
    ("ring-not-found" "(std net ring)")
+   ("ring-oldest-offset" "(std misc ringbuf)")
    ("ring-redirect" "(std net ring)")
    ("ring-response" "(std net ring)")
+   ("ring-size" "(std misc ringbuf)")
+   ("ring-slice-from" "(std misc ringbuf)")
+   ("ring?" "(std misc ringbuf)")
    ("ringbuf->list" "(std misc ringbuf)")
    ("ringbuf-capacity" "(std misc ringbuf)")
    ("ringbuf-clear!" "(std misc ringbuf)")
diff --git a/data/changelog.sexp b/data/changelog.sexp
index 1ae5d90..f046418 100644
--- a/data/changelog.sexp
+++ b/data/changelog.sexp
@@ -2,7 +2,22 @@
    .
    "Machine-readable changelog of Jerboa API drift. Consumers (LLM tooling, lints, jerboa_verify) use this to invalidate stale recommendations and to suggest migrations when a symbol is renamed or relocated.")
   ("entries"
-    (("added" "typed-library-form->kotlin-string"
+    (("added" "make-ring" "ring?" "ring-capacity" "ring-size"
+       "ring-append!" "ring-oldest-offset" "ring-newest-offset"
+       "ring-slice-from")
+      ("date" . "2026-07-16")
+      ("modules_added")
+      ("moved")
+      ("notes"
+        .
+        "The Jerboa reader now preserves #f literals in list and vector positions. (std misc ringbuf) gained a bounded byte replay ring with absolute cursors, and its legacy module plus the printf/heap/LRU batch modules now import the Jerboa definition forms they use. jerbuild exec accepts '-' for multi-form stdin scripts. MCP verification tools accept validated environment overrides, function signatures include decoded arity and usage semantics, balanced_insert performs form-aware insertion, and security scanning recognizes nearby dynamic-wind foreign-free and SQLite finalization cleanup.")
+      ("removed")
+      ("renamed")
+      ("tier_changes")
+      ("tools_added" "jerboa_balanced_insert"
+       "jerboa_feature_manifest_audit")
+      ("version" . "v0.2.4"))
+     (("added" "typed-library-form->kotlin-string"
        "typed-module->kotlin-string" "typed-module->kotlin-file"
        "typed-type->kotlin-type" "kotlin-file->string"
        "kotlin-expr->string")
diff --git a/data/cookbooks.sexp b/data/cookbooks.sexp
index 3cf7002..56f974e 100644
--- a/data/cookbooks.sexp
+++ b/data/cookbooks.sexp
@@ -4904,11 +4904,11 @@
      "Persist Records by Decomposing to Bounded Safe Data"))
  (("code"
     .
-    "jerbuild exec --libdirs ./lib:vendor/jsqlite/src:vendor/jerboa-websearch/src:$(jerbuild --jerboa-home)/lib /dev/stdin <<'EOF'\n(import (jerboa prelude) (jcode ui tui-theme))\n(displayln (get-registered-themes))\n(displayln (set-theme-by-name! \"opencode-dark\"))\n(displayln (current-theme-name))\nEOF") ("id" . "jerbuild-exec-local-module-smoke-test")
+    "jerbuild exec --libdirs ./lib:vendor/jsqlite/src:$(jerbuild --jerboa-home)/lib - arg1 arg2 <<'EOF'\n(import (jerboa prelude))\n(import (my-project module))\n(displayln (command-line-arguments))\n(displayln (smoke-check))\nEOF") ("id" . "jerbuild-exec-local-module-smoke-test")
    ("imports")
    ("notes"
      .
-     "Use this after `jerboa_make build` or `make build` has transpiled/compiled the repo into `lib/`. Plain `jerboa /dev/stdin` may not know project libdirs, and the colon reader form can fail in stdin scripts; use canonical module imports like `(jcode ui tui-theme)`.")
+     "Use '-' to read multiple top-level forms from stdin while preserving arguments after '-'. Build or transpile local modules first, and use canonical module imports.")
    ("tags" "jerbuild" "exec" "libdirs" "local-module"
      "smoke-test" "stdin")
    ("title"
@@ -6741,4 +6741,16 @@
      .
      "Keep count bounded and values parameterized. Each id = ? branch can use the jsqlite rowid point seek; IN may scan. Map returned rows by ID when caller order matters.")
    ("tags" "jsqlite" "union-all" "primary-key" "batch")
-   ("title" . "Batch bounded jsqlite primary-key seeks")))
+   ("title" . "Batch bounded jsqlite primary-key seeks"))
+ (("code"
+    .
+    "(import (jerboa prelude))\n(import (std misc ringbuf))\n\n(def ring (make-ring 5))\n(ring-append! ring (u8-list->bytevector '(1 2 3 4 5 6 7)))\n(displayln (ring-oldest-offset ring)) ; 2\n(displayln (ring-newest-offset ring)) ; 7\n(displayln (bytevector->u8-list (ring-slice-from ring 0))) ; (3 4 5 6 7)\n(displayln (bytevector->u8-list (ring-slice-from ring 5))) ; (6 7)") ("id" . "bounded-byte-replay-ring")
+   ("imports" "(std misc ringbuf)")
+   ("notes"
+     .
+     "ring-slice-from clamps an evicted cursor forward to ring-oldest-offset and clamps a future cursor back to ring-newest-offset. Offsets count every appended byte, including evicted bytes.")
+   ("tags" "ring-buffer" "bytevector" "replay" "scrollback"
+     "std-misc-ringbuf" "cursor")
+   ("title"
+     .
+     "Bounded byte replay ring with absolute offsets")))
diff --git a/data/error-fixes.sexp b/data/error-fixes.sexp
index 74f3fd0..e0f0b8f 100644
--- a/data/error-fixes.sexp
+++ b/data/error-fixes.sexp
@@ -2701,4 +2701,16 @@
      "Run jerboa_check_balance on the hand-authored source. A preceding form is usually missing a closing delimiter, so the reported top-level def became nested. Fix the first imbalance, rebuild generated output, and do not patch generated files.")
    ("id" . "invalid-context-definition-from-unclosed-form")
    ("pattern" . "invalid context for definition.*line [0-9]+")
-   ("type" . "syntax")))
+   ("type" . "syntax"))
+ (("code_example"
+    .
+    "(let ([env (interaction-environment)] [port (open-input-string bounded-source)])\\n  (let loop ()\\n    (let ([form (read port)])\\n      (unless (eof-object? form)\\n        (eval form env)\\n        (loop)))))")
+   ("explanation"
+     .
+     "Chez load has one argument but that argument must be a pathname string; its arity alone does not imply port support.")
+   ("fix"
+     .
+     "Do not pass a port to Chez load. For bounded trusted script input, read forms from the port and eval them in one interaction-environment; for untrusted input, use jerboa-read with explicit limits or a schema decoder.")
+   ("id" . "chez-load-requires-pathname")
+   ("pattern" . "Exception in load: .*port.* is not a string")
+   ("type" . "runtime")))
diff --git a/data/features.sexp b/data/features.sexp
index a93249b..a192eb4 100644
--- a/data/features.sexp
+++ b/data/features.sexp
@@ -89,6 +89,7 @@
    ("note"
      .
      "Requires calling an LLM API from within an MCP tool — not practical without Anthropic API integration.")
+   ("status" . "proposed")
    ("tags" "ai" "codegen" "verification" "prompt")
    ("title"
      .
@@ -110,6 +111,7 @@
    ("note"
      .
      "Requires LLM API + knowledge of Rust crate APIs — too domain-specific without crate introspection tooling.")
+   ("status" . "proposed")
    ("tags" "ai" "ml" "ffi" "rust" "scaffold")
    ("title"
      .
@@ -726,7 +728,7 @@
    ("votes" . 0))
  (("closed_reason"
     .
-    "(std os limits) exports limit policies, parsers, capability/planning, and setrlimit installation. (std os supervise) exports launch specs, process-result records/alists, timeout/output-cap handling, child pre-exec status reporting, process-group kill support, and capability reporting. tests/test-limits-primitives.ss covers the reusable supervisor and limits behavior.")
+    "Implemented portable process limits and supervision.")
    ("description"
      .
      "Add a Jerboa stdlib API that launches child process groups, applies resource limits, kills whole process trees, and returns structured status/audit data. Backends should use cgroup v2 on Linux and setrlimit/process-group fallbacks elsewhere.")
@@ -741,6 +743,7 @@
    ("implemented_in"
      .
      "lib/std/os/limits.ss, lib/std/os/supervise.ss")
+   ("implemented_tool" . "(std os limits), (std os supervise)")
    ("note"
      .
      "Implemented with portable rlimit/process-group supervision and structured status reporting; cgroup v2 precision remains an optional/future backend improvement.")
@@ -755,7 +758,7 @@
    ("votes" . 0))
  (("closed_reason"
     .
-    "Added (std os tracefs) with normalized trace event records and degraded-mode support.")
+    "Implemented normalized filesystem tracing.")
    ("description"
      .
      "Add a common tracefs API that records file and directory access events for a supervised command and its subprocesses. The API should normalize event shape across Linux ptrace/strace, macOS dtrace/EndpointSecurity, BSD ktrace/truss, and degraded fallback modes.")
@@ -767,6 +770,7 @@
      "A jsh wrapper runs an AI tool with ,tracefs summary and receives read/write/exec events for node, npm, git, and child processes.")
    ("id" . "portable-tracefs-api") ("impact" . "high")
    ("implemented_in" . "lib/std/os/tracefs.ss")
+   ("implemented_tool" . "(std os tracefs)")
    ("status" . "implemented")
    ("tags" "tracefs" "audit" "sandbox" "filesystem" "process")
    ("title" . "Portable filesystem access tracing API")
@@ -776,7 +780,7 @@
    ("votes" . 0))
  (("closed_reason"
     .
-    "(std os exec-id) exports executable PATH resolution, realpath/device/inode/hash identity, and same-file checks. (std security env) exports allowlist environment policies, deny patterns, overrides, named secret injection, command secret scanning/validation, redaction helpers, and audit summaries. tests/test-limits-primitives.ss covers both modules.")
+    "Implemented executable identity and secret-safe environment helpers.")
    ("description"
      .
      "Add stdlib helpers to resolve executables through an explicit PATH, return realpath/device/inode/hash identity, construct child environments from allowlists, inject named secrets, and redact secrets from logs/audit output.")
@@ -788,7 +792,12 @@
      "A jsh policy flags node as hostile by resolved inode/hash, strips all TOKEN-like env vars, injects only OPENAI_API_KEY, and redacts that value from audit output.")
    ("id" . "exec-identity-and-secret-env-api")
    ("impact" . "high")
-   ("implemented_in" . "lib/std/os/exec-id.ss")
+   ("implemented_in"
+     .
+     "lib/std/os/exec-id.ss, lib/std/security/env.ss")
+   ("implemented_tool"
+     .
+     "(std os exec-id), (std security env)")
    ("note"
      .
      "Implemented across (std os exec-id) and (std security env).")
@@ -803,7 +812,7 @@
    ("votes" . 0))
  (("closed_reason"
     .
-    "Added (std net allow-proxy) and (std net allowlist) for CONNECT proxy allowlist policy and audit events.")
+    "Implemented allowlist proxy policy and auditing.")
    ("description"
      .
      "Add a Jerboa library for a local HTTP CONNECT/SOCKS proxy that enforces host:port allowlists, denies IP literals and local/private networks, resolves DNS in the trusted parent, and emits structured connection audit events.")
@@ -814,7 +823,12 @@
      .
      "A codex wrapper denies direct network in the child, injects HTTPS_PROXY pointing to the Jerboa allowlist proxy, and permits only api.openai.com:443 while blocking localhost and RFC1918 targets.")
    ("id" . "network-allowlist-proxy-api") ("impact" . "high")
-   ("implemented_in" . "lib/std/net/allow-proxy.ss")
+   ("implemented_in"
+     .
+     "lib/std/net/allow-proxy.ss, lib/std/net/allowlist.ss")
+   ("implemented_tool"
+     .
+     "(std net allow-proxy), (std net allowlist)")
    ("status" . "implemented")
    ("tags" "network" "proxy" "allowlist" "sandbox" "audit")
    ("title"
@@ -987,6 +1001,7 @@
      .
      "Audit /Users/user/mine/chez* and /Users/user/mine/jerboa* while excluding target, vendor, .venv, model artifacts, generated parser output, and bare git backup repos, then generate a fix plan for another agent.")
    ("id" . "cross-repo-security-review") ("impact" . "high")
+   ("status" . "proposed")
    ("tags" "security" "multi-repo" "audit" "report")
    ("title"
      .
@@ -1022,9 +1037,12 @@
      .
      "Reviewing modified Jerboa source files before deciding whether changes are healthy.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "Add a tool that scans a Jerboa workspace containing many jerboa*/chez* repos and reports branch, origin, last commit, dirty tracked files, untracked artifacts, stale generated lib files, available make targets, and known health findings in one compact table.")
+    "Implemented as jerboa_workspace_repo_status in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "Add a tool that scans a Jerboa workspace containing many jerboa*/chez* repos and reports branch, origin, last commit, dirty tracked files, untracked artifacts, stale generated lib files, available make targets, and known health findings in one compact table.")
    ("estimated_token_reduction"
      .
      "~3000 tokens per workspace review")
@@ -1044,9 +1062,12 @@
      .
      "Strategic reviews of the Jerboa stack across sibling repositories.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "Improve jerboa_security_scan so it distinguishes Chez/Jerboa idioms from generic vulnerability patterns: call-with-output-file with an explicit 'replace policy, bytevector u8* FFI calls versus foreign-alloc pointers, intentional REPL/eval handlers behind auth gates, and Scheme do-loop bounds that are already nonnegative by construction.")
+    "Implemented as jerboa_security_scan in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "Improve jerboa_security_scan so it distinguishes Chez/Jerboa idioms from generic vulnerability patterns: call-with-output-file with an explicit 'replace policy, bytevector u8* FFI calls versus foreign-alloc pointers, intentional REPL/eval handlers behind auth gates, and Scheme do-loop bounds that are already nonnegative by construction.")
    ("estimated_token_reduction"
      .
      "~1500 tokens per scanned file with noisy findings")
@@ -1146,9 +1167,12 @@
      .
      "Writing cookbook recipes for a not-yet-installed Gerbil version. Currently requires trying the call, getting an error, then manually noting 'needs v0.19'. A version guard would produce a clear message instead.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "When exploring unfamiliar modules (especially checking if an installed module is the Jerboa version vs. the gerbil-origin version), there's no way to know which file jerboa_module_exports is reading. This session required a bash glob to find that std/iter was at /opt/gerbil/v0.18.1-173-gb3417266/lib/std/iter.ssi before understanding why the API didn't match expectations.")
+    "Implemented as jerboa_module_exports in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "When exploring unfamiliar modules (especially checking if an installed module is the Jerboa version vs. the gerbil-origin version), there's no way to know which file jerboa_module_exports is reading. This session required a bash glob to find that std/iter was at /opt/gerbil/v0.18.1-173-gb3417266/lib/std/iter.ssi before understanding why the API didn't match expectations.")
    ("estimated_token_reduction"
      .
      "~500 tokens: eliminates the bash glob + read .ssi file detour needed to identify which module version is active")
@@ -1169,9 +1193,12 @@
      .
      "Understanding which installed copy of a module is being used when multiple gerbil versions or Jerboa overrides are present. Critical for v0.18 vs v0.19 disambiguation.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "When jmcp writer tools fail, the response can be the literal template 'Tool error: failed for ~a: ~(~a~)' instead of the tool name and exception text. This hides the actionable cause, such as invoking jmcp outside the repo without JERBOA_MCP_REPO set.")
+    "Implemented as tools/call error wrapper in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "When jmcp writer tools fail, the response can be the literal template 'Tool error: failed for ~a: ~(~a~)' instead of the tool name and exception text. This hides the actionable cause, such as invoking jmcp outside the repo without JERBOA_MCP_REPO set.")
    ("estimated_token_reduction"
      .
      "~500-1500 tokens per failing MCP call; avoids source spelunking to infer the exception.")
@@ -1193,14 +1220,18 @@
      .
      "Debugging failed MCP tool calls, especially cookbook/feature/security writer calls from direct JSON-RPC or the Claude MCP shim.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "jerboa_verify and jerboa_compile_check can throw an internal string-ref index exception while scanning a valid .ss script, leaving no actionable Scheme diagnostic. The tools should catch scanner exceptions, report the phase and file/offset, and continue to syntax/expand checks when possible.") ("estimated_token_reduction" . "500")
+    "Closed as a duplicate of the bounded internal diagnostic implementation.")
+   ("description"
+     .
+     "jerboa_verify and jerboa_compile_check can throw an internal string-ref index exception while scanning a valid .ss script, leaving no actionable Scheme diagnostic. The tools should catch scanner exceptions, report the phase and file/offset, and continue to syntax/expand checks when possible.")
+   ("estimated_token_reduction" . "500")
    ("example_scenario" . "")
    ("id" . "verify-file-internal-error-reporting")
-   ("impact"
-     .
-     "Avoids falling back to bash/local scheme when the verifier scanner fails internally.")
+   ("impact" . "medium") ("implemented_in" . "mcp/server.ss")
+   ("implemented_tool" . "jerboa_verify, jerboa_compile_check")
+   ("status" . "implemented")
    ("tags" "verify" "compile-check" "diagnostics" "tooling")
    ("title"
      .
@@ -1209,9 +1240,12 @@
      .
      "Validating tools/check-system-manifest.ss hit `Exception in string-ref: 12290 is not a valid index` even though the script runs and security_scan passes.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "jerboa_verify reported no issues for a .sls file that later failed during jerbuild binary WPO compilation with `invalid syntax (hash-get row key #f)`. A verification mode that runs the same expansion/WPO path as binary builds, or at least flags syntax accepted by lightweight checks but rejected by WPO, would catch these before a full binary build.")
+    "Implemented as jerboa_verify in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "jerboa_verify reported no issues for a .sls file that later failed during jerbuild binary WPO compilation with `invalid syntax (hash-get row key #f)`. A verification mode that runs the same expansion/WPO path as binary builds, or at least flags syntax accepted by lightweight checks but rejected by WPO, would catch these before a full binary build.")
    ("estimated_token_reduction"
      .
      "~1000-2000 tokens per WPO-only compile failure")
@@ -1299,9 +1333,12 @@
      .
      "Discovering cookbook recipes by natural keyword queries, and ensuring recipes just saved via jerboa_howto_add are actually findable by search rather than only by exact id.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "compile_check, check_syntax, run_tests, and eval require passing extra_libdirs (plus project_path and jerboa_home) on essentially every call. For a project with a stable layout, the tools could auto-detect libdirs from a project marker -- e.g. a Makefile's LIBDIRS= line, a .jerboa config file, or a sibling jerboa checkout -- given just project_path (or by walking up from file_path). Callers would stop repeating the identical extra_libdirs array dozens of times per session.")
+    "Implemented as jerboa_compile_check, jerboa_check_syntax, jerboa_eval, jerboa_run_tests in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "compile_check, check_syntax, run_tests, and eval require passing extra_libdirs (plus project_path and jerboa_home) on essentially every call. For a project with a stable layout, the tools could auto-detect libdirs from a project marker -- e.g. a Makefile's LIBDIRS= line, a .jerboa config file, or a sibling jerboa checkout -- given just project_path (or by walking up from file_path). Callers would stop repeating the identical extra_libdirs array dozens of times per session.")
    ("estimated_token_reduction"
      .
      "~60-80 tokens per compile/run call; ~1000+ tokens per iterative session")
@@ -1324,9 +1361,12 @@
      .
      "Iteratively compile-checking and running many files in one project across a long session.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "jerboa_verify and jerboa_compile_check can fail inside the MCP tool with an exception like `Exception in string-ref: <n> is not a valid index for \"<entire file>\"` while checking larger project files. The failure prevents normal syntax/compile diagnostics and forces fallback to `jerboa_make`. The tool should report a structured internal-tool error with filename and offending offset at minimum, and ideally complete the verification normally.")
+    "Closed as a duplicate of the bounded diagnostic formatter implementation.")
+   ("description"
+     .
+     "jerboa_verify and jerboa_compile_check can fail inside the MCP tool with an exception like `Exception in string-ref: <n> is not a valid index for \"<entire file>\"` while checking larger project files. The failure prevents normal syntax/compile diagnostics and forces fallback to `jerboa_make`. The tool should report a structured internal-tool error with filename and offending offset at minimum, and ideally complete the verification normally.")
    ("estimated_token_reduction"
      .
      "~1000-3000 tokens per affected verification because the fallback dumps large file contents and requires extra build/debug steps.")
@@ -1334,7 +1374,9 @@
      .
      "After editing src/jcode/mcp/client.ss, src/jcode/core/agent.ss, and src/jcode/ui/serve.ss, both jerboa_verify and jerboa_compile_check crashed with string-ref invalid-index exceptions instead of returning syntax or compile diagnostics.")
    ("id" . "fix-verify-compile-check-string-index-crash")
-   ("impact" . "medium")
+   ("impact" . "medium") ("implemented_in" . "mcp/server.ss")
+   ("implemented_tool" . "jerboa_verify, jerboa_compile_check")
+   ("status" . "implemented")
    ("tags" "verify" "compile-check" "string-ref" "tooling")
    ("title" . "Fix verifier string-ref crash on larger files")
    ("use_case"
@@ -1352,10 +1394,7 @@
      .
      "Run jerboa_verify with file_path=/Users/user/mine/jerboa-code/src/jcode/ui/tui-sidebar.ss and project_path=/Users/user/mine/jerboa-code. Expected: verify the module. Actual: export form outside of a module or library.")
    ("id" . "verify-ss-export-module-context")
-   ("impact"
-     .
-     "Reduces false verification failures and avoids fallback build-only checks for ordinary Jerboa project source files.")
-   ("implemented_in" . "mcp/server.ss")
+   ("impact" . "medium") ("implemented_in" . "mcp/server.ss")
    ("implemented_tool" . "jerboa_verify")
    ("status" . "implemented")
    ("tags" "verify" "export" "source-file" "project-context"
@@ -1367,9 +1406,12 @@
      .
      "After editing a Jerboa project source file, agents need a direct verifier result before building. If verify rejects top-level export forms, agents fall back to make build and lose the faster, more focused syntax/expand feedback.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "Calling jerboa_compile_check with file_path on a large .ss file fails with 'Exception in string-ref: <N> is not a valid index for \"<entire file contents>\"' instead of returning compile diagnostics. The exception message also embeds the FULL file source, so a single failed check dumps ~90KB of text back into the agent context. Two asks: (1) fix the off-by-one/length bug so large files validate normally; (2) never inline the entire source into an error string — truncate to the relevant span or omit it. Likely an internal cursor/offset (line-start index, span end) computed past (string-length src) on files above some size.")
+    "Completed by bounded source excerpts and guarded diagnostic index handling.")
+   ("description"
+     .
+     "Calling jerboa_compile_check with file_path on a large .ss file fails with 'Exception in string-ref: <N> is not a valid index for \"<entire file contents>\"' instead of returning compile diagnostics. The exception message also embeds the FULL file source, so a single failed check dumps ~90KB of text back into the agent context. Two asks: (1) fix the off-by-one/length bug so large files validate normally; (2) never inline the entire source into an error string — truncate to the relevant span or omit it. Likely an internal cursor/offset (line-start index, span end) computed past (string-length src) on files above some size.")
    ("estimated_token_reduction"
      .
      "~20k+ tokens per failed check (suppressing the full-file echo) plus avoiding a multi-minute make fallback to validate large files")
@@ -1377,13 +1419,12 @@
      .
      "jerboa_compile_check(file_path: '.../provider/provider.ss') on a ~94KB file returned 'Exception in string-ref: 94269 is not a valid index for \"<the full 94KB source>\"'. I had to fall back to `make binary` (minutes) to validate a one-line edit, and the error echoed the entire file into context.")
    ("id" . "compile-check-large-file-robustness")
-   ("impact" . "medium")
-   ("implemented_in" . "lib/jerboa/translator.sls")
+   ("impact" . "medium") ("implemented_in" . "mcp/server.ss")
    ("implemented_tool" . "jerboa_compile_check")
    ("note"
      .
      "The reproduced string-ref scanner failures are fixed in the translator string scanners; separate diagnostic truncation hardening can still be improved.")
-   ("status" . "partial")
+   ("status" . "implemented")
    ("tags" "compile-check" "large-file" "robustness"
      "error-message" "token-bloat")
    ("title"
@@ -1417,9 +1458,12 @@
      .
      "After editing a stdlib/module that has a vendored copy or a compiled cache, before building — to avoid silent stale-artifact build failures.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "A reusable bounded circular byte buffer with an absolute-offset cursor: make-ring (cap), ring-append! (evicting oldest when full), ring-oldest-offset / ring-newest-offset (absolute byte counts), and ring-slice-from (fresh bytevector of [from-offset, total), clamped forward if evicted). Useful for output scrollback/replay, log tailing, and rate-limited capture. Each consumer currently reimplements it.")
+    "Implemented in the existing generic ring-buffer module to avoid a competing implementation; the byte replay API uses absolute cursors and clamps evicted reads.")
+   ("description"
+     .
+     "A reusable bounded circular byte buffer with an absolute-offset cursor: make-ring (cap), ring-append! (evicting oldest when full), ring-oldest-offset / ring-newest-offset (absolute byte counts), and ring-slice-from (fresh bytevector of [from-offset, total), clamped forward if evicted). Useful for output scrollback/replay, log tailing, and rate-limited capture. Each consumer currently reimplements it.")
    ("estimated_token_reduction"
      .
      "~60 lines + unit tests reimplemented per consumer; one stdlib module + a howto recipe replaces it")
@@ -1427,6 +1471,11 @@
      .
      "jsh's mux added a per-pane 256KiB replay ring (append!/oldest-offset/newest-offset/slice-from) so a reconnecting client can resume output from a byte offset. That circular-buffer logic is generic and belongs in the stdlib rather than buried in a jsh module (and was separately unit-tested to get the wrap/eviction offset math right).")
    ("id" . "std-io-ring-buffer") ("impact" . "medium")
+   ("implemented_in"
+     .
+     "lib/std/misc/ringbuf.ss, tests/test-batch5.ss")
+   ("implemented_tool" . "(std misc ringbuf)")
+   ("status" . "implemented")
    ("tags" "ring-buffer" "io" "bytevector" "scrollback"
      "stdlib")
    ("title"
@@ -1446,7 +1495,7 @@
      .
      "Importing (std text base64) with (chezscheme) fails with 'multiple definitions for base64-encode in body'; the fix is (except (chezscheme) base64-encode base64-decode) but you only learn the names one compile at a time.")
    ("id" . "predict-builtin-shadow-except")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "import" "except" "chezscheme" "shadow" "conflict")
    ("title"
      .
@@ -1465,6 +1514,7 @@
      .
      "After each of 8 phases, `make test` exited non-zero solely due to the pre-existing nrepl + supervise failures; confirming that meant stashing changes and rerunning the suite on master several times.")
    ("id" . "test-target-baseline-diff") ("impact" . "medium")
+   ("status" . "proposed")
    ("tags" "testing" "baseline" "regression" "flaky" "make")
    ("title"
      .
@@ -1483,7 +1533,7 @@
      .
      "An app using jsqlite works under `jerbuild exec` but the standalone binary fails with `Exception in foreign-procedure: no entry for \"open\"`. The maintainer has to write support/main.c, support/gen-ffi-symbols.sh, and run jerbuild twice.")
    ("id" . "jerbuild-binary-auto-ffi-symbol-registration")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "jerbuild" "ffi" "binary" "foreign-procedure"
      "native")
    ("title"
@@ -1605,16 +1655,19 @@
      .
      "A manually inspected screenshot showed the sidebar section dividers and bottom edge were uneven. Build/tests passed, but only visual review exposed the missing bottom border and inconsistent separator rows.")
    ("id" . "tui-screenshot-layout-regression-harness")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "tui" "screenshot" "layout" "regression" "termbox")
    ("title" . "TUI screenshot and layout regression harness")
    ("use_case"
      .
      "Agents working on terminal UI need a repeatable way to catch visual defects like uneven borders, stale cells, and status/sidebar overlap that normal Scheme tests miss.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "jerboa_verify and jerboa_compile_check can fail internally with `Exception in string-ref: <n> is not a valid index` on large source files, dumping nearly the entire file instead of reporting syntax or compile diagnostics. The tool should guard index math in its pre-scan and return a concise internal-tool-error with file size, failing index, and a fallback recommendation.")
+    "Closed as a duplicate of verify-large-files-without-string-index-crash.")
+   ("description"
+     .
+     "jerboa_verify and jerboa_compile_check can fail internally with `Exception in string-ref: <n> is not a valid index` on large source files, dumping nearly the entire file instead of reporting syntax or compile diagnostics. The tool should guard index math in its pre-scan and return a concise internal-tool-error with file size, failing index, and a fallback recommendation.")
    ("estimated_token_reduction"
      .
      "~10k-50k tokens per failed invocation on large files")
@@ -1622,7 +1675,9 @@
      .
      "Running jerboa_verify on src/jcode/provider/provider.ss after a small provider fallback patch raised `Exception in string-ref: 97675 is not a valid index` and printed most of the file, forcing fallback to make build.")
    ("id" . "verify-large-file-string-ref-boundary")
-   ("impact" . "medium")
+   ("impact" . "medium") ("implemented_in" . "mcp/server.ss")
+   ("implemented_tool" . "jerboa_verify, jerboa_compile_check")
+   ("status" . "implemented")
    ("tags" "verify" "compile_check" "large-file" "diagnostics")
    ("title"
      .
@@ -1733,9 +1788,12 @@
      .
      "Verifying any .ss edit before building, as mandated by jerboa-* project CLAUDE.md files.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "The compact Jerboa dispatcher has tools like howto_add, list_features, vote_feature, and suggest_feature, but searching natural phrases such as \"howto add recipe cookbook\" and \"list features suggest feature vote feature\" returned no matches. A catalog search should index operation aliases, CRUD verbs, and related nouns so users can discover the right compact-dispatcher target without falling back to paging the catalog.")
+    "Implemented as jerboa dispatcher search in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "The compact Jerboa dispatcher has tools like howto_add, list_features, vote_feature, and suggest_feature, but searching natural phrases such as \"howto add recipe cookbook\" and \"list features suggest feature vote feature\" returned no matches. A catalog search should index operation aliases, CRUD verbs, and related nouns so users can discover the right compact-dispatcher target without falling back to paging the catalog.")
    ("estimated_token_reduction"
      .
      "~300-700 tokens per save-discoveries invocation by avoiding failed searches and extra catalog exploration.")
@@ -1835,7 +1893,7 @@
      .
      "While editing src/jcode/core/agent.ss and test/run.ss, jerboa_verify and jerboa_compile_check returned empty Unexpected output messages. I had to fall back to check_balance plus make build/test to confirm validity.")
    ("id" . "verify-project-file-diagnostics")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "verify" "compile-check" "diagnostics" "file-path")
    ("title"
      .
@@ -1854,7 +1912,7 @@
      .
      "Edited provider.ss (5 hunks), ran jerboa_compile_check with project_path set -> 'Unexpected output:' (empty). Had to fall back to `make test` (full build + 633 tests, minutes) just to learn the edits compiled.")
    ("id" . "compile-check-gerbil-style-imports")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "compile-check" "gerbil-imports" "module-resolution"
      "error-reporting" "jerboa-code")
    ("title"
@@ -1864,9 +1922,12 @@
      .
      "Verifying edits to any repo using the jcode module convention before running the full test suite")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "jerboa_module_exports for (std os posix) returned 'Module (std os posix) exports no symbols.' — but lib/std/os/posix.ss defines posix-getpid/posix-getppid etc. Either the module path failed to resolve (no jerboa_home/libdirs given) or the load errored; both cases are reported identically to a genuinely empty export list. A false 'no symbols' silently sends the caller off to grep sources (or, as in this session, to avoid the API entirely and pick a different primitive). Return an explicit 'module not found in <searched libdirs>' / load-error message instead.")
+    "Implemented as jerboa_module_exports in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "jerboa_module_exports for (std os posix) returned 'Module (std os posix) exports no symbols.' — but lib/std/os/posix.ss defines posix-getpid/posix-getppid etc. Either the module path failed to resolve (no jerboa_home/libdirs given) or the load errored; both cases are reported identically to a genuinely empty export list. A false 'no symbols' silently sends the caller off to grep sources (or, as in this session, to avoid the API entirely and pick a different primitive). Return an explicit 'module not found in <searched libdirs>' / load-error message instead.")
    ("estimated_token_reduction"
      .
      "saves 1-2 fallback grep/read calls (~300-800 tokens) per false negative, and prevents wrong API choices")
@@ -1892,9 +1953,12 @@
      .
      "Checking which symbols a stdlib module exports before writing an import line")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "Several verify/check-syntax calls returned only \"Unexpected output:\" with no stderr/stdout detail, which forced fallback to make build and shell checks. The tool should include the command, exit status, captured stdout/stderr, and the file/code context that triggered the parser failure.")
+    "Implemented as jerboa_verify, jerboa_compile_check, jerboa_check_syntax, jerboa_eval in mcp/server.ss, mcp/test/protocol-test.ss.")
+   ("description"
+     .
+     "Several verify/check-syntax calls returned only \"Unexpected output:\" with no stderr/stdout detail, which forced fallback to make build and shell checks. The tool should include the command, exit status, captured stdout/stderr, and the file/code context that triggered the parser failure.")
    ("estimated_token_reduction"
      .
      "~500-1500 tokens per failed verification by avoiding fallback build/debug loops")
@@ -1928,7 +1992,7 @@
      .
      "Editing `vendor/jerboa-awk/lib/jerboa-awk/runtime.sls` left `runtime.tarm64osx` older than the source, but `stale_static` reported zero artifacts for both the root project and the vendor project.")
    ("id" . "stale-static-sls-platform-artifacts")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "stale" "sls" "artifacts" "chez" "vendor")
    ("title"
      .
@@ -1947,7 +2011,7 @@
      .
      "A multicall binary imports jpkg, which reaches (std os posix) at visit time and needs strerror registered. Project-wide static_symbol_audit also reports test-only FFI symbols and generated example strings, obscuring the actionable registration set.")
    ("id" . "entry-aware-static-symbol-audit")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "static" "ffi" "audit" "multicall"
      "Sforeign_symbol")
    ("title" . "Entry-aware static symbol audit")
@@ -1955,9 +2019,12 @@
      .
      "Debugging static Chez/Jerboa binaries that fail at startup with foreign-procedure: no entry for ...")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "`jerboa_function_signature` can report `Could not find` for symbols that `jerboa_module_exports` confirms are exported from imported project modules, such as `(jsh ffi)` or `(jsh signals)`. It should evaluate the imports and inspect the binding when static metadata is unavailable, or clearly distinguish non-procedure bindings from unresolved symbols.")
+    "Closed by project-aware catalog introspection through supplied imports and libdirs.")
+   ("description"
+     .
+     "`jerboa_function_signature` can report `Could not find` for symbols that `jerboa_module_exports` confirms are exported from imported project modules, such as `(jsh ffi)` or `(jsh signals)`. It should evaluate the imports and inspect the binding when static metadata is unavailable, or clearly distinguish non-procedure bindings from unresolved symbols.")
    ("estimated_token_reduction"
      .
      "~300-700 tokens per affected API check by avoiding fallback searches/evals.")
@@ -1965,7 +2032,9 @@
      .
      "While adding a jsh meta-command, `module_exports` showed `ffi-kill-pid` and `signal-name->number`, but `function_signature` could not find either with imports supplied.")
    ("id" . "function-signature-imported-export-resolution")
-   ("impact" . "medium")
+   ("impact" . "medium") ("implemented_in" . "mcp/server.ss")
+   ("implemented_tool" . "jerboa_function_signature")
+   ("status" . "implemented")
    ("tags" "function_signature" "module_exports" "arity"
      "imports" "project-modules")
    ("title"
@@ -1985,7 +2054,7 @@
      .
      "Editing src/jcode/core/models.ss and running jerboa_verify with project_path=/Users/user/mine/jerboa-code reports library (jcode core log) not found, while make build succeeds with ./lib and vendor libdirs.")
    ("id" . "verify-jerbuild-project-libdirs")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "verify" "jerbuild" "libdirs" "project_path")
    ("title"
      .
@@ -2004,7 +2073,7 @@
      .
      "Editing src/jcode/tool/external-llm.ss, jerboa_verify file_path+project_path failed to find (jcode core log), so the session had to rely on check_balance plus make build for compile verification.")
    ("id" . "verify-file-project-libdirs-resolution")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "verify" "project_path" "libdirs" "compile_check")
    ("title"
      .
@@ -2023,7 +2092,7 @@
      .
      "A developer launches ./jcode --repl-port 5555 and tries ./repl-reader.ss 127.0.0.1:5555 '(+ 1 2)'; the helper uses TLS/token and gets EOF, while printf '(+ 1 2)\\n' | nc 127.0.0.1 5555 succeeds.")
    ("id" . "jcode-repl-reader-plain-loopback-mode")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "jcode" "debug-repl" "repl-reader" "loopback"
      "tooling")
    ("title"
@@ -2033,9 +2102,12 @@
      .
      "Debug a running local jcode process started with --repl-port 5555 --trace ~/jcode.trace.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "Implemented as jerboa_script_scaffold_verify. It generates verified .ss command-line scripts, can write them safely, smoke-runs with supplied args, returns exact output comparison, and points to the absolute Scheme interpreter path.")
+    "Implemented as jerboa_script_scaffold_verify in mcp/server.ss.")
+   ("description"
+     .
+     "Implemented as jerboa_script_scaffold_verify. It generates verified .ss command-line scripts, can write them safely, smoke-runs with supplied args, returns exact output comparison, and points to the absolute Scheme interpreter path.")
    ("estimated_token_reduction"
      .
      "~1500-4000 tokens per small script by collapsing recipe lookup, scaffold, verify, and command selection")
@@ -2062,7 +2134,7 @@
      .
      "A verified workflow saw only 'exit 1' or a terse Jerboa condition and the model repeatedly edited the same broken file, then tried unavailable run tools. A direct error-repair MCP tool would make the repair path obvious.")
    ("id" . "jmcp-direct-error-repair-tools-for-jcode")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "jmcp" "errors" "repair" "jcode" "local-llm")
    ("title"
      .
@@ -2071,9 +2143,12 @@
      .
      "After a verify command fails, the agent can call an MCP error helper with the stderr text and get a targeted repair hint instead of trying shell commands or repeating the same edit.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "Implemented as jerboa_compact_tool_manifest. It gives a small call-order guide plus high-value tool list and optional matching tools without dumping all schemas.")
+    "Implemented as jerboa_compact_tool_manifest in mcp/server.ss.")
+   ("description"
+     .
+     "Implemented as jerboa_compact_tool_manifest. It gives a small call-order guide plus high-value tool list and optional matching tools without dumping all schemas.")
    ("estimated_token_reduction"
      .
      "~500-1500 tokens per discovery step")
@@ -2102,6 +2177,7 @@
      .
      "While fixing build scripts, changed_only=true without base_ref produced an error, and passing the full unified diff as a payload later crashed/aborted. Retrying with base_ref=HEAD worked. The scanner could make that retry unnecessary.")
    ("id" . "security-scan-auto-git-diff") ("impact" . "medium")
+   ("status" . "proposed")
    ("tags" "security-scan" "changed-only" "git" "diff"
      "workflow")
    ("title"
@@ -2121,7 +2197,7 @@
      .
      "A TUI spawned signal-cli jsonRpc and waited for its version response. The real cause was a separate launchctl-started signal-cli daemon holding the account database lock, visible only after checking ps, lsof, logs, and LaunchAgents separately.")
    ("id" . "subprocess-hang-diagnostic-bundle")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "subprocess" "diagnostics" "process" "lock"
      "launchctl")
    ("title" . "Bundle subprocess hang diagnostics")
@@ -2148,9 +2224,12 @@
      .
      "Reduce recovery loops when MCP tools return a known-good command line.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "jerboa_verify and jerboa_compile_check fail on this repo's .ss files before reaching the edited file body: importing jcode/ui/tui-sidebar raises \"export form outside of a module or library\" from jcode/ui/tui-ffi.ss. The normal project build transpiles these files successfully, so the verifier needs a mode that mirrors jerbuild's source-module handling for export/import-style project .ss files.")
+    "Closed as a duplicate of the implemented project export-source verifier.")
+   ("description"
+     .
+     "jerboa_verify and jerboa_compile_check fail on this repo's .ss files before reaching the edited file body: importing jcode/ui/tui-sidebar raises \"export form outside of a module or library\" from jcode/ui/tui-ffi.ss. The normal project build transpiles these files successfully, so the verifier needs a mode that mirrors jerbuild's source-module handling for export/import-style project .ss files.")
    ("estimated_token_reduction"
      .
      "~800-1500 tokens per validation failure by avoiding fallback diagnosis and direct make reruns.")
@@ -2158,7 +2237,9 @@
      .
      "After editing src/jcode/ui/tui-sidebar.ss, jerboa_verify failed on an imported module's top-level export form, while make test transpiled and compiled the same source successfully.")
    ("id" . "verify-source-export-project-modules")
-   ("impact" . "high")
+   ("impact" . "high") ("implemented_in" . "mcp/server.ss")
+   ("implemented_tool" . "jerboa_verify")
+   ("status" . "implemented")
    ("tags" "verify" "compile-check" "export" "project-modules"
      "jerbuild")
    ("title"
@@ -2178,7 +2259,7 @@
      .
      "With a bad parenthesis placement in src/jcode/ui/tui-sidebar.ss, jerboa_make target=test showed compile output but omitted the later unbound identifier error; direct make test failed with exit code 2.")
    ("id" . "make-target-completion-status-tail")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "make" "tests" "timeout" "output" "status")
    ("title"
      .
@@ -2187,9 +2268,12 @@
      .
      "Trust jerboa_make as the preferred build/test runner without needing a direct shell rerun to confirm that the requested target actually completed.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "jerboa_eval currently evaluates a bare #f correctly, but #f disappears or is treated incorrectly in argument/result positions. For example `(list 1 #f 2)` returned `(1 2)`, `(if #t #f #t)` returned `#t`, and `(equal? #f (not #t))` became an arity error as if the #f argument had been removed. This makes eval-based validation unreliable for ordinary Scheme examples that return or pass false values.")
+    "The reader now uses a distinct hash-comment sentinel, preserving literal #f values in every datum position.")
+   ("description"
+     .
+     "jerboa_eval currently evaluates a bare #f correctly, but #f disappears or is treated incorrectly in argument/result positions. For example `(list 1 #f 2)` returned `(1 2)`, `(if #t #f #t)` returned `#t`, and `(equal? #f (not #t))` became an arity error as if the #f argument had been removed. This makes eval-based validation unreliable for ordinary Scheme examples that return or pass false values.")
    ("estimated_token_reduction"
      .
      "~500-1200 tokens per debugging session involving predicates or sentinel false values.")
@@ -2197,6 +2281,11 @@
      .
      "While preparing a cookbook recipe for word wrapping, a helper returning #f for no wrap point appeared to return #t through jerboa_eval, forcing the example to use -1 instead.")
    ("id" . "eval-preserve-false-literals") ("impact" . "high")
+   ("implemented_in"
+     .
+     "lib/jerboa/reader.sls, mcp/server.ss, tests/test-reader.ss, mcp/test/protocol-test.ss")
+   ("implemented_tool" . "jerboa_eval, (jerboa reader)")
+   ("status" . "implemented")
    ("tags" "eval" "reader" "false" "literal" "mcp")
    ("title"
      .
@@ -2205,9 +2294,12 @@
      .
      "Validate Jerboa snippets through MCP without rewriting examples to avoid #f sentinels or false-valued consequents.")
    ("votes" . 1))
- (("description"
+ (("closed_reason"
     .
-    "FFI-heavy Jerboa projects often need environment variables such as JERBOA_QT_LIB, JERBOA_QT_SHIM_DIR, DYLD_LIBRARY_PATH, LD_LIBRARY_PATH, or QT_QPA_PLATFORM before importing a module. jerboa_verify currently runs in a fixed environment, so Qt modules can fail during import with a shared-library load error even when the project builds and tests correctly under Makefile-provided env vars.")
+    "Verifier subprocesses accept a validated env object and inherit unspecified parent variables.")
+   ("description"
+     .
+     "FFI-heavy Jerboa projects often need environment variables such as JERBOA_QT_LIB, JERBOA_QT_SHIM_DIR, DYLD_LIBRARY_PATH, LD_LIBRARY_PATH, or QT_QPA_PLATFORM before importing a module. jerboa_verify currently runs in a fixed environment, so Qt modules can fail during import with a shared-library load error even when the project builds and tests correctly under Makefile-provided env vars.")
    ("estimated_token_reduction"
      .
      "~300-800 tokens per FFI verification session by avoiding failed verify interpretation and manual shell fallback.")
@@ -2216,6 +2308,13 @@
      "In jerboa-qt, `jerboa_verify` on qt-test.ss failed because the Qt shim library path was not configured, while `make test` passed with JERBOA_QT_SHIM_DIR and DYLD_LIBRARY_PATH set.")
    ("id" . "verify-env-vars-for-ffi-projects")
    ("impact" . "medium")
+   ("implemented_in"
+     .
+     "mcp/server.ss, mcp/test/protocol-test.ss")
+   ("implemented_tool"
+     .
+     "jerboa_verify, jerboa_compile_check, jerboa_eval")
+   ("status" . "implemented")
    ("tags" "verify" "ffi" "environment" "qt" "shared-library")
    ("title"
      .
@@ -2224,9 +2323,12 @@
      .
      "Verify .ss files that import local FFI modules without falling back to shell scripts or Makefile-only checks.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "`jerboa_function_signature` should accept the same project_path/extra_libdirs/module import context as `jerboa_module_exports` and resolve signatures for local generated/transpiled modules when those symbols are exported. In this session, `module_exports` could see `(jerboa-qt qt)` exports such as `qt-send-key-press!`, but `jerboa_function_signature` reported the symbol as missing, requiring fallback to module export dumps and source grep.")
+    "project_path, extra_libdirs, and jerboa_home are now advertised and used for imported project modules.")
+   ("description"
+     .
+     "`jerboa_function_signature` should accept the same project_path/extra_libdirs/module import context as `jerboa_module_exports` and resolve signatures for local generated/transpiled modules when those symbols are exported. In this session, `module_exports` could see `(jerboa-qt qt)` exports such as `qt-send-key-press!`, but `jerboa_function_signature` reported the symbol as missing, requiring fallback to module export dumps and source grep.")
    ("estimated_token_reduction"
      .
      "~400-900 tokens per affected API check")
@@ -2235,6 +2337,11 @@
      "A verifier imports `(jerboa-qt qt)` and needs `qt-send-key-press!` arity. `jerboa_function_signature` says missing even though `jerboa_module_exports` lists it, so the agent has to inspect source manually.")
    ("id" . "function-signature-project-libdirs-resolution")
    ("impact" . "medium")
+   ("implemented_in"
+     .
+     "mcp/server.ss, mcp/test/protocol-test.ss")
+   ("implemented_tool" . "jerboa_function_signature")
+   ("status" . "implemented")
    ("tags" "signature" "project_path" "libdirs" "exports"
      "local-modules")
    ("title"
@@ -2244,9 +2351,12 @@
      .
      "Before editing Jerboa verifier code, confirm local Qt or generated-module API arities without manual grep/source inspection.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "`jerboa_module_exports` can list generated project exports such as the Jerboa Qt bindings, but `jerboa_function_signature` can fail to resolve individual exported symbols from the same module. This forces source inspection or runtime tests to confirm arities for generated binding modules.")
+    "Closed by project-aware catalog introspection through supplied imports and libdirs.")
+   ("description"
+     .
+     "`jerboa_module_exports` can list generated project exports such as the Jerboa Qt bindings, but `jerboa_function_signature` can fail to resolve individual exported symbols from the same module. This forces source inspection or runtime tests to confirm arities for generated binding modules.")
    ("estimated_token_reduction"
      .
      "~300-800 tokens per binding-heavy task by avoiding manual source inspection for exported generated bindings.")
@@ -2254,7 +2364,9 @@
      .
      "While hardening a generated FFI binding verifier, module_exports confirmed an exported drawing helper exists, but function_signature returned `Could not find` for the same binding, requiring manual source/runtime confirmation.")
    ("id" . "function-signature-generated-exports")
-   ("impact" . "medium")
+   ("impact" . "medium") ("implemented_in" . "mcp/server.ss")
+   ("implemented_tool" . "jerboa_function_signature")
+   ("status" . "implemented")
    ("tags"
      "function-signature"
      "module-exports"
@@ -2277,7 +2389,7 @@
      .
      "A recipe importing a project-local module failed verification with only \"Unexpected syntax-check output\". The fix required fetching the recipe and running jerboa_check_syntax manually to infer that the recipe needed to be self-contained.")
    ("id" . "howto-verify-show-syntax-output")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "howto" "verify" "diagnostics" "syntax-check")
    ("title"
      .
@@ -2286,7 +2398,9 @@
      .
      "Debugging and fixing cookbook recipes immediately after saving them.")
    ("votes" . 0))
- (("closed_reason" . "")
+ (("closed_reason"
+    .
+    "Closed with the shared verifier environment override implementation.")
    ("description"
      .
      "Add an env map to jerboa_verify/compile checks so callers can pass dynamic library paths such as DYLD_LIBRARY_PATH, LD_LIBRARY_PATH, and project-specific FFI variables while verifying modules that load native shims.")
@@ -2297,8 +2411,11 @@
      .
      "A contract imports `(jerboa-qt qt)` and passes under `make contract` with JERBOA_QT_SHIM_DIR and DYLD_LIBRARY_PATH set, but `jerboa_verify` stops while loading libqt_shim.dylib because it has no env override.")
    ("id" . "jerboa-verify-env-overrides") ("impact" . "medium")
-   ("implemented_in" . "") ("implemented_tool" . "")
-   ("status" . "open")
+   ("implemented_in"
+     .
+     "mcp/server.ss, mcp/test/protocol-test.ss")
+   ("implemented_tool" . "jerboa_verify")
+   ("status" . "implemented")
    ("tags" "verify" "ffi" "dyld" "qt" "environment")
    ("title" . "Allow environment overrides for jerboa_verify")
    ("use_case"
@@ -2315,6 +2432,7 @@
      .
      "A generated main.ss has `Unexpected close ) at line 57`. The model calls balance and reads the same line range many times. A balance hint saying `Use line_edit(path,line=57,content=...) or replace_range for the enclosing function` would likely save the loop.")
    ("id" . "balance-repair-action-hints") ("impact" . "medium")
+   ("status" . "proposed")
    ("tags" "balance" "local-model" "repair" "line-edit"
      "replace-range")
    ("title" . "Add actionable repair hints to balance reports")
@@ -2332,7 +2450,7 @@
      .
      "A local model repeatedly tries unknown write tools, then uses brittle old_str replacement after it fails. The exporter turns the real transcript into a rejected example and the eventual verified line_edit/replace_range flow into the chosen example.")
    ("id" . "jcode-repair-trace-sft-dpo-exporter")
-   ("impact" . "high")
+   ("impact" . "high") ("status" . "proposed")
    ("tags" "jcode" "training-data" "sft" "dpo" "repair-traces")
    ("title"
      .
@@ -2359,9 +2477,12 @@
      .
      "Large Jerboa review/fix passes that touch many sibling repositories and need reliable final verification before commits and pushes.")
    ("votes" . 0))
- (("description"
+ (("closed_reason"
     .
-    "Teach the security scanner to treat a foreign-alloc allocation as freed when the pointer is released in a dynamic-wind after thunk. The current foreign-alloc-no-free rule reported a leak on code that allocates an int pointer, uses it, and frees it in the cleanup thunk.")
+    "The scanner recognizes nearby dynamic-wind, unwind-protect, and with-resource foreign-free cleanup.")
+   ("description"
+     .
+     "Teach the security scanner to treat a foreign-alloc allocation as freed when the pointer is released in a dynamic-wind after thunk. The current foreign-alloc-no-free rule reported a leak on code that allocates an int pointer, uses it, and frees it in the cleanup thunk.")
    ("estimated_token_reduction"
      .
      "~300-600 tokens per FFI review by avoiding manual false-positive explanation")
@@ -2369,7 +2490,12 @@
      .
      "The fixed anti-debug waitpid code uses foreign-alloc for a status int and foreign-free in dynamic-wind, but the scanner still flagged foreign-alloc-no-free.")
    ("id" . "foreign-alloc-dynamic-wind-free-recognition")
-   ("impact" . "medium") ("status" . "open")
+   ("impact" . "medium")
+   ("implemented_in"
+     .
+     "mcp/server.ss, mcp/test/protocol-test.ss")
+   ("implemented_tool" . "jerboa_security_scan")
+   ("status" . "implemented")
    ("tags" "security-scan" "ffi" "foreign-alloc" "dynamic-wind"
      "false-positive")
    ("title" . "Recognize dynamic-wind foreign-free cleanup")
@@ -2387,7 +2513,7 @@
      .
      "A jerboa-shell migration needs to verify that no non-vendor .sls files remain tracked, no .ss files sit under src/lib/vault-stage libdirs, and no user-facing .ss still contains a top-level (library ...) form.")
    ("id" . "generated-sls-source-layout-audit")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "audit" "jerbuild" "generated-sls" "git"
      "source-layout")
    ("title"
@@ -2407,7 +2533,7 @@
      .
      "A support/jerbuild.ss verification returned 'cadr: incorrect list structure (defstruct)' with no source location, so the actual validation had to be done through make compile instead of the MCP verifier.")
    ("id" . "verify-script-expansion-source-locations")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags" "verify" "diagnostics" "source-location" "script"
      "expansion")
    ("title"
@@ -2427,7 +2553,7 @@
      .
      "A generated main.ss is delimiter-balanced, but verify fails at line 104 with invalid context for definition because process-items lacks a close and swallows later top-level helpers. The tool would point to process-items and suggest replacing the enclosing span.")
    ("id" . "invalid-context-definition-diagnoser")
-   ("impact" . "high")
+   ("impact" . "high") ("status" . "proposed")
    ("tags" "diagnostics" "syntax" "top-level" "replace-range")
    ("title" . "Diagnose invalid-context top-level definitions")
    ("use_case"
@@ -2444,7 +2570,7 @@
      .
      "For a Jerboa command-line utility, the tool would return exact imports, relevant call shapes, self-test shape, forbidden forms, and the recommended verify/balance/replace_range repair ladder in under 1000 tokens.")
    ("id" . "compact-jerboa-workflow-advisor-for-local-models")
-   ("impact" . "high")
+   ("impact" . "high") ("status" . "proposed")
    ("tags" "workflow" "compact" "local-model" "cookbook")
    ("title"
      .
@@ -2463,7 +2589,7 @@
      .
      "Given main.ss and line 104, return that process-items starts at 88 and appears to continue through later top-level defines, with the next expected top-level define at 136. The model can replace that range instead of repeatedly reading or using brittle old_str.")
    ("id" . "source-form-span-and-range-repair-tool")
-   ("impact" . "high")
+   ("impact" . "high") ("status" . "proposed")
    ("tags" "source" "form-span" "repair" "replace-range")
    ("title" . "Report source form spans for repair tools")
    ("use_case"
@@ -2480,6 +2606,7 @@
      .
      "note-inspection-after-failed-verify! used when in value position. Before the inspection limit it returned void, so do-read returned null instead of file contents. A guard would catch this during tests.")
    ("id" . "tool-result-void-null-guard") ("impact" . "medium")
+   ("status" . "proposed")
    ("tags" "tooling" "void" "null" "tests")
    ("title" . "Guard against void/null tool results")
    ("use_case"
@@ -2496,7 +2623,7 @@
      .
      "Running jerboa_verify on jsh mux-server after edits failed with: loading std/crypto/native-rust yielded a different compilation instance from that required by compiled jsh mux-auth. make compile succeeded after stale artifacts were cleaned by the project build.")
    ("id" . "verify-stale-instance-auto-diagnose")
-   ("impact" . "medium")
+   ("impact" . "medium") ("status" . "proposed")
    ("tags"
      "verify"
      "stale-artifacts"
@@ -2509,9 +2636,12 @@
      .
      "Verifying a Jerboa source file after editing a dependency-heavy project where old compiled artifacts remain in libdirs.")
    ("votes" . 0))