11 KiB
CODE-REVIEW — issue #533, заход r2
Материал: 73c13e37b4f81ebac42777a6ad7a50d16b7da69b (рабочая копия уже на
нём). Предыдущий вердикт — r1, жёлтый, на SHA acea695069075fb1bd7592f3f2b38853bc9f4c32
(документ docs/reviews/CODE-REVIEW-533-r1.md). SHA не был назван автором
явно в тексте ответа — найден по цепочке acea6950 -> 73c13e37 в
git log --oneline origin/dev..HEAD.
Дельта: git diff acea6950..73c13e37 -- demo/smoke_room_resize.mjs
(+20/-20 строк, один файл). Дельта закрывает ровно находку r1 и не выходит
за её границы — правка того же вида на оставшихся местах, без изменения
условий pointer(), sent(), mapping_stable. Разбор в этом раунде сужен
до дельты плюс всего, до чего она дотягивается: сами имена проверок, которые
дельта добавляет.
Закрытие раунда r1
| находка r1 | чем закрыта | где это видно |
|---|---|---|
Medium: sent() стояла на 3 из 22 вызовов pointer() (только главный сценарий); 19 вызовов (mixed_role, owner_boundary/range_role-блок, corner_clamped, preflight, commit_preflight, cancel, disabled-блок) отбрасывали возвращаемое значение молча |
каждый оставшийся await pointer(...) обёрнут в sent('<scenario>.<event>_sent', ...) |
demo/smoke_room_resize.mjs, коммит 73c13e37; проверено grep -c "await pointer(" = grep -c "sent(" = 23 (совпадает) — ни одного голого вызова не осталось |
Подтверждено самостоятельно, тем же приёмом, что и автор: временно испортил
цель pointerdown в disabled-сценарии (cx: 331 → cx: 999, восстановлено
git checkout -- сразу после), прогнал node demo/smoke_room_resize.mjs —
раньше немой find дал бы зелёный OK, сейчас красная строка
owner_boundary.pointerdown_sent: expected true, got false (файл
восстановлен, git status чист).
Унаследовано из r1
Без повторной проверки приняты факты, которых дельта не касается (документ
docs/reviews/CODE-REVIEW-533-r1.md, SHA acea6950):
- AC1, перевод координат внутри кадра события —
pointer()переводит план → экран внутри того жеpage.evaluate, что и диспетч события; функция не менялась в дельте r1→r2 (только точки её вызова обёрнуты снаружи). - AC1, прицел
pointermove/pointerupв ту же ручку, что иpointerdown— черезcx/cy, во всех сценариях; не менялось. - AC2,
safe_resize.mapping_stable— допуск1e-6, обе величины и оба размера стейджа в сообщении; строки не в дельте. - Продуктовый код не тронут, класс B (гейты/инструментарий), трейлеры
Issue: #533/User-Visible: noна обоих коммитах r1 и r2 — не требуют ченджлога; повторно свёлgit log -1 --format=%Bна73c13e37, трейлеры на месте.
Новая находка (в дельте r2)
Medium, в скоупе. Два из 22 новых sent()-лейблов называют не свой
сценарий, что напрямую противоречит заявленной цели правки: «имя проверки
называет сценарий и тип события», «следующий случай на раннере читается с
первой строки» (AC2 того же духа применён автором и к AC1).
demo/smoke_room_resize.mjs:212— блок проaria-disabled-ручку (все соседние проверки названыsafe_resize.disabled_*:disabled_no_drag,disabled_zero_history,disabled_zero_write) обёрнут какsent('owner_boundary.pointerdown_sent', ...)— чужое имя сценария.demo/smoke_room_resize.mjs:263-265— блок, чьи проверки названыsafe_resize.owner_boundary_clamped/topology/no_mixed_role/cm_preserved, обёрнут какsent('range_role.pointerdown_sent'/…)— имяrange_roleне совпадает ни с одной проверкой этого или соседнего блока вообще.
Воспроизведение (эксперимент см. выше, «Закрытие раунда r1»): испортил
cx в disabled-блоке — красная строка называется owner_boundary.*, хотя
упавший жест относится к disabled-сценарию, а не к owner_boundary. Будущий
разбор красного раннера прочитает не тот блок кода с первой строки — именно
то, чего AC2/AC1 обязаны были избежать.
Не High: ни один AC не ломается — check() по-прежнему верно
детектирует недоставленное событие (result.sent), обе проверки красные
именно тогда, когда должны быть красными; страдает только текст диагностики.
В скоупе: правка — переименовать две строки-лейблы
(owner_boundary.pointerdown_sent → disabled.pointerdown_sent;
range_role.* → owner_boundary.*), без изменения логики.
Что проверено и как
- AC1 (полнота
sent()) —grep -c "await pointer("иgrep -c "sent("вdemo/smoke_room_resize.mjsдают одинаковое число (23); каждый вызов проверен построчно (см. таблицу закрытия r1). Негативный прогон — см. выше. - AC2 — унаследовано из r1, дельта не касается.
- AC3 (смок зелёный, мутант ловится) — прогнал сам:
npm run build && npm run bundle:sync(локальныйdist/houseplan-card.jsбыл собран на более старом коде, демо не грузилось без пересборки), затемnode demo/smoke_room_resize.mjs→OK, 0 провалов,mapping_stableсошёлся (scale0.6144...наdownиmove),safeResizeResult[450, 450, 450, 0.45]. Плюс уже зелёный Validate на этом самом SHA73c13e37(https://github.com/Matysh/houseplan-card/actions/runs/34622809175) — покрывает раннер и штатный мутантsafe-resize-commit-preflight-bypassed, подтверждённый автором в ответе на r1. - Дешёвые гейты
tsc --noEmit/npm test/npm run build(сверка бандла) не перегонял отдельно — Validate на73c13e37зелёный, диф не трогаетsrc/**, так чтоcheck-docs.mjsне требуется. Геометрия/модель не затронуты — инварианты не применимы.golden,pytest, perf-профили — вне диффа, не запускал. demo/smoke-select.mjs --base acea6950 --head 73c13e37не запускал: дельта — правка того же файла-свидетеля тем же приёмом, что уже разобран в r1 (диффа продукта нет, смок сам себя не проверяет через другие смоки); выбор смоков по инструменту относится к продуктовым диффам, здесь неприменим.
Чего не проверял
- Остальные 5 сценариев смока (
safe_resizeглавный,mixed_role,corner_clamped,preflight,commit_preflight,cancel) на предмет мисматча лейблов — построчно сверены (см. таблицу выше), несовпадений не нашёл, но повторно не гонял с намеренной порчейcxна каждом — ограничился одним репрезентативным экспериментом на дельте (owner_boundary/disabled). - Полный набор
npm run golden:verify,pytest, perf — не в скоупе диффа, не запускал. - Устойчивость
mapping_stableна реальном CI-раннере при плывущей раскладке — воспроизвести флуктуацию раскладки локально не пытался, полагаюсь на зелёный Validate73c13e37как на прямое свидетельство того, что гейт больше не мигает на этом материале.
Вывод
AC1–AC3 выполнены. Находка r1 закрыта корректно и полно (23/23 вызовов).
Новая Medium-находка в дельте r2 — два лейбла sent() называют чужой
сценарий, что противоречит собственной заявленной цели правки
(понятная диагностика с первой строки). В скоупе задачи, чинится
переименованием двух строк без риска для AC. Возврат автору, жёлтый.
Материал раунда
- Ветка:
issue/533-resize-witness-mapping, коммит73c13e37b4f8— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
0b69a7dd77e802de09b50798d0384291f1acbf5agit log --all --format='%H %T' | grep 0b69a7dd77e8 - Тело issue:
ae465893153dbb7ba1b9d991e2d5cf4a05c8f526b51ae2f2b74e6e2c566805d9 - Вердикт конвейера:
yellow· High 0