Skip to content

Releases: zawatton/anvil.el

anvil.el v1.3.0 — maintainer workflow expansion

Choose a tag to compare

@zawatton zawatton released this 26 Jun 05:17

Develop-line release focused on broader AI maintainer workflows: codebase graph analysis, reversible context compression, structured mail tools, CAD read/edit tools, and long-running agent-output evaluation.

Added

  • anvil-defs codebase graph (Doc 57) — expands the SQLite defs index into call-graph analysis for Elisp, Python, JavaScript, and TypeScript. Adds trace-path, change blast-radius, caller/callee ranking, dead-code hints, file-level clustering, architecture summaries, and default exclusions for .worktrees/ and target/.
  • anvil-semantic (Doc 18) — local-first semantic search combining SQLite FTS5, CJK LIKE fallback, lexical overlap, and optional vector cosine retrieval. The embedding provider defaults to ollama-local, with Gemini/OpenAI opt-in.
  • anvil-context — Headroom-inspired reversible context compression for JSON, diffs, logs, code excerpts, and prose. Adds context-compress, context-retrieve, and context-stats; raw context is retained by ccr-id through anvil-state.
  • anvil-mu4e and anvil-wl (Docs 53/56) — structured mail tools over local mu4e and Wanderlust/Maildir stores. Read/search/compose paths are structured and CJK-aware; send paths are gated. This closes #50.
  • anvil-cad — ASCII DXF/SVG read/edit/generate tools through a shared entity IR: outline, extract, annotate, batch-update, and generate.
  • Fusion modules (Docs 54/55) — panel, async, long-run store, and MCP surfaces for comparing agent outputs and preserving compact review summaries.
  • Client documentation — README now documents both Claude Code and Codex CLI MCP registration, plus AGENTS.md / CLAUDE.md guidance for shell-run, shell-tee-get, context-compress, context-retrieve, and context-stats.

Fixed

  • Use #!/usr/bin/env bash in the stdio bridge for NixOS-friendly execution.
  • Decode literal newline escapes in the mu4e compose body path.
  • Improve test isolation around orchestrator task-table state.
  • Skip org-habit assertions on older org-habit builds where the habit summary format differs.

Notes

  • Stable tag: v1.3.0
  • Branches at release: master / develop
  • Mail tooling is opt-in and keeps send operations gated by default.

anvil.el v1.1.1 — bug fix batch (issues #19 #21 + 11 fixes)

Choose a tag to compare

@zawatton zawatton released this 30 Apr 13:38

Patch release on top of v1.1.0. All 14 commits are bug fixes / docs; no new features, no breaking changes.

User-reported issues

  • #21 fix(package): keep internal modules out of Package-Requirespackage-vc-install no longer merges anvil-server / anvil-http / anvil-state into a bogus dependency set, so (use-package anvil :vc ...) now resolves cleanly. Thanks @tmills80 for the report.
  • #19 fix(server): add anvil-server-status command — the README documented (anvil-server-status) but the function was never defined; a thin defun symmetric with anvil-worker-status now exists. Thanks @marcuslannister for the report.

org tooling

  • fix(org): avoid kill prompt on tool errors
  • fix(org): resolve id lookup and edit body uri — resource and tool paths now share the id-lookup helper
  • fix(org): allow empty tags and no-state transitions
  • fix(org): accept multi-tag JSON array string at MCP boundary — multi-tag callers can pass \"[\\\"a\\\",\\\"b\\\"]\", parallel to file-batch.operations / json-object-add.pairs-json

eval / cron / py

  • fix(eval): report async runtime separately — queue-wait vs runtime split; new :run-start-time / :queue-wait-sec / :runtime-sec plist fields
  • fix(cron): clear stale result when transitioning to running
  • fix(py): coerce symbol-shaped import names to strings

sexp / file / server

  • fix(sexp): kill checkdoc visiting buffer
  • fix(sexp): capture checkdoc diagnostics — switch from checkdoc-file to checkdoc-current-buffer; no window changes
  • fix(server): handle quit during MCP dispatch — C-g during a long tool dispatch now returns a JSON-RPC error instead of crashing the dispatch loop
  • docs(file): clarify code-extract-pattern brace-balance contract

Release engineering

  • docs(release): bump version refs to v1.1.1 — `anvil.el` `Version:` header (was missed at v1.1.0) + `README.org` install pins (v1.0.0 → v1.1.1) + `README.ja.org` install pins (v0.4.1 → v1.1.1, large divergence sync)

Testing

  • 13 fix commits add ~500 lines of focused ERT
  • Full `make test-all`: 1673/1732 pass, 0 failed, 22.4s

Credits

Originally landed via PR #22 (12 commits, rebased from #20 by @yours57) and PR #23 (1 commit, fix #19), with version-pin sync added directly on develop.

Full Changelog: v1.1.0...v1.1.1

anvil.el v1.0.0 — first stable + NeLisp standalone

Choose a tag to compare

@zawatton zawatton released this 27 Apr 11:45

[1.0.0] - 2026-04-27

First stable release. Two landmark capabilities ship together:

  1. anvil.el now runs without an Emacs install — thanks to NeLisp's
    v1.0 standalone Rust runtime (anvil-runtime). bin/anvil mcp serve --no-emacs
    spawns zero Emacs processes; the Rust binary itself reads + evaluates
    the loaded anvil modules and serves MCP tools over stdio.
  2. anvil-ide split — Emacs-only IDE features (treesit-based code
    navigation, the worker dashboard, Info/Help lookup) moved out of
    anvil.el into the dedicated anvil-ide.el
    repo. The remaining anvil.el is the AI-side workbench: pure
    stdio MCP server + tool registry + library helpers, no human IDE
    surface.

This is a breaking release (anvil-ide tools are no longer in this
repo) and a major architecture milestone (anvil + NeLisp standalone
proves the AI workbench can run on a substrate other than the Emacs
binary). Hence the jump 0.4.x → 1.0.0.

Added — Doc 38 anvil-ide split (Phases A → G)

  • Doc 38 §3 — full split pipeline shipped 2026-04-26 → 04-27.
    Phase A (audit + classification of all 60+ modules) → Phase B
    (5-wave adapter migration: anvil-buffer / anvil-elisp / anvil-org-index /
    anvil-org / anvil-browser) → Phase C (rename anvil-treesit /
    anvil-worker-uianvil-ide-*, split info-lookup-symbol into
    anvil-ide-elisp.el) → Phase D (git filter-repo extract preserving
    12-commit history) → Phase E (cleanup + soft (require 'anvil-ide-* nil 'noerror)) → Phase F (treesit backend abstraction so anvil-ts /
    anvil-js / anvil-py stay AI-callable on NeLisp substrate via
    subprocess fallback) → Phase G (subprocess backend impl: Python full
    ast / JavaScript acorn / TypeScript degraded acorn). All phases
    documented in docs/design/38-anvil-ide-split.org.
  • Architecture α now active — anvil-defs, anvil-state, anvil-http
    internals delegate to NeLisp side via fboundp guard + fallback,
    letting the Rust runtime evaluate them without a host Emacs.

Added — Standalone deployment paths

  • Stage D v2.0 (bundled-Emacs tarball, ~25 MB) and v3.0
    (Rust-only tarball, ~2.3 MB) ship as part of NeLisp v1.0; both
    expose the same MCP tools so existing Claude Code .mcp.json
    entries keep working. See dist/anvil-stage-d-v3.0-* in the
    NeLisp repo for the artifact.

Removed — anvil-ide.el extraction (BREAKING)

  • anvil-treesit.el, anvil-worker-ui.el, anvil-ide.el, the
    elisp-info-lookup-symbol MCP tool, and the org-element /
    org-edit-body tree-walk surface are no longer in this repo.
    Install anvil-ide.el
    separately if you want the IDE layer. Cross-package wires use
    (require 'anvil-ide-* nil 'noerror) so anvil.el continues to
    load even when anvil-ide is absent.

Changed — CI + tests

  • CI subprocess test gating — 49 slow subprocess ERTs gated on
    ANVIL_SLOW_TESTS=1 so the default GitHub Actions matrix exits 0
    on every push. Local make test-all still runs everything.
  • Test count: 1198 (v0.4.0) → 1610+ (v1.0.0), with all of
    Phase F backend abstraction + Phase G subprocess paths under
    ERT.

Internal — design + audit

  • 3 audit-correction notes appended to Doc 38: anvil-buffer is
    namespace-disjoint, not drop-in compatible; the
    org-capture-templates reference in anvil-browser is
    docstring-only; anvil-ts / -js / -py wrap treesit-* and were
    reclassified PURE-via-backend in Phase F.

v0.4.1 — release-audit + treesit_info hotfix

Choose a tag to compare

@zawatton zawatton released this 22 Apr 13:46

Two small fixes released same-day as v0.4.0, both reached the repo
after the v0.4.0 tag was pushed.

Fixed

  • Release-audit false positive on anvil-discovery.el — four
    private accessors (--tool-intent / --tool-layer /
    --tool-stability / --tool-summary) triggered the MCP-tool
    wrapper regex and failed the release-audit gate on master,
    leaving the v0.4.0 CI build red. Renamed to -of suffixes
    (--intent-of / --layer-of / --stability-of / --summary-of)
    so the audit no longer treats them as MCP tools. No public API
    change; the actual anvil-tools-by-intent / anvil-tools- usage-report surfaces are unchanged.
  • treesit_info parser initialisation (@yours57) — the tool
    ran through the TreeSitter node walker without creating a parser
    first, so callers got a stale / empty info payload on buffers
    where treesit hadn't been warmed. Added treesit-parser-create
    • integer-param parse helper + autoload for
      anvil-treesit-language-for-file / -ensure-grammar.

v0.4.0 — AI agent workbench

Choose a tag to compare

@zawatton zawatton released this 22 Apr 13:46

AI agent workbench release. Fourteen new design documents (Doc 21-34)
worth of primitives turn anvil from a tool-per-task module collection
into a cohesive agent development platform: memory engine, intent-based
tool discovery + profile filter, structural edits for Python / TS / JS /
Elisp-CST, shell output compression, session snapshot + Claude Code
lifecycle hooks.

Test suite: 640 → 1198 passing (+558, +87%). 20 new anvil-*.el
modules. +39,343 / -408 lines across 145 files.

Added — AI agent core

  • memory module (Doc 29) — Bayesian + TTL + FTS5 auto-memory
    engine with 16 MCP tools (memory-scan / memory-audit /
    memory-access / memory-list / memory-search / memory-duplicates /
    memory-promote / memory-serve-start etc.). Indexes
    ~/.claude/projects/*/memory/*.md into SQLite, tracks contradictions
    and URL liveness, surfaces stale rows to memory-pruner. +115 ERT.
  • session module (Doc 17) — session snapshot / resume plus 5
    Claude Code lifecycle hooks (PreCompact / SessionStart / PostToolUse
    / UserPromptSubmit / SessionEnd). session-snapshot captures branch
    • task summary into anvil-state ns=session (14-day TTL), returns a
      preamble-suggested resume block; anvil-hook install wires the
      hook set into ~/.claude/settings.json. +19 ERT.
  • shell-filter module (Doc 27) — shell output compression with
    20 bundled filters (git status / git log / git diff / rg / find /
    pytest / ert-batch / emacs-batch / make / docker-logs / …) + tee +
    gain statistics. Raw output stashed under shell-tee namespace with
    TTL so callers can recover on demand. Depends on state.
  • disclosure module (Doc 28) — 3-layer read contract and citation
    URI scheme. file-outline / org-index-index / defs-index /
    journal-index / http-cache-index (Layer 1), file-read-snippet
    (Layer 2), file-read / org-read-headline / org-read-by-id /
    elisp-get-function-definition / http-cache-get (Layer 3).
    disclosure-help tool prints the contract; anvil-uri-fetch is a
    cross-layer resolver.
  • discovery module (Doc 34) — intent-based MCP tool discovery
    (Phase A) + agent / edit intent-based profiles (Phase B) +
    orchestrator auto-injection + per-tool usage counter + release-audit
    :unused-since scanner (Phase C). anvil-tools-by-intent returns
    tools matching intent CSV / layer / query regex, sorted by layer rank
    and intent overlap. All 198 registered tools tagged with :intent /
    :layer / :stability metadata. +27 ERT across discovery / manifest
    / orchestrator / dev.

Added — Token efficiency

  • manifest module (Doc 26) — per-session tools/list profile
    filter driven by ANVIL_PROFILE. Five legacy profiles (ultra /
    nav / core / lean / full) advertise curated tool subsets to
    shrink the manifest token cost; handlers of hidden tools stay
    callable via explicit tools/call. Phase 1b auto-injects
    --mcp-config into orchestrator child sessions.
  • Intent-based profiles (Doc 34 Phase B) — agent (orchestrator /
    session / memory / browser + edit tools, layer=core+workflow) and
    edit (file / org / code / json / db only, layer=core). Filter by
    metadata instead of hand-curated ID lists.

Added — Language-aware structural edits

  • sexp module (Doc 12 Phase 1+2) — reader-based edits for Elisp:
    sexp-read-file / sexp-surrounding-form / sexp-rename-symbol /
    sexp-replace-call / sexp-replace-defun / sexp-wrap-form /
    sexp-macroexpand / sexp-verify. +48 ERT.
  • sexp-cst module (Doc 31) — tree-sitter-elisp CST + runtime
    inspect-object tool for any live Lisp value. sexp-cst-read
    (comment-preserving CST), sexp-cst-edit + -write (point-offset
    replacement with re-parse validation), sexp-cst-repair (paren +
    unterminated-string balancing). +47 ERT.
  • py module (Doc 21 Phase 1) — Python structural locators and
    edits via treesit: py-list-imports / py-list-functions /
    py-list-classes / py-list-methods / py-list-decorators /
    py-find-definition / py-surrounding-form plus edit tools
    py-add-import / py-remove-import / py-rename-import /
    py-replace-function / py-wrap-expr. +55 ERT.
  • ts + js modules (Doc 21 Phase 2) — TS/TSX + JS/JSX locators:
    ts-list-imports/exports/functions/classes/methods/interfaces/ type-aliases/find-definition/surrounding-form and the js-*
    mirror. +25 ERT (ts) + ts-test fixtures.
  • defs module (Doc 11) — SQLite-backed Elisp symbol index.
    defs-search / defs-references / defs-signature /
    defs-who-requires / defs-index-rebuild / defs-index-status.
    +52 ERT.

Added — Developer workflow

  • bench module (Doc 14)bench-compare / bench-profile-expr
    / bench-last.
  • bisect module (Doc 13) — test-driven git bisect via worktree-
    isolated emacs --batch. bisect-test pins a failing ERT to the
    introducing commit. +12 ERT.
  • git-msg module (Doc 15)git-commit-message (from staged
    diff) and git-pr-body (from branch log). +17 ERT.
  • lint module (Doc 16) — repo hygiene scanner with pluggable
    registry: conflict-markers (error), orphan-ids (info),
    broken-scheduled (warning). +13 ERT.
  • data module (Doc 33) — JSON path-based edits with preview-by-
    default: data-get-path / data-set-path / data-delete-path /
    data-list-keys for ~/.claude.json, package.json, MCP configs.
    +28 ERT.

Added — Orchestrator polish

  • Provider latency routing (Doc 22)orchestrator-routing-select
    for per-provider latency-aware dispatch. +13 ERT.
  • Consensus presets (Doc 23) — named provider combinations ship
    with orchestrator-consensus-* family. +16 ERT.
  • Orchestrator submit-and-collect — one-shot dispatch + wait
    combinator for programmatic callers.
  • Preamble managementorchestrator-preamble-set/-get/-list/ -delete/-set-from-file for reusable system prompts.
  • Live streamingorchestrator-stream + orchestrator-tail
    forward provider stdout as MCP events while the task runs.
  • Cross-session statsorchestrator-stats aggregates batch
    history across daemon restarts via anvil-state.

Added — Tool discovery and counters

  • anvil-tools-by-intent — intent CSV / layer / query regex / stability
    filter, deprecated always hidden, experimental opt-in, layer-ranked
    output.
  • anvil-tools-usage-report — per-tool counter summary (days
    threshold, never-called bucket, unused-since bucket, recency
    sort).
  • anvil-dev-release-audit gains :unused-since N scanner —
    advisory-only Phase C hazard: does not flip :clean-p.

Changed

  • anvil-server-encode-handler internals — replaced eval + constructed lambda with make-symbol + fset + apply-partially + symbol-property (anvil-server-raw-handler /
    anvil-server-encode-result). anvil-server-register-tool
    normalizes wrappers back to the raw handler for schema generation
    and docstring validation. Fixes silent enable skip for sexp /
    py / bench / git-msg optional modules (PR #12, @yours57).
  • git MCP handlers — sentinels :null / :empty-array
    literal strings "null" / "[]" (visible wire-format change).
    All 8 git tools now wrapped via anvil-server-encode-handler at
    registration; 6 dedicated ERT.
  • Worker server files — path moved from
    user-emacs-directory/server/ to server-auth-dir /
    server-socket-dir; liveness check uses server-running-p for
    local sockets, PID parsing for TCP auth files.
  • anvil-server-tool-filter-function — now receives
    (TOOL-ID TOOL-PLIST SERVER-ID) so filters can branch on metadata.
    anvil-manifest uses the full signature for intent-based filtering.
  • anvil-server-tool-dispatch-hook (new abnormal hook) — runs
    after each successful handler return with (TOOL-ID SERVER-ID);
    used by anvil-discovery to maintain usage counters without
    coupling anvil-server to anvil-state.

Fixed

  • Encoded handler registration buganvil-server-encode-handler
    previously returned (lambda (&rest args) ...) which
    anvil-server--generate-schema-from-function rejected; silently
    skipped enable for sexp / py / bench / git-msg and made
    every re-register via unload-feature break. Fixed via the
    symbol-backed wrapper path above (PR #12).
  • JSON encoder on dotted pairsanvil-server--to-json-value
    crashed with listp error on alist entries like (cons "k" 1.0).
    New anvil-server--list-to-json-array emits [car, cdr] for
    improper lists so mapcar can't trip.
  • xref_find_apropos — missing (require 'apropos) made the
    tool void-function on fresh Emacs installs.
  • Worker liveness — Unix-socket workers wrongly reported alive
    via file existence alone; now goes through server-running-p.

Documentation

  • Fourteen new design docs (Doc 21-34). Six docs (18 / 19 / 20 / 24
    / 25 / 30) explicitly DEFERRED — out of scope for this release.
    Doc 32 is an audit memo (rhblind/emacs-mcp-server positioning,
    informational only).
  • CLAUDE.md selection flowchart trimmed (11 rows → 5) — discoverable
    entries moved to anvil-tools-by-intent runtime query; only
    size/shape heuristics kept.
  • Platform files (linux.md / windows.md) gained a tool 探索
    section documenting ANVIL_PROFILE=agent / edit usage.

v0.3.1 — orchestrator MCP wrapper hotfix

Choose a tag to compare

@zawatton zawatton released this 19 Apr 12:40

Hotfix surfaced by the v0.3.0 orchestrator benchmark
(develop: benchmarks/results/report-2026-04-19.org).
The bench's first programmatic orchestrator-* call hit the
cons-return bug; every fix here fell out of the investigation.

Fixed

  • orchestrator MCP wrappers returned plists instead of strings,
    tripping the anvil-server contract and breaking every
    programmatic orchestrator-* call from Claude Code / OpenCode /
    other MCP clients with "Tool handler must return string or nil, got: cons". Added anvil-orchestrator--encode-handler which
    wraps each registered tool at registration time and JSON-encodes
    the plist result. Tool bodies stay unchanged (and still return
    rich plists for direct Elisp / ERT callers).
  • Added anvil-orchestrator--batch-task-ids accessor + docstring
    note on the anvil-orchestrator--batches /
    anvil-orchestrator--consensus-groups shape asymmetry, so future
    callers stay decoupled from the storage representation.

Changed

  • Raised the codex per-provider concurrency default from 3 → 6.
    The v0.3.0 ramp benchmark reached 8 concurrent codex jobs on
    ChatGPT Plus OAuth with zero 429s; the old default was defensive
    past its evidence. Users on throttled accounts can set it back
    via anvil-orchestrator-per-provider-concurrency.

v0.3.0 — Foundation Wave (Doc 01–10) SHIPPED

Choose a tag to compare

@zawatton zawatton released this 19 Apr 09:06

Major release covering 10 design documents worth of new primitives:
orchestrator (Doc 10), browser framework (Doc 07), disk-first helpers
(Doc 05), code-transform tools (Doc 06), state KV store (Doc 08), HTTP
client (Doc 09), pty-broker (Doc 04), worker pool v2 (Doc 01), org
index (Doc 02), offload framework (Doc 03). Test suite grew from 292
to 508 passing.

Added

  • orchestrator module (Doc 10) — parallel AI CLI dispatcher.
    • 5 native providers: claude, aider, gemini, ollama, codex
      (OpenAI ChatGPT Plus OAuth).
    • Pool with per-provider concurrency caps, state-persisted queue,
      tabulated-list dashboard, git worktree isolation.
    • :depends-on DAG with cycle / unknown-name detection and
      propagating failure semantics. DAG resume across daemon restart
      via orchestrator-resume-interrupted.
    • Cross-model consensus (Jaccard verdict) and meta-LLM judge
      (synthesized answer via 3rd provider).
    • Auto-retry with exponential backoff + jitter, Retry-After
      honouring, per-provider backoff overrides.
    • Live streaming events (Phase 7c) — per-event callbacks without
      SQLite writes, overflow compression.
    • Context preamble registry (Phase 7b) — reusable prompt preludes
      via :preamble-ref, auto-resolved at submit.
    • submit-and-collect convenience for synchronous fan-out,
      submit-one / extract-result / tail glue helpers.
    • Observability: orchestrator-stats with percentile / provider
      filter, anvil-orchestrator-stats-dashboard command.
    • anvil-cron integration (Phase 2b) via anvil-cron-register :fn
      • examples/nightly-orchestrator.org.
    • gemma4 thinking-mode guard (XML <think> and plain-text
      delimiter).
  • browser module (Doc 07) — agent-browser wrapper.
    • Phase A: browser-fetch / -interact / -capture /
      -screenshot / -close MCP tools with in-memory cache +
      metrics + M-x anvil-browser-status.
    • Phase A': auth primitives (profile, user-agent,
      auto-connect, session-presets) for login-walled / anti-bot
      sites.
  • pty-broker module (Doc 04 Phase 1) — Node-pty TCP broker +
    Elisp client + 5 MCP tools, structurally avoids filter-starvation
    and ConPTY headless-stdin limitations.
  • state module (Doc 08) — SQLite-backed KV store with
    namespaces, TTL, and prin1 value serialization. anvil-browser
    cache now persists across daemon restarts.
  • http module (Doc 09 Phase 1a)http-fetch / -head /
    -cache-purge with ETag/TTL cache via anvil-state.
  • org-index (Doc 02 Phase 1-4 + 5a) — SQLite org index,
    filenotify watcher + periodic scan, 177× speed-up on 1500 files /
    71k headlines; org-read-* routed through index.
  • Disk-first helpers (Doc 05):warnings on every mutating
    file-* tool, plus buffer-read / buffer-save /
    buffer-list-modified MCP tools.
  • Code-transform tools (Doc 06)code-extract-pattern
    (read-only structured block extraction) and
    code-add-field-by-map (TS/JS object literal bulk field add for
    i18n).
  • Worker pool v2 (Doc 01) — 3-lane split with :kind
    classifier, batch warmup, latency metrics, optional
    server-eval-at transport.
  • Offload framework (Doc 03) — pipe REPL + pool, :offload t,
    hard-kill, handler-side checkpoint for :value / :cursor
    persistence.
  • anvil-dev toolsanvil-dev-release-audit (3 scanners:
    Emacs 30 _args arglist-strip hazard, missing
    MCP Parameters: docstring sections, non-SHIPPED design docs),
    anvil-dev-test-run-all :minimal, anvil-dev-self-sync-check,
    anvil-dev-journal-memo-append, anvil-scaffold-module.
  • Efficiency bundleanvil-server-register-tools bulk
    registration, anvil-orchestrator-preamble-set-from-file,
    anvil-orchestrator-dashboard-autofollow,
    anvil-dev-release-audit :scope.
  • anvil-git extensions — worktree helpers +
    git-branch-current / git-head-sha / git-repo-root /
    git-worktree-list MCP tools.

Changed

  • anvil-orchestrator-summary-max-chars default raised 300 → 4000 to
    eliminate the common re-parse round-trip; pass :full t to
    orchestrator-extract-result for the unbounded form.
  • No-arg MCP wrapper convention: write () not (_args). Emacs 30
    help-function-arglist strips _-prefix, which broke MCP schema
    registration for worker, cron, orchestrator, browser, and other
    modules — all audited and fixed.

Fixed

  • orchestrator: close stdin after spawn to prevent ollama CLI hang
    (31d2f3f).
  • orchestrator: deep-copy task plist in submit so consensus
    fan-out does not share tails — previously caused :cost-usd /
    :elapsed-ms clobber across providers (5a2610f).
  • orchestrator: gemma4 thinking-strip now handles the plain-text
    Thinking... ...done thinking. delimiter in addition to XML
    <think> blocks (86a0e7c).
  • Windows stdio CR robustness — tools/list decode reliably on
    MSYS2 + gawk 5.0.0 + coreutils 8.32 (issue #6).
  • Emacs 30 help-function-arglist underscore-strip regressions
    across worker, cron, orchestrator (issue #9, v0.2.1) + remaining
    no-arg wrappers audited via anvil-release-audit.

v0.2.0 — Windows MCP transport repair + offload subsystem

Choose a tag to compare

@zawatton zawatton released this 18 Apr 01:32

Critical fixes

  • fix(stdio): repair Windows MSYS frame-boundary corruption in emacsclient output (a1cb34f). On MSYS the C BUFSIZ is 512, but Emacs server's server-reply-print chunks output at 1024-byte frames — every frame larger than ~512 bytes overran the client's read buffer, the tail lost its -print-nonl prefix, and emacsclient injected *ERROR*: Unknown message: markers into the base64 payload. The bridge captured the corrupted blob, base64 -d choked silently, and clients saw zero tools even though tools/list returned them correctly. Affects every Windows install. Refs #3.
  • fix(file): stringify file-read MCP result (157d9fc, PR #4 by @yours57). Handler returned a plist; anvil-server--handle-tools-call requires string-or-nil, so file-read failed with Tool handler must return string or nil, got: cons.
  • buffer/disk: also silence userlock--ask-user-about-supersession-threat in force-path writes (995deb6, 71e24f4). The public ask-user-about-supersession-threat alone doesn't intercept Emacs 29+ private call sites.
  • fix(file): require anvil-server so macro expansion survives stale .elc (9aa1c82).

New: anvil-offload subsystem

Out-of-band REPL pool that lets the main daemon stay responsive while heavy ops (byte-compile, OCR, large file scans, slow shell-outs) run in worker REPLs. Tools opt in via :offload t at registration time and the offload layer auto-derives wrappers, with hard-kill preemption and a handler-side checkpoint protocol so partial results survive cancellation.

Phases shipped: 1 (future API + batch REPL), 2a (round-robin pool), 2b (:offload t registration), 3a (hard-kill + :resumable partial), 3b (checkpoint protocol), 5 initial / 5 2nd wave (auto-derive + per-tool retrofits).

Other features

  • feat(org-index): Phase 5 3rd wave — rebuild retrofit with checkpoint (434442a).
  • feat(dev): anvil-test-run-all + scaffold-module helpers (a8bcad2).
  • fix(dev): Makefile TMP/TEMP export + test-runner -L tests so the offload stub loads correctly under CI (a1d3442, 35fc5e7).

Docs

  • docs(README): document the second mcpServers entry pointing at --server-id=emacs-eval (7d59ef9, refs #3). Anvil registers tools across two server-ids (anvil + emacs-eval), so a single-entry config was silently hiding ~30 file/org/buffer/worker tools. The README now ships two-entry configs for Claude Desktop (macOS/Linux + Windows) and Claude Code CLI. A future release will collapse to one server-id.
  • docs(README): split install into stable tag vs bleeding-edge master (34fdd36).
  • docs(design): Doc 07 — browser framework + next-primitives roadmap (642665a).

Upgrade notes

  • Pin to v0.2.0. The README install snippets now reference this tag.
  • If you were running v0.1.0 on Windows, the anvil-stdio.sh fix alone is reason enough to upgrade — non-trivial MCP responses were silently dropped.
  • If you only had a single mcpServers entry for anvil, add the second --server-id=emacs-eval entry from the README to expose the file/org/buffer/worker tool surface.

Closes #3.


🤖 Release notes drafted with Claude Code