The initial stat and read happened without a lock between them. A file change mid-window stored the mtime of the pre-change stat against the post-change content, suppressing the next reload. Re-stat after read_text; fall back to the pre-read stat only on OSError.