In short
Astral enabled 413 linter rules by default instead of 59—unresolved dependencies broke everyone's CI. But now, the errors can be fixed en masse by an AI agent in a single pass.
Astral has released Ruff v0.16.0, and the first thing developers noticed when they had an unpinned version of ruff in their dev dependencies was that their CI failed. The number of default rules has increased from 59 to 413. Many of these rules catch serious issues: syntax errors, runtime errors, and unsafe patterns—things that previously had to be enabled manually now work out of the box without any configuration.
Simon Willison ran the new Ruff against three of his major projects—Datasette, sqlite-utils, and LLM. The command uvx ruff@latest check . --fix --unsafe-fixes on sqlite-utils found 1,618 errors, automatically fixed 1,538, and left 80 for manual review.
The remaining errors show the kinds of issues that fall under the new rules. datetime.datetime.now() without tz—rule DTZ005. Catching a bare Exception without specifying the type—BLE001. Useless access to an attribute where the result isn’t assigned to anything—rule B018. Each trigger is accompanied by a clear explanation and a link to the documentation.
The most interesting part isn’t the rules themselves, but how Simon handled them. He tasked the Codex agent (GPT-5.6 Sol high) with upgrading LLM and sqlite-utils, and Claude Code with Opus 5 for Datasette. Ruff’s output format—rule number, file, line, column, explanation—proved to be the ideal input for a coding agent. There’s no need to explain the context or copy chunks of code into the chat: the agent reads the linter’s output and edits the files.
Given that Astral is now owned by OpenAI, this doesn’t seem like a coincidence. Tools whose output is machine-readable are becoming increasingly valuable—not because people can’t read an error, but because the agent can fix it without an intermediary.
Practical takeaway: if ruff isn’t version-locked in your project, now is the time to do it—otherwise, the next release will break CI again. And if you want to try out the new rules on existing code, a single command gives you the full picture: uvx ruff@latest check .. The errors remaining after --fix are good material to feed to the agent and see how autonomously it can handle them.
Source: Simon Willison's Weblog