Review round 1 on PR #190:
- B1: dropping the unremovable special files from Watch's persistent
finding left every test green. New test: a FIFO in a read-only dir
stays and the alert names it; red under that flip.
- The removeSpecial doc and test comment no longer claim a regular file
swapped in is always left alone: the re-check narrows, but cannot close,
the window before the unlink (as in removeSymlinks).
- Messages: the special-file finding says what one is and to delete it;
the persistent alert no longer talks only about symlinks.
- Rule 9: the Watch removal test is named for what it observes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tripwire looked only for symlinks. A FIFO in the brain passed it: at
classification.yaml it made startup exit (classification.Load refuses a
non-regular file, #176), and at a note path it could hang a reader that
skips the handle check.
- Scan reports special files (anything not a regular file, directory or
symlink) in Result.Special; Clean() and String() include them, so the
startup check refuses with a clear message naming the path.
- Watch removes them as it removes symlinks, through an os.Root, after
re-checking each is still special (a regular file, directory or
symlink swapped in is left alone and reported).
The live brain has no special files (checked before this change), so the
startup check does not newly refuse.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>