Clean feature backlog and implement tooling fixes
ober
c8411750761bc9a1ece8b82178c34f2aae21968c
--- 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)") --- 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") --- 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"))) --- 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"))) --- 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))