Repository navigation
v0.233.0
This release stops an agent's memory and history from filling with noise, and closes several plugin-author traps. An audit of one agent on 2026-11-08 found 173 of its 225 memories were noise and 24.7 MB of session summaries. Memory now learns only from your own chats, refuses work-status logs, and old summaries and history age out. Plugin authors get guards against two failures that otherwise ship green, event subscriptions that survive startup and reload, and rate-limited view events.
Added
show_config(section="version")reports the running build (#4886, issue #4876). It returns the package version (the same value/healthzreports), the git sha and dirty flag when running from a source checkout, the install kind and path, the start time and the uptime. The tool now points "which version are you on?" questions there instead of at a checkout'sgit describe.
Changed
- Changelog fragments can be right in a PR's first commit (#4881). Name a fragment
changelog.d/<slug>.<kind>.mdand leave the PR number out. At release,changelog.py collateadds it from the squash-merge commit. TheChangelog entrycheck now rejects a placeholder such as(#NNNN), a bullet with no bold lead and no#N, and a name that isn't a slug.
Fixed
- Memory learns only from your own chats (#4882). The fact extractor that runs when a chat retires now reads only authenticated operator chats. It used to read peer-agent, API and group-chat threads, and saved what peers said as facts about "the user". Other threads still get a history summary.
memory_saverefuses work-status logs (#4882). A save that reads as a status log ("I cut release v0.231.0", "PR 558 merged with green checks") is refused, with a pointer to where the fact already lives: the tag, the PR or the board. Lessons and rules still save, even when they cite a PR.- Summaries no longer contain hidden reasoning (#4882, #4883). History summaries and session-summary files read only the reply text. They drop encrypted reasoning and thinking blocks.
- Session summaries are bounded and age out (#4883). A summary keeps the opening request and the newest messages (40 in all, 500 characters each), plus clipped tool calls and final output. A 100-message session drops from about 300 KB to under 40 KB. Files older than
memory.session_retention_days(90) or pastmemory.session_max_files(500) are deleted by the maintenance sweep. - History retention per kind (#4883). System-session rows age out after 30 days and background reports after 90. Summaries and your chat archives are kept. This starts as a dry run (see Upgrading).
- Plugin event subscriptions work across startup and reload (#4885, issue #4800).
registry.on()called inregister()now queues until the host's event bus is wired, so no events are missed and none are delivered twice. The registry owns the unsubscribes and tears them down on reload. - Plugin view events are rate-limited and stay in their namespace (#4884, issue #4803). A plugin view's publishes are coalesced per topic and rate-limited per view. A per-view publish token makes the server enforce the plugin's own topic namespace. Publishing with an operator bearer token works as before.
- Plugin registration catches two silent failures (#4888, issue #4804). A route whose
Request,WebSocket,ResponseorBackgroundTasksparameter is a string annotation (so FastAPI treats it as a query parameter and every call returns 422) now logs a warning on a live host. The same goes for a tool with a parameter namedconfig,callbacksorrun_manager, which LangChain swallows as its injected config. The plugin testkit raises on both, so a plugin's own tests fail before it ships. - The plugin scaffold no longer creates the 422 trap (#4889, issue #4804). Generated plugins no longer start with
from __future__ import annotations.
Docs
- The building-plugins skill covers both traps and plugin storage (#4889, #4890, issue #4808). A new Gotchas section explains the two failures above and their fixes. The skill also gives
plugin_store's exact path (<instance root>/<plugin_id>[/<subdir>]), explains why ids that name a core store (such asmemory) are refused at load, and notes that the testkit gives each test a temporary store.
Upgrading
- Session-summary files are deleted on update. The first maintenance sweep removes summary files older than 90 days and all but the newest 500. This is not a dry run. To keep them, set
memory.session_retention_days: 0andmemory.session_max_files: 0before you update. - History retention deletes nothing yet. It logs
[history-prune] dry run: would remove …. Sethistory.retention_dry_run: falseto turn deletion on. - Older chats give no new facts. Chats from before the operator-chat stamp (#4873) retire with a history summary only.
- Plugin authors: tests that use the testkit now fail on the two traps above. Import
Requestand similar types at module level (or drop the future import), and rename a tool parameter calledconfig,callbacksorrun_manager. - Nothing else to change. The new settings are YAML only for now.
What's Changed
- fix(memory): stop peer threads and status logs filling an agent's memory by @mabry1985 in #4882
- fix(events): iframe publish is coalesced + rate-limited per view, and the server enforces the plugin namespace via a per-view publish token (#4803) by @mabry1985 in #4884
- fix(changelog): write the fragment right in the first commit; the release stamps the PR number by @mabry1985 in #4881
- fix(memory): bounded session summaries and history retention by @mabry1985 in #4883
- ci(gitleaks): retry the install download and check its sha256 by @mabry1985 in #4887
- fix(plugins): show_config gains a "version" section (package version, git sha/dirty, install kind/path, start time, uptime) and points "what version" questions at it (#4876) by @mabry1985 in #4886
- fix(plugins): registry.on() in register() delivers events — queue until HOST.on is wired, own the unsubscribes, tear down on reload (#4800) by @mabry1985 in #4885
- fix(plugins): register_router warns (live) / raises (FakeRegistry) on a string Request/WebSocket/Response/BackgroundTasks param; register_tool flags a param named config/callbacks/run_manager (#4804 part 1) by @mabry1985 in #4888
- fix(plugin-devkit): the scaffold no longer emits
from __future__ import annotations; building-plugins skill gains a Gotchas section for both footguns (#4804 part 2) by @mabry1985 in #4889 - docs(plugins): building-plugins skill documents plugin_store's exact path, the reserved core-store ids and the testkit temp-dir stub; closes 4808 by @mabry1985 in #4890
Full Changelog: v0.232.0...v0.233.0