Problem
Three small gaps were left after the fix for #2017, which taught scripts/skills_install.py to leave an existing Claude Code marketplace registration in place and added --snapshot-only. Each was raised by a local review pass on that branch after its edit budget was spent. They were deferred rather than fixed there.
--report still crashes on a registered path carrying a NUL byte. directory_gone() reads such a path as present, which is right for the installer. live_channel() then hands it to git_in(), and subprocess.run raises ValueError: embedded null byte, which git_in() does not catch. Reaching it needs a hand-edited registration, so it is unlikely in practice. The fix is to catch ValueError in git_in() beside OSError, with a LiveChannelCase test using a constructed path such as /tmp/a\0b.
- The "gone" messages are wrong when a plain file sits at the registered path. A file there counts as gone, which is intended, since it serves nothing. But the installer then says the directory "no longer exists", and
--report says the checkout "does not exist". The action is right and only the wording is wrong: say "is not a directory" or "serves nothing" instead.
- Two refresh instructions still say "re-run the installer" without
--snapshot-only. docs/host-setup.md "Fleet Skills Install", the paragraph opening "The refresh cadence", and check-this-repo's "Answering 'why isn't a fleet rule applying'" section both say this. check-this-repo's safe-to-fix bullet and skill-lifecycle step 8 now say --snapshot-only, and step 8 points at the host-setup cadence as its source. A full install no longer moves the registration, so the older wording does no harm. The surfaces just disagree.
Scope
scripts/skills_install.py (git_in, the two messages) and tests/test_skills_install.py
docs/host-setup.md "Fleet Skills Install"
.agents/skills/check-this-repo/SKILL.md, regenerated through scripts/build_dist.py
Problem
Three small gaps were left after the fix for #2017, which taught
scripts/skills_install.pyto leave an existing Claude Code marketplace registration in place and added--snapshot-only. Each was raised by a local review pass on that branch after its edit budget was spent. They were deferred rather than fixed there.--reportstill crashes on a registered path carrying a NUL byte.directory_gone()reads such a path as present, which is right for the installer.live_channel()then hands it togit_in(), andsubprocess.runraisesValueError: embedded null byte, whichgit_in()does not catch. Reaching it needs a hand-edited registration, so it is unlikely in practice. The fix is to catchValueErroringit_in()besideOSError, with aLiveChannelCasetest using a constructed path such as/tmp/a\0b.--reportsays the checkout "does not exist". The action is right and only the wording is wrong: say "is not a directory" or "serves nothing" instead.--snapshot-only.docs/host-setup.md"Fleet Skills Install", the paragraph opening "The refresh cadence", andcheck-this-repo's "Answering 'why isn't a fleet rule applying'" section both say this.check-this-repo's safe-to-fix bullet andskill-lifecyclestep 8 now say--snapshot-only, and step 8 points at the host-setup cadence as its source. A full install no longer moves the registration, so the older wording does no harm. The surfaces just disagree.Scope
scripts/skills_install.py(git_in, the two messages) andtests/test_skills_install.pydocs/host-setup.md"Fleet Skills Install".agents/skills/check-this-repo/SKILL.md, regenerated throughscripts/build_dist.py