v5.17.0
The agent sessions running on one machine stop being invisible to each other, and an agent can
ask what its own branch broke.
A push no longer fails anonymously on an over-long field. The cloud contract caps title,
source and conflictKey at 500 characters; the local store caps nothing, so a research atom
with a long citation list sat staged until push, where the server's zod rejection came back as
Too big: expected string to have <=500 characters with no path and no id — one line per
offender, and no way to tell which two atoms of a hundred were meant short of SQL over
cloud_published. The caps are now checked before the request, and the failure names the atom,
the field and both lengths. Not enforced at write time on purpose: knowl store is local-first
and works with no cloud account, so a machine that will never push does not answer to the
server's limits (#217).
knowl doctor stops prescribing a fix that breaks publishing. A repo embedding differently
from its workspace drew a WARN saying the two sets of items were "invisible to each other", with
the remedy "align search.vector, then reindex". #191 made the mechanism false — each peer is
searched under its own profile and scored against its own range and floor — and the remedy was
worse than the warning: a cloud-connected repo's atoms must stay on the server's serving
profile, so aligning to the workspace would break every knowl cloud push. It is now an OK line
that names the per-profile mode. workspace add and workspace join still refuse a mismatch,
but say why they actually refuse: a workspace holds one profile so every repo shares one
semantic range, which is a policy choice rather than an invisibility claim (#216).
The sessions on one machine can see each other, on every host. Claude Code keeps a registry of
its live sessions and lets one message another, but records nothing about what each is doing —
and every other host records nothing at all — so two sessions hit the same failure and both start
fixing it, and a third changes the hook every one of them is standing on. Knowl now keeps the
other half in one machine-level file, ~/.knowl/fleet.db: what each session was asked, what it
wrote this turn, its last error, and which problem it has claimed by editing files after seeing
it. Every host with Knowl hooks is in the fleet and they see each other — a Codex session appears
on a Claude session's roster and the reverse — with liveness read from the host's own registry
where it publishes one and from recency where it does not. Only the sessions the host's messaging
can actually reach are offered as something to SendMessage; the rest are listed, marked, and
raised with the user instead. knowl fleet lists it from any terminal, inside a project or not,
and the knowl_fleet MCP tool lists it to an agent — registered unless fleet.enabled is
false. Two of the four switches ship active, and the line between them is what a surface can
cost you: fleet.enabled because the roster prints nothing at all when a session is alone, and
fleet.cards (enforce) because a card is advice on a channel the agent is already reading and
never a refusal. The two that would cost you something ship quiet — fleet.digest (off) spends
lines on every turn, and fleet.nudge (shadow) withholds a stop, so it records what it would
have said until you arm it. knowl posture maximal turns the digest on and arms the nudge.
An agent can ask what its own branch broke. knowl pr --since has always answered "which
stored knowledge does this diff invalidate", and it was CLI-only — so the actor most able to act
on the answer, the one that just wrote the branch, had no way to ask. knowl_drift is the same
check as an MCP tool: it takes a base ref, previews by default, and apply marks the matches as
needing review. It deliberately does not tell the team, which the CLI does — publishing a
retirement is visible to every member of a workspace, and sending stays the user's to run, the
same line knowl_cloud already draws. The automatic session-start check is a different question
and is unchanged: that one asks what drifted while you were away, this one asks what the work you
just did made false, and the diff that answers it does not exist until the branch does.