skillmem 0.12: 16 invariants and two models that tried to break them
Published: 2026-09-29 · Author: AI Release · @ai_release1
⚡ The gist in 5 seconds - What it is: skillmem 0.12 — a release of local memory for coding agents, built on 16 invariants (docs/INVARIANTS.md). Each invariant describes a specific promise: the exact wording, the function that upholds it, and its status at the time of release. - Where it's available: open source, an MCP server on top of SQLite with nine mem_* tools. One database is shared by Claude Code, Codex, Cursor, and other clients. - The bar: the release threshold was zero P1/P2 issues in the "data," "trust," and "concurrency" classes; everything else is openly listed under Known issues. ### 🔍 What was found Two models from different labs took part in the review: Codex from OpenAI ("Astra" in the project) and Claude Opus 5.5 from Anthropic. They worked for about ten days: 0.11.0 shipped on September 17, 0.12.0 on the 27th. One rule applied: a finding without reproduction doesn't count — a command or test is required; reasoning alone is not accepted. Every fix is accompanied by a test that fails on the parent commit; this is verified by scripts/release-gate.sh. Property tests are written with hypothesis and use real concurrent writers: separate processes and threads over a single file, with no mocked locks. The most telling finding: Windows treats stdin redirected from NUL as a console, so the command skillmem write < NUL went through as owner-approved and saved a sealed record. Also found: a future timestamp on Windows (which broke recap debouncing), bypasses of the "data, not instructions" boundary via Unicode line separators, NBSP, invisible characters, and lookalike brackets ⨠/⪥, loss of records after Ctrl-C due to an unclosed SQLite transaction, and a database copy that believed it was the original and deleted its backups. Separately fixed: case-insensitive filesystems (APFS, NTFS) mixing up dumps and attachments, upgrade sending a stored GitHub token via a redirect to another host, and on Python below 3.14, Path.is_dir() raising PermissionError instead of returning False. ### 💡 Why it matters The main takeaway from the previous release: model review without criteria is just taste. One nitpicks naming, another nitpicks race conditions, and each is right in its own way. The stop condition of "two clean rounds in a row" worked, but it didn't answer the question of what exactly the program guarantees. Invariants change the approach: the reviewer no longer judges whether the code is good — it takes a specific promise and looks for a counterexample. This is the practical benefit: users get verifiable guarantees around data, trust, and concurrency instead of abstract "cleanliness." ### 🧩 Context skillmem is local memory for coding agents, an MCP server on top of SQLite. Two articles about it have already appeared on Habr: one on turning someone else's README into a user rule, and one on forty rounds of review. In 0.12, the invariants document came first and the code followed — a deliberate inversion of the process. The result: tests grew from roughly 430 to 2,538, full CI runs on Linux, macOS, and Windows with Python 3.11–3.13, plus a Docker check. A correctness release breaks scenarios that worked by accident, so the release notes are open
⚡ The gist in 5 seconds - What it is : skillmem 0.12 — a release of local memory for coding agents, built on 16 invariants (docs/INVARIANTS.md).
Each invariant describes a specific promise: the exact wording, the function that upholds it, and its status at the time of release.
- Where it's available : open source, an MCP server on top of SQLite with nine mem_ tools.
One database is shared by Claude Code, Codex, Cursor, and other clients.
- The bar : the release threshold was zero P1/P2 issues in the "data," "trust," and "concurrency" classes; everything else is openly listed under Known issues.
🔍 What was found Two models from different labs took part in the review: Codex from OpenAI ("Astra" in the project) and Claude Opus 5.5 from Anthropic.
They worked for about ten days: 0.11.0 shipped on September 17, 0.12.0 on the 27th.
One rule applied: a finding without reproduction doesn't count — a command or test is required; reasoning alone is not accepted.