Тема
Шаблоны контрибьюта — design, задача, отчёт
Заполнители к CONTRIBUTING.md. Каждый <…> заменяется текстом, NNN — номером строки из прочитанного кода. Пустой раздел не оставляется: если раздел к изменению не относится, пишется «не затрагивается — потому что <причина, проверенная командой>». Формат квитанции ревью здесь не повторяется — он в docs/operations/design-review-gate.md §«Квитанция».
design.md
markdown
## Context
<Что есть сейчас: файлы и строки, которые изменение затрагивает. Метод
исследования — команды, которыми это установлено, с результатами.>
## Goals / Non-Goals
- Цель: <проверяемый признак успеха>
- Не входит: <что заведомо не делается и почему>
## Модель данных
| Сущность | Что меняется | Единственный писатель | Миграция |
|---|---|---|---|
| `<таблица.колонка>` | <создаётся/меняется/удаляется> | `<Тип::метод>` (`<файл>:NNN`) | <версия контракта, файл миграции либо «нет»> |
Проверено: `rg -n '<таблица>' crates/pm-engine/src --glob '!*_tests.rs' --glob '!**/tests/**'` → <список файлов>.
## Интерфейсы
| Порт/метод | Новый или меняется | Вызывающие (`файл:строка`) | Реализует | Default-тело |
|---|---|---|---|---|
| `<Порт::метод(сигнатура)>` | <новый/меняется> | `<файл>:NNN` | `<тип адаптера>` | нет |
Проверено: `rg -n '\.<метод>\(' crates/pm-engine/src --glob '!*_tests.rs' --glob '!**/tests/**'` → <N совпадений>.
## Место в жизненном цикле
Участник: `<компонент>`. Фаза: <запуск/прогрев/работа/остановка/завершение>.
Стартует: `<кто>` (`<файл>:NNN`). Останавливает: `<кто>` (`<файл>:NNN`).
При остановке ждём: <что именно, или «ничего — потому что …»>.
## Поток данных
<Откуда → куда.> Строки `events` в той же транзакции: <перечень или «нет»>.
Публикация на `EventBus` после `commit()`: `<файл>:NNN`. Исполняется в
задаче: <тракт стратегии / отдельная фоновая задача / приёмник наблюдений>.
## Контекст
Вход: `<тип>` (`event_id`, ревизия, стадия — <какие>). Выход: `<тип>`.
Разрыв «текущее ≠ цель» по `docs/target/event-context.md`: <назван или «нет»>.
## Конфликты
| Сценарий | Что делает код | Где |
|---|---|---|
| конкурентная запись | <…> | `<файл>:NNN` |
| повтор / дубликат | <…> | `<файл>:NNN` |
| сбой посередине операции | <…> | `<файл>:NNN` |
| отказ внешней системы | <…> | `<файл>:NNN` |
| деньги и округление | <инвариант и точка синхронной проверки> | `<файл>:NNN` |
## Скорость
На горячем пути: <да/нет, что именно>. Добавляется: аллокаций <N>, копий <N>,
vtable-диспетчей <N> — по коду `<файл>:NNN`. В фоновую задачу уходит: <что>.
## Тесты
| Требование | Положительный тест | Отрицательный тест | Двойники |
|---|---|---|---|
| <формулировка из spec> | `<файл>::<тест>` | `<файл>::<тест>` | `support::<…>` / `crate::testing::<…>` |
Проверено: `rg -n 'impl <Порт> for' crates/pm-engine/tests crates/pm-engine/src` → новых копий нет.
## Дублирование
| Что нужно | Уже есть | Решение |
|---|---|---|
| `<функция/тип>` | `<крейт>::<путь>` (`<файл>:NNN`) либо «нет — `rg -n '<имя>' crates/` → 0» | используем / выносим в `<общий модуль>` ДО реализации |
## Decisions
### D1. <Название решения>
Контекст: <…>. Варианты: (а) <…>; (б) <…>. Компромиссы: <…>. Риски: <…>.
Рекомендация: <вариант> — потому что <…>. Проверка: <команда → ожидаемый вывод>.
## Risks / Trade-offs
- <риск> → <чем ограничен>
## Migration Plan
1. <шаг> — проверка: <команда → вывод>
## Open Questions
- <вопрос оператору, без которого меняется поведение> — либо «нет»Строка задачи в tasks.md
markdown
- [ ] 2.1 <Что сделать — одно наблюдаемое изменение>. Проверка: `<команда>` → `<ожидаемый вывод>`.Закрытие задачи — только - [ ] → - [x]. Наблюдение (фактический вывод команды-проверки, отклонения) записывается в отчёт, а не дописывается в текст задачи: дописанный текст меняет слепок квитанции и обесценивает вердикт круга 2.
Строка CHANGELOG.md
2026-09-01 | Claude Code | <описание ≤100 знаков: что изменилось, не «обновил документацию»> | ???????????????? заменяет хешем координатор после вливания в main.
Отчёт
markdown
## Задача
<одна строка: что требовалось; дерево — вывод `git rev-parse --show-toplevel`>
## Что сделано
- `<файл>:NNN` — <что изменено и зачем>
- прочитаны AGENTS.md: `<путь>`, `<путь>`
- отклонения от design: <нет / что и где записано>
## Как проверяли
| Команда | Вывод |
|---|---|
| `cargo fmt --all -- --check` | пусто, код 0 |
| `cargo clippy --locked -p <крейт> --all-targets -- -D warnings` | `Finished`, 0 предупреждений |
| тесты `<крейт>` | `binaries=<n> passed=<p> failed=0 ignored=<i>` |
| `bash scripts/arch-gate.sh` | все `OK` |
| `bash scripts/design-review-gate.sh check` | `Ревью замысла пройдено` |
Не прогонялось: <перечень с причиной, либо «ничего»>.
## Примечания
- гипотезы (не проверены): <…, чем проверить>
- вопросы оператору: <…>
- незавершённое: <…, либо «нет»>
## Состояние дерева
`git -C <дерево> status --short`:
<вывод дословно>
Временные файлы: <«не создавались» / «созданы и удалены: <пути>»>.Отчёт о проблеме
Когда работа не может быть завершена: вместо оговорки в общем отчёте — четыре раздела, каждый заполнен.
markdown
## Проблема
<Что именно нарушено или не выполнено — одним предложением.>
## Факты
- `<файл>:NNN` — <что там написано>
- `<команда>` → `<вывод дословно>`
## Влияние
<Почему это важно: деньги, контракт, боевой процесс, ворота.>
## Требуемое действие
<Что нужно сделать до завершения и кто решает — оператор или исполнитель.>