mirror of
https://github.com/OthmanAdi/planning-with-files.git
synced 2026-09-14 16:09:40 +08:00
f202800d7d
Claude Code's project-dir naming is lossy: /home/dev/client.acme and /home/dev/client-acme both fold to -home-dev-client-acme and share one directory of transcripts. Until this release the resolver did not fold the same characters, so it simply missed such a directory. Now that it folds the way Claude Code does, it finds the shared directory, and catchup has to decide which transcripts in it belong to the project that asked. Without that decision a catchup in one project prints the other project's conversation into the fresh context. Reproduced against the previous commit with a planted canary: the victim project's run emitted the donor's message verbatim. The same run after this change emits a one line notice instead. A transcript is skipped only when it positively records a different cwd. Transcripts that record none are kept, because the field is not present in every generation of the format. A directory whose transcripts all belong to another project is reported rather than used, and mixed directories keep the project's own transcripts, which is why the filter is per session rather than a rejection of the whole directory: in a collision both projects live there permanently, so rejecting the directory would cost the project its own history for good. Comparison goes through the same canonicalization the Codex path already uses, case-insensitively on Windows. tests/test_catchup_cross_project_guard.py covers the four cases at unit level across every copy that carries the guard, plus two end to end runs of the real script against a shared store: one asserting the canary never appears, one asserting the project's own transcript still does.