What's changed
Bug fixes
- MCP protocol fix —
completion_celebrationinstreak.pywas writing to stdout (the JSON-RPC channel). All output now routes to stderr. - Scope validation fix —
validate_scope()prefix match allowed/project_old/file.pyto pass a/projectscope. Fixed withos.sepsuffix; regression test added.
New
- GitHub Actions CI — pytest on Python 3.11, 3.12, and 3.13 on every push and PR
handlers_session.py— session lifecycle handlers split fromhandlers.py;_run_git_checkpointnow returns a human-readable status string for all 4 outcomes- Startup integrity check —
messages.pyraisesAssertionErrorat import time if any message key is missing a tone variant - Git status in
session_checkpoint— response now shows what happened with the git commit instead of silently passing - Expanded stop-word list — reduces gap-penalty false positives on long on-topic messages
Code quality
DRIFT_SCORE_CAPimported frommodels.pyinstead of hardcoded inhandlers.py_STOPfrozenset hoisted to module level indrift.py(was rebuilt on every call)_assert_routes_match_tools()validates route/tool parity at server startup- Version resolved via
importlib.metadata— stays in sync withpyproject.toml [project.urls]added topyproject.toml
Tests
108 tests (up from 96) across 6 files — new coverage for git checkpoint branches, route/tool parity, scope prefix regression, and flow mode auto-expiry.
Docs
CHANGELOG.mdandDECISIONS.mdaddedAGENTS.mdupdated to reflect full 15-module architecture and all 14 toolsREADME.md: CI badge, updated test count, architecture tree