Запись архива

Ruff v0.16.0: как AI-агенты помогли исправить тысячи ошибок в коде Python

Релиз Ruff v0.16.0 увеличил число правил по умолчанию с 59 до 413, вызвав массовые сбои в CI. Саймон Уиллисон показал, как Codex и Claude Code справились с исправлением сотен ошибок в проектах Datasette, sqlite-utils и LLM.

Скриншот терминала с запуском Ruff v0.16.0 и AI-агентами Codex и Claude Code, исправляющими ошибки Python
Скриншот терминала с запуском Ruff v0.16.0 и AI-агентами Codex и Claude Code, исправляющими ошибки Python
English Wikipedia light on dark colour scheme.png | by Software:
Wikimedia Foundation and contributors
Screenshot:

VulcanSphere | wikimedia_commons | CC BY-SA 3.0

23 июля 2026 года компания Astral (приобретённая OpenAI) выпустила значительное обновление своего инструмента для линтинга Python — Ruff v0.16.0. Главное изменение: количество правил, включённых по умолчанию, выросло с 59 (в версии v0.1.0) до 413. Это привело к тому, что многие проекты, использующие Ruff без явной конфигурации, начали получать сотни новых ошибок в CI-пайплайнах.

Саймон Уиллисон, известный разработчик и создатель Datasette, sqlite-utils и LLM, столкнулся с этой проблемой на практике. Его CI-задачи начали падать из-за новых проверок Ruff. В ответ он решил не просто исправить ошибки вручную, а проверить, как современные AI-агенты справятся с задачей массового рефакторинга кода.

Ключевые факты

Параметр Значение
Версия Ruff v0.16.0
Дата релиза 23 июля 2026 года
Правил по умолчанию 413 (было 59)
Всего правил 968 (было 708)
AI-агенты Codex (GPT-5.6 Sol high) и Claude Code (Opus 5)

Масштаб изменений

Ruff — это быстрый линтер и форматтер для Python, написанный на Rust. В версии v0.16.0 разработчики включили по умолчанию правила, которые ранее требовали ручной настройки. Среди них — проверки на синтаксические ошибки, ошибки времени выполнения, а также рекомендации по использованию временных зон, обработке исключений и другим практикам.

Уиллисон запустил `uvx ruff@latest check .` против своих трёх проектов. Результат: сотни предупреждений, которые ранее не появлялись. Для массового исправления он использовал команду `uvx ruff@latest check . –fix –unsafe-fixes`. В sqlite-utils это дало 1618 найденных ошибок, из которых 1538 были исправлены автоматически, 80 остались на ручной разбор.

Примеры оставшихся проблем

Уиллисон привёл три наглядных примера ошибок, которые Ruff не смог исправить автоматически. Они иллюстрируют типичные ситуации, требующие человеческого (или AI) решения:

  • DTZ005: `datetime.datetime.now()` вызывается без аргумента `tz`. Ruff рекомендует передавать объект `datetime.timezone`.
  • BLE001: Перехват голого `Exception` — линтер предлагает указывать конкретные типы исключений.
  • B018: Бесполезный доступ к атрибуту без присваивания — например, вызов `.last_pk` без сохранения результата.

Каждая ошибка сопровождается понятным объяснением и указанием на конкретную строку кода. Как отметил Уиллисон, такой формат идеально подходит для AI-агентов, которые могут анализировать контекст и вносить правки.

AI-агенты в деле

Уиллисон использовал два AI-инструмента для исправления оставшихся ошибок:

  • Codex (на базе GPT-5.6 Sol high) — для проектов LLM и sqlite-utils.
  • Claude Code (с Opus 5) — для Datasette.

Оба агента успешно справились с задачей, что подтверждает гипотезу: современные языковые модели способны эффективно обрабатывать автоматизированные задачи рефакторинга, если им предоставить чёткие инструкции и контекст. Это особенно важно для разработчиков, которые поддерживают крупные кодовые базы и хотят минимизировать ручную работу при обновлении инструментов.

Почему это важно для читателей Comrad404

Для сообщества, следящего за практическим применением AI в разработке, этот случай — наглядная демонстрация того, как AI-агенты могут быть встроены в реальный рабочий процесс. Вместо того чтобы тратить часы на ручное исправление сотен ошибок, разработчик получает возможность делегировать эту задачу модели, а сам сосредоточиться на более сложных аспектах.

Кроме того, обновление Ruff — это напоминание о важности контроля версий зависимостей. Уиллисон использовал нефиксированную зависимость `ruff`, что и привело к неожиданным сбоям. В продакшене стоит закреплять версии, а обновления проводить осознанно.

Источник: Simon Willison — “Ruff v0.16.0” (https://simonwillison.net/2026/Jul/25/ruff/#atom-everything)