|
| 1 | +# Процесс разработки (SDD: Spec-Driven Development) |
| 2 | + |
| 3 | +Этот документ описывает канонический цикл разработки в `docker-git`: от issue до |
| 4 | +проверяемого PR. Он отвечает на вопрос «как должна проходить разработка» из |
| 5 | +[issue #390](https://github.com/ProverCoderAI/docker-git/issues/390) и связывает |
| 6 | +шаги процесса с уже существующими инструментами репозитория. |
| 7 | + |
| 8 | +Базовая философия задана в [`AGENTS.md`](../AGENTS.md) и [`CLAUDE.md`](../CLAUDE.md): |
| 9 | + |
| 10 | +> «Если это нельзя доказать — это нельзя доверить продакшену.» |
| 11 | +> Каждая функция — теорема, каждый тест — доказательство, каждый тип — утверждение. |
| 12 | +
|
| 13 | +SDD означает, что **сначала формализуем (спецификация + инварианты), потом |
| 14 | +программируем**. Спецификация и её инварианты живут вместе с кодом и проверяются |
| 15 | +автоматически. |
| 16 | + |
| 17 | +## Обзор цикла |
| 18 | + |
| 19 | +```text |
| 20 | +issue ──▶ clone (среда) ──▶ /plan ──▶ уточнение ТЗ + Deep Research |
| 21 | + │ │ |
| 22 | + │ ▼ |
| 23 | + │ Story + Prove (инварианты проверяемости) |
| 24 | + │ │ |
| 25 | + │ апрув плана ──▶ plan-to-git ──▶ PR (память) |
| 26 | + │ │ |
| 27 | + │ ▼ |
| 28 | + └──────────────── разработка (код + тесты + Playwright MCP) |
| 29 | + │ |
| 30 | + ToDos + subagents (декомпозиция) |
| 31 | + │ |
| 32 | + ▼ |
| 33 | + CI/CD ──▶ сверка с инвариантами плана ──▶ merge |
| 34 | +``` |
| 35 | + |
| 36 | +## 1. Issue — источник истины |
| 37 | + |
| 38 | +Разработка всегда начинается с issue. Issue фиксирует намерение и становится |
| 39 | +точкой привязки для плана, PR и итоговой проверки инвариантов. |
| 40 | + |
| 41 | +## 2. Среда: клонирование с изоляцией |
| 42 | + |
| 43 | +Для каждой issue поднимается отдельное Docker-окружение. Браузерная автоматизация |
| 44 | +включается флагом `--mcp-playwright` (Playwright MCP + Chromium sidecar): |
| 45 | + |
| 46 | +```bash |
| 47 | +bun run docker-git clone https://github.com/ProverCoderAI/docker-git/issues/390 --force --mcp-playwright |
| 48 | +``` |
| 49 | + |
| 50 | +- `--force` пересоздаёт окружение и удаляет volumes проекта. |
| 51 | +- `--mcp-playwright` включает Playwright MCP для проверки кода в реальном браузере. |
| 52 | +- `--auto` (или `--auto=codex|claude|gemini|grok`) запускает агента, который сам |
| 53 | + выполнит задачу, создаст PR и очистит контейнер после завершения. |
| 54 | + |
| 55 | +Подробности по флагам — в [`README.md`](../README.md). |
| 56 | + |
| 57 | +## 3. Планирование: `/plan` |
| 58 | + |
| 59 | +Агенту передаётся ссылка на issue и команда `/plan`. На этом этапе агент **не |
| 60 | +пишет код**, а формализует задачу: |
| 61 | + |
| 62 | +1. **Задаёт уточняющие вопросы** и фиксирует ТЗ. Неоднозначности проясняются до |
| 63 | + начала разработки, а не во время неё. |
| 64 | +2. **Ведёт Deep Research.** Внутренняя формулировка из `AGENTS.md`: |
| 65 | + «I am looking for code that does `<requested functionality>`, is there existing |
| 66 | + code that can do this?» Сперва ищем переиспользуемые паттерны в репозитории, |
| 67 | + затем — внешние источники. Внешний материал цитируется дословно (`SOURCE:`), |
| 68 | + иначе `SOURCE: n/a`. Похожий подход к правилам ресёрча см. |
| 69 | + [contract-knowledge/.cursorrules](https://github.com/ton-ai-core/contract-knowledge/blob/main/.cursorrules). |
| 70 | +3. **Формирует Story** — итог плана. Story описывает поведение в терминах |
| 71 | + пользователя и завершается блоком **Prove**: инвариантами, по которым |
| 72 | + проверяется выполнение задачи. |
| 73 | + |
| 74 | +### Story + Prove (инварианты проверяемости) |
| 75 | + |
| 76 | +Каждая Story обязана содержать проверяемые инварианты — пред-/постусловия и |
| 77 | +свойства, которые можно подтвердить тестом, типом или прогоном CI. Это основной |
| 78 | +артефакт SDD: именно по нему сверяется результат разработки. |
| 79 | + |
| 80 | +```markdown |
| 81 | +## Story: <краткое название> |
| 82 | + |
| 83 | +Как <роль>, я хочу <возможность>, чтобы <ценность>. |
| 84 | + |
| 85 | +### Prove (инварианты проверяемости) |
| 86 | + |
| 87 | +- INV-1: ∀ вход ∈ Domain: <предусловие> → <постусловие> |
| 88 | +- INV-2: <свойство, проверяемое property-based тестом> |
| 89 | +- INV-3: <наблюдаемое поведение, проверяемое через CI / Playwright MCP> |
| 90 | + |
| 91 | +### Способ проверки каждого инварианта |
| 92 | + |
| 93 | +- INV-1 → unit/property тест `<имя>` |
| 94 | +- INV-2 → `bun test <путь>` |
| 95 | +- INV-3 → шаг CI `<job>` / сценарий Playwright |
| 96 | +``` |
| 97 | + |
| 98 | +Формат инвариантов согласован с разделом «PROOF-обязательства в PR» в |
| 99 | +[`AGENTS.md`](../AGENTS.md) и [`CLAUDE.md`](../CLAUDE.md). |
| 100 | + |
| 101 | +## 4. Апрув плана → `plan-to-git` → PR |
| 102 | + |
| 103 | +Когда план одобрен, он не должен теряться. Инструмент |
| 104 | +[`plan-to-git`](https://github.com/ProverCoderAI/plan-to-git) автоматически |
| 105 | +выгружает захваченные планы в комментарий PR — так план становится постоянной |
| 106 | +памятью разработки и привязывается к ветке. |
| 107 | + |
| 108 | +В сгенерированных окружениях это уже подключено (см. PR #371, |
| 109 | +«feat(shell): sync agent plans to pull requests»): |
| 110 | + |
| 111 | +- бинарь `plan-to-git` устанавливается в образ проекта; |
| 112 | +- managed-хук Codex захватывает явные планы (`plan-to-git hook --source codex`); |
| 113 | +- `plan-to-git sync` запускается из git post-push обёртки перед бэкапом сессии. |
| 114 | + |
| 115 | +Таким образом апрувнутый план фиксируется в PR без ручных действий — память о |
| 116 | +намерении сохраняется даже при пересоздании контейнера. |
| 117 | + |
| 118 | +## 5. Разработка |
| 119 | + |
| 120 | +После принятия плана начинается реализация (Codex / выбранный агент): |
| 121 | + |
| 122 | +- агент пишет код, **запускает тесты и проверяет работоспособность**; |
| 123 | +- при необходимости использует **Playwright MCP** для проверки написанного кода |
| 124 | + в браузере; |
| 125 | +- активно ведёт **ToDos** и использует **subagents** для декомпозиции крупной |
| 126 | + задачи на независимые проверяемые шаги. |
| 127 | + |
| 128 | +Код пишется только после формального понимания задачи: типы и инварианты → |
| 129 | +архитектура (CORE/SHELL) → код → тесты. Минимальный корректный diff |
| 130 | +предпочтительнее переписывания. |
| 131 | + |
| 132 | +## 6. Верификация и сверка с инвариантами |
| 133 | + |
| 134 | +После реализации: |
| 135 | + |
| 136 | +1. Агент проверяет **CI/CD** (сборка, типчек, тесты, линтеры). |
| 137 | +2. **Сверяет результат с инвариантами плана** (блок Prove): каждый инвариант |
| 138 | + Story должен иметь подтверждение — пройденный тест, проверку типа или зелёный |
| 139 | + шаг CI / сценарий Playwright. |
| 140 | + |
| 141 | +Если любой шаг не проходит — возврат в петлю ресёрча (см. `AGENTS.md`), а не |
| 142 | +обход проверки. |
| 143 | + |
| 144 | +## 7. Доказательство фикса (proof-of-fix) |
| 145 | + |
| 146 | +При исправлении проблемы агент **всегда** добавляет краткое доказательство в PR: |
| 147 | +**почему возникла проблема** и **как она решена**. Кратко, по существу. |
| 148 | + |
| 149 | +```markdown |
| 150 | +## Proof of fix |
| 151 | + |
| 152 | +- Причина: <корневая причина, кратко> |
| 153 | +- Решение: <что изменено и почему это устраняет причину> |
| 154 | +- Доказательство: <тест/прогон, который падал до и проходит после> |
| 155 | +``` |
| 156 | + |
| 157 | +Фикс без воспроизводящего теста считается неполным: без воспроизведения нельзя |
| 158 | +проверить исправление, и возможна регрессия. |
| 159 | + |
| 160 | +## 8. Борьба с дублированием |
| 161 | + |
| 162 | +Нужны инструменты и привычки, устраняющие дублирование кода и дублирование |
| 163 | +смысла: |
| 164 | + |
| 165 | +- перед написанием нового кода — Deep Research по существующим реализациям |
| 166 | + (шаг 3.2), чтобы переиспользовать, а не копировать; |
| 167 | +- одна единица смысла — одно место определения (типы, инварианты, константы); |
| 168 | +- при обнаружении дублирования — выделение общего модуля вместо копии. |
| 169 | + |
| 170 | +## Чек-лист цикла |
| 171 | + |
| 172 | +- [ ] Issue зафиксировала намерение. |
| 173 | +- [ ] Среда поднята (`clone`, при необходимости `--mcp-playwright`). |
| 174 | +- [ ] План уточнён вопросами и Deep Research. |
| 175 | +- [ ] Story содержит блок Prove с проверяемыми инвариантами. |
| 176 | +- [ ] План одобрен и выгружен в PR через `plan-to-git`. |
| 177 | +- [ ] Реализация ведётся через ToDos/subagents, с тестами и (при необходимости) |
| 178 | + Playwright MCP. |
| 179 | +- [ ] CI/CD зелёный; каждый инвариант Story подтверждён. |
| 180 | +- [ ] Для фикса добавлено proof-of-fix. |
| 181 | +- [ ] Дублирование кода и смысла исключено. |
0 commit comments