Files
l0ng-ai 4b7719ba5f fix(watch): stop a filesystem watch feeding itself on Linux (#523)
On Linux, an idle window with a repository open ran `git status -uall` about
2.6 times a second, forever. `notify`'s inotify backend subscribes with
`WatchMask::OPEN`, so every `open(2)` under a watched directory is an event —
and `git status` opens `.git/index`, `.git/HEAD` and `refs/heads/*`, all of
which the source control watch covers. The read that answers "did this
repository change" was itself an event saying it may have changed, so each
answer scheduled the next question. Measured on the Linux runner: 78 debounce
bursts in 30 seconds, from one real change.

`Debounce`'s doc argued this was impossible because `GIT_OPTIONAL_LOCKS=0`
stops `git status` writing the index back. That covers writes; `IN_OPEN` fires
on reads. macOS FSEvents has no equivalent, which is why it was invisible on
the machine it was written on.

`is_content_change` drops `Access(Open | Read | Close(Read))` and keeps
`Access(Close(Write))`, at both the host watch and the config hot-reload watch.
Guarded by a host conformance case rather than a platform test, verified red on
the Linux runner with the filter removed.

Also here, and how the above was found: the `render_idle` tests counted frames
across a window they advance a virtual clock over, while the pane runs its own
git pipeline off a 300ms timer on that same clock that nothing advanced during
settle — so the measurement set off the pane's first `git` run and raced its
landing. `test_window::quiesce` settles both clocks, and the kernel's, before
counting. That turned #523 from a 1-in-50 flake into a deterministic failure,
which is what made the watch loop findable.

Third: `ssh_config::an_alias_added_to_an_included_file_is_seen_without_touching_the_root`
(from #528, already on main) failed on every Windows run of this branch. The
cache keys on mtime and the test writes twice inside one ~15ms Windows clock
tick, so the cache was right to say nothing changed. Test-only; the poll behind
it runs at 4Hz and real edits arrive at human speed.

Closes #523.
2026-08-12 01:00:52 +08:00
..