7b1f02377f
ruff PLW1514 (already enforced repo-wide via the blocking lint step) covers open()/Path.open()/read_text()/write_text() but NOT os.fdopen — the exact hole the AlexFucuson9 sweep PRs (#56033 #56940 #65565) kept patching by hand. Add an fdopen rule to check-windows-footguns.py, which also runs as a blocking CI step, so a bare text-mode fdopen fails CI. Also fix a false-negative in the read_text/write_text rule: chained forms like `read_text()[:4000]` or `read_text().splitlines()` never end the line with `)` and slipped past the multi-line-call heuristic. Replace the endswith check with a paren-balance walk (keeps multi-line calls with encoding= on a continuation line unflagged — verified against the full tree). This makes the rule the effective standing replacement for the standalone checker proposed in PR #66669: R1-style coverage now lives in PLW1514 + this script, both blocking in .github/workflows/lint.yml. Sabotage-verified: reverting agent/shell_hooks.py's fdopen encoding or tools/skills_tool.py's read_text encoding now fails the gate. Co-authored-by: AlexFucuson9 <AlexFucuson9@users.noreply.github.com> Co-authored-by: Paulo Nascimento <pnascimento9596@gmail.com>