/**
 * Contract every resource staleness checker implements. Each checker owns
 * the layer-resolution and entry-shape rules for one resource type. The
 * aggregator in `../index.ts` doesn't know any of those details — it just
 * calls these three methods.
 *
 * Why three methods (not just "isStale"):
 *   - `listNames`   feeds both the manifest writer (what to record) and the
 *     name-set diff (`stored` vs. `current` reveals adds/removes).
 *   - `build`       produces the entry for a single name; called per name
 *     after listing. Pure — no comparison logic.
 *   - `isFresh`     checks one stored entry against current state; called
 *     when the name set already matches and we need content-level certainty.
 *
 * The `unknown` entry type is intentional — each checker round-trips its
 * own concrete shape through JSON (commands/hooks/mcp use FileEntry; skills
 * /subagents/workflows/plugins use DirEntry; rules/permissions use their
 * own composite entries).
 */
export {};
