v4.7.6
Summary
The backlog can now live on a multi-repo workspace directory with no .git of its own, and the three names PACT keeps for one project — the backlog file, the pact-memory project id, and the session-directory slug — all derive from the same resolved directory through the same sanitiser.
What landed
- Umbrella backlogs.
project_root()falls back to the resolvedCLAUDE_PROJECT_DIRwhen git resolves nothing and no.gitsits at or above it; a directory inside a repository git could not read refuses instead of writing a second backlog keyed on a subdirectory or worktree. The refusal names which input it saw and echoes the rejected value. - One project name. The pact-memory project id returns the resolved basename for a symlinked project directory. One
project_slughelper replaces eleven inline derivations across the session hooks and the pact-memory session script. Every reader and writer of a session path — the resume-line fallback, the old-name reaper sweep, and the pact-memory session script — composes it through the one sanitising helper. - Symlink-launched sessions crossing this upgrade keep their journal: session start adopts the old-name directory (only when the two names differ, the old path is a real directory, and the new path is absent or empty; never clobbers, never raises), the previous-session-dir reader follows the moved path, and the reaper sweeps the old-name directory beside the new one.
- Re-key note. New pact-memory records for a project launched through a symlink land under the target's name; older records stay under the link's name.
- Ten backlog tests that reached the writer through the process cwd now pin
CLAUDE_PROJECT_DIR; one test pins the cwd path on purpose.
Why
A workspace umbrella was the only project shape the backlog writer refused outright, and the session-start remedy it printed could not succeed there. Review found that a project launched through a symlink was named three different ways; closing that split without leaving a documented gap meant adopting old session directories, following moved paths, and putting every path composition through the sanitiser the writers already used.