v0.10.0 — content-based drift detection (hash mode)
Phase 2's first increment: mode: "hash". A syncPairs entry can now do a true content comparison instead of the mtime heuristic.
- The snapshot embeds a synced-to marker naming the source content it last reconciled to:
<!-- never-stale:synced-to 8c2b42f56e6fd699 --> - On compact, the gate hashes the source's normalized content (CRLF, trailing whitespace, and leading/trailing blank lines normalized away → cosmetic churn is not drift) and flags a mismatch, reporting the new hash so you can paste it back.
- A snapshot with no marker, or a source missing / larger than the 512 KB cap, is treated as unknown (never drift) and surfaced in
/never-stale:status.
The synced-to marker is matched with a static, gate-owned pattern — no user-supplied regex, no ReDoS surface — and the source read is size-capped and happens only on the low-frequency compact path. /never-stale:status previews hash-mode pairs. With no syncPairs configured, the reminder stays byte-identical.
Full notes: CHANGELOG.md.