A focused patch release: the system prompt now carries a self-consistent tool guide, and persistent memory is capped so it stays selective.
Dynamic tool guide
The system prompt gains a compact Tool guide block rendered directly from the session's registered tool definitions, so it can never drift from the actual toolset:
- Optional tools (
memory_*,web_*,skill_read) are listed only when they are registered for the session. update_planappears only while a plan is active or blocked, preserving the proposal-vs-execution split.- Roughly 82 tokens for the default toolset; the block shows up in
/contextlike any other.
This bumps PROMPT_VERSION to 6.
Memory store caps
memory.json(global and project, each separately) is now capped at 1800 serialized characters. Writes that would exceed the cap are rejected with a clear instruction to forget or compact existing entries — stored memory stays selective instead of relying on prompt truncation.- The cap ratchets: stores that predate the cap and exceed it can always shrink (
/memory forgetkeeps working, including for minified legacy files), while growth stays rejected until the store complies. /memory compactis now atomic across stores — every replacement is validated before any file is written, so a rejected optimization can no longer partially apply./memory add,/memory forget, and/memory compactreport cap rejections with a friendly message instead of failing opaquely.
Scoped memory
- The injected memory block now groups global and project preferences into distinct sections.
memory_propose_updatedocuments the global-vs-project scope policy (what belongs where, what should never be stored) in its tool description.
Quality
- 1625 tests (up from 1610), ruff + mypy --strict green, CI green on Python 3.11 and 3.14.
- New coverage for legacy over-cap stores, ratchet semantics, atomic compact rejection, grouped rendering, and tool-guide composition.
- Validated in a live session before merge.
Full Changelog: v0.11.0...v0.11.1