Skip to content

v0.10.0 - project scope and global scope, handled independently

Choose a tag to compare

@ringo380 ringo380 released this 31 Jul 03:13
· 8 commits to main since this release
765cb4a

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/*/memory glob, 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.md landed 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.