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

13 KiB
Raw Blame History

SPEC-REVIEW-265-r3

  • Issue: #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