CONTRIBUTING.md для первого воспроизводимого вклада
Практическая структура CONTRIBUTING.md, которая ведёт нового участника от чистого поддерживаемого окружения к проверяемому изменению и отделяет прохождение проверок от решения сопровождающего.
Хороший CONTRIBUTING.md ведёт нового участника по одному проверенному маршруту: показывает поддерживаемое окружение, способ получить исходное дерево, установить зависимости, выбрать небольшое изменение, запустить те же проверки, что использует проект, и описать результат так, чтобы сопровождающий мог его воспроизвести. В документе нужны не общие пожелания, а точные входные данные, реальные команды проекта, наблюдаемые признаки успешного выполнения и понятный способ сообщить о сбое.
При этом руководство не должно обещать принятие изменения. Прошедшие проверки подтверждают только то, что перечисленные проверки завершились ожидаемым образом. Архитектурная пригодность, границы изменения, понятность решения и другие вопросы остаются предметом проверки сопровождающего. Поэтому CONTRIBUTING.md разделяет автоматические условия, ручную оценку и случаи, когда работу следует остановить до публикации.
Начните с маршрута первого вклада
Новый участник открывает руководство не ради полного описания внутренней жизни проекта. Ему нужен короткий путь от чистого окружения до проверяемого результата. Этот путь лучше поставить в начало, а редкие варианты, альтернативные среды и особые случаи вынести в отдельные документы. Иначе основная последовательность теряется среди исключений, а человек вынужден угадывать, какие разделы относятся к его задаче.
Короткий маршрут должен отвечать на последовательные вопросы: какое окружение поддерживается, какое исходное состояние брать, как установить зависимости, где искать подходящую задачу, какие файлы допустимо менять, какие проверки выполнить, что считать прохождением и что приложить к описанию изменения. Если один из ответов зависит от знания привычек команды, значит руководство пока не самодостаточно.
Критерий качества маршрута прост: участник, который не видел локальную машину сопровождающего, может повторить шаги и получить либо ожидаемый результат, либо диагностируемый сбой.
Опишите входные данные, а не только название инструмента
Фраза «установите обычное окружение разработки» не задаёт воспроизводимый вход. В CONTRIBUTING.md следует назвать поддерживаемую версию среды выполнения, используемый менеджер пакетов, способ получения исходного дерева и обязательные системные компоненты. Если проекту нужен внешний сервис, переменная среды или локальный файл конфигурации, это тоже часть входных данных, а не подразумеваемое знание.
Версии библиотек закрепляют в файле описания проекта и файле фиксации зависимостей. Текстовое указание вроде «возьмите свежую версию» быстро расходится с фактической сборкой и не позволяет понять, какое состояние проверялось. Однако файл фиксации зависимостей не устанавливает отсутствующий системный комплект разработки, не запускает внешний сервис и не создаёт нужную переменную среды. Эти условия нужно перечислить отдельно.
Полезно явно указать, что считается каноническим состоянием: ветвь, метка или иная выбранная точка исходного дерева. Само название транспорта не делает вклад воспроизводимым. Веб-интерфейс площадки может помогать отправить изменение, но порядок установки, проверки и описания должен оставаться понятным независимо от конкретной кнопки или формы.
Проверяйте руководство на чистом окружении
Команда, которая проходит на машине автора, может незаметно использовать глобально установленный инструмент, старый кэш или переменную среды. Поэтому инструкции проверяют не там, где проект уже давно настроен, а в чистом поддерживаемом окружении. Цель такой проверки — обнаружить скрытые предпосылки до того, как их найдёт новый участник.
Проверка начинается с зафиксированного исходного состояния. Затем выполняют только действия, перечисленные в CONTRIBUTING.md, без ручных исправлений между шагами. Для каждого этапа записывают вход, выполненную команду, наблюдаемый результат и отклонение. Если пришлось вспомнить дополнительную настройку, установить инструмент вне инструкции или повторить шаг в другом порядке, маршрут считается неполным.
Журнал проверки не обязан быть публичным отчётом на каждую попытку, но у команды должна оставаться проверяемая запись: какое окружение использовали, какой вариант инструкции прошли, где возник сбой и какое изменение внесли в документ. Такая запись отделяет подтверждённый путь от предположения «у нас обычно работает».
Покажите, как выбрать небольшую подходящую задачу
Первый вклад проще воспроизвести, когда его область ограничена и заранее понятна. Руководство должно объяснять, где описаны допустимые задачи, какие изменения подходят новичку и какие темы требуют предварительного обсуждения. Здесь важен не ярлык в системе задач, а наблюдаемые признаки: понятна ожидаемая правка, видны затронутые файлы, можно проверить результат, не требуется скрытое решение о направлении проекта.
Полезно отделить исправление локального дефекта, уточнение документации и небольшое покрытие тестом от изменения архитектуры, формата данных или внешнего поведения. Последние варианты могут быть обоснованными, но участнику нужно заранее знать, что сначала следует согласовать область. Иначе он выполнит большую работу, а сопровождающий будет вынужден отклонить не качество исполнения, а сам выбранный путь.
Критерий остановки здесь должен быть прямым: если задача не имеет подтверждённой области, затрагивает неописанные интерфейсы или требует решения, которого нет в открытых правилах, работу не продолжают как готовый вклад. Сначала фиксируют вопрос и получают решение владельца соответствующей части проекта.
Дайте точные команды и объясните проходящий результат
В CONTRIBUTING.md нужны реальные команды форматирования, статических проверок, тестов и сборки, которые применяются именно в этом проекте. Их берут из действующей конфигурации и проверяемого процесса, а не сочиняют для документа. Участник должен иметь возможность скопировать команду без замены скрытых параметров и без знания локальных сокращений сопровождающего.
Рядом с каждой командой описывают не только действие, но и наблюдаемый результат. Недостаточно написать «запустите тесты». Нужно объяснить, какой признак означает завершение без ошибок, где появляется отчёт, какие предупреждения допустимы по правилам проекта и какие сообщения требуют остановки. Это не универсальная расшифровка любого вывода, а локальное описание тех сигналов, которые команда действительно использует.
Если проверка состоит из автоматической и ручной частей, их разделяют. Автоматическая часть может подтвердить формат, выполнение тестов или сборку. Ручная часть может оценивать соответствие области, понятность изменения, сохранение выбранной структуры и достаточность объяснения. Смешивание этих уровней создаёт ложное впечатление, будто зелёный результат автоматически означает принятие.
Свяжите стиль, тесты и тестовые данные с проверками
Требование «следуйте стилю проекта» полезно только тогда, когда участник понимает, где этот стиль закреплён и как обнаруживается отклонение. Если правило проверяется автоматически, CONTRIBUTING.md указывает соответствующую команду и результат. Если правило проверяется вручную, документ описывает наблюдаемый критерий: область именования, структура изменения, формат сообщений или иной локально установленный признак.
То же относится к тестам. Руководство должно объяснять, когда изменение требует нового теста, где размещаются тесты и какие данные допустимо использовать. Тестовые данные не должны появляться из секретной среды или личного набора сопровождающего. Если для сценария нужен подготовленный пример, его источник и способ создания должны быть частью воспроизводимого пути.
Участнику также нужен способ сообщить, что проверка не воспроизводится. Полезное сообщение содержит исходное состояние, окружение, выполненный шаг, ожидаемый признак и фактически наблюдаемый результат. Такой формат помогает отличить дефект инструкции от ошибки в изменении и не заставляет сопровождающего восстанавливать контекст по фразе «не работает».
Объясните требования к описанию изменения
Хорошее описание позволяет проверить не только код, но и замысел. В CONTRIBUTING.md следует попросить участника назвать проблему, границы правки, выбранное решение, выполненные проверки и известные ограничения. Если изменение связано с открытой задачей или предварительным обсуждением, связь указывают по принятому в проекте способу, не превращая конкретный интерфейс площадки в основу всего процесса.
Описание не должно требовать рекламного обоснования или обещания отсутствия рисков. Достаточно отделить наблюдаемые факты от предположений: что изменено, что не изменено, каким способом проверено и что осталось за пределами проверки. Такая структура помогает сопровождающему повторить шаги и увидеть, где требуется собственное суждение.
Для крупного или спорного изменения руководство может требовать предварительного согласования. Это не гарантия последующего принятия, а способ не смешивать решение о направлении с проверкой исполнения. Если область изменилась в ходе работы, участник должен обновить описание и снова проверить, применимы ли первоначальные критерии.
Разделите проверку и решение о принятии
Критерии принятия должны быть видимыми, но не формулироваться как автоматическое обещание слияния. Документ перечисляет минимальные условия: изменение относится к согласованной области, проверки выполнены, результат описан, тестовые данные допустимы, документация обновлена там, где это требуется локальным процессом. Затем отдельно указывает, какие вопросы остаются за сопровождающим.
Сопровождающий может оценивать архитектурную пригодность, размер области, понятность решения, влияние на поддерживаемую структуру и соответствие текущему направлению проекта. Прошедшие тесты не снимают эти вопросы. Такое разделение защищает обе стороны: участник знает, что обязан проверить, а команда не выдаёт автоматические сигналы за окончательное решение.
Результат проверки лучше записывать по пунктам: что подтверждено автоматически, что просмотрено вручную, какие замечания блокируют принятие, какие относятся к последующей работе. Если решение отрицательное, полезно указать, связано ли оно с дефектом исполнения, неподходящей областью или отсутствием необходимого решения владельца.
Разведите обычный дефект и сообщение об уязвимости
Обычный дефект можно описывать через публичный канал проекта, если сообщение не содержит секретные данные и сведения о ещё не исправленной уязвимости. CONTRIBUTING.md должен кратко сказать, какие сведения нужны для воспроизведения: исходное состояние, окружение, шаги, ожидаемое и фактическое поведение.
Для предполагаемой уязвимости нужен отдельный приватный маршрут. Публичная задача не подходит, когда сообщение раскрывает сведения о ещё не исправленной уязвимости, секреты или иные закрытые данные. CONTRIBUTING.md не обязан заменять политику безопасности: он должен направить участника к каноническому приватному процессу и явно попросить не размещать такие данные публично.
Это разделение следует формулировать без обещаний скорости исправления или гарантии результата. Руководство определяет канал и минимальный состав сообщения, а дальнейшая обработка относится к отдельному процессу безопасности и управления проектом.
Зафиксируйте журнал проверки и критерии остановки
Воспроизводимый вклад заканчивается не нажатием кнопки отправки, а записью того, что было проверено. Участник перечисляет выполненные команды, их результат, ручные проверки и ограничения окружения. Сопровождающий при необходимости повторяет этот маршрут и отмечает расхождения. Так появляется журнал, по которому можно понять, почему изменение считалось готовым к рассмотрению.
Критерии остановки нужны не меньше, чем критерии прохождения. Работу следует приостановить, если инструкция требует неописанного инструмента, файл фиксации зависимостей расходится с описанным процессом, обязательный сервис недоступен, проверка даёт необъяснённый результат, тестовые данные содержат закрытые сведения или область изменения вышла за согласованные границы. Остановка не равна окончательному отказу; она означает, что дальнейший шаг пока нельзя проверить.
После устранения причины маршрут проходят заново с того исходного состояния, для которого заявлена поддержка. Простое повторение последней команды может скрыть влияние кэша или ручного исправления. Повторная проверка должна показать, что обновлённая инструкция работает как последовательность, а не как воспоминание человека, который уже знает обходной путь.
Обновляйте CONTRIBUTING.md вместе с процессом
Руководство устаревает при смене среды выполнения, менеджера пакетов, набора проверок, структуры проекта или порядка рассмотрения изменений. Поэтому изменение инструментария не завершено, пока не обновлён путь первого вклада. То же относится к удалённой команде, новому обязательному сервису, изменению тестовых данных или переносу канонических правил.
Проверяемым признаком актуальности служит не дата редактирования сама по себе, а повторно пройденный маршрут. Команда должна видеть, какое изменение процесса потребовало обновления CONTRIBUTING.md, кто проверил новый путь и какой результат получен. Если инструкция больше не подтверждается на поддерживаемом окружении, её нельзя оставлять как формально существующую.
При этом CONTRIBUTING.md не должен поглощать все документы проекта. Он связывает участника с правилами поведения, политикой безопасности, лицензией и устройством управления, но не заменяет их. Его собственная задача уже: провести человека от известного исходного состояния к проверяемому изменению и честно показать, где заканчиваются автоматические проверки и начинается решение сопровождающего.
Каркас, который можно проверить
- Поддерживаемое окружение: версия среды, менеджер пакетов, системные зависимости, сервисы и переменные.
- Исходное состояние: каноническая точка дерева и один подтверждённый способ установки.
- Первый маршрут: небольшая задача, допустимая область и случаи предварительного согласования.
- Проверки: реальные команды проекта, ожидаемые признаки прохождения и способ сообщить сбой.
- Правила изменения: стиль, тесты, тестовые данные, описание границ и известных ограничений.
- Рассмотрение: автоматические условия, ручная оценка и отсутствие гарантии принятия.
- Безопасность: отдельный приватный путь для сообщения о предполагаемой уязвимости.
- Актуальность: повторная проверка на чистом окружении после изменения процесса.
Такой CONTRIBUTING.md не пытается предсказать каждую ситуацию. Он делает видимым основной путь, входные данные, наблюдаемый результат и точки, где требуется остановка или решение владельца. Именно это превращает первый вклад из набора внутренних привычек в воспроизводимый процесс.