has_artifacts counted only the paths a purge may remove. When all that was left lay behind a linked dir, `purge claude <uuid>` (or auto) found no adapter and exited 5 with an empty residual, hiding the path the purge had refused to follow. has_artifacts now counts every candidate; _inside still decides what is removed, so the CLI exits 0, removes nothing and lists the linked path as residual. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>