16 KiB
CODE-REVIEW-195-r2
- Issue: https://github.com/Matysh/houseplan-card/issues/195
- Трек:
trivial(короткий, §5.1 PROCESS.md) — ТЗ живёт в теле issue, спек-файла нет и не требуется. - Диапазон:
git log --oneline origin/dev..HEAD/git diff origin/dev...HEADна веткеissue/195-editor-close-hit-targetпосле ребейза на актуальныйorigin/dev:016c75ffix: enlarge editor close hit target(Issue: #195,User-Visible: yes)2ef3241test: sample editor close glyph before removal(Issue: #195,User-Visible: no)07b0b3ddocs: review document for #195(Issue: #195,User-Visible: no) — сохранённый документ предыдущего зелёного ревью
- Роль: ревьюер кода (не автор), этап
S7-code-review - Цикл: r2/2 (лимит короткого трека). r1 закончился зелёным вердиктом
(High: 0, Medium: 0,
CODE-REVIEW-195-r1.md); слияние вdevне удалось из-за конфликта, ветка перебазирована и переведена обратно вS7-code-review— по AGENTS.md после ребейза это другой код и требует полноценного повторного прогона, а не формальности.
Почему нужен новый цикл, а не переиспользование r1
dev ушёл вперёд (в частности #186, #176) с момента r1; ребейз переписал
историю и мог затронуть файлы, которые r1 не рассматривал в их новой форме
(docs/STATUS.md, docs/images/screenshots.json, три копии бандла). Цель
r2 — не переделать анализ К1/К2/К3 заново, а убедиться, что: (а) продуктовая
и тестовая правки, уже одобренные в r1, дошли до постребейзного дерева
байт-в-байт; (б) конфликты разрешены корректно, без потери чужих изменений
или порчи новой правки; (в) все обязательные гейты зелены именно на текущем
HEAD, а не на снятой с проверки версии.
Как проверялось
git fetch originи сверкаgit log --oneline origin/dev..HEAD— диапазон соответствует ожидаемому (три коммита выше), рабочее дерево чистое (git status).- Побайтовое сравнение продуктового и тестового коммитов с версиями,
которые видел r1:
git show 016c75f -- src/styles.ts— диф идентичен диффу140a56fиз r1 (то же правило.modetab .closex:width/height: 24px,margin: -5.5px -5.5px -5.5px -3.5px, тот же комментарий). Продуктовая логика не менялась при ребейзе.git show 2ef3241 -- demo/smoke_editor_tabs.mjs— диф идентичен диффуa169cc6из r1 (тот же фикс порядка измеренияglyphStays13до клика).git diff origin/dev...HEAD -- src/houseplan-card.ts— 0 строк:_setMode/_finishWallChainпо-прежнему не тронуты, К2/К3 не переписаны, короткий трек остаётся корректным выбором.git diff origin/dev...HEAD --stat -- 'src/**' 'custom_components/houseplan/**/*.py' manifest.json hacs.json— единственный класс-A файл:src/styles.ts, 10 изменённых строк.
- Проверены файлы, затронутые слиянием с новым
dev(не входили в diff r1 в этом виде):docs/CHANGELOG.md/docs/CHANGELOG.ru.md— запись#195присутствует в обеих версиях и запись#186, добавленная наdevпосле r1, не потеряна (обе видны последовательно вgit show 016c75f -- docs/CHANGELOG.md).docs/STATUS.md— строкаCurrent local cycleперечисляет и #180/#192/ #193/#196/#197/#176 (историю dev), и добавленное предложение про #195; ни одна запись не выпала при разрешении конфликта.docs/images/screenshots.json—sourceFingerprint/sourceSha256обновлены (edb4278c…→b0a03dc3…),imageSha256не менялись — согласуется с тем, что это чисто невидимая CSS-правка: скриншоты не перевыпускались, обновился только хеш исходников, который включает весьsrc/**(в него входят и посторонние измененияdev, попавшие в диапазон ребейза, — не только #195).
- Перепрогнаны обязательные гейты лично на текущем
HEAD(не переиспользована декларация из хендоффа/r1) — см. таблицу. - Falsifiability прогнанного browser smoke повторно подтверждена на
постребейзном дереве: временно восстановлен дореформенный
src/styles.ts(git show 016c75f^:src/styles.ts), пересобран бандл, скопирован вdemo/srv/assets/;node demo/smoke_editor_tabs.mjsупал ровно наtabCrossTargetsAtLeast24: expected true, got false, остальные проверки остались зелёными. Дерево восстановлено (cpисходногоsrc/styles.tsиз бэкапа), бандл пересобран и скопирован в обе generated-копии;cmpподтвердил побайтовое совпадение всех трёх копий сdist/houseplan-card.js,git status --shortпуст. node scripts/check-docs.mjs --external— проверяет обновлённыйsourceFingerprintиз п.3 против фактического текущегоsrc/**; зелёный, значит хеш вscreenshots.jsonне рассинхронизирован с постребейзным деревом (это тот самый гейтdocs, который в CI ловит именно такое расхождение после #113).- Прочитан
docs/USER-GUIDE.ru.md:166— формулировка «крестик активного редактора» совпадает с изменённым текстомdocs/CHANGELOG.ru.mdиdocs/UX-MODES.md; новых терминов интерфейса не изобретено. - Содержательный анализ AC (диагностика К1/К2/К3, корректность фикса, отсутствие расширения скоупа) не повторялся заново — он не зависит от ребейза, полностью выполнен и задокументирован в r1, и продуктовый код, как показано в п.2, не изменился ни на байт.
Обязательные гейты (всегда)
| Гейт | Команда | Результат |
|---|---|---|
| Typecheck | npx tsc --noEmit |
чисто, без вывода |
| Unit-тесты | npm test |
908/908, 0 fail (было 900/900 в r1 — рост за счёт тестов, вошедших в dev после r1) |
| Build + сверка бандлов | npm run build, затем cmp dist/houseplan-card.js custom_components/houseplan/frontend/houseplan-card.js и cmp dist/houseplan-card.js demo/srv/assets/houseplan-card.js |
оба cmp без вывода — три копии идентичны; git status --short после сборки пуст |
| Docs-гейт | node scripts/check-docs.mjs --external |
Documentation checks passed (7 files, 10 external links). |
Гейты по необходимости
| Гейт | Почему запускался / не запускался | Результат |
|---|---|---|
node demo/smoke_editor_tabs.mjs |
назван в AC1–AC3 issue, единственный смок по затронутой поверхности (.modetab, header editor tabs); повторно прогнан на постребейзном бандле, а не переиспользован из хендоффа |
зелёный, все 48 проверок true; falsifiability подтверждена в п.5 выше на текущем дереве |
Остальные 126 demo/smoke_*.mjs |
diff после ребейза по-прежнему один CSS-селектор на header editor tabs (п.2); других продуктовых поверхностей ребейз не добавил | не прогонялись — сознательное сужение, как в r1 |
npm run golden:verify |
видимая геометрия не менялась (тот же вывод, что в r1, п.6 того документа: расчёт CSS box-модели + эмпирическое измерение rect); ребейз не тронул demo/golden/baselines/** (нет в diff-статистике) и не добавил новых визуальных изменений сверх CSS-правила из r1 |
не запускался — обоснованное сужение |
python -m pytest tests_backend -q |
diff не касается custom_components/**/*.py |
не запускался — неприменимо |
| performance-профили | правка — статический CSS без hot-path кода | не запускались — неприменимо |
Что проверено и корректно
- Продуктовая и тестовая правки дошли до постребейзного
HEADбез изменений.016c75f/2ef3241побайтово повторяют содержимое140a56f/a169cc6, одобренное в r1 (п.2). Анализ К1 (единственная подтверждённая причина), корректность фикса (расширение реального border-box кликабельного узла, а не хак с перехватом координат) и легитимность правки теста (computed style фиксируется до удаления узла из DOM) остаются в силе без повторного вывода — код не изменился. - Конфликт ребейза разрешён без потерь.
docs/CHANGELOG.md/.ru.mdиdocs/STATUS.mdсодержат записи и #195, и всех соседей изdev(#186, #176 и далее);docs/images/screenshots.jsonобновил только фингерпринт исходников (без измененияimageSha256), что подтверждено зелёнымcheck-docs.mjs— сам гейт CI, который ловит именно такое расхождение (#113), проходит на текущем дереве. - Все три AC по-прежнему доказаны исполняемым тестом на текущем
HEAD.tabCrossTargetsAtLeast24/tabCrossGlyphStays13/tabCrossKeepsLayoutFootprint(AC1),reclickNoop/tabCrossCloseStartsDuringEnter/tabCrossCloseDuringEnterWorks(AC2),tabCrossFinishesWallChain/tabCrossLimitKeepsDraftWithFeedback(AC3) — всеtrue; падение до фикса и восстановление дерева воспроизведены заново на постребейзном бандле (п.5), а не приняты на слово из хендоффа. - Класс A по-прежнему ограничен одним CSS-селектором.
src/houseplan-card.tsне тронут (0 строк),_setMode/_finishWallChain— тот же код, что вdev; трекtrivialостаётся верным выбором и после ребейза. - Трейлеры и changelog. Все три коммита несут
Issue: #195;User-Visible: yesтолько на016c75f, оба changelog редактируются в нём же;2ef3241и07b0b3d—User-Visible: no, корректно (тест и документ ревью не меняют продукт). - Терминология не изобретена.
docs/UX-MODES.md,docs/CHANGELOG.ru.mdиспользуют формулировку, совпадающую сdocs/USER-GUIDE.ru.md:166.
Находки
Находок нет. High: 0, Medium: 0, Low: 0.
Чего не проверял
- Полный набор
demo/smoke_*.mjs(127 файлов). Ребейз не расширил затронутую поверхность за пределы header editor tabs; прогон одного целевого смока соразмерен диффу (PROCESS.md §8). npm run golden:verify. Не запускался повторно. Обоснование не меняется относительно r1: изменение невидимо на пиксель (только hit-zone, не рендер), аdemo/golden/baselines/**вне диапазона diff. Полный golden-прогон всё равно случится перед бетой.python -m pytest tests_backend -qи performance-профили. Неприменимы — diff не касается Python-кода и не имеет измеримого влияния на производительность.- Multi-touch/реальное тач-устройство. Контракт
docs/TOUCH-SUPPORT.mdне меняется этой правкой (как и в r1);24×24— заявленный в issue WCAG-минимум, не HA-тач-рекомендация 40 px. - Повторный содержательный анализ К1/К2/К3 и продуктового обоснования фикса. Не повторялся с нуля — обоснован в п.2 и п.8 выше: продуктовый и тестовый код после ребейза побайтово идентичен тому, что уже прошло r1; предметом r2 был ребейз и его последствия, а не переоткрытие уже закрытого содержательного вопроса.
Вердикт
Зелёный. High: 0, Medium: 0. Ребейз на актуальный dev не изменил ни
продуктовый, ни тестовый коммит ни на байт (сверено побайтово); конфликт в
документации и генерируемых артефактах разрешён без потери соседних
изменений и подтверждён зелёным check-docs.mjs. Все обязательные гейты
перепрогнаны лично на текущем HEAD (908/908 тестов, чистый typecheck,
идентичные три копии бандла) и целевой demo/smoke_editor_tabs.mjs
перепроверен на постребейзном бандле, включая повторное подтверждение, что
он умеет падать. Задача готова к слиянию в dev.