mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-10-27 06:53:11 +08:00
A persistently dirty or untracked worktree re-triggered a full reindex (and its DB/artifact rewrite) on every poll cycle - git_is_dirty() answered 'is the tree dirty' where the watcher needs 'did the tree CHANGE'. Idle repos with one uncommitted file produced sustained disk write amplification (reported at 1 TB/day across several repos). The watcher now tracks a dirty-state signature: FNV-1a over the entries of git status --porcelain -uall -z plus each listed path's (size, mtime_ns). Same signature -> no reindex; editing a dirty file, adding/removing one, or reverting the tree to clean each produce a new signature and trigger exactly one reindex. Submodule status is folded in on POSIX, mirroring the old submodule dirty probe. 0 is reserved for a clean tree; a dirty-at-baseline tree still reindexes once (the watcher cannot know whether that state reached the DB, e.g. after a server restart with a stale artifact). Baselines (HEAD and signature) are now committed only after a SUCCESSFUL reindex: check_changes stages observations in pending_* fields, and busy-skips (index_fn > 0, e.g. pipeline lock held) or failed runs leave the baselines untouched so the change is retried on the next poll instead of being recorded as seen and silently lost - the old code stored the new HEAD at check time, dropping any commit that arrived while the pipeline was busy. Closes #937 Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>