v4.1.2 — The monitor that was watching nothing
·
22 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Fixed
- A killed embedding worker was never brought back, and nothing said so. The
worker is stopped on an idle timeout roughly every hour, by design, and a
background monitor exists to revive it. That monitor decided whether anything
was wrong by looking at a probe search: results with no meaning-score meant a
broken embedder. But it explicitly did not count no results at all — and no
results is what a dead embedder produces, because the meaning channel returns
nothing and the probe phrase appears in nobody's memories. So the one symptom
that should have started a repair was read as proof that none was needed, and
because a clean verdict is silent, it left no trace. Observed on a machine that
sat for over an hour, across two restarts, with searching by meaning switched
off, no explanation in the log, and a manual restart the only cure. The monitor
now asks the embedder directly, which is a question a search cannot answer. - There was no way to tell a quiet monitor from a dead one. A check that
finds nothing wrong writes nothing, which is right — a monitor that narrates
every success is one whose warnings get skimmed past. But it left "is it even
running?" unanswerable except by waiting for something to break. The time of
the last check is now reported, so it can be looked at instead of inferred. - A failing repair would not say what it was failing. When a completed
upgrade step stops holding, the report named the step and not the condition —
and that step checks five separate things. Anyone who hit it had to come back
and ask which. It now says which. - One drifted row could make the whole store unreachable. Any failed upgrade
step made every request return "service unavailable". That is right when a
table is missing. It is wrong for the checks that guard data rather than
structure — ordinary use can undo those, a single background pass being
enough — and it left people restarting a daemon to fix something a restart
could not fix. Structural failures still refuse; a data check that drifted now
reports itself and keeps serving while it is repaired. Anything that does not
say which kind it is still refuses, so nothing became more permissive by
accident.
Changed
- The plugin now installs and lists everywhere it should. It is the main way
to get SLM, and it was only half-delivered:- Codex could not see it at all. Codex reads
.codex-plugin/plugin.jsonto
register a plugin and that file did not exist, so twelve skills, the hooks,
the launcher and the server config were all installed and none of it appeared
under Plugins. There was nothing to enable. - Codex was also missing two thirds of the product. It shipped skills and
neither the four sub-agents nor the slash command. Both come from the same
single source as the Claude Code copies now, so they cannot drift. - Antigravity had no plugin at all. It has one now, with the same skills,
agents, commands and hooks as every other surface. - VS Code was missing the slash command.
- Every release looked like no release. The marketplace entry carried no
version, so a client had nothing to compare and an installed plugin never
appeared out of date. This reverses a rule of our own making; the version is
now stated, and one script owns every place that states it.
- Codex could not see it at all. Codex reads
slm doctornow says whether your skills are as new as your install. The
skills, agents and commands are delivered by your editor, not bypip, so
upgrading the package leaves them untouched — and nothing had ever mentioned
that. This release changed 76 files across them. Doctor now reports the plugin
version beside the package version and names the command that updates it.