Ruff v0.16.0

Disclosure: Some links in this article are affiliate links. AI Maestro may earn a commission if you make a purchase, at no…

By Vane July 25, 2026 1 min read

Astral shipped Ruff v0.16.0 on July 23rd. The update changed the default rule set, causing my continuous integration jobs to fail immediately.

Brent Westbrook noted that the tool now enables 413 rules by default, a jump from 59 in earlier versions. The last major change to the default set occurred in v0.1.0. Since then, the total number of available rules has grown from 708 to 968. Many of these new checks catch syntax errors and immediate runtime errors that the tool previously ignored unless explicitly configured.

You can test the latest version on any Python project with this command:

uvx ruff@latest check .

I ran the tool against three major projects: Datasette, sqlite-utils, and LLM. The scan identified hundreds of minor violations against the new defaults.

Each project maintains a comprehensive test suite running across Python 3.10 through 3.14. This coverage makes upgrades safer. The following command handled most of the fixes:

uvx ruff@latest check . --fix --unsafe-fixes

On sqlite-utils, the output reported 1618 errors. The tool fixed 1538 of them, leaving 80 remaining.

Here are three examples of the issues that could not be auto-fixed:

DTZ005 `datetime.datetime.now()` called without a `tz` argument

Ruff suggests passing a `datetime.timezone` object to the `tz` parameter.

BLE001 Do not catch blind exception: `Exception`

The tool flags catching a bare `Exception` class.

B018 Found useless attribute access. Either assign it to a variable or remove it.

Given Astral’s acquisition by OpenAI, the output format provides everything a coding agent needs to resolve these problems.

I used Codex (GPT-5.6 Sol high) to upgrade LLM and sqlite-utils. I also used Claude Code (with Opus 5) to upgrade Datasette.

What it means

Developers can run a single command to audit their code against a much stricter standard. The tool now defaults to catching issues that previously required manual configuration. This reduces the gap between “what the tool can find” and “what the tool checks by default.”

Scroll to Top