mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
Волна 3 эпика #674. AGENTS.md 650 → 187 строк: карта пакета, маршрут чтения, правило №1, классы и треки одной строкой со ссылками, трейлеры, рабочие деревья, хендофф и ожидание вердикта; пересказы PROCESS.md — ссылками на разделы. Неверный список «Gate jobs» снят (списки jobs не копируются в прозу, шапка PROCESS.md). Правила, жившие только в AGENTS, получили дом: жёлтый вердикт при выполненных AC — PROCESS §2.7; свежесть бандла, съёмка только в Linux (#455, HP_ALLOW_FOREIGN_CAPTURE) и смоки из AC до S7 (#151) — TESTING.md; причуда демо-стенда и среда-зависимый smoke_opening_measure — DEVELOPMENT › Smoke tests; отказ публикации без `Release:` и при несвежем отпечатке бандла, отмена Validate новым пушем, кандидат беты не promotion-only, fail-closed реестра Labs — DEVELOPMENT; предупреждение и ошибка свежести скриншотов — CONTRIBUTING. PROCESS.md: §13 (внедрение с открытым ⏳), §14 (блок со ссылкой на несуществующий docs/PROCESS.md) и §7.3 (история) удалены. Ссылки «§7.2» на правило полного разбора после ребейза ведут в §2.10, на сверку SHA перед выводом — в §2.7; то же в сообщениях scripts/branch-state.mjs, merge-candidate.mjs, review-doc-guard.mjs, pre-push-gate.mjs, в промпте _process.yml и TESTING.md. Число `any` в прозе → `node scripts/no-new-any.mjs --total` (новый режим, юнит-тест; было «1034 в 49 файлах», сейчас 862 в 52), дата-число замороженного списка якорей монолита снято. Устаревшая команда пересъёмки скриншотов в §8 заменена ссылкой на действующий путь. STATUS.md 113 → 61 строка: сгенерированный снимок, текущий цикл и девять строк решений; Workflow, CI, Toolchain, Tests, Scope, open items и политика документации — ссылками (PROCESS §2.6, DEVELOPMENT › Release, TESTING); локали en/ru/de/fr; закрытые «coverage, mypy strict» сняты. DEVELOPMENT.md: file-sync и «Reproducible scripts» (прототип) удалены; раздел Release — единственный дом релизной механики: введение, правила тела стабильного релиза (#328, release:notes), шаг continuity:screencast, источники версии по release-contract. CONTRIBUTING: ссылка на Release вместо пересказа, замеры клона без чисел. TESTING: any-гейт — ссылкой на PROCESS §8. entry-cost: автор 11 125 → 5 407 слов, ревьюер 8 464 → 4 285. Issue: #680 User-Visible: no Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
18 KiB
18 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+bundle-policy --verify,smoke-selectи целевые смоки,no-new-any; по диффу —golden:verify,check-docs,model-invariants,pytest tests_backend, junction parity. Команды — в каноне (§8);npm run gate:smallсобирает обязательную часть (docs/TESTING.md, «Локальный набор перед пушем»). - Бандл в коммит задачи не идёт: сборка переписывает отслеживаемый
dist/, перед коммитом —npm run bundle:clean; хукcommit-msgотклоняет пути бандла без трейлераRelease:(#657, §1). - Новый код не добавляет
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).