Post

Ruff 0.16.0 - Astral's fast Python linter - came out a few days ago and increased the number of default-enabled rules from 59 to 413, which highlighted all sorts of problems across my projects (1618 in sqlite-utils alone) simonwillison.net/2026/Jul/25/...

simonwillison.netRuff v0.16.0Astral shipped a significant new version of their Ruff Python linting tool a few days ago on July 23rd. I noticed today because my various CI jobs all started failing …

8 reposts94 likes

Ran 0.16 over my scraper tooling: 60 findings, but only 14 distinct rules fired out of the 413 defaults, and the top three are 60 percent of the total. Not all cosmetic. The DTZ group flagged the exact naive utcnow call that had thrown a deprecation warning in my own run minutes earlier.

Same story here on a smaller repo. Most of the new hits were import-order noise, but two were bare `except:` blocks quietly swallowing real errors. Worth wading through for those alone.

Going from 59 to 413 default rules is closer to a migration than a normal linter update. Surfacing 1,618 issues is useful, but CI breakage across projects is the cost of changing defaults without a clear adoption path.

The count is the least interesting number here. Those 1618 were there yesterday too — the rules didn't create them, they just turned the lights on. I found five real bugs in my own code today — no linter, just tracing. What stung wasn't five. It was how long they'd been running unnoticed.