Files
houseplan-card/docs/reviews/SPEC-REVIEW-265-r3.md
T
2026-08-25 11:14:32 +00:00

151 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SPEC-REVIEW-265-r3
- Issue: [#265](https://github.com/Matysh/houseplan-card/issues/265) — «Рефакторинг 2/5: один контракт шва импорта — ремап ссылок за собой и идемпотентная уборка»
- Этап: `S4-spec-review` (ревью ТЗ, PROCESS.md §2.4)
- Заход: r3 · блокирующих циклов израсходовано 2/4 до этого вердикта (лимит — 4, обычный трек: метки issue — `P1`, `S4-spec-review`, `tech-debt`, `small`/`trivial` не стоит)
- ТЗ: `docs/specs/265-import-reference-seam.md`, ветка `issue/265-import-seam-contract`, SHA на момент ревью — HEAD (`26af611a`, коммит «docs: name real i18n verification»)
- Ревьюер: Claude (свежая сессия, без переписки с автором)
## Скоуп ревью
Третий заход, разбор по дельте (PROCESS.md §2.10, issue #214).
1. Вердикт предыдущего раунда (r2) и SHA, на котором он получен, найдены без
поиска: комментарий r2 в issue и шапка `docs/reviews/SPEC-REVIEW-265-r2.md`
называют его явно — HEAD на момент того ревью, `67bcce8e` («docs: address
import seam spec review»). SHA назван — не находка.
2. Дельта: `git diff 67bcce8e..HEAD --stat`:
```
docs/reviews/SPEC-REVIEW-265-r2.md | 186 ++++++++
docs/specs/265-import-reference-seam.md | 2 +-
```
`SPEC-REVIEW-265-r2.md` — публикующий шаг положил документ прошлого раунда
в ветку задачи (это не правка автора и не предмет разбора). Единственная
правка автора — одна строка в
`docs/specs/265-import-reference-seam.md`: замена одного имени в ячейке
таблицы «§15.1 Матрица доказательств», строка AC10.
3. Дельта — точное и единственное исправление находки r2 (M5), ни одна другая
строка ТЗ не тронута. Продуктового кода в дельте нет, контракт (lineage,
матрица ссылок, immutable candidate, remap, edge cases, риски, сценарий,
i18n-ключи) не менялся ни по одной строке с r2.
4. Условия «разбор остаётся полным» (§2.10 PROCESS.md) не выполнены: не было
ребейза, контракт поведения не менялся, новая подсистема не затронута,
объём дельты (одна ячейка одной таблицы) многократно меньше исходной
задачи. Сокращение объёма разбора до дельты плюс всего, что дельта
задевает, — законно.
## Закрытие раунда r2
| Находка r2 | Чем закрыта | Где это видно |
|---|---|---|
| **M5** — AC10 в «§15.1 Матрица доказательств» называет обязательным гейтом `check-i18n`, которого не существует ни в `package.json`, ни как файл, ни в workflow | Ячейка AC10 переписана: `check-i18n` заменён на `npm test` (включая `test/i18n.test.mjs`) — реальный, существующий гейт, который фактически прогоняет паритет en/ru-ключей | `docs/specs/265-import-reference-seam.md:454` (было: `` `check-i18n`, `check-docs`, … ``; стало: `` `npm test` (включая `test/i18n.test.mjs`), `check-docs`, … ``) |
Закрыто предметно: новая строка называет команду, которая существует и делает
то, что от неё требуется (см. «Как проверялось», п.2), а не декларация «поправлено
опечаткой».
## Унаследовано из r2
Без повторной проверки принято (документ `docs/reviews/SPEC-REVIEW-265-r2.md`,
SHA `67bcce8e`, полный разбор второго захода):
- §3 «Подтверждённое состояние кода», §4 «Унаследованные продуктовые решения»,
§5 «Цели и границы», §6 «Канонический lineage id», §7 «Неизменяемый
кандидат preview/apply», §9 «Порядок remap и конфликты», §11 «Инварианты и
отказоустойчивость», §12 «Совместимость и миграция», §13 «Риски», §14 «Edge
cases», §16–§19 (план реализации, проверки, rollback, допущения) —
содержимое не менялось между r2 и r3, дельта их не касается;
- §1 «Сценарий и персона», §2 «Что человек увидит до и после» — закрытие
находок M1 из r1, подтверждено в r2, не тронуто в этой дельте;
- §10 (перечень RU/EN i18n-ключей) и безусловная формулировка AC10 в прозе
(§435-439) — закрытие M2, подтверждено в r2, эта дельта меняет только
строку матрицы доказательств, не прозу AC10 и не сам список ключей;
- «§15.1 Матрица доказательств» как факт существования раздела (закрытие M3)
и «§13. Риски» как факт существования раздела (закрытие M4) — подтверждено
в r2; в этой дельте меняется одна ячейка внутри уже принятой таблицы, а не
сам факт её наличия;
- терминология («Оптимизировать планы», «carrier»), три унаследованных
решения владельца, отсутствие открытых продуктовых вопросов — не
пересматривались ни в r2, ни здесь, дельта их не касается;
- транзитивно из r1 (`docs/reviews/SPEC-REVIEW-265-r1.md`, SHA `2cf47fc1`):
построчная сверка §3(r2-нумерация) с `import_export.py` и с пробелами
`scripts/model-invariants.mjs`, сверка §4 со статусом закрытых
#244/#248/#252/#258/#262 — не пересматривались повторно ни в r2, ни в r3.
## Как проверялось
1. Прочитаны комментарии issue #265 (аналитика, хендофф ТЗ, оба предыдущих
вердикта, оба хендоффа автора после правок) и шапки/тела
`SPEC-REVIEW-265-r1.md`, `SPEC-REVIEW-265-r2.md` — восстановлены SHA обоих
предыдущих раундов без догадок.
2. Дельта получена и прочитана целиком: `git diff 67bcce8e..HEAD` и
`git diff 67bcce8e..HEAD --stat`. Один функциональный файл, одна строка.
3. Проверено фактическое утверждение, которое эта дельта вносит:
- `package.json` → `"test": "tsc -p tsconfig.test.json && node
scripts/fix-test-build.mjs && node --test test/*.test.mjs"` — `npm test`
действительно прогоняет весь `test/*.test.mjs`, включая
`test/i18n.test.mjs`;
- `test/i18n.test.mjs:9` — `test('i18n: en and ru dictionaries carry the
same key set', …)` — тест реально проверяет паритет ключей en/ru, то
есть именно то свойство, для доказательства которого строку AC10
цитирует;
- `check-docs` в той же ячейке — `scripts/check-docs.mjs` существует
(без изменений с r2, не переоценивался повторно).
4. `git diff --check 67bcce8e..HEAD -- docs/specs/265-import-reference-seam.md`
— чисто, пробельных дефектов нет.
5. `node scripts/check-docs.mjs` → `Documentation checks passed (7 files, 10
external links)` — прогнан ради полноты; дельта не касается `src/**`, гейт
не обязателен на этом этапе, но дёшев и уже был зелёным в r2.
6. `npx tsc --noEmit` / `npm test` / `npm run build` не запускались: дельта не
содержит кода, продуктового кода в задаче на этапе `S4-spec-review` ещё
нет — то же основание, что в r1 и r2. (Косвенно `npm test` уже был
изучен построчно в п.3 — не как гейт этого ревью, а как объект проверки
самого AC10.)
7. Перечитаны AC1–AC10 в прозе (§ «Критерии приёмки») и убедился, что правка
матрицы доказательств не меняет и не противоречит тексту самих AC10 —
критерий приёмки остаётся тем же, поменялся только способ его
доказательства.
## Находки
Нет. Единственная находка предыдущего раунда закрыта точно и без побочных
эффектов; дельта не вносит новых утверждений, кроме подтверждённого выше
факта существования и содержания `npm test`/`test/i18n.test.mjs`.
## Что проверено и корректно
- M5 (r2) закрыта предметно: `check-i18n` заменён на существующий, реально
выполняющий нужную проверку гейт `npm test` (`test/i18n.test.mjs`); прилегающий
`check-docs` не тронут и остаётся корректным.
- Правка ограничена ровно той ячейкой, которую называла находка — AC10 в
прозе, список i18n-ключей (§10) и любой другой раздел не задеты.
- Дельта не создаёт нового расхождения между прозой AC10 и матрицей
доказательств: оба места описывают один и тот же набор гейтов.
- Все находки r1 (M1–M4) и r2 (M5) закрыты предметно и подряд, ни одна не
вернулась и не переоткрылась.
## Чего не проверял
- Не переоценивал §1–§9, §11–§14, §16–§19 повторно — дельта их не касается,
унаследованы из r2 (и транзитивно из r1) без повторной проверки, ссылки на
документы и SHA — в разделе «Унаследовано из r2» выше.
- Не запускал `typecheck`/`test` (как гейт билда)/`build`/смоки/`invariants` —
продуктового кода в этой задаче ещё нет, гейты неприменимы на этапе
`S4-spec-review` (то же основание, что в r1 и r2). `npm test` изучен только
как текст скрипта и файла теста — предмет проверки самого утверждения AC10,
не гейт этого ревью.
- Не проверял заново соответствие терминологии `docs/USER-GUIDE.ru.md` — не
тронуто дельтой, унаследовано.
- Не оценивал производительность/security заново — алгоритмическая часть
(§6, §8, §9, §11) дельтой не изменена, оценка r1/r2 в силе.
## Вердикт
Единственная находка r2 (M5) закрыта точно, доказуемо и без побочных
эффектов на остальной документ. Дельта этого раунда не вносит новых находок.
ТЗ по всем разделам PROCESS.md §7.1 и DoR §2.5 полно, каждый AC1–AC10
однозначен и снабжён способом доказательства, открытых продуктовых вопросов
нет.
**Вердикт: зелёный · заход r3 · блокирующих циклов 2/4 · High: 0 · Medium: 0**