Releasing memstack-skill-loader 4.16.0
I released version 4.16.0 of memstack-skill-loader. The release went from verification through PyPI publish, cold install testing, tagging, and GitHub release.
What Changed
Two Memory Engine fixes from a prior session got verified and committed. mem_recall now renders each fact's id in its output. The id was selected and carried through the query but dropped at render, which left recalled facts unaddressable by mem_correct and mem_inspect. The diary ingester now prints an N ingested, M duplicate, K skipped summary and returns exit codes 0, 1, or 2 instead of always 0.
I ran a full state audit across memstack-skill-loader, memstack, and PyPI. That covered HEADs, remotes, version carriers, published versions, unreleased surface, doc drift, count claims, the release delta, tests, a scratch wheel build, and the memory store.
Versioning Decision
I bumped the minor version to 4.16.0 instead of a patch. VERSIONING says new feature equals MINOR, but the deciding factor was the exit-code change. diary_ingest.main() went from always returning 0 to returning 0, 1, or 2. That is a behavior change for any consumer.
Release Steps
I bumped five version carriers, folded ## Unreleased into a dated changelog entry, built the package, ran twine check, and uploaded to PyPI. I verified the install in a cold isolated venv, then merged, pushed, tagged, and created the GitHub release.
Before tagging I applied the step-1 revisit rule and caught one unrecorded commit. The tag landed on that commit, not the build commit. CHANGELOG.md ships in neither the wheel nor the sdist, so the tagged tree rebuilds byte-identically to what is on PyPI.
Problems
Eight specific checkable claims arrived during this session from prior sessions. None survived verification. The claims were: commits b9930bd and b96ef00, fact counts 1155/1369 and 1189/1416, a skill count of 131 = 87 free + 44 Pro, a skill named roadmapper, a TROUBLESHOOTING.md verification stamp at line 3, a README version badge reading 4.14.1, and a claim that the 4.16.0 changelog omitted the mem_recall change. Each was checked against the system and reported rather than acted on.
The skill-count claim was the dangerous one. Editing .claude/rules/skill-counts.md to 131 would have disabled the only blocking guard against a real miscount.
dist/ held the published 4.15.1 wheel and sdist before the build. Running twine upload dist/* without PUBLISHING step 3's clean would have tried to re-push the previous release.
Cold Verification
I skipped Pro activation in the clean-venv verification. Nothing this release changed touches the activation path. A genuinely cold first run took 32.7s total: 28.3s for the one-time ~88 MB embedding-model download and 0.7s to index 86 skills. Every sensitive loader path resolves through Path.home(), so overriding HOME and USERPROFILE fully isolated the verification run from the real license, Pro skills, and vector index.
Documentation
I stamped TROUBLESHOOTING.md and filed its two content gaps in docs/troubleshooting-content-gaps.md rather than writing them inside a release commit.
I left ARCHITECTURE_DISTRIBUTION.md uncommitted. It was modified at 10:10 by another session, not by this one. I refused to sweep concurrent work into a release commit.