diff --git a/docs/reviews/SPEC-REVIEW-543-r2.md b/docs/reviews/SPEC-REVIEW-543-r2.md new file mode 100644 index 00000000..3f4c0ef3 --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-543-r2.md @@ -0,0 +1,136 @@ +# SPEC-REVIEW-543-r2 + +Issue: #543 · Этап: spec (PROCESS.md §2.4) · Заход: r2 · блокирующих циклов +израсходовано 1 из 4 + +Материал: тело issue #543, раздел `## ТЗ`, на момент ревью (метка +`S4-spec-review` после комментария автора «Правка ТЗ после SPEC-REVIEW r1»). +Предыдущий раунд — `docs/reviews/SPEC-REVIEW-543-r1.md`, вердикт жёлтый, +единственная находка Medium в скоупе, материал того раунда: тело issue с +sha256 `06cae6bc0c1c834e055a858a18d406231ff7a696f929be70277a82a675f6779a`, +дерево `bd3acd278b0c6dd3d0cc572096f8c0d2c7e3b38c`, код проверялся на +`6d2facc2e37724a6e6e1a96c5e026aa24b595a07`. + +Продуктовый код между раундами не менялся: этот SHA — коммит «docs: review +document for #544» (документация, класс C), рабочая копия сейчас стоит на +`4a91d5cbe88d6868947f2d7f73c9830869478b56` — тоже только документационный +коммит («docs: review document for #543», публикация r1). Ни одного файла +класса A/B между `6d2facc2` и текущим HEAD не добавлено и не изменено; +единственное продуктовое изменение в этом диапазоне (`6502f516` fix для +#544) уже входило в дерево, которое читал r1. Технические утверждения ТЗ, +завязанные на код (К1–К9, ссылки на строки), это не затрагивает — код, +который читал r1, идентичен коду сейчас. + +## Дельта раунда + +По собственному комментарию автора («Правка ТЗ после SPEC-REVIEW r1», +2026-09-12T18:52:19Z) правка ограничена тремя точками текста тела issue, +все — закрытие единственной находки r1: + +1. формулировка `AC7`; +2. строка про `test/config-adoption-ownership.test.mjs` в разделе «Ожидаемые + файлы и модули»; +3. добавление отдельного пункта «отдельный поведенческий unit coordinator» + в тот же список файлов. + +Остальной текст ТЗ (сценарий, что человек увидит, подтверждённая причина, +скоуп/не-скоуп, К1–К9, UX, модель данных, i18n, AC1–AC6/AC8/AC9, план +автотестов пп.1–6 кроме списка файлов, риски, откат, release-артефакты, +принятые технические предположения) не тронут — сверено построчным чтением +текущего тела issue против содержания, которое цитирует и пересказывает +`SPEC-REVIEW-543-r1.md`, расхождений не найдено. Дельта локальна (§2.10): +код не менялся, контракт поведения не менялся, новая подсистема не +затронута — объём разбора сокращается до дельты и её последствий. + +## Закрытие раунда r1 + +| Находка r1 | Чем закрыта | Где это видно | +|---|---|---| +| Medium (в скоупе): `AC7` и «Ожидаемые файлы и модули» называли `test/config-adoption-ownership.test.mjs` свидетелем поведенческого async-порядка, хотя это статический regex-ratchet #500, не видящий async вообще | Текст `AC7` и списка файлов теперь прямо исключают этот файл из доказательной базы #543 и явно называют единственным поведенческим свидетелем `test/config-adoption.test.mjs`; для нового coordinator-модуля назван отдельный «поведенческий unit», не смешанный с ratchet-файлом | `AC7`: «Статический ratchet `test/config-adoption-ownership.test.mjs` не является свидетелем async-порядка и в доказательную базу #543 не входит.» · «Ожидаемые файлы и модули»: «…отдельный поведенческий unit coordinator; …» и «`test/config-adoption-ownership.test.mjs` остаётся неизменным статическим ratchet #500 и не доказывает async-порядок #543.» (тело issue #543, текущая редакция) | + +Проверено чтением точной итоговой формулировки, а не заявлением автора о +том, что она изменена: обе фразы выше процитированы из текущего тела issue. +Двусмысленности, которую нашёл r1 (можно было прочитать как «этот файл — +свидетель»), в новой формулировке нет: предложение утверждает обратное явно +и с указанием номера задачи. + +## Унаследовано из r1 + +Без повторной проверки принято всё, что не затронуто дельтой — со ссылкой на +`docs/reviews/SPEC-REVIEW-543-r1.md` и материал того раунда (тело issue +sha256 `06cae6bc0c1c834e055a858a18d406231ff7a696f929be70277a82a675f6779a`, +код на `6d2facc2e37724a6e6e1a96c5e026aa24b595a07`): + +- соответствие `docs/SCOPE.md` (J1/J6), продуктовая рамка сценария и «что + человек увидит до/после» — не изменились текстуально; +- построчная сверка технических утверждений с кодом: `_reloadConfigOnly` + (`src/houseplan-card.ts:4417,4466-4501`), `adoptAuthoritativeGated` + (`src/config-adoption.ts:428-460`), шесть call sites + `_adoptAuthoritative`/`adoptAuthoritativeGated`, все `_reloadConfigOnly(true)` + call sites, `docs/ARCHITECTURE.md:1375-1393` (#500), прецедент + `_liveSyncGeneration`/`_liveSyncConnection`, термин «route leave» — код не + менялся, вывод остаётся в силе; +- контракт К1–К9 — текст идентичен, содержательно не проверялся повторно; +- AC1–AC6, AC8, AC9 — формулировки не изменились, доказательства (`unit`, + `smoke`, `lifecycle matrix`, `force/reset`, `mutation`, `gates`) не + затронуты дельтой; +- план автотестов пп.1–6 (кроме уточнения в списке файлов, разобранного + выше) — не изменился; +- риски (6 пунктов), откат, release-артефакты, «Принятые технические + предположения» (5 пунктов) — не изменились; +- обоснование полного трека (нарушенные критерии `small`) — не изменилось; +- продуктовых вопросов владельцу нет и не было — согласие с r1. + +## Что перепроверено заново (по дельте) + +- `AC7` целиком — прочитан в текущей редакции, однозначен: единственный + поведенческий свидетель — `test/config-adoption.test.mjs`, порядок + `compare → asset readiness → continuity → adopt → reload tail → caller + hook` и раздельная обработка current/superseded asset failure сформулированы + без изменений относительно r1 (только вычеркнута ссылка на ratchet-файл). + Новых дефектов формулировки не внесено. +- Раздел «Ожидаемые файлы и модули» — новая структура списка не создаёт + противоречия с `AC7`, `AC8` (`scripts/mutation-gate.mjs` назван и там, и + там) и планом автотестов (`отдельный поведенческий unit coordinator` + соответствует плану автотестов п.2 — «добавить unit request-owner/ + coordinator»). Само по себе имя нового unit-файла не зафиксировано — это + укладывается в «Принятые технические предположения», решается на + код-ревью, продуктовым вопросом не является. +- Проверено, что правка не расширила и не сузила скоуп/не-скоуп и не создала + нового технического спора автора и ревьюера, требующего отдельного цикла: + правка чисто редакционная, устраняет саму находку без побочных эффектов. + +## Что не проверялось и почему + +- Продуктовый код реализации (`src/config-adoption.ts`, будущий + request-owner/coordinator модуль, `demo/smoke_config_reload_race.mjs`, + мутант AC8) — не существует на этом этапе, предмет код-ревью. +- Гейты `typecheck`/`test`/`build`/`golden`/`invariants` — не прогонялись: + на этапе ТЗ продуктового кода к задаче ещё нет, гонять их не по чему; + унаследовано из r1, за раунд между r1 и r2 продуктовый код #543 не + появился. +- Частота гонки на реальном HA — не измерялась, аудит и ТЗ прямо признают + это неизмеренным; унаследовано из r1. +- Полное повторное построчное чтение кода — не выполнялось: код не менялся + между раундами (см. «Материал» выше), только вычитка дельты текста ТЗ. + +## Вердикт + +Зелёный. Единственная находка r1 (Medium, в скоупе) закрыта точной правкой +текста `AC7` и списка файлов, проверено по итоговой формулировке, а не по +заявлению автора. Новых находок дельта не создала. High: 0, Medium: 0. +Готово к переходу в «Готово к разработке» (`S5-ready`). + +--- + + + +## Материал раунда + +- Ветка: `dev`, коммит `4a91d5cbe88d` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. +- Дерево материала: `d88d3e161f7336c02a9cdd1bfa679804cf42041d` + ``` + git log --all --format='%H %T' | grep d88d3e161f73 + ``` +- Тело issue: `18a8083126ef98f841e6dd8e670203f8c016ea805af7a9dbefcc54aacb7d7cf1` +- Вердикт конвейера: `green` · High 0