You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Fix: Antigravity and Windsurf were treated as configured in every repository on the machine
Both hosts keep their MCP entry in the user's home, so one knowl init antigravity anywhere made detect().configured true in every repository. Doctor then warned "lifecycle hooks missing or
stale" in each, and doctor --fix (and the knowl upgrade --all sweep, which runs the same
repairs) ran knowl init antigravity and wrote .agents/hooks.json into repositories that had
never used the host: five of them in one sweep. For a host whose MCP entry lives in the user's
home, a repository now counts as configured only when it also has that host's hooks file, which knowl init <host> writes. init's own verify step is unchanged and still checks only the MCP
entry, so a first knowl init antigravity works. A repository that already has the hooks file
is unaffected.
Fix: the Hermes plugin dropped every tool event, so none of the mid-turn reminders ran
post_tool_call handed its work to a new thread, and that thread looked up the session's folder
in a context variable Hermes sets for the turn. A thread does not inherit it, so the lookup
returned the process directory, which is not a Knowl project, and the event was dropped before it
reached the engine. Everything built on tool events was dead on Hermes: the continuation
reminder, same-turn change cards, skill nudges and turn capture. One real repository held 92
Hermes sessions with only start and stop events and no tool event at all. The folder is now
resolved on the turn's own thread and passed to the observer. Also removed fire_async, which
had no callers. Reinstall with knowl init hermes to load it.
Hermes: the manual install routes ship the rules file too
integrations/hermes/install.py copied a fixed list of two files, and the pip package listed only plugin.yaml as package data, so either route left guidance.json behind and the plugin loaded
with empty rules. install.py now copies every file in the plugin directory and the package ships *.json. knowl init hermes already copied it. The Hermes, hosts and reference docs now describe
the memory-provider route, the tool-visibility table per host, knowl init --all and the cadence
change.
Hermes and Claude Code: the memory tools are no longer behind tool search
knowl_query and knowl_store stay visible on Hermes. Hermes defers every plugin and MCP tool
behind tool_search, so a model told to call knowl_query first had to look it up first, and
skipped it. A memory provider's tools are added after that decision, so the Hermes plugin now
offers the two tools as its provider's tools, and knowl init hermes sets memory.provider: knowl when none is set. A provider you already chose is left alone, and then the tools stay
deferred. There is one copy of each tool in front of the model, not two.
Claude Code gets alwaysLoad: true on the knowl entry in .mcp.json, its documented
exemption from MCP tool deferral. The Claude Desktop app does not honor it yet
(anthropics/claude-code#86284). No other host has a verified equivalent, so none is changed.
A stale Hermes plugin is now visible. The plugin is a copy, and an npm update never reached
it. knowl doctor now reports an installed integration that differs from the shipped one as
"out of date", and --fix / knowl init <agent> repairs it.
Sessions with no project
knowl init --global <host> now tells the host about Knowl in every folder. A project's AGENTS.md is what tells an agent to use Knowl, and a session with no project, or in a folder
nobody ran init in, has none. For Claude Code, Codex, Antigravity and Windsurf, the four hosts
whose global instruction file is documented, it adds a short managed block (its own markers, the
rest of the file untouched, the old file kept as <file>.backup) saying to query personal
defaults first. It asks first, or takes --yes. Cursor and the rest have no documented file and
are named and skipped instead of guessed at.
The server's handshake card now says what the tools are for when no project is open. It said
"for project work" and nothing more, to a session that has no project.
Every agent-facing text is built from shared sentences
The reminder, the three capture nudges, the correction nudge, the global instruction block and the
Hermes plugin's rules each hand-wrote their own "store it" line and had drifted: three nudges named knowl_store or knowl_decide and never knowl_update. KNOWL_WRITE_ROUTING, KNOWL_LOAD_SCHEMA_LINE, KNOWL_NO_SECRETS_LINE and KNOWL_USE_TOGETHER_LINE now live once in src/core/knowl-guidance.ts and each text composes them; a test fails if a writing text omits the
routing. The Hermes plugin is Python and cannot import them, so npm run docs:generate renders
its rules from src/core/plugin-guidance.ts into integrations/hermes/knowl/guidance.json, docs:check fails when that file is stale, and the installer copies it with the plugin. Its rules
now also name knowl_update and knowl_decide, and say to load them through tool_search.
A plugin installed without the file loads with empty rules and a logged warning: run knowl init.
The mid-turn reminder now covers writing, not just reading
The continuation reminder said "call knowl_query" and a generic "store durable findings", so a
model that obeyed it queried and never wrote. It now names knowl_store for a verified finding,
stated goal or recurring diagnosis, knowl_update for stale memory (instead of a duplicate) and knowl_decide for a confirmed decision, and says to load a tool's schema if it is listed but not
callable. It no longer names Claude, since eight hosts receive it. Four hosts have no mid-turn
channel at all (Claude Desktop, Cline, Windsurf and the generic host) and are unchanged: they
rely on the server card and the instruction files.
Default change: the continuation reminder now speaks after 6 tool calls, not 12
reminders.driftEvery defaults to 6. It counts consecutive successful tool calls that used no
Knowl tool, and any Knowl call resets it. In four days of real Hermes sessions, 128 stretches ran
6 or more calls without a Knowl call, and only 50 reached 12, so the old default never spoke in
most of the stretches long enough to matter. With backoff on, it now lands at 6, 18, 42, 90, 186
rather than 12, 36, 84, 180, 372, so a long session pays for one more reminder, not many. A repo
that set the key keeps its value; knowl config set reminders.driftEvery 12 restores the old
cadence and 0 turns it off.
knowl init --all replaces knowl upgrade --all
knowl init --all upgrades every repository on the machine (project files, schema, guidance) and
applies doctor's repairs, which now include re-registering an out-of-date integration in the
repository that already has it. It never adds an agent a repository did not use, and machine-wide
hosts are refreshed once per run. It takes --root, --dry-run, --reindex and --no-snapshot.
knowl upgrade and knowl upgrade --all still work, are hidden from help, and print a
deprecation notice. Anything gating CI on knowl upgrade --all keeps working until it is removed.