mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
@@ -0,0 +1,185 @@
|
|||||||
|
# CODE-REVIEW — issue #631, заход r2
|
||||||
|
|
||||||
|
Материал: `c1cc94f0e0333732262430c63bae992c76aa3635` (рабочая копия на нём,
|
||||||
|
детач HEAD). Диапазон: `origin/dev..HEAD`, три коммита:
|
||||||
|
`test(editors): unit contracts for dialog baselines and form problems (#631)`
|
||||||
|
(040ad3dc), `docs: review document for #631` (d071ac2e),
|
||||||
|
`docs(reviews): индекс после сдвига каталога (#631)` (c1cc94f0).
|
||||||
|
|
||||||
|
## Скоуп
|
||||||
|
|
||||||
|
Заход r1 (`36f0db6e1ae9…`) был зелёным, High 0, Medium 0 — см.
|
||||||
|
`docs/reviews/CODE-REVIEW-631-r1.md`. SHA r1 в локальном дереве больше не
|
||||||
|
резолвится (`git cat-file -t 36f0db6e1ae9…` и его дерево `a7cbed4ee3b2…` —
|
||||||
|
«bad object»): по §2.10 это обычное дело при ребейзе, не находка. Материал
|
||||||
|
ищётся по блобу — все четыре файла диффа r1 (`tsconfig.test.json`,
|
||||||
|
`test/dialog-baseline.test.mjs`, `test/dialog-form-problems.test.mjs`,
|
||||||
|
`scripts/mutation-registry.mjs`) на текущем HEAD дают ровно те хеши, что
|
||||||
|
названы якорями в самом документе r1 (`858994a6…`, `89e6f73f…`, `a08b616a…`
|
||||||
|
и хеш `scripts/mutation-registry.mjs` — см. «Дельта» ниже про единственное
|
||||||
|
расхождение, оно не от этого раунда).
|
||||||
|
|
||||||
|
**Дельта r1→r2** (`git diff origin/dev...HEAD --stat` минус то, что уже было
|
||||||
|
в диффе r1): ровно два новых файла, оба чисто документационные —
|
||||||
|
`docs/reviews/CODE-REVIEW-631-r1.md` (добавлен документ r1, 152 строки) и
|
||||||
|
`docs/reviews/INDEX.md` (2 изменённые строки — счётчики и новая строка
|
||||||
|
индекса для #631·r1). Ни один код/тестовый файл (`src/**`, `test/**`,
|
||||||
|
`scripts/mutation-registry.mjs`, `tsconfig.test.json`) между r1 и r2 не
|
||||||
|
менялся — подтверждено побайтовым совпадением blob-хешей всех четырёх файлов
|
||||||
|
диффа r1 на HEAD (см. ниже) и тем, что `git log --oneline -- scripts/mutation-registry.mjs`
|
||||||
|
называет их последним изменением коммит 040ad3dc, входящий в материал r1.
|
||||||
|
|
||||||
|
Раз AC1–AC3 относятся исключительно к этим четырём файлам, а они не
|
||||||
|
изменились, дельта AC не задевает — полный повторный разбор кода не нужен.
|
||||||
|
Разбору по существу в r2 подлежат только два новых файла: сам документ
|
||||||
|
ревью (публикуется пайплайном, не автором задачи) и обновление индекса
|
||||||
|
(генерируется скриптом). Трейлеры `Issue: #631` / `User-Visible: no` стоят
|
||||||
|
на всех трёх коммитах диапазона, включая оба новых.
|
||||||
|
|
||||||
|
Продуктовая рамка не меняется относительно r1: класс B, `src/**` не
|
||||||
|
тронут, задача обслуживает J6 (укрепление доказательной базы Save/dirty).
|
||||||
|
|
||||||
|
## Как проверялось
|
||||||
|
|
||||||
|
1. `git diff origin/dev...HEAD --stat` — 6 файлов; из них 4 совпадают
|
||||||
|
построчно с диффом, уже разобранным в r1, 2 новых — только доки.
|
||||||
|
2. Попытка резолвить материал r1 по SHA/дереву — не резолвится (см. выше),
|
||||||
|
это ожидаемо при ребейзе (§2.10) и не находка.
|
||||||
|
3. Побайтовая проверка неизменности четырёх файлов диффа r1 на HEAD:
|
||||||
|
```
|
||||||
|
tsconfig.test.json: 858994a6065e9a39430dc1697b413aba30718ea0
|
||||||
|
test/dialog-baseline.test.mjs: 89e6f73fbb670f14185e4a620de6601b6fdaad24
|
||||||
|
test/dialog-form-problems.test.mjs: a08b616a39ffb88cb886c786c607f97327e7b099
|
||||||
|
scripts/mutation-registry.mjs: 8322625afab1051edfd5407914f7eb8e82ac45dc
|
||||||
|
```
|
||||||
|
Первые три совпадают дословно с якорями, названными в тексте документа
|
||||||
|
r1 (`858994a6…`, `89e6f73f…`, `a08b616a…`). Четвёртый якорь документа r1
|
||||||
|
назван как `107801f8…`, а фактический хеш `scripts/mutation-registry.mjs`
|
||||||
|
и в r1, и сейчас — `8322625a…`: расхождение — опечатка/неверный якорь
|
||||||
|
внутри текста самого документа r1, не относящаяся к дельте r2 (файл с
|
||||||
|
момента 040ad3dc не менялся ни разу, включая r1). Уже закрытый зелёный
|
||||||
|
вердикт r1 задним числом не пересматриваю (§12 — ревью своей работы и
|
||||||
|
повторное подтверждение — не моя роль), но фиксирую здесь как Low, чтобы
|
||||||
|
не потерялось.
|
||||||
|
4. Пересобран test-build и перепрогнаны целевые юниты, чтобы не полагаться
|
||||||
|
только на факт «файл не менялся»: `npx tsc -p tsconfig.test.json &&
|
||||||
|
node scripts/fix-test-build.mjs` → rc 0; `node --test
|
||||||
|
test/dialog-baseline.test.mjs test/dialog-form-problems.test.mjs` →
|
||||||
|
pass 25, fail 0 — совпадает с числом r1.
|
||||||
|
5. `node scripts/process-gate.mjs` → «гейт пройден, предупреждений 0»
|
||||||
|
(диапазон origin/dev..HEAD, коммитов 3).
|
||||||
|
6. `node scripts/smoke-select.mjs --base origin/dev --head HEAD` →
|
||||||
|
«Исполняемого frontend-диффа нет (src/**/*.ts не тронут)» — согласуется
|
||||||
|
с тем, что новая дельта тоже не трогает `src/**`.
|
||||||
|
7. `node scripts/reviews-index.mjs` (без `--check`, скрипт сам сообщает
|
||||||
|
актуальность) → «docs/reviews/INDEX.md свеж»: коммит c1cc94f0
|
||||||
|
детерминированно воспроизводится генератором, вручную не редактирован
|
||||||
|
(файл несёт пометку «не редактировать руками» — соблюдена).
|
||||||
|
`git status --porcelain` после прогона — пусто.
|
||||||
|
8. Сверена запись `docs/reviews/INDEX.md` для `#631 · code · r1`: 🟢
|
||||||
|
зелёный, H 0, M 0, находки «—» — совпадает с итогом
|
||||||
|
`CODE-REVIEW-631-r1.md` (Находки: не выявлено; High 0, Medium 0, Low 0).
|
||||||
|
9. Трейлеры всех трёх коммитов диапазона проверены `git show -s --format=%B`
|
||||||
|
— `Issue: #631` и `User-Visible: no` на месте на каждом. При
|
||||||
|
`User-Visible: no` правка changelog не требуется; ни один changelog в
|
||||||
|
диффе не тронут (диффу это не противоречит).
|
||||||
|
10. Дешёвые гейты (`npx tsc --noEmit` полный, `npm test` полностью, `npm
|
||||||
|
run build` со сверкой копий бандла) не перегонял целиком — они уже
|
||||||
|
подтверждены зелёным Validate на этом же SHA `c1cc94f0`
|
||||||
|
(https://github.com/Matysh/houseplan-card/actions/runs/35958702507).
|
||||||
|
Целевые юниты из этого прогона перепрогнал отдельно (п.4) для проверки
|
||||||
|
находок задачи, не взамен Validate.
|
||||||
|
|
||||||
|
## Соответствие AC
|
||||||
|
|
||||||
|
AC1–AC3 не пересматривались по существу — дельта r1→r2 их не задевает (ни
|
||||||
|
один файл, к которому они относятся, не менялся). Статус наследуется из
|
||||||
|
r1: все три доказаны исполняемыми тестами/мутациями (AC1 — юниты
|
||||||
|
`dialog-baseline.test.mjs` + 3 из 4 пунктов мутационно, четвёртый —
|
||||||
|
проверен вручную по «умению падать»; AC2 — `dialog-form-problems.test.mjs`
|
||||||
|
на каждый код ошибки и пустой список каждой из 4 форм; AC3 — три гарда в
|
||||||
|
`mutation-registry.mjs` переведены со смоков на юниты, каждый прогнан
|
||||||
|
индивидуально «поймано 1 из 1»). Неизменность кода-носителя AC
|
||||||
|
переподтверждена в этом раунде: блобы файлов идентичны (п.3 выше), тесты
|
||||||
|
перепрогнаны и дают то же число (п.4), а не просто предполагаются
|
||||||
|
неизменными по дате коммита.
|
||||||
|
|
||||||
|
## Унаследовано из r1
|
||||||
|
|
||||||
|
| Что | Документ/материал r1 | Почему принято без повторной проверки в r2 |
|
||||||
|
|---|---|---|
|
||||||
|
| AC1 (stableKey: порядок/транзиентность/вложенные объекты/no-baseline→dirty) | `docs/reviews/CODE-REVIEW-631-r1.md`, материал `36f0db6e1ae9…` (SHA не резолвится, дельта — 0 файлов кода) | `test/dialog-baseline.test.mjs` не менялся с 040ad3dc; blob совпадает; тест перепрогнан в r2 и даёт тот же pass-count |
|
||||||
|
| AC2 (`*Problems` на каждый код и пустой список) | там же | `test/dialog-form-problems.test.mjs` не менялся; blob совпадает; перепрогнан |
|
||||||
|
| AC3 (три гарда мутантов переведены со смоков на юниты) | там же | `scripts/mutation-registry.mjs` не менялся с 040ad3dc; blob совпадает |
|
||||||
|
| Чтение носителей AC (`dialog-baseline.ts`, четыре `*-form-state.ts`) построчно против тестовых утверждений | там же, раздел «Как проверялось», п.1 | эти файлы вне диффа и в r1, и в r2 — не могли измениться между раундами; сам диапазон `origin/dev..HEAD` их не касается |
|
||||||
|
| Мутационные прогоны 9 мутантов «поймано 1 из 1» | там же, п.3 | те же мутанты, тот же неизменный код — новый прогон дал бы то же значение; перепроверены сами юниты (п.4 этого документа), которые эти мутанты гардят |
|
||||||
|
|
||||||
|
## Проверено чтением, не исполнением
|
||||||
|
|
||||||
|
- Содержимое `docs/reviews/CODE-REVIEW-631-r1.md`: структура разделов
|
||||||
|
(скоуп/как проверялось/AC/находки/итог/материал раунда) соответствует
|
||||||
|
формату §2.7; прочитан целиком, а не по грепу — расхождение якоря
|
||||||
|
`107801f8…` в п.3 «Как проверялось» найдено этим чтением.
|
||||||
|
- Диффа `docs/reviews/INDEX.md`: новая строка `#631` вставлена в общий
|
||||||
|
порядок по убыванию номера issue (между `#632` и `#630`) — на месте.
|
||||||
|
|
||||||
|
## Чего не проверял
|
||||||
|
|
||||||
|
- Полный `npm test` (все файлы), `npx tsc --noEmit` по всему проекту,
|
||||||
|
`npm run build` со сверкой трёх копий бандла — не перегонял целиком;
|
||||||
|
основание — зелёный Validate на этом же SHA `c1cc94f0` (ссылка выше),
|
||||||
|
дельта без правок `src/**`/сборки этому не противоречит.
|
||||||
|
- `node scripts/check-docs.mjs` — не требуется, `src/**` не тронут ни в
|
||||||
|
материале r1, ни в дельте r2.
|
||||||
|
- Браузерные смоки — не запускал; `smoke-select.mjs` в этом раунде вновь
|
||||||
|
подтвердил, что выбирать нечего (frontend-дифф пуст).
|
||||||
|
- golden/perf/pytest — не по диффу: нет рендера, нет `custom_components/**`.
|
||||||
|
- Полный ночной прогон `mutation-registry.mjs` (все мутанты) — не
|
||||||
|
запускал, это предрелизный/ночной гейт.
|
||||||
|
- Ручное тестирование в браузере — не проводилось (`User-Visible: no`,
|
||||||
|
`src/**` не тронут ни в одном коммите диапазона).
|
||||||
|
- Повторная ревизия правильности самих ассертов в
|
||||||
|
`test/dialog-baseline.test.mjs` / `test/dialog-form-problems.test.mjs`
|
||||||
|
против исходников `*-form-state.ts` "с нуля" — не делал; это было
|
||||||
|
выполнено в r1 (см. таблицу «Унаследовано»), а дельта r2 их не
|
||||||
|
затрагивает.
|
||||||
|
|
||||||
|
## Находки
|
||||||
|
|
||||||
|
- **Low** (снимается записью, не блокирует). Документ `CODE-REVIEW-631-r1.md`,
|
||||||
|
раздел «Как проверялось», п.3 называет для `scripts/mutation-registry.mjs`
|
||||||
|
анкер-хеш `107801f8…`, тогда как фактический blob файла (и в момент r1,
|
||||||
|
и сейчас) — `8322625afab1051edfd5407914f7eb8e82ac45dc`. Опечатка внутри
|
||||||
|
текста уже смёрженного зелёного документа r1: не влияет на его вердикт
|
||||||
|
(сам файл прогонялся и проверялся по содержимому, а не только по этому
|
||||||
|
анкеру) и не относится к дельте r2. Фиксирую как Low и снимаю: правка
|
||||||
|
задним числом чужого смёрженного документа не входит в мою роль
|
||||||
|
(§12), а на вердикт этого раунда не влияет.
|
||||||
|
|
||||||
|
High — 0, Medium — 0, Low — 1 (снята записью выше).
|
||||||
|
|
||||||
|
## Итог
|
||||||
|
|
||||||
|
Дельта r1→r2 — два документационных файла (публикация ревью-документа
|
||||||
|
предыдущего раунда и детерминированная перегенерация индекса), ни один
|
||||||
|
файл, к которому относятся AC1–AC3, не изменился. Неизменность
|
||||||
|
переподтверждена не только по коммитам, но и побайтовым совпадением blob
|
||||||
|
и повторным прогоном целевых юнит-тестов (pass 25/25, как и в r1).
|
||||||
|
Трейлеры на месте на всех трёх коммитах диапазона. Новых AC-релевантных
|
||||||
|
изменений в этом заходе нет, находок, блокирующих вердикт, не выявлено.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||||
|
|
||||||
|
## Материал раунда
|
||||||
|
|
||||||
|
- Ветка: `issue/631-form-state-units`, коммит `c1cc94f0e033` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||||
|
- Дерево материала: `17d1453f7945c34c02ecd48ae61749414f0d46f3`
|
||||||
|
```
|
||||||
|
git log --all --format='%H %T' | grep 17d1453f7945
|
||||||
|
```
|
||||||
|
- Тело issue: `65fb6131e45f761b7a50d4daf8a05706d1c987d495b7132e1fba4307f9549702`
|
||||||
|
- Вердикт конвейера: `green` · High 0
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Индекс ревью
|
# Индекс ревью
|
||||||
|
|
||||||
Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1023, issue: 362. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`.
|
Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1024, issue: 362. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`.
|
||||||
|
|
||||||
| Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы |
|
| Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы |
|
||||||
|---|---|---|---|---:|---:|---|---|
|
|---|---|---|---|---:|---:|---|---|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
| #632 | [CODE-REVIEW-632-r2.md](CODE-REVIEW-632-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — |
|
| #632 | [CODE-REVIEW-632-r2.md](CODE-REVIEW-632-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — |
|
||||||
| #632 | [CODE-REVIEW-632-r3.md](CODE-REVIEW-632-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — |
|
| #632 | [CODE-REVIEW-632-r3.md](CODE-REVIEW-632-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — |
|
||||||
| #631 | [CODE-REVIEW-631-r1.md](CODE-REVIEW-631-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — |
|
| #631 | [CODE-REVIEW-631-r1.md](CODE-REVIEW-631-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — |
|
||||||
|
| #631 | [CODE-REVIEW-631-r2.md](CODE-REVIEW-631-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — |
|
||||||
| #630 | [CODE-REVIEW-630-r1.md](CODE-REVIEW-630-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — |
|
| #630 | [CODE-REVIEW-630-r1.md](CODE-REVIEW-630-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — |
|
||||||
| #629 | [SPEC-REVIEW-629-r1.md](SPEC-REVIEW-629-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — |
|
| #629 | [SPEC-REVIEW-629-r1.md](SPEC-REVIEW-629-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — |
|
||||||
| #627 | [SPEC-REVIEW-627-r1.md](SPEC-REVIEW-627-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | избыточное (не противоречивое) условие в AC2; влияние на touch не названо явным пунктом | `docs/TOUCH-SUPPORT.md` |
|
| #627 | [SPEC-REVIEW-627-r1.md](SPEC-REVIEW-627-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | избыточное (не противоречивое) условие в AC2; влияние на touch не названо явным пунктом | `docs/TOUCH-SUPPORT.md` |
|
||||||
|
|||||||
Reference in New Issue
Block a user