The check_conflict footprint was computed as git diff <baseSHA> — every
change since the worktree was created. baseSHA never moves and the worktree
only goes away on delete, so a session kept 'holding' its files forever;
committing or even merging never released them.
Compute the footprint as unmergedFiles instead: the files the session
touched since it forked, intersected with the files that still differ from
the merge target's tip. Once the work lands (content-identical in target)
those files drop out and the lock is released. Content-based, so it works
for merge/squash/rebase, and intersecting with the since-base set keeps
other sessions' merges into target from being misattributed.
Co-Authored-By: Claude Opus 4.8 <[email protected]>