Distinguishes why an entry did not end up removed, so the caller can be
honest about it instead of collapsing “refused because modified” and
“wasn’t there to begin with” into the same boolean.
The skill text ships inside the binary, so every upgrade path — brew,
cargo, bb update — carries new content as an inherent consequence rather
than needing a separate sync. It also means the installed skill can never
describe a flag this binary lacks.
Entries plus an optional warning. A missing state file simply means nothing
is tracked; a corrupt one is reported but treated as empty, so a hand-edited
file cannot brick bb update.
Refreshes every tracked entry against the currently-running binary’s
embedded text. Driven by the recorded entries rather than a root and an
agent list, so a single call spans every project the user has installed
into. Uses the same drift rules as install, via state_of: Stale or
Missing rewrites the file and updates the recorded hash, Modified is
left byte-identical and reported as SkippedModified, and Current is
reported as Unchanged without touching anything.