diff --git a/docs/reviews/INDEX.md b/docs/reviews/INDEX.md index c5e6cdf7..126fce55 100644 --- a/docs/reviews/INDEX.md +++ b/docs/reviews/INDEX.md @@ -1,10 +1,11 @@ # Индекс ревью -Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 169, issue: 80. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. +Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 170, issue: 80. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. | Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы | |---|---|---|---|---:|---:|---|---| | #691 | [SPEC-REVIEW-691-r1.md](SPEC-REVIEW-691-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | направление edge-swipe не квантифицировано и не отмечено как допущение | `src/houseplan-card.ts` | +| #691 | [SPEC-REVIEW-691-r2.md](SPEC-REVIEW-691-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #689 | [SPEC-REVIEW-689-r1.md](SPEC-REVIEW-689-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #688 | [SPEC-REVIEW-688-r1.md](SPEC-REVIEW-688-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #688 | [CODE-REVIEW-688-r1.md](CODE-REVIEW-688-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | AC6 не покрывает спиральную лестницу и второй масштаб печати на уровне PDF-сцены | `test/pdf-scene.test.mjs` `test/stairs.test.mjs` `src/pdf/pdf-scene.ts` | diff --git a/docs/reviews/SPEC-REVIEW-691-r2.md b/docs/reviews/SPEC-REVIEW-691-r2.md new file mode 100644 index 00000000..38c6f79e --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-691-r2.md @@ -0,0 +1,171 @@ +# SPEC-REVIEW-691-r2 + +- **Issue:** https://github.com/Matysh/houseplan-card/issues/691 +- **Этап:** `S4-spec-review` (ревью ТЗ, PROCESS.md §2.4) +- **Трек:** полный (закреплено ещё в r1: «лёгкий трек: нет», P1, ценность + 9/10, сложность и риск 7/10 — публичный touch-контракт View/kiosk с + несколькими конкурентами #449/#563/#578/#531). +- **Материал:** тело issue #691, раздел `## ТЗ`, плюс комментарий (6) + «Правка по spec-review r1» — единственная правка после r1. +- **Заход:** r2 · блокирующих циклов израсходовано 1 из 4 +- **Роль:** ревьюер ТЗ (не автор) + +## Скоуп ревью + +Тот же контракт, что в r1: разделение pan и edge-swipe в View/kiosk (48 px +краевая зона, финальность owner) плюс расширение double-tap/double-click +«Вписать всё» на room fill/label с задержкой одиночного room-fit на 350 мс. +Автор внёс ровно одну правку — устранение Medium-находки r1 (не +квантифицированная граница направления edge-swipe в §6 п.6). Правка +локальна: три места текста (§6 п.6, §18, AC3), без изменения §1–5, §7–17, +без новых продуктовых развилок и без кода (диапазон #691 по-прежнему пуст, +см. ниже). Это укладывается в критерий «дельта локальна» PROCESS.md §2.10: +не ребейз, не смена контракта, не новая подсистема — разбор ведётся по +дельте, а не заново. + +**SCOPE-проверка** не повторяется: обоснование J1/`docs/TOUCH-SUPPORT.md` +из r1 не затронуто правкой — наследуется без повторной проверки (см. +раздел «Унаследовано из r1» ниже). + +## Как проверялось + +1. Получено тело issue #691 (`gh issue view --json body`) и все 7 + комментариев (включая машинный вердикт r1 и авторский ответ на него). +2. Найден и прочитан целиком документ предыдущего раунда + `docs/reviews/SPEC-REVIEW-691-r1.md` — единственная находка Medium, + её формулировка, смягчающее обстоятельство и требуемая правка + («число, либо явная запись в §18, что порог сохраняется без изменения»). +3. Дельта объявлена сверкой кода: `git diff --stat 1751184b..20f17fee` + (1751184b — SHA материала r1, 20f17fee — текущий SHA) показывает только + `docs/reviews/INDEX.md` и добавление `docs/reviews/SPEC-REVIEW-691-r1.md` + — **исходный код (`src/**`) не менялся ни на строку** между r1 и r2. + Значит все построчные сверки кода из r1 (`_panLock`, `_swipeZone`, + `STAGE_TAP_DISTANCE_PX=8`, `|dx|>1.5·|dy|` на `src/houseplan-card.ts:6833`, + `DOUBLE_FIT_WINDOW_MS=350`, `planGestureOwnerFromPath()`, + `beginDoubleFitPointer()` на `src/room-fit.ts`) остаются верны без + повторного чтения файлов — они привязаны к байтам, которые не изменились. +4. Дельта тела issue сверена по трём точкам, которые комментарий (6) + «Правка по spec-review r1» назвал явно, против текущего полного текста: + - §6 п.6 теперь гласит: «...при сохранённой действующей границе + горизонтального преобладания: `|dx| > 1,5 × |dy|` в правильном + inward-направлении. Равенство и всё, что ниже этой границы, + классифицируется как pan. ... Неверное направление или + pan-классификация финальны и не могут позже стать swipe.» — число + названо явно, граница (`=`) отнесена к `pan`, что и требовала находка. + - §18 «Принятые предположения» получил строку: «Порог clean tap и + первичной drag-классификации остаётся 8 px, граница edge-swipe + сохраняется `|dx| > 1,5 × |dy|`, окно double-fit — 350 мс.» — число + теперь в общем перечне с 48 px/8 px/350 мс, как просила находка. + - AC3 (§12) расширен: «Parameterized unit отдельно доказывает диагонали + на границе: `|dx| = 1,5 × |dy|` остаётся pan, минимальное превышение + при inward-направлении становится swipe.» — закрывает исходный пробел + r1 «AC2/AC3 тестируют только явно горизонтальный и явно вертикальный + drag, не саму границу». + Все три правки на месте, согласованы друг с другом (одно и то же число + `1,5`) и с §6 п.6 буквально. +5. Проверено, что правка не вносит новой неоднозначности: «минимальное + превышение» в AC3 — стандартная формулировка граничного теста (тест + вправе взять любое значение строго выше порога), не требует + дополнительного числа — сам порог (`1,5`) уже назван, только сторона + `>`/`=` уточняется тестом. Смягчающее обстоятельство r1 («при сомнении + жест уходит в pan», не в switch) не изменилось — так и осталось в §6 п.6. +6. Перечитаны §1–5 и §7–17 целиком на предмет незаявленных изменений — + текст идентичен r1 (сверено построчно с котировками r1-документа в его + разделе «Что проверено и корректно», где цитируются §6/§7/§9/§10/§15–18); + комментарий (6) автора прямо говорит «Другие разделы и продуктовые + решения не менялись» — подтверждено, а не принято на слово. +7. Гейты (`tsc --noEmit`, `npm test`, `npm run build`, `check-docs.mjs`, + смоки, инварианты) не прогонялись: этап `spec`, `git diff + origin/dev...HEAD` для кода #691 по-прежнему пуст (см. п.3) — неприменимо + к тексту ТЗ, не пропущено. + +## Закрытие раунда r1 + +| Находка r1 | Чем закрыта | Где это видно | +| --- | --- | --- | +| Medium: направление edge-swipe (§6 п.6) не квантифицировано и не отмечено как допущение — AC2/AC3 не тестируют саму границу | §6 п.6 явно называет `|dx| > 1,5 × |dy|` и относит равенство к `pan`; то же число добавлено в §18; AC3 получил parameterized-проверку ровно на границе и при минимальном превышении | Тело issue #691, §6 п.6 (предложения 2–3), §18 (последняя добавленная фраза), §12 AC3 (предложение 2) | + +## Унаследовано из r1 + +- **Трек и приоритет** (полный трек, P1, ценность/сложность) — документ + `docs/reviews/SPEC-REVIEW-691-r1.md`, SHA материала `1751184b1247`, не + затронуто правкой r2. +- **SCOPE-проверка** (J1, release-blocking touch-поверхность по + `docs/TOUCH-SUPPORT.md`, trailer `Touch editor: not exposed`) — + тот же документ, раздел «Скоуп ревью»; §4/§5 ТЗ не менялись. +- **Построчная сверка кода** (`_panLock`, `_swipeZone`, + `STAGE_TAP_DISTANCE_PX`, `DOUBLE_FIT_WINDOW_MS`, `planGestureOwnerFromPath`, + `beginDoubleFitPointer`) — тот же документ, раздел «Как проверялось» п.4, + подтверждено актуальностью байт-в-байт (`git diff --stat` в п.3 выше). +- **Обязательные разделы §7.1, внутренняя согласованность контракта §6/§7, + покрытие AC1–AC12, числовая согласованность 48/8/350** — тот же документ, + разделы «Как проверялось» п.3–6 и «Что проверено и корректно»; §1–5, §7–17 + не менялись (подтверждено в п.6 выше). +- **Риски, откат, release-артефакты, i18n** — тот же документ, раздел + «Что проверено и корректно», не затронуто правкой. + +## Находки + +Нет. Единственная находка r1 закрыта точечно и без побочных эффектов; +новых находок в дельте и при контрольном перечитывании остального текста +не обнаружено. + +## Что проверено и корректно + +- Правка r1→r2 точна: число `1,5` и отнесение равенства к `pan` появились + ровно в тех местах, которые требовала находка (§6 п.6, §18, AC3), и нигде + не противоречат друг другу или остальному тексту. +- Правка не расширяет и не сужает скоуп, не открывает новых продуктовых + вопросов — комментарий (6) не содержит вопросов владельцу, только + фиксацию решения. +- Исходный код между r1 и r2 не менялся (`git diff --stat 1751184b..20f17fee` + трогает только `docs/reviews/*`), поэтому все технические утверждения ТЗ + о текущем поведении кода остаются точными без повторной построчной сверки. +- Документ ревью r1 (`docs/reviews/SPEC-REVIEW-691-r1.md`) присутствует в + дереве, использован как материал предыдущего раунда, ничего в нём не + противоречит текущему тексту issue. + +## Чего не проверял + +- Гейты (`tsc --noEmit`, `npm test`, `npm run build`, `check-docs.mjs`, + смоки, `golden:verify`, инварианты, performance) — не прогонял: этап + `spec`, кода для #691 по-прежнему нет (см. «Как проверялось» п.3, п.7). + Предмет код-ревью после реализации. +- Не переоценивал заново разделы §1–5 и §7–17 построчно против кода/SCOPE — + они не входят в дельту r1→r2, а r1 уже проверил их полно (см. + «Унаследовано из r1»); перечитаны только на предмет необъявленных правок + (см. «Как проверялось» п.6), расхождений не найдено. +- Не воспроизводил исходный баг вручную на touch-устройстве — как и в r1, + это диагностика по коду, подтверждённая построчным чтением, а не ручная + проверка на этапе spec. +- Не искал новых записей в `docs/reviews/INDEX.md` сверх уже известной по + r1 — индекс обновляется шагом публикации, не ревьюером. + +## Вердикт + +Единственная находка r1 (Medium, не квантифицированная граница +edge-swipe-направления в §6 п.6) закрыта точно и без побочных эффектов: +число `|dx| > 1,5 × |dy|` явно названо в контракте, продублировано в +«Принятых предположениях» §18 и получило собственную parameterized-проверку +на границе в AC3. Между материалом r1 и текущим SHA (`20f17fee`) код не +менялся ни на строку, поэтому все построчные сверки r1 остаются в силе. +Остальные разделы ТЗ (§1–5, §7–17) не изменены и не требуют переразбора. +Новых находок нет. + +Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0 + +--- + +--- + + + +## Материал раунда + +- Ветка: `dev`, коммит `20f17fee5453` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. +- Дерево материала: `83fad81b86c95ba0f05aee6c1e1ce7173205e205` + ``` + git log --all --format='%H %T' | grep 83fad81b86c9 + ``` +- Тело issue: `e8f3dd66a656bbca09f4f291c52632feb3ee16759c54dc9dcdd4e328aaf99b7b` +- Вердикт конвейера: `green` · High 0