mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
Вход агента до первого файла кода стоил ≈ 26 700 слов (аудит 22.09). - docs/process/AUTHOR.md и REVIEWER.md — выжимки PROCESS.md: каждый пункт ссылается на раздел канона, ключевые формулировки дословные; test/process-digests.test.mjs сверяет якоря, ссылки и правила. - scripts/entry-cost.mjs — маршрут чтения по роли и бюджет (автор ≤ 12 000 слов, AC1); AGENTS.md «Read this first» называет те же маршруты. - docs/STATUS.md: блок Snapshot генерирует scripts/status-snapshot.mjs (версии — release-contract, счётчики — inventory, теги — git); feature surface и ранние milestones перенесены дословно в docs/STATUS-FEATURES.md. - docs/TESTING.md — действующая инструкция (684 строки, AC3); ручные чек-листы и приложения по issue перенесены дословно в docs/testing-notes/ с индексом и тестом на полноту. - Промпт ревьюера в process.yml читает конспект вместо пересказа правил; машинные требования (строка вердикта, REVIEW_DOC, запрет fetch, таблица «чем краснеет», разделы повторного раунда) сохранены и закреплены тестом. - PROCESS.md: правила не менялись; добавлены ссылка на конспекты в шапке и уточнение в §10.4, что ревьюер конвейера читает конспект. - 7 мутантов в реестре. Issue: #634 User-Visible: no
17 KiB
17 KiB
Конспект для автора
Роли: аналитик, автор ТЗ, разработчик, автор инфраструктурной задачи (§6).
Это выжимка, а не канон. Канон процесса —
PROCESS.md; при расхождении побеждает он, а расхождение — issue с меткойprocess. Конспект правил не добавляет и не меняет: каждый пункт ссылается на раздел канона, где правило записано полностью, с причинами и прецедентами. Ссылки и ключевые формулировки сверяетtest/process-digests.test.mjs. Читать раздел канона целиком, когда пункт касается текущего шага.
Вход в процесс
- Изменение продуктового кода без issue запрещено. Код меняется только
из
S5-readyили дальше (§1, §3 п.1–2). - Классы: A — продукт (
src/**,custom_components/houseplan/**/*.py, манифесты, i18n); B — гейты и инструменты (test/**,tests_backend/**,demo/**,scripts/**,.github/**, конфиги сборки,package*.json); C — документация; D — сгенерированное (dist/**,custom_components/houseplan/frontend/**,demo/golden/baselines/**). При пересечении путей D сильнее A (§1). - Инфраструктурная задача — ни одного файла класса A: реализация сразу в
issue/<NN>-<slug>, без аналитики и ТЗ; локальные гейты зелёные, ветка запушена —S7-code-review. «В основном инфраструктурная» не бывает (§1). - Ровно одна метка статуса на issue;
blockedдополняет статус, а не заменяет; инфраструктурная задача до первогоS7может быть безS*(§9, §3 п.5). - Статус меняется до действия, а не после: взял — поставил метку (§3 п.4).
- Автор не ревьюит своё — ни ТЗ, ни код; автор и ревьюер — разные агенты/сессии (§3 п.6, §6).
Аналитика (S2-analysis)
- Чек-лист комментарием: дубликаты, скоуп по
docs/SCOPE.mdиdocs/TOUCH-SUPPORT.md, ценность, сложность и риск, приоритет, тип, поверхности, трек. Оценки ставятся метками сразу; молчание владельца — согласие; вS3-specаналитик переводит сам. Останавливается аналитика только на конфликте соSCOPE.md(§2.2). - Шаблон:
Оценка: ценность N/10 · сложность N/10 · P<1-3> · тип · поверхности: … · дубликаты: … · лёгкий трек: да/нет(§7.2). - Лёгкий трек
small— путь по умолчанию: обосновывается не выбор лёгкого трека, а отказ от него — называется нарушенный критерий. Критерии, все сразу: сложность и риск ≤ 3; одна поверхность; нет миграции конфига; нет нового UX-контракта; нет влияния на перф и touch (§5). - Короткий трек
trivial:S2-analysis→S5-ready, AC автор пишет в теле issue до перехода. Типbug, одна поверхность, без i18n, миграции, перфа и touch, не больше трёх AC, и ожидаемое поведение уже зафиксировано — решать нечего (§5.1).
ТЗ (S3-spec)
- ТЗ живёт в теле issue, раздел
## ТЗ; файл вdocs/specs/не создаётся (§2.3). - Обязательные разделы: сценарий · что человек увидит до и после · проблема · скоуп и не-скоуп · контракт поведения · UX · модель данных и миграция · i18n · AC1…ACn с доказательством · план автотестов · риски · откат · release-артефакты. На лёгком треке короче: проблема · контракт · AC · откат (§7.1, §5).
- Размытое место не додумывается. Владельцу задаются только продуктовые вопросы — что человек видит или делает и какой объём видимых изменений входит в issue. Всё, чего пользователь не наблюдает, автор решает сам и записывает блоком «принято предположительно, поменять свободно». Смешанный вопрос делится (§7.1).
- Вопросы — одним комментарием, пачкой: что неясно · что изменится от ответа ·
вариант по умолчанию. Пока ждём ответа, issue остаётся в
S3-specи получаетblocked(§7.1). - DoR перед
S5-ready: зелёное ревью ТЗ; пронумерованные AC со способом доказательства (unit/backend/smoke/golden/ «ревью кода»); файлы и модули; ключи i18n en + ru; миграция поdocs/CONFIG-COMPATIBILITY.md; перф; touch; release-артефакты; откат; нет открытых продуктовых вопросов (§2.5). - Лимит — 4 цикла ревью, на лёгком и коротком треке 2; зелёный вердикт цикла не тратит; исчерпание — решение владельца: разделить, отклонить, арбитраж (§4).
Реализация (S6-in-progress)
- Занятие:
Взял: <роль> · сессия <id> · ветка issue/NN-slug; WIP — одна задача в разработке на исполнителя (§2.6, §7.2). - Ветка
issue/<NN>-<slug>; каждый коммит несёт трейлерыIssue: #<NN>иUser-Visible: yes|no.User-Visible: yesтребует правок в обоих changelog в том же коммите. Послеcherry-pick -xтрейлеры остаются последним блоком (§2.6, §3 п.10). - Автотесты — часть реализации: каждый AC с пометкой
unit/backend/smoke/goldenполучает проверку здесь же (§2.6). - Приёмка проверяет результат для человека: обычный сценарий плюс самый рискованный соседний, у каждого наблюдаемый oracle. Шесть классов риска проходятся явно: async; данные и права; геометрия; визуал; объём и performance; host/input. Проверка имени метода или строки исходника oracle не считается (§2.6).
- Скоуп не расширяется: найденное по пути — новый issue; блокирующая находка —
blockedсо ссылкой (§2.6, §3 п.9). - Документация — в том же коммите, что и поведение: changelog RU+EN,
STATUS.md,DEVELOPMENT.md,ARCHITECTURE.md(§2.6, §3 п.11). - Сгенерированное не коммитится само по себе; golden принимаются только
npm run golden:accept -- --reviewedпо полному Linux-артефакту или аттестованному WSL-артефакту (§3 п.12–13). - Защитный AC доказывается таблицей «чем краснеет»: AC · чем доказан · чем краснеет (мутация, снятая защита или отрицательная проба с результатом). Пустой третий столбец — находка Medium. Мутант в реестре обязателен, когда защита в продуктовом коде и проверяется дорогим гейтом (§2.7).
- Контракты по монолиту — исполнением, не regex по тексту: экспорт функции и
вызов в
test-build; список текстовых якорей заморожен;npm run lint:unusedкрасит рост метрик монолита (§2.7). - Одно число — один источник: величина, которую пользователь видит дважды, считается в одном месте (§8).
- AC доказывает автотест или честное «проверено чтением, не исполнением» у ревьюера; «проверил локально» доказательством не является (§3 п.18).
Гейты перед хендоффом
- Минимальный набор по изменённым поверхностям:
npx tsc --noEmit,npm test,npm run buildсо сверкой копий бандла,smoke-selectи целевые смоки,no-new-any; по диффу —golden:verify,check-docs,model-invariants,pytest tests_backend, junction parity. Команды — в каноне (§8);npm run gate:smallсобирает обязательную часть (AGENTS.md, «Gates»). - Новый код не добавляет
any: гейт судит добавленные строки; исключение —// any-ok: <конкретная причина>на той же строке (§8). - Любая правка
src/**требуетnode scripts/check-docs.mjs: отпечаток скриншотов считается по всему фронтенду. Скриншоты снимает только CI; без изменения кадров —npm run docs:accept -- --identical(§8). - Полные наборы — предрелизный гейт, а не гейт ревью. Упавший предрелизный гейт автор чинит и повторно прогоняет; повторного код-ревью нет, если правка не меняет контракт, не задевает новую подсистему и не правит сам гейт (§8, §11.4).
- Хуки ставит
npm ci:commit-msgпроверяет трейлеры,pre-pushгоняетscripts/process-gate.mjs(§10.1, §10.2).
Хендофф и ожидание вердикта
- Хендофф:
Сделано: … · Файлы: … · Гейты: <команда → результат> · НЕ сделано: … · Риски: … · Следующий статус: … · Новые issue: #…(§7.2). - Один хендофф — один пуш: материал пушится до метки, перед пушем
node scripts/process-gate.mjs --issues; послеS7-code-reviewв ветку не пушить до вердикта;S7ставится один раз на заход (§10.4). - Ревью не начинается на красном коде: конвейер сам гоняет Validate с
мутантами и возвращает красный в
S6-in-progressбез траты цикла (§10.4). - Ветка приводится к
devдо ревью, а не после: конфликт — возврат вS6-in-progressдо ревью (§10.4). - Автор обязан дождаться вердикта, а не заканчивать сессию:
node scripts/wait-verdict.mjs --issue NN, смотреть на метку, а не на комментарий; приblockedне ждать. После прогона ревью метка меняется всегда; не сменилась — упал сам прогон (§10.4). - Вперёд двигает только зелёный вердикт; жёлтый и красный возвращают автору. Medium в скоупе чинится в текущем issue, вне скоупа — отдельный issue (§7.2, §3 п.8).
- Зелёное ревью с неудавшимся слиянием —
S6-in-progress: остался ребейз, после него сноваS7;S8-mergedставится только после push вdev(§10.4). - Issue закрывает релиз-менеджер после выпуска беты, не исполнитель (§2.8, §3 п.14).
Запрещено
- Код без issue или из статуса раньше
S5-ready; ТЗ после кода (кроме хотфикса); ревью своей работы; пятый цикл ревью; issue вместо возврата на правки (§12). - Попутные правки «раз уж я здесь»; параллельные бэклоги в файлах;
force-push в
dev; закрытие issue до выпуска беты (§12, §3 п.17). - Принятие golden-эталонов ради зелёного CI; Medium, оставленные как TODO в документе ревью (§12).
- Аварийный хотфикс — только решением владельца, с issue в той же сессии до коммита (§11.2).