Открытый код · 2026 · продолжается

59 правок отправлено в 44 чужих проектов.

Влито уже 17, и каждую правку можно открыть и проверить.

Я маркетолог. Код читаю и правлю, разработчиком себя не называю. Началось всё с проверки одной догадки, получится ли у человека со стороны найти настоящий дефект в большом чужом проекте, не потратив полгода на погружение.

Получилось. Ниже таблица влитого, два случая, разобранных до последнего шага, и метод, которым это ищется. Плюс честная оговорка про то, где инструменты врали.

правок отправлено
59
проектов
44
влито
17

Цифры сверены с GitHub 5 августа 2026 г.. Профиль на GitHub

Что влито

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

Два случая целиком

Мерж сам по себе показывает только результат. В этих двух видно дорогу к нему.

Случай первый

Тест проверял совсем не то, что написано в его названии

toqito, библиотека квантовой теории информации на Python

В их конфиге ruff включены пять наборов правил, набора bugbear среди них нет. Прогнал код с отключённым конфигом и с --select B. Среди шума нашлась одна настоящая вещь, слепое pytest.raises(Exception).

Тест называется test_is_ppt_non_hermitian_matrix и по названию сторожит то, что функция отвергает неэрмитову матрицу. Ловил он ошибку изменения формы массива. is_ppt берёт размерности подсистем как корень из формы матрицы, для 2×2 выходит [[1,1],[1,1]], и partial_transpose падает на reshape. Эрмитовость функция вообще не проверяет.

Доказательство собрано двумя пробами. Эрмитова матрица 2×2 даёт ровно ту же ошибку. Неэрмитова 4×4 спокойно возвращает False. Значит тест прошёл бы там, где обязан упасть, и пропустил бы именно то, ради чего написан.

Правка переименовала тест под то, что он реально проверяет, и сузила pytest.raises(Exception) до ValueError с match, как принято в остальном их наборе. Прогон по state_props, 598 тестов зелёные, их ruff чист. Отдельный вопрос, должна ли is_ppt отвергать неэрмитову матрицу вообще, задан в тексте PR и оставлен мейнтейнеру. Это уже изменение поведения библиотеки.

Мейнтейнер воспроизвёл все три пункта доказательства у себя и расписал это в ревью построчно. Влито за 9,4 часа. Такой отзыв стоит дороже самого мержа.

Открыть pull request, vprusso/toqito#1910

Случай второй

Условие написали в июне, возможность добавили в ноябре

traefik-helm-chart, официальный Helm-чарт Traefik

В чарте есть проверка, которая запрещает namespaced-режим прав доступа, если включён провайдер, которому нужен охват на весь кластер. Провайдеров там перечислено три. Четвёртый, knative, пришёл позже и в список не попал, так что чарт отказывал в схеме, с которой код уже умел работать.

Доказательство собрано их же историей коммитов. Условие написано 18 июня 2025 года, коммит 4f39c87. Knative добавили 10 ноября 2025 года, коммит fbd7922, тогда же role.yaml научили выдавать ему права. Условие обновить забыли.

Дальше надо было убедиться, что кластерный охват knative и правда не нужен. Его права чисто namespaced и побайтно одинаковы в role.yaml и clusterrole.yaml. У соседнего kubernetesGateway, которому охват действительно нужен, стоит своя отдельная проверка двумя строками выше.

В их AGENTS.md написано прямо, сначала пиши падающий тест. Так и сделано. Тест падает на main, проходит с правкой, весь набор helm unittest зелёный, 734 теста.

Мейнтейнер попросил заодно починить отступ в их же тестах, где errorMessage стоит на одном уровне с failedTemplate. YAML читает это как два соседних ключа, поэтому текст ошибки никогда не сравнивался, проверялся только факт падения. Починено в том же PR и проверено пробой, с выправленным отступом подмена ожидаемого текста роняет тест. Влито за 15,7 часа.

Открыть pull request, traefik/traefik-helm-chart#1955

Как это ищется

Поиск идёт вширь. Разобраться в одном большом проекте до уровня его мейнтейнеров стоит лет. А сверка того, что проект обещает, с тем, что он делает, работает в любом проекте на любом языке и занимает часы.

Обещание живёт в документации, в докстроках, в схемах, в примерах конфигов, в разделах Removed у CHANGELOG. Поведение живёт в коде. Между этими двумя источниками почти всегда есть зазор, потому что параметр переименовали, флаг вырезали, провайдера добавили. Сборка при этом зелёная, документацию ведь никто не компилирует.

Из этого выросла своя картотека. Сейчас в ней 14 пород дефектов. Порода, найденная в одном проекте, потом прогоняется по остальным. Сравнение вместо присваивания нашлось в библиотеке для нейронауки на Python и в тестах астрономической библиотеки. Устаревшее имя параметра в докстроке нашлось в семи проектах на трёх языках.

Часть пород ловится линтером, если запустить его с отключённым конфигом проекта. Часть не ловится ничем. Их находит только чтение двух источников рядом, документация против кода, вики против кода, данные против схемы.

Где врали инструменты

Заметную часть находок приносят собственные сканеры. Сканеры ошибались, и довольно грубо.

Первый разборщик докстрок насчитал в Boost.GIL 42 расхождения, а в Boost.Histogram 25. Настоящих оказалось 11 и 3. Цифры от сломанной версии успели попасть в текст pull request и остались там навсегда, мейнтейнер их прочитал. После шести починок парсера отсев на уже разобранных площадках упал почти до нуля. Шум шёл от сканера, сама порода была в порядке с самого начала.

Второй случай. Приём поиска отставших копий чужого кода дал у karmada три кандидата. После чтения вызывающего кода подтвердился один. Ещё один отпал потому, что апстрим чинил там пересоздание обработчиков, а karmada ничего не пересоздаёт, и починка ей просто ни к чему.

Отсюда правило. Вывод скрипта это гипотеза. Находкой она становится после того, как человек прочитал вызывающий код и попробовал опровергнуть собственный вывод. Через это проходит каждая находка перед отправкой.

Этот шаг и отделяет работу от генератора шума.

Зачем это маркетологу

Отвечу прямо. Разработчиком меня не возьмут, и я туда не иду. Работает другое. Маркетологу, который идёт в инфраструктуру, девтулы или ИИ, труднее всего доказать, что он понимает продукт. Обычно это доказывается на собеседовании, долго и вязко. Профиль с влитыми правками в etcd и AFL++ закрывает вопрос до разговора.

И побочный эффект, которого я не планировал. За первые дни лично отвечали основатель rclone, ведущий мейнтейнер AFL++, сооснователь E2B и один из трёх создателей NetworkX. Письмо в компанию, чей репозиторий ты уже трогал, читается совсем иначе.