v0.10.0 - project scope and global scope, handled independently
Scope was only ever settled for the two CLAUDE.md files. Everywhere else it was unstated, and in two places wrong.
Fixed
- The project-dir path encoding omitted the
.->-replacement. Claude Code encodes both/and., so any path containing a dot resolved to a directory that does not exist - losing the session transcript and the project's memory dir, then offering to create a duplicate the harness would never load. The rule now has one canonical home and a test that executes it. - The audit located the memory dir with a
projects/*/memoryglob, which matches every project on the machine and so can never identify the current one. Capture and audit both resolve by exact path, and a test bans the glob from shipped files. - Routing asked "is this tool-specific?" before "is this repo-specific?" A learning that is both - one repo's deployment detail on a shared platform - landed in a global note and loaded in every other session. Scope is now a gate ahead of the routing tree.
- Nothing detected leakage in either direction. New audit check 9 finds a global note whose subject is really one repo, and a project memory file holding a fact that is true everywhere. It partitions cleanly against the cross-tier duplication check: one copy in the wrong scope is a move, two copies straddling scopes is a delete.
- A strict run's backup of
./CLAUDE.mdlanded in the repo working tree. Project-scope backups now go to~/.claude/notation-backups/<encoded-cwd>/, so notation never leaves an artifact in a user's repo. - The audit scorecard never named the project it resolved, so a run in the wrong working directory was invisible in the output.
Note for anyone reading the source
The encoding is inlined self-contained at each call site rather than defined once as a shell helper. The Bash tool does not persist shell state between invocations, so a function defined in one block is unset in the next and the path collapses to empty - reproducing the exact bug this release fixes.
Closes #15.