Issue: #543 User-Visible: no
12 KiB
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:
- формулировка
AC7; - строка про
test/config-adoption-ownership.test.mjsв разделе «Ожидаемые файлы и модули»; - добавление отдельного пункта «отдельный поведенческий 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— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
d88d3e161f7336c02a9cdd1bfa679804cf42041dgit log --all --format='%H %T' | grep d88d3e161f73 - Тело issue:
18a8083126ef98f841e6dd8e670203f8c016ea805af7a9dbefcc54aacb7d7cf1 - Вердикт конвейера:
green· High 0