
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)
