mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 19:58:50 +00:00
@@ -0,0 +1,188 @@
|
||||
# SPEC-REVIEW — issue #521 — заход r3
|
||||
|
||||
**Этап:** S4-spec-review (PROCESS.md §2.4) · **Трек:** полный (нарушен критерий
|
||||
§5 «нет влияния на производительность и на touch-контракт», названо самим
|
||||
автором в S2) · **Заход:** r3 (третий) · **Бюджет циклов:** 2/4 израсходовано
|
||||
до этого вердикта (r1 — жёлтый, цикл 1; r2 — жёлтый, цикл 2; зелёный вердикт
|
||||
цикла не образует и бюджет не тратит, #227).
|
||||
|
||||
## Скоуп ревью
|
||||
|
||||
Материал — тело issue #521, раздел `## ТЗ`, в редакции после комментария
|
||||
автора «Исправление по ревью ТЗ r2 → заход r3» (2026-09-10T19:01:46Z). Автор
|
||||
заявляет дельту r2→r3 как «одни скобки в „Продуктовой рамке“» — правку
|
||||
единственной находки r2 (Medium: ссылка на несуществующий `CLAUDE.md §4`).
|
||||
Контракт, AC1–AC9, риски, откат и release-артефакты, по заявлению автора, не
|
||||
менялись.
|
||||
|
||||
Дельта локальна: не ребейз (see below), не смена контракта поведения, не
|
||||
новая подсистема, объём несопоставим с исходной задачей — единственная
|
||||
правка одного вложенного уточнения в одном абзаце. По §2.10 разбор веду по
|
||||
дельте: находка r2 проверяется на закрытие, всё остальное наследуется из r1
|
||||
и r2 без повторной проверки.
|
||||
|
||||
## Как проверялось
|
||||
|
||||
- прочитано текущее тело issue #521 целиком (`gh issue view 521 --json body`)
|
||||
и построчно сверено с абзацем «Продуктовой рамки», как он цитируется в
|
||||
`docs/reviews/SPEC-REVIEW-521-r2.md` (находка и «Чем закрывается»);
|
||||
- прочитаны все шесть комментариев issue в хронологическом порядке (аналитика
|
||||
S2, «ТЗ готово», вердикт r1, «Исправление r1→r2», вердикт r2, «Исправление
|
||||
r2→r3»), чтобы отличить объявленную дельту от подтверждённой чтением;
|
||||
- заявление автора «Контракт, AC1–AC9, откат и release-артефакты не тронуты»
|
||||
проверено не на слово: текущий текст разделов «Контракт» (п.1–6), таблицы
|
||||
AC1–AC9, «Риски», «Откат», «Release-артефакты» побайтово совпадает по
|
||||
содержанию с тем, что цитируют/описывают документы r1 и r2 — расхождений,
|
||||
кроме заявленной правки, не найдено;
|
||||
- сама правка проверена буквально:
|
||||
- текущий текст абзаца: «…изобретать формулировки в обход руководства
|
||||
запрещает `AGENTS.md` («interface wording comes from there and is not
|
||||
invented»)» — ссылки на `CLAUDE.md` в теле issue больше нет;
|
||||
- `grep -rn "CLAUDE.md" --include="*.md" .` по всему репозиторию (включая
|
||||
`docs/reviews/*`, где сама фраза цитируется как история находки) —
|
||||
единственные совпадения лежат в архивных документах `SPEC-REVIEW-521-r2.md`,
|
||||
описывающих прошлую находку, в актуальном тексте ТЗ (теле issue) —
|
||||
ноль совпадений;
|
||||
- `find . -iname "CLAUDE.md"` и `git log --all --diff-filter=A --name-only |
|
||||
grep -i "^CLAUDE.md$"` — пусто, файла в репозитории нет и не было;
|
||||
переисполнено самостоятельно, не принято на слово автора или r2;
|
||||
- `AGENTS.md:21-23` — существует, дословно: «For work that changes visible
|
||||
behaviour, also read `docs/USER-GUIDE.ru.md` — interface wording comes
|
||||
from there and is not invented, or the UI starts speaking developer.» —
|
||||
единственная оставшаяся ссылка точна;
|
||||
- `docs/USER-GUIDE.ru.md`, 2241 строка, `grep -n -i
|
||||
"выравнив|направляющ|якор|align"` — ноль совпадений, факт «долг
|
||||
документации» в абзаце по-прежнему подтверждён независимо, а не только
|
||||
предыдущими раундами;
|
||||
- проверено, что материал не ребейзнут: `git merge-base --is-ancestor
|
||||
9592092b 548e7a85` → true, `git log --oneline 9592092b..548e7a85` содержит
|
||||
ровно один коммит — публикацию документа `SPEC-REVIEW-521-r2.md» самим
|
||||
конвейером (0 изменений кода). Это подтверждает, что между r2 и r3 в ветку
|
||||
не прилетело ничего постороннего — этап spec, продуктового кода в диапазоне
|
||||
нет вовсе;
|
||||
- этап spec: продуктовый код не менялся, гейты код-ревью (§8) здесь не
|
||||
применяются — не запускались, как и в r1/r2.
|
||||
|
||||
## Закрытие раунда r2
|
||||
|
||||
| Находка r2 | Чем закрыта | Где это видно |
|
||||
|---|---|---|
|
||||
| Medium: абзац «Продуктовой рамки» ссылался на несуществующий документ `CLAUDE.md §4` — файла нет и никогда не было в репозитории | Ссылка убрана целиком; в скобках осталась только `AGENTS.md` с точной цитатой требования | Тело issue #521, `## ТЗ` → «Продуктовая рамка»: «…изобретать формулировки в обход руководства запрещает `AGENTS.md` («interface wording comes from there and is not invented»)» — `CLAUDE.md` в тексте больше не упоминается; подтверждено `grep -rn "CLAUDE.md" --include="*.md" .` (ноль совпадений в теле issue) |
|
||||
|
||||
Находка закрыта по существу, а не только формально: ложная ссылка убрана
|
||||
полностью, а не заменена другой недоказанной. Автор дополнительно объяснил
|
||||
происхождение ошибки (смешение репозиторного контекста с внерепозиторным
|
||||
рабочим файлом `CLAUDE.md` в папке владельца) и зафиксировал правило на
|
||||
будущее («впредь в ТЗ и ревью ссылаюсь только на то, что лежит в
|
||||
репозитории») — это не предмет проверки ревью (комментарий, не текст ТЗ), но
|
||||
показывает, что механизм ошибки не повторится тем же способом в этой задаче.
|
||||
|
||||
## Унаследовано из r1 и r2
|
||||
|
||||
Без повторной проверки в этом раунде приняты выводы `docs/reviews/SPEC-REVIEW-521-r1.md`
|
||||
(материал: `dev`, коммит `c50bc725c895`; тело issue sha256
|
||||
`bf26b17118240771206ed2a7f26f10c82783ea586679def63cbc17e538c38cfe`) и
|
||||
`docs/reviews/SPEC-REVIEW-521-r2.md` (материал: `dev`, коммит `9592092b8eb9`;
|
||||
тело issue sha256 `ecdf5deb2acf08068eeb2f5e74e98a262d18f2011f4e26c672428abd72123093`),
|
||||
поскольку дельта r3 их не задевает:
|
||||
|
||||
- диагноз и причинность регресса (два независимых слома от `c0d61ca3`/#451,
|
||||
подтверждённых на всех трёх жестах) — проверены r1 построчно по коду на
|
||||
`dev`;
|
||||
- контракт п.1–6 — технически осуществим, ссылки на `_renderAlignGuides()`,
|
||||
`_livePos`, `scheduleHouseplanEditor`, `makeTransparent` точны (r1);
|
||||
- таблица AC1–AC9 «AC · чем доказан · чем краснеет» — заполнена без пустых
|
||||
ячеек, каждый пункт однозначен и называет способ доказательства и мутацию;
|
||||
ссылки на существующие мутанты/сценарии (#400, `noneInView`) реальны, не
|
||||
выдуманы (r1);
|
||||
- требование «смок обязан покраснеть на текущем `dev` до правки» — часть
|
||||
AC1–AC6, проверено r1 как условие приёмки, а не пожелание;
|
||||
- откат — один revert, не касается данных/конфига/публичных контрактов (r1);
|
||||
- release-артефакты — тексты обоих changelog названы дословно, `User-Visible: yes` (r1);
|
||||
- перф и touch — риски названы явно, соответствуют требованию DoR при
|
||||
нарушенном критерии `small` (r1);
|
||||
- объём задачи (все три жеста в одной issue) — продуктовый вопрос уже задан
|
||||
автором владельцу в установленной форме (что неясно · дефолт · приглашение
|
||||
возразить), повторный запрос от ревьюера был бы дублированием (r1);
|
||||
- факт отсутствия описания направляющих в `docs/USER-GUIDE.ru.md` —
|
||||
переподтверждён в r2 самостоятельным `grep`, и в этом раунде ещё раз (см.
|
||||
«Как проверялось») — воспроизводится стабильно на неизменном файле.
|
||||
|
||||
Технические разделы «Что не проверял» из r1/r2 (не запускались гейты
|
||||
код-ревью; не оценивалась реализуемость подавления `.hp-editor-only-layer`
|
||||
для режимов `devices`/`decor`; не оценивался бюджет тестового счётчика
|
||||
осевых циклов) остаются в силе тем же образом — это предмет код-ревью, а не
|
||||
этого этапа.
|
||||
|
||||
## Находки
|
||||
|
||||
Новых находок нет. Единственная находка r2 закрыта без появления нового
|
||||
экземпляра того же или другого класса дефекта — весь текст новой правки
|
||||
(удаление трёх слов и пары скобок) проверен построчно, ничего не добавлено.
|
||||
|
||||
## Что проверено и признано корректным
|
||||
|
||||
- **Дельта соответствует заявленной.** Сравнение текущего тела с описанием
|
||||
находки r2 и с комментарием автора «Исправление по ревью ТЗ r2 → заход r3»
|
||||
подтверждает: правка ограничена одной вложенной ссылкой в абзаце
|
||||
«Продуктовой рамки»; контракт, AC1–AC9, риски, откат и release-артефакты
|
||||
текстуально не менялись (сверено построчно, не на слово автора).
|
||||
- **Единственная оставшаяся нормативная ссылка (`AGENTS.md`) точна и
|
||||
существует.** Цитата дословна, строки 21–23 файла её подтверждают.
|
||||
- **Материал не ребейзнут между r2 и r3** — единственный коммит в диапазоне
|
||||
публикует документ предыдущего раунда, кода не касается.
|
||||
- **Абзац «Продуктовой рамки» теперь не содержит ни одного непроверяемого
|
||||
утверждения о внешнем документе:** источник поведения — код и тесты,
|
||||
названные явно и существующие; отсутствие описания в пользовательском
|
||||
руководстве названо прямо как открытый долг, а не как факт задокументированного
|
||||
поведения.
|
||||
|
||||
## Чего не проверял
|
||||
|
||||
- Не перепроверял построчно код (`_renderAlignGuides`, `_alignPoint`,
|
||||
`live-editor.ts`, `houseplan-editor-runtime.ts`) — дельта r3 его не
|
||||
касается, вывод r1 наследуется без повторной проверки.
|
||||
- Не запускал `tsc`/`test`/`build`/смоки — этап spec-review, продуктового
|
||||
кода ещё нет, гейты §8 к этому этапу не относятся.
|
||||
- Не связывался с владельцем по вопросу объёма задачи (три жеста в одной
|
||||
issue) — вопрос уже задан автором в установленной форме в r1, статус не
|
||||
изменился.
|
||||
- Не проверял технические AC-детали, не задетые дельтой (счётчик осевых
|
||||
циклов, бюджет `test/**`/`demo/**`, реализуемость подавления
|
||||
`.hp-editor-only-layer` для `devices`/`decor`) — они остаются предметом
|
||||
код-ревью, как и было записано в r1/r2.
|
||||
|
||||
## Вердикт
|
||||
|
||||
Находка r2 закрыта по существу, новых находок нет, High нет, Medium в
|
||||
скоупе — 0 незакрытых. ТЗ готово к разработке: полная цепочка §7.1
|
||||
(сценарий, что человек увидит, проблема, скоуп/не-скоуп, контракт, AC1–AC9 с
|
||||
доказательством, откат, release-артефакты) заполнена и не содержит
|
||||
непроверяемых или недоказанных утверждений.
|
||||
|
||||
Вердикт: зелёный · заход r3 · блокирующих циклов 2/4 · High: 0 · Medium: 0 → в задаче
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: заполняется конвейером публикации -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `dev`, коммит `548e7a8563d6ad523b0b715d08cd6bdda34948ad`.
|
||||
- Тело issue проверено по `gh issue view 521 --json body` на момент разбора;
|
||||
дельта r2→r3 — удаление ссылки на `CLAUDE.md §4` из «Продуктовой рамки».
|
||||
- Вердикт: `green` · High 0 · Medium 0
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `dev`, коммит `548e7a8563d6` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||
- Дерево материала: `37d7b40eef9319cb230aa1232018d933afad2ee2`
|
||||
```
|
||||
git log --all --format='%H %T' | grep 37d7b40eef93
|
||||
```
|
||||
- Тело issue: `1e7f8d192f340e80e878aec0d6de383c982263254b408f8fc928f383130f5684`
|
||||
- Вердикт конвейера: `green` · High 0
|
||||
Reference in New Issue
Block a user