v1.5.0: controlled vocabulary, single write path
Schema and packaging release. The graph gets a controlled vocabulary and a single validated write path; the sdist stops shipping the test suite.
Known issue in this version. Sparse retrieval is degraded by a term-ID defect that produces no error and is hidden by RRF fusion — measured on a real vault at MRR 0.16 where it should be 0.63. You will not notice it from search results. Fixed in 2.0.0; see the postmortem. If you are installing fresh, install 2.0.1 instead.
Why this release exists
A real vault reached 46 entity types and 66 relation types across 173 entities. Two causes.
entityType was answering two questions at once — what role does this node play, and what subject is it about — so the list grew by one entry per topic. Splitting subject into its own domain field collapses the type list to ten and keeps it there.
Non-canonical relation types were accepted with a warning. Nothing acted on the warning, so 56 one-off types accumulated unnoticed. The graph stayed writable and stopped being queryable.
Breaking
Existing vaults must be migrated before this version can write to them.
python -m rawthink_mcp.migrate --guess-domains --heal-dangling # dry run
python -m rawthink_mcp.migrate --guess-domains --heal-dangling --applyA timestamped backup is taken before anything is written.
Highlights
record(),record_decision()andrevise()— one validated, all-or-nothing write path.record_decisionstores what was rejected, which is the part that exists nowhere else once the code is written.entityTypeclosed to ten roles;domain,visibilityand observationkindadded.- Unknown relation types are rejected rather than warned about.
search_nodesis bounded and reportstotal_matched, so a truncated result is visible.- Tool profiles:
recall(4 tools, ~900 tokens),record(5, ~1750),full(17, ~4200). serverInfo.versionreports the package version instead of FastMCP's.- The published 0.1.4 sdist contained
tests/, whose fixtures hardcoded personal entity names and session dates.pyproject.tomlnow has an explicit allowlist and the evaluation set loads fromRAWTHINK_EVAL_GT.
Full detail in CHANGELOG.md.