diff --git a/docs/reviews/SPEC-REVIEW-449-r1.md b/docs/reviews/SPEC-REVIEW-449-r1.md index 0eb79f3e..abd9ff98 100644 --- a/docs/reviews/SPEC-REVIEW-449-r1.md +++ b/docs/reviews/SPEC-REVIEW-449-r1.md @@ -1,210 +1,213 @@ -# SPEC-REVIEW — issue #449 · заход r1 +# SPEC-REVIEW — issue #449 · заход r2 - Issue: https://github.com/Matysh/houseplan-card/issues/449 - Этап: ревью ТЗ (PROCESS.md §2.4) - ТЗ: `docs/specs/449-double-fit-all.md` -- Материал: ветка `issue/449-double-fit-all`, SHA `5847bf2b1bb6e6168f6727b26470c28f7f2650ec` +- Материал: ветка `issue/449-double-fit-all`, SHA `e027b2a06d62b79530840a36369651d5eea38839` - Трек: полный (issue не помечен `small`); лимит циклов ревью ТЗ — 4 (§2.4) -- Заход r1, блокирующих циклов израсходовано до этого вердикта: 0/4 +- Заход r2, блокирующих циклов израсходовано до этого вердикта: 1/4 (r1 — жёлтый) -## Скоуп проверки +## Скоуп проверки — по дельте (PROCESS.md §2.10) -Диапазон `git diff origin/dev...HEAD` — два файла, оба класса C: +Предыдущий вердикт: r1, жёлтый, документ `docs/reviews/SPEC-REVIEW-449-r1.md`, +зафиксирован в коммите `9206ef64b6e8f344a881db057ecae065833e25db`. Материал того +раунда: SHA `5847bf2b1bb6e6168f6727b26470c28f7f2650ec`, дерево +`0254c870c60fdf2ba6d000a7c0586607a9bf4e52`, блоб ТЗ +`3abb3ba5bb81f1c15be272ddbf1fa858f0e6adb5` — SHA живой, разрешается +напрямую (`git log --oneline 9206ef64..e027b2a0` даёт один коммит), ребейза не +было (`git merge-base origin/dev e027b2a0` = `89647c10`, тот же база, что и на +момент r1). + +Дельта — один коммит `e027b2a0` поверх `9206ef64`: ``` -docs/specs/449-double-fit-all.md | 412 +++++++++++++++++++++++++++++++++++++++ -docs/specs/README.md | 1 + +git diff 9206ef64..e027b2a0 -- docs/specs/449-double-fit-all.md docs/specs/README.md ``` -Продуктовый код не менялся (класс A/B пуст в этом диффе) — это чистый этап -«ТЗ в работе → ТЗ на ревью», код-гейты (`typecheck`/`test`/`build`) к этому -раунду не относятся и не прогонялись: разбор — это чтение ТЗ, тела issue и -сверка каждого фактического утверждения ТЗ с действующим кодом/документами. +```diff ++- **Touch editor: not exposed** — жест живёт только во View и kiosk; редакторы ++ Плана, Устройств, Декора и Подложки его не получают, их touch-поведение и ++ редакторский double-click не меняются (§6 «Режимы», AC7). Правило ++ `docs/TOUCH-SUPPORT.md` → «Documentation rule». +``` + +Ровно 4 добавленные строки в шапке ТЗ, `docs/specs/README.md` не менялся (запись +issue↔ТЗ уже была на месте с r1). Продуктовый код по-прежнему не тронут: диапазон +`git diff origin/dev...HEAD` содержит только `docs/reviews/SPEC-REVIEW-449-r1.md`, +`docs/specs/449-double-fit-all.md`, `docs/specs/README.md` — класс C целиком. + +Дельта локальна: не ребейз, не смена контракта, не новая подсистема, объём — 4 +строки против находки в одну строку. Разбор сокращён до дельты плюс всего, до +чего эта дельта дотягивается: сама новая строка и разделы, на которые она +ссылается (§6 «Режимы», AC7, `docs/TOUCH-SUPPORT.md` → «Documentation rule»). +Остальные разделы ТЗ дельта не задевает и не проверялись повторно — см. +«Унаследовано из r1». ## Как проверялось -1. `docs/SCOPE.md` — мандат и Core user jobs. -2. `AGENTS.md`, `PROCESS.md` целиком (включая §2.4, §2.10, §5, §7.1, §12) — - процесс, обязательные разделы ТЗ, правила Medium в/вне скоупа. -3. Тело issue #449 и все 6 комментариев (`gh issue view 449 --comments`) — - восстановлена хронология Q1/Q2/Q3 и финальное решение владельца. -4. `docs/specs/449-double-fit-all.md` целиком. -5. `docs/CANVAS.md` §5, `docs/TOUCH-SUPPORT.md`, `docs/UX-MODES.md` — - канонические документы подсистемы camera/gesture/touch. -6. `docs/USER-GUIDE.ru.md` §6 (терминология интерфейса) и `src/i18n/ru.json`. -7. Сверка утверждений ТЗ о «текущем поведении по коду» с самим кодом: - `src/houseplan-card.ts` (`_stagePointerUp`, `_stagePointerDown`, `_fitAll`, - `_resetZoom`, `_lastTap`, `_swipeStart`, `_startCameraTransition`), - `src/room-fit.ts` (`roomFitOwnerFromPath`, `acceptedRoomFitGesture`, - `ROOM_FIT_INTERACTIVE_OWNER`), `src/viewport-transition.ts` - (`CameraTransitionReason`, `sameCameraState`, `CameraTransitionController`). -8. Существование всех файлов, упомянутых в «Плане автотестов» и AC - (`demo/smoke_kiosk.mjs`, `demo/smoke_kiosk_pan_lock.mjs`, - `demo/smoke_room_fit.mjs`, `demo/smoke_editor_gestures.mjs`, - `demo/smoke_smooth_zoom.mjs`, `test/room-fit.test.mjs`, - `scripts/mutation-gate.mjs`, `npm run bundle:budget`). -9. Трейлеры коммита `5847bf2b` (`git show -s --format=full`). -10. `docs/specs/README.md` — ссылка issue↔ТЗ в обе стороны. +1. Найден вердикт r1 и его материал — комментарий issue + `#issuecomment-5542152824` и документ `docs/reviews/SPEC-REVIEW-449-r1.md` + (коммит `9206ef64`), включая блок «Материал раунда». +2. `git diff 9206ef64..e027b2a0` — единственная правка, 4 строки. +3. Проверена точная формулировка `docs/TOUCH-SUPPORT.md` → «Documentation + rule» (`docs/TOUCH-SUPPORT.md:163-175`): три допустимых значения, + `not exposed` — одно из них, выбор соответствует факту (задача не даёт и не + отнимает touch-возможностей редакторов, а не вырождает их). +4. Проверена ссылка новой строки на §6 «Режимы» и AC7 внутри самого файла + (`docs/specs/449-double-fit-all.md:180-188`, `:279-285`) — обе секции + существуют и говорят про **три** редактора: План, Устройства, Подложка. +5. Сверено количество и названия редакторов, перечисленных в новой строке + («Плана, Устройств, Декора и Подложки» — четыре существительных), с + каноническим списком: `docs/USER-GUIDE.ru.md:201-206` (таблица режимов: + Редактор плана / Редактор устройств / Редактор подложки — ровно три), + `docs/UX-MODES.md:186` (`## Background — the decor underlay`, то есть + «decor» — это содержимое редактора Background/Подложка, не отдельный + редактор) и `scripts/check-docs.mjs:115` (`[/\bDecor editor\b/gi, + 'Background editor']` — инструмент проекта явно нормализует «Decor editor» + в «Background editor» как устаревший синоним одного и того же редактора). + Также сверено с внутренним enum режима: `src/houseplan-card.ts:890` + (`private _mode: 'view' | 'plan' | 'devices' | 'decor'`) — `decor` здесь и + есть код режима редактора Подложки, а не четвёртое отдельное значение. +6. Файлы `docs/specs/README.md` (не изменился) и трейлеры коммита `e027b2a0` + (`git show -s --format=full e027b2a0`) — `Issue: #449`, `User-Visible: no`, + верно для документационного коммита без изменения поведения. -## Продуктовая рамка +## Закрытие раунда r1 -Job — J1 «Show the whole home and what's happening right now»: быстрый -возврат к обзору всего дома после zoom/pan — прямая навигационная надобность -внутри уже закрытого job, не новая функциональность вне SCOPE.md. Персона — -Household member/Guest на View, Home admin на kiosk-стенде; оба уже описаны -как основная аудитория View/kiosk (TOUCH-SUPPORT.md: «touch-first product in -View and kiosk»). В скоупе. +| Находка r1 | Чем закрыта | Где это видно | +|---|---|---| +| **M1** (Medium, в скоупе): нет обязательной строки `Touch editor: …` из `docs/TOUCH-SUPPORT.md` → «Documentation rule» | Добавлена строка `Touch editor: not exposed` в шапку ТЗ, с обоснованием и ссылкой на §6/AC7 | `docs/specs/449-double-fit-all.md:9-12` (коммит `e027b2a0`) | +| Вне скоупа: расхождение «Показать всё» / «Вписать всё» в `docs/USER-GUIDE.ru.md` | Заведено отдельным issue, как и требовало ревью; в этой ветке не трогается | issue [#452](https://github.com/Matysh/houseplan-card/issues/452) | + +M1 закрыта формально верно — правило требует именно одну явную строку с одним +из трёх значений, строка добавлена в то же место, что и у ранее цитированных +прецедентов (#229, #230, #302, #220, #243). Но сама добавленная строка вносит +новую фактическую неточность — см. находку ниже. ## Находки ### Medium (в скоупе — чинится в этом ТЗ, без него — жёлтый вердикт) -**M1. Нет обязательной строки `Touch editor: …`.** +**M2. Строка `Touch editor: not exposed`, закрывающая M1, называет +несуществующий четвёртый редактор.** -`docs/TOUCH-SUPPORT.md` §«Documentation rule»: «New editor feature -specifications and code reviews must state one of: `Touch editor: -supported` / `best effort / intentionally degraded` / `not exposed`». -ТЗ #449 явно исключает редакторы из скоупа (раздел «Не-скоуп», п.4; таблица -§6 «Режимы» — План/Устройства/Подложка: «Нет нового действия»), но нигде не -формулирует это классификацией `Touch editor: not exposed`, хотя это -установленная практика проекта даже для задач, вообще не трогающих -редакторы — см. `docs/specs/229-merge-collinear-partitions.md:8`, -`docs/specs/230-hatch-density-normalization.md:7`, -`docs/specs/302-junction-node-material.md:7`, -`docs/specs/220-space-tab-reorder.md:156`, -`docs/specs/243-space-tab-drop-target.md:184` — везде одна явная строка -рядом с обоснованием. +Строка перечисляет «редакторы Плана, Устройств, **Декора** и **Подложки**» +(`docs/specs/449-double-fit-all.md:9-10`) — четыре разных существительных, +как если бы Декор и Подложка были двумя разными редакторами. Это не так: +`docs/USER-GUIDE.ru.md:201-206` называет ровно три редактора (План, Устройства, +Подложка); `docs/UX-MODES.md:186` прямо называет декор «the decor underlay» — +содержимым редактора Подложки/Background, не отдельным режимом; +`scripts/check-docs.mjs:115` normalizes «Decor editor» → «Background editor» +именно потому, что в проекте это два имени одного и того же редактора (внутри +код называет его `decor`, снаружи — «Подложка» / «Background editor»); и, +наконец, сама эта строка ссылается на §6 «Режимы» и AC7 того же файла, которые +оба перечисляют ровно три редактора: План, Устройства, Background +(`docs/specs/449-double-fit-all.md:180-188,279-285`). -**Воспроизведение:** `grep -in "touch editor" docs/specs/449-double-fit-all.md` -→ пусто. +**Воспроизведение:** +``` +git show e027b2a0:docs/specs/449-double-fit-all.md | sed -n '9,12p' +git show e027b2a0:docs/specs/449-double-fit-all.md | sed -n '180,188p' +``` +Первая команда даёт четыре редактора, вторая — три. Разночтение внутри одного +файла. -**Почему это находка, а не придирка к форме:** пункт DoR (§2.5) требует -«влияние на touch по `docs/TOUCH-SUPPORT.md` (View и киоск — блокирующие)» -явно названным. Сейчас читатель должен сам собрать этот вывод из трёх разных -мест ТЗ (не-скоуп, таблица режимов, раздел UX); одна строка закрывает вопрос -однозначно и без интерпретации, как это сделано в дюжине предыдущих ТЗ. +**Почему это находка, а не придирка к форме:** ровно это M1 из r1 просило +устранить — необходимость собирать вывод «какие редакторы затронуты» из +нескольких мест. Правка добавила единственную обязательную строку, но эта +строка сама разошлась с §6/AC7, на которые ссылается, — и внесла ложную +сущность («редактор Декора»), которой не существует ни в UI, ни в коде, ни в +каноническом словаре `docs/USER-GUIDE.ru.md`. Оставить как есть значит вернуть +ту же двусмысленность, которую M1 просило закрыть, только в обратную сторону +(лишний редактор вместо необходимого, но неявного вывода). -**Как чинится:** добавить одну строку, например «`Touch editor: not -exposed` — задача не добавляет и не убирает ни одного жеста в Плане, -Устройствах и Подложке; двойной жест ограничен `_mode === 'view'` -(включает kiosk)». +**Как чинится:** убрать дублирующее существительное, например: «редакторы +Плана, Устройств и Подложки (декора) его не получают» — либо просто «Плана, +Устройств и Подложки», раз термин «декор» уже пояснён как содержимое +Подложки в остальном тексте ТЗ (§2, «Что считается свободным фоном» и другие +места файла, не входящие в дельту, декор нигде не называют отдельным +редактором). -### Вне скоупа — заведён отдельный issue +### High / Low -**Терминология кнопки «Вписать всё» vs «Показать всё».** ТЗ #449 корректно -использует «Вписать всё» — это буквальный текст тултипа (`title.zoom_fit` в -`src/i18n/ru.json`) и терминология `docs/CANVAS.md`. Но -`docs/USER-GUIDE.ru.md` §6 (три места: строки 270, 289, 297) называет ровно -ту же команду `_fitAll()` «Показать всё» — расхождение, судя по всему, -попавшее из формулировки записи `v1.70.0-beta.1` (#82) в -`docs/CHANGELOG.ru.md:271`. Поскольку `docs/USER-GUIDE.ru.md` — канонический -источник интерфейсной терминологии (AGENTS.md), а сам документ противоречит -себе (гайд ↔ тултип/CANVAS.md), это самостоятельный дефект документации, не -созданный и не обязанный чиниться в ветке #449 (задача не трогает эту -формулировку намеренно). Заведён -[#452](https://github.com/Matysh/houseplan-card/issues/452) со ссылкой на -#449, метки `docs`, `P3`, `S1-new`. - -### Low - -Нет находок уровня Low после разбора: единственный технический вопрос, -который я бы поставил под сомнение (общее окно 350 мс для мыши и тач, -«Принятые предположения» п.2), явно помечен автором как предположение, -свободное к пересмотру ревьюером без цикла — 350 мс лежит в обычном -диапазоне порогов ОС/браузера для double-click, менять не вижу оснований. -Снимаю без правки. +Нет находок этих уровней в дельте r2. ## Что проверено и корректно -- **Продуктовые решения Q1/Q2 зафиксированы и непротиворечиво перенесены в - ТЗ.** История комментариев: Q1 сначала переоткрыт в пользу альтернативы - («жест работает и по комнате»), затем явным комментарием владельца - возвращён к default (только свободный фон), Q3 закрыт как потерявший - предмет. Раздел «Контракт поведения» §5 и таблица §6 корректно отражают - именно финальное решение, а не промежуточное. -- **Заявления о «текущем поведении по коду» проверены построчно и точны:** - `_lastTap`/`_swipeStart` действительно живут только внутри - `if (this._kiosk) { … }` в `_stagePointerUp` (`src/houseplan-card.ts:6951-6988`); - stage не имеет `dblclick`-обработчика (единственные `@dblclick` в файле — - на decor-фигурах Background editor и backdrop-диалоге); `acceptedRoom` - вычисляется до kiosk-ветки и не обновляет `_lastTap`, что подтверждает - «room-owned tap намеренно не входит в kiosk double-tap sequence» — - совпадает и с `docs/CANVAS.md:294-295` («room-owned taps never enter the - free-background double-tap sequence»). -- **`_fitAll()` действительно принимает только `'fit' | 'home'` сегодня** - (`src/houseplan-card.ts:6318`), а `CameraTransitionReason` в - `src/viewport-transition.ts:10` уже включает `'double-tap'` — ТЗ корректно - формулирует требуемое расширение сигнатуры `_fitAll`, а не выдаёт его за - существующий факт. -- **Заявление о no-op на совпадающий target подтверждено кодом:** - `_startCameraTransition` (`src/houseplan-card.ts:1156-1173`) содержит два - явных ранних выхода на `sameCameraState`, ровно то, что описывает - контракт §1 п.7. -- **Список исключений «не свободный фон» (§2) не расходится с - `ROOM_FIT_INTERACTIVE_OWNER`** в `src/room-fit.ts:36-40` — совпадает по - составу (`.dev`, `.vacpuck`, `.oplock`, `.op-hit`, `.opening`, `.rlgo`, - `a/button/input/select/textarea`, `role=link/button`, - `[data-room-fit-block]`) плюс `.roomlabel`/`[data-hp="room"]`, - корректно добавленные как «room owner», не «свободный фон». Требование - «один источник selector list для room-fit и нового жеста» — правильная и - проверяемая техническая директива. -- **Режим `view` действительно общий для View и kiosk на уровне - `this._mode`** (`private _mode: 'view' | 'plan' | 'devices' | 'decor'`, - kiosk — отдельный булев флаг) — формулировка §3 п.2 «режим на всём жесте — - `view`» корректно покрывает оба поверхностных режима одним условием. -- **Все файлы, названные в «Плане автотестов» и в AC1–AC11 как - доказательства, существуют** (перечислены выше в «Как проверялось» п.8) — - ни одной ссылки на несуществующий смок/скрипт. -- **Обязательные разделы §7.1 присутствуют все**: сценарий, что человек - увидит до/после, проблема, скоуп/не-скоуп, контракт поведения, UX, модель - данных/миграция/compatibility/i18n, AC1…AC11 с доказательством, план - автотестов, риски, откат, release-артефакты. -- **AC пронумерованы, у каждого указан способ доказательства** (unit / mutation - / production-bundle smoke), включая явные негативные AC (AC4–AC8) — - ни одного «размытого» критерия без проверяемого исхода. -- **Блок «Принятые предположения» отделяет техническое от продуктового** - корректно: ни один пункт там не является продуктовым решением, которое - требовалось бы спрашивать у владельца (только технические — Pointer - Events vs dblclick, отсутствие нового spatial threshold, разделение - modality, отсутствие таймера, вынос selector list, единый reason). -- **Трейлеры коммита корректны:** `Issue: #449`, `User-Visible: no` — верно - для чисто спецификационного коммита без изменения поведения. -- **Ссылка issue ↔ ТЗ на месте в обе стороны:** заголовок ТЗ ссылается на - issue, `docs/specs/README.md` получил новую строку с корректной ссылкой на - файл. -- **Golden/screenshots корректно исключены**: «Golden baseline не должен - меняться» и «Новых UI screenshots не требуется» — верно, статический кадр - View не меняется (только динамика жеста). -- **Formal DoR-пункты** (i18n: явно «нет новых строк», compatibility: явно - «нет новых полей», перф: явно назван бюджет O(длина composed path), откат: - явно описан) все закрыты явными утверждениями, а не молчанием. +- **M1 закрыта по существу формы**: строка добавлена, использует ровно одно + из трёх разрешённых значений правила (`not exposed`), стоит в шапке рядом с + «Решения владельца» — там же, где и у процитированных прецедентов. +- **Ссылка на `docs/TOUCH-SUPPORT.md` → «Documentation rule» точна**: раздел + существует по названным строкам, формулировка трёх допустимых значений + совпадает. +- **Ссылки новой строки на §6 и AC7 разрешимы** — оба раздела существуют в том + же файле и оба говорят о touch/double-click в редакторах, тема совпадает + (расходится только счётный состав — см. M2). +- **`docs/specs/README.md` не тронут и не должен был быть**: запись + issue↔ТЗ добавлена ещё в r1 и делта её не касается. +- **Трейлеры `e027b2a0` корректны**: `Issue: #449`, `User-Visible: no` — верно + для чисто документационной правки без изменения поведения продукта. +- **Дельта действительно локальна**: не ребейз, не новая подсистема, не смена + контракта — полный повторный разбор не требуется (PROCESS.md §2.10). + +## Унаследовано из r1 + +Всё, что документ `docs/reviews/SPEC-REVIEW-449-r1.md` (коммит `9206ef64`, +материал — SHA `5847bf2b1bb6`, дерево `0254c870c60f`, блоб ТЗ `3abb3ba5bb81`) +проверил и признал корректным, дельта r2 не задевает и принято без повторной +проверки: + +- продуктовая рамка — job J1, персоны Household/Guest (View) и Home admin + (kiosk), задача в скоупе `docs/SCOPE.md`; +- решения владельца Q1/Q2 корректно перенесены в контракт поведения (§5) и + таблицу §6 (сама таблица не менялась дельтой r2, кроме факта, что новая + строка теперь на неё ссылается — содержимое таблицы проверено заново в этом + раунде, см. «Как проверялось» п.4, и совпадает с тем, что подтвердил r1); +- построчная сверка «текущего поведения по коду» (`_lastTap`/`_swipeStart` + внутри kiosk-ветки, отсутствие `dblclick` на stage, `_fitAll` сигнатура, + `ROOM_FIT_INTERACTIVE_OWNER`, `CameraTransitionReason`, no-op на + `sameCameraState`) — код не менялся, повторная сверка не требуется; + «Как проверялось» п.5 этого раунда лишь свежо сверил список редакторов и + внутренний enum `_mode`, не весь код-контракт заново; + — но раз ссылка на исходники была короткой и по конкретному факту, она не + расширяет разбор до полного; +- существование всех файлов, названных в «Плане автотестов» и AC1–AC11 + (smoke/test/mutation-gate) — файлы дельтой не переименовывались и не + удалялись; +- обязательные разделы §7.1 присутствуют все, AC пронумерованы и каждый несёт + способ доказательства; +- блок «Принятые предположения» отделяет техническое от продуктового + корректно — не менялся; +- вне-скоуп находка «Показать всё» / «Вписать всё» верно заведена как #452 и + не относится к предмету этого раунда. ## Чего не проверял и почему -- **Реализацию** — её нет, диапазон диффа не содержит класса A/B; проверять - нечего до `S5-ready`. -- **`npx tsc --noEmit` / `npm test` / `npm run build`** — не гоняла: раунд не - меняет ни одной строки кода, только `docs/**` (класс C), эти гейты - относятся к код-ревью, а не к ревью ТЗ. -- **`node scripts/check-docs.mjs`** — не гоняла: диапазон не трогает - `src/**`, отпечаток скриншотов документации не мог устареть от этого - диффа. -- **Достижимость всех связанных issue (#82, #152, #183)** — не перечитывала - их код заново сверх того, что нужно для проверки конкретных фактических - утверждений ТЗ (см. выше); ссылки как «уже сделано/подтверждено» приняты - там, где сверены с текущим кодом, и не расширялись дальше необходимого. -- **Возможные будущие AC-конфликты с #82/#152 после реализации** — предмет - код-ревью, не ТЗ: на этапе спецификации проверяется непротиворечивость - контракта, а не факт его будущей корректной реализации. +- **Реализацию** — её по-прежнему нет: диапазон `git diff origin/dev...HEAD` + не содержит класса A/B, только `docs/**`. +- **`npx tsc --noEmit` / `npm test` / `npm run build`** — не гонял: раунд не + меняет ни одной строки кода. +- **`node scripts/check-docs.mjs`** — не гонял: диапазон не трогает `src/**`, + и сам скрипт нормализует «Decor editor» только в `PUBLIC_DOCS` (README, + USER-GUIDE), не в `docs/specs/**`, так что он не поймал бы M2 и не является + подменой этой проверки. +- **Полный текст ТЗ вне зоны дельты** (сценарий, скоуп/не-скоуп, модель + данных, риски, план автотестов, откат, release-артефакты) — не перечитывал + заново; ничто из этого не зависит от добавленных четырёх строк, см. + «Унаследовано из r1». +- **Q1/Q2/Q3 продуктовую историю** — не переоткрывал: решения владельца + зафиксированы до r1 и дельта их не касается. ## Вердикт -High: 0 · Medium в скоупе: 1 (M1, см. выше) · Medium вне скоупа: 1 → заведён -[#452](https://github.com/Matysh/houseplan-card/issues/452). +High: 0 · Medium в скоупе: 1 (M2) · Medium вне скоупа: 0 (r1-находка уже +заведена как #452, повторно не считается). Без High это жёлтый вердикт (PROCESS.md §2.4, §12): ТЗ возвращается автору на -правку M1, повторный цикл — по дельте (§2.10), лимит цикла израсходован -1/4. +правку M2 — привести добавленную строку `Touch editor: not exposed` к тем же +трём редакторам, что называют §6 и AC7 того же файла. Правка локальна (один +факт в одной строке), следующий цикл должен разбираться по дельте этой правки. +Лимит циклов израсходован 2/4. --- @@ -212,12 +215,12 @@ High: 0 · Medium в скоупе: 1 (M1, см. выше) · Medium вне ск ## Материал раунда -- Ветка: `issue/449-double-fit-all`, коммит `5847bf2b1bb6` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. -- Дерево материала: `0254c870c60fdf2ba6d000a7c0586607a9bf4e52` +- Ветка: `issue/449-double-fit-all`, коммит `e027b2a06d62` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. +- Дерево материала: `f5db58186a589e659c2bdb9dd9fad3ba88a9e5c6` ``` - git log --all --format='%H %T' | grep 0254c870c60f + git log --all --format='%H %T' | grep f5db58186a58 ``` -- ТЗ `docs/specs/449-double-fit-all.md`, блоб `3abb3ba5bb81f1c15be272ddbf1fa858f0e6adb5` +- ТЗ `docs/specs/449-double-fit-all.md`, блоб `a1f7c22a6ad5e028a2fdbc3cfc01a8aa9f6780f0` ``` - git log --all --find-object=3abb3ba5bb81f1c15be272ddbf1fa858f0e6adb5 -- docs/specs/449-double-fit-all.md + git log --all --find-object=a1f7c22a6ad5e028a2fdbc3cfc01a8aa9f6780f0 -- docs/specs/449-double-fit-all.md ```