mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
@@ -0,0 +1,150 @@
|
||||
# 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**
|
||||
Reference in New Issue
Block a user