mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-02 21:01:21 +00:00
Five places still described the pipeline as it was before code that is already in dev: - the S3 hint of the task packet told the author to push the branch, while the spec lives in the issue body (§2.3, #517) and nothing is pushed before S5 (§11.8); - process-gate printed «FAIL п.9 Gates: light» for a trailer nobody writes or reads, while §10.2 item 9 is the unimplemented release:prerelease verdict check. The check is removed; a contract test ties every RULES key to an implemented item of §10.2 and every finding number to a RULES key; - §10.4 item 4 demanded a heredoc in run:, while #723/#730 and their tests demand the opposite: commit messages echo line by line into a file, comment and summary texts come from code; - the ship merge comment, AUTHOR.md, REVIEWER.md and AGENTS.md named only the pre-beta document, though since #727 the night reads ship code first; - the nightly publication committed «docs: ship review for nightly … перед бетой» with the beta step's Issue: #696. It now has its own subject (the document name), body and Issue: #727; the beta message is unchanged. The browser-guard inventory note still said growth above 200 fails mutation-gate --check; since #699 it is a guideline and --check warns. Its counts now match the inventory: 205, lifecycle 90. Issue: #748 User-Visible: no Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
26 KiB
26 KiB
Конспект для автора
Роли: аналитик, автор ТЗ, разработчик, автор инфраструктурной задачи (§6).
Это выжимка, а не канон. Канон процесса —
PROCESS.md; при расхождении побеждает он, а расхождение — issue с меткойprocess. Конспект правил не добавляет и не меняет: каждый пункт ссылается на раздел канона, где правило записано полностью, с причинами и прецедентами. Ссылки и ключевые формулировки сверяетtest/process-digests.test.mjs. Читать раздел канона целиком, когда пункт касается текущего шага.
Вход в процесс
- Изменение продуктового кода без issue запрещено. Код меняется только
из
S5-readyили дальше (§1, §3 п.1–2). Исключение — локальный черновик наtrack:askво время ревью ТЗ (§11.8). - Классы: 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, ценность, сложность и риск, приоритет, тип, поверхности, трек. Оценки ставятся метками сразу; молчание владельца — согласие; дальше аналитик переводит сам:track:ask— вS3-spec,track:show— вS5-ready. Останавливается аналитика только на конфликте соSCOPE.md(§2.2). - Шаблон:
Оценка: ценность N/10 · сложность N/10 · P<1-3> · тип · поверхности: … · дубликаты: … · трек: ship/show/ask (причина)(§7.2). - Трек задаёт метка
track:ship,track:showилиtrack:ask, по умолчаниюtrack:show. Метка владельца главнее критериев; повысить трек может любой агент с причиной в комментарии, понизить — только владелец (§5). - Трек подтверждает только владелец — строкой
Трек: <ship|show|ask> — решение владельцав начале строки комментария. Метка без такой строки — предложение. Агент эту строку не пишет никогда. Несколько трековых меток — действует строжайшая (§5). - Рискованный участок (геометрия, touch, миграция, устройства, perf, новый
UX-ключ) в
shipбез подтверждения владельца конвейер повышает доshowприS7; наshowревьюер спросит, где поведение зафиксировано, — нет ссылки, повысь трек доaskдоS7. Классы и следствие печатает пакет задачи (§5). - Вердикт код-ревью
showсroute: reclassifyконвейер исполняет сам:track:ask,S3-specи комментарий с критерием §5 (#726). Дальше — полное ТЗ по §7.1 в теле issue под## ТЗи ревью ТЗ; код остаётся в ветке, код класса A не пушить доS5. Бюджет код-ревью не обнуляется, лимит — 4. Подтверждённый владельцемshowполучаетblockedи вопрос владельцу (§5). track:show:S2-analysis→S5-ready, до трёх AC автор пишет в теле issue до перехода; ревью ТЗ нет, лимит код-ревью 2. Уместен, когда всё сразу: сложность и риск ≤ 3, одна поверхность, нет миграции, нового UX-контракта, влияния на перф и touch, и ожидаемое поведение уже зафиксировано — решать нечего (§5).track:ship:S1-new→S5-ready, в теле issue строка «что меняется и чем проверить». Рамки: диффsrc/**до 30 строк, без новых файлов, i18n, полей конфига и Python (§5).- Тяжёлые проверки на любом треке — метками
ci:fullиci:golden;ci:goldenставится по сигналу — визуальный риск в пути отрисовки плана, — а риск сам полного набора не включает; прежниеsmallиtrivialчитаются какtrack:show(§5.1).
ТЗ (S3-spec)
- ТЗ живёт в теле issue, раздел
## ТЗ; файл вdocs/specs/не создаётся (§2.3). - Обязательные разделы: сценарий · что человек увидит до и после · проблема ·
скоуп и не-скоуп · контракт поведения · UX · модель данных и миграция ·
i18n · AC1…ACn с доказательством · план автотестов · риски · откат ·
release-артефакты. На
track:show— до трёх AC, наtrack:ship— одна строка (§7.1, §5). - Размытое место не додумывается. Владельцу задаются только продуктовые вопросы — что человек видит или делает и какой объём видимых изменений входит в issue. Всё, чего пользователь не наблюдает, автор решает сам и записывает блоком «принято предположительно, поменять свободно». Смешанный вопрос делится (§7.1).
- Дефект растра, резкости или композитинга: до кода нужен свидетель, красный на старом коде именно по симптому владельца; в AC — подтверждение владельца в реальном GPU-браузере. Headless-доказательства мало (урок #685 → #689, §7.1).
- Вопросы — одним комментарием, пачкой: что неясно · что изменится от ответа ·
вариант по умолчанию. Пока ждём ответа, issue остаётся в
S3-specи получаетblocked(§7.1). - DoR перед
S5-ready: наtrack:askзелёное ревью ТЗ; пронумерованные AC со способом доказательства (unit/backend/smoke/golden/ «ревью кода»); файлы и модули; ключи i18n en + ru; миграция поdocs/CONFIG-COMPATIBILITY.md; перф; touch; release-артефакты; откат; нет открытых продуктовых вопросов. Наshipиshowпункты DoR закрываются словом «нет» (§2.5). - Лимит — 4 цикла ревью, на
track:show2 цикла код-ревью; зелёный вердикт цикла не тратит; бюджет этапа один на все треки задачи; вердикт, исчерпавший бюджет, сразу ставитreview-4; исчерпание — решение владельца: разделить, отклонить, арбитраж (§4).
Черновик во время ревью ТЗ (S4-spec-review)
- Черновик — возможность, а не обязанность: только
track:ask, только после того, как ТЗ отправлено и стоитS4-spec-review; подblockedиreview-4не ведётся. Цена — код по непринятому тексту, который после жёлтого или красного вердикта переделывается (§11.8). - Один checkout, одна локальная ветка
issue/<NN>-<slug>; доS5не пушится ни ветка, ни коммиты; статус остаётсяS4. Комментарий «Черновик:» по шаблону, черновик занимает слот WIP (§11.8, §7.2, §2.6). - Каждый черновой коммит несёт ровно один трейлер
Spec-Draft: sha256:<хеш>— строку печатает пакет задачи в разделе «Черновик» (§11.8). - Жёлтый или красный вердикт — черновик остановить: коммиты по прежнему тексту
гейт не примет, переписывать дату автора запрещено; новый черновик — в
следующей эпохе
S4с новым хешем (§11.8, §12). - В ветку черновик попадает только после зелёного ревью ТЗ:
S6-in-progress,git fetch, ребейз наorigin/dev(или наorigin/issue/<NN>-*, если ветка уже была; без force-push), проверкаnode scripts/process-gate.mjs --range origin/dev..HEAD --issues --report, push (§11.8, §10.2).
Реализация (S6-in-progress)
- Занятие:
Взял: <роль> · сессия <id> · ветка issue/NN-slug; WIP — одна задача в разработке на исполнителя, не больше трёх на цикл релиза и двух в код-ревью (§2.6, §7.2). - Ветка
issue/<NN>-<slug>; каждый коммит с файлами классов A, B или D несёт трейлеры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).
Гейты перед хендоффом
- Обязательная часть —
npm run gate:small: его состав живёт вscripts/gate-small.mjsи нигде не переписывается. По диффу и AC сверх него — целевые смоки из выводаsmoke-select(связь не доказана — его визуальный минимум,--smokesгоняет его сам, #690),model-invariants,pytest tests_backend, junction parity;golden:verify— только с меткойci:golden(§8;docs/TESTING.md, «Локальный набор перед пушем»). - Обязательные проверки с основаниями печатает пакет задачи:
gate:small, смокиsmoke-selectс видом связи, invariants приgeometry, pytest при Python, parity при зеркалах junction limits,ci:golden— только при визуальном риске в пути отрисовки плана (§8). - Мутанты не гоняются ни локально, ни в CI: мутант своей защиты пишется в
реестр, якорь сверяет
mutation-gate --check, поимку — ночь (#709, §2.7). - На
shipиshowсверхgate:smallи названного в ТЗ ничего не гоняется: одно доказательство на пункт ТЗ;--smokesнаshipне нужен; попутный флак — отдельное issue одной записью, без расследования в задаче (§8). - Бандл в коммит задачи не идёт: сборка переписывает отслеживаемый
dist/, перед коммитом —npm run bundle:clean; хукcommit-msgотклоняет пути бандла без трейлераRelease:(#657, §1). - Новый код не добавляет
any: гейт судит добавленные строки; исключение —// any-ok: <конкретная причина>на той же строке (§8). - Ветка задачи не коммитит
docs/images/**иdemo/golden/baselines/**: отпечаток и кадры скриншотов, эталоны golden обновляет один коммит бота наdevперед бетой. Задача, которая меняет визуал намеренно, ставитci:goldenи принимает сдвинутые кадры сама (§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до ревью;show/shipс чистым слиянием ребейзятся один раз, при слиянии (§10.4). shipв рамках сливается без ревью модели; выход за рамки конвейер сам переводит вtrack:show. Кодshipчитает пакетное ревью: ночью (SHIP-REVIEW-<база>-dev-<sha12>.md) и перед бетой — то, что ночь не прочла (SHIP-REVIEW-<тег>.md) (§10.4, §11.7).- Автор обязан дождаться вердикта, а не заканчивать сессию:
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(кроме черновикаtrack:askпо §11.8); ТЗ после кода (кроме хотфикса); ревью своей работы; пятый цикл ревью; issue вместо возврата на правки (§12). - Push черновика до
S5; перенос черновика по устаревшему ТЗ коммитами с переписанной датой автора (§12, §11.8). - Попутные правки «раз уж я здесь»; параллельные бэклоги в файлах;
force-push в
dev; закрытие issue до выпуска беты (§12, §3 п.17). - Принятие golden-эталонов ради зелёного CI; Medium, оставленные как TODO в документе ревью (§12).
- Аварийный хотфикс — только решением владельца, с issue в той же сессии до коммита (§11.2).