mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-02 04:38:55 +00:00
@@ -0,0 +1,214 @@
|
||||
# CODE-REVIEW-749-r2
|
||||
|
||||
Issue: #749 · Репозиторий: Matysh/houseplan-card · Этап: code · Трек: show
|
||||
Заход: r2 · блокирующих циклов израсходовано 0 из 2
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- SHA: `fd13f82eb7888dede455db89878c942fa3dfc11f` (рабочая копия уже на нём)
|
||||
- Диапазон: `git log --oneline origin/dev..HEAD`:
|
||||
```
|
||||
fd13f82e docs(reviews): индекс после сдвига каталога (#749)
|
||||
8cfbbb06 docs: review document for #749
|
||||
a82c482f fix(process): integrate runs every pipeline script from one dev snapshot (#749)
|
||||
```
|
||||
- Validate на `fd13f82e` зелёный:
|
||||
https://github.com/Matysh/houseplan-card/actions/runs/36884088915 — дешёвые
|
||||
гейты (`tsc --noEmit`, `npm test`, `npm run build` + сверка бандла) приняты
|
||||
без повторного прогона.
|
||||
|
||||
## Почему это r2, а не повторная работа над находками
|
||||
|
||||
r1 (`docs/reviews/CODE-REVIEW-749-r1.md`, SHA `9bf35aec…`) вынес **зелёный**
|
||||
вердикт, High/Medium/Low — 0/0/0. Цикл не образовался (зелёный вердикт его не
|
||||
открывает, §4). Публикация, однако, не прошла: токен конвейера `HP_PROCESS_TOKEN`
|
||||
не имеет права `workflow` и GitHub отклонил пуш правки `.github/workflows/_process.yml`
|
||||
(`remote rejected ... refusing to allow a Personal Access Token to create or
|
||||
update workflow ... without workflow scope`). Это ровно строка таблицы
|
||||
AGENTS.md «Handoff и вердикт»: *вердикт был зелёный, слился только конфликт —
|
||||
ребейз и re-apply*. Задачу вернули в `S6-in-progress` с пометкой «код-ревью
|
||||
зелёное, переделывать работу не нужно», автор сам сделал
|
||||
`git fetch && git rebase origin/dev` и запушил свою версию: ребейз
|
||||
осиротил коммит `9bf35aec`, он стал `a82c482f` на новом основании (`dev`
|
||||
`14ea2661`), конфликт был только в генерируемом `docs/reviews/INDEX.md`.
|
||||
|
||||
Старый SHA `9bf35aec` и записанное в r1 дерево `3075c1fc6dae…` в этом
|
||||
репозитории не резолвятся (`git cat-file -t` — ошибка) — ожидаемо после
|
||||
ребейза и явно разрешено разделом «Повторный раунд»: нерезолвящийся SHA — не
|
||||
находка, когда материал ищется по дереву и блобу. Дерево ищется сравнением
|
||||
диффов, см. ниже.
|
||||
|
||||
## Скоуп
|
||||
|
||||
Класс B (`.github/workflows/_process.yml`, `scripts/mutation-registry.mjs`,
|
||||
тесты) + класс C (`PROCESS.md`) + два новых docs-коммита класса C
|
||||
(`docs/reviews/CODE-REVIEW-749-r1.md` — публикация предыдущего раунда,
|
||||
`docs/reviews/INDEX.md` — пересборка индекса после ребейза). Продуктовый код
|
||||
(`src/`, интеграция) не затронут. `User-Visible: no` — верно на всех трёх
|
||||
коммитах.
|
||||
|
||||
Маршрут §5 (трек show) не пересматриваю: диапазон трека и критерии не
|
||||
менялись со времени r1 — complexity/surfaces/migration/ux-contract/perf-touch/
|
||||
undocumented пройдены там же (см. «Унаследовано из r1»). `route: fix`.
|
||||
|
||||
## Как проверялось — разбор по дельте (§2.10)
|
||||
|
||||
Предмет раунда — ровно дельта между содержимым, которое судил r1, и текущим
|
||||
деревом: **рефакторинг кода отсутствует**, есть только перенос того же коммита
|
||||
на новое основание и генерируемый артефакт.
|
||||
|
||||
1. **Дифф кода байт-в-байт идентичен тому, что видел r1.**
|
||||
`git diff --stat origin/dev...HEAD -- . ':!docs/reviews/CODE-REVIEW-749-r1.md' ':!docs/reviews/INDEX.md'`
|
||||
даёт те же 10 файлов и ту же сумму `351 insertions(+), 45 deletions(-)`,
|
||||
что зафиксирована в r1 построчно по каждому файлу
|
||||
(`.github/workflows/_process.yml` 82, `PROCESS.md` 22,
|
||||
`scripts/mutation-registry.mjs` 2, `test/process-integrate-tools.test.mjs`
|
||||
180 (новый), `test/process-track.test.mjs` 24,
|
||||
`test/publish-push-refusal.test.mjs` 71, `test/review-doc-guard.test.mjs` 6,
|
||||
`test/review-result-gate.test.mjs` 2, `test/reviews-index.test.mjs` 4,
|
||||
`test/status-label.test.mjs` 3 — совпадает построчно с «Материал раунда» r1).
|
||||
Коммит `a82c482f` — это ребейзнутый `9bf35aec`: `git rebase` реплеит тот же
|
||||
патч на новом родителе, конфликт был заявлен автором только в
|
||||
`docs/reviews/INDEX.md` (генерируемый файл), что и наблюдается — других
|
||||
файлов конфликт не затронул.
|
||||
2. **Дерево без следов незакрытого слияния.**
|
||||
`git grep '<<<<<<<\|=======\|>>>>>>>'` по `.github`, `PROCESS.md`,
|
||||
`docs/reviews`, `scripts`, `test` — пусто (совпадения — только цитаты в
|
||||
старых документах ревью и комментарии в тестах, не маркеры). `git status
|
||||
--short` — чисто.
|
||||
3. **PROCESS.md §10.4 цел.** Абзац «Скрипты конвейера — из `dev`» (#749) на
|
||||
месте (`PROCESS.md:1320`), содержимое не тронуто ребейзом.
|
||||
4. **Конфликт в `docs/reviews/INDEX.md` разрешён правильно, не руками.**
|
||||
`node scripts/reviews-index.mjs --check` → `docs/reviews/INDEX.md свеж`.
|
||||
Пересчитал независимо: `ls docs/reviews/*.md | wc -l` = 262 (включая сам
|
||||
`INDEX.md`) → 261 документ без него, шапка индекса говорит «Документов:
|
||||
261, issue: 133» — сходится. Строка `#749 | CODE-REVIEW-749-r1.md | code ·
|
||||
r1 | 🟢 зелёный | 0 | 0` добавлена на верное место (между #750 и #747 по
|
||||
убыванию номера issue).
|
||||
5. **Трейлеры.** Все три коммита несут `Issue: #749`, `User-Visible: no`
|
||||
(два docs-коммита — класса C, трейлеры для них не обязательны, но лишними
|
||||
не являются и не противоречат правилу). Число, видимое пользователю
|
||||
карточки, в диффе по-прежнему отсутствует — изменение только в конвейере
|
||||
ревью, как и в r1.
|
||||
6. **Независимый прогон затронутых дельтой и ключевых AC-тестов** (цена
|
||||
минимальна, Validate зелёный уже подтверждает полный `npm test` на этом же
|
||||
SHA — прогнал отдельно только то, что имеет смысл перепроверить после
|
||||
ребейза):
|
||||
```
|
||||
node scripts/entry-cost.mjs --check → budgets OK (author 5367/12000, reviewer 4849/9000)
|
||||
node --test test/process-integrate-tools.test.mjs → 3/3
|
||||
node --test test/publish-push-refusal.test.mjs → 29/29
|
||||
node --test test/reviews-index.test.mjs → 13/13
|
||||
```
|
||||
Все зелёные, те же числа, что в r1/комментарии автора (29/29 и 3/3
|
||||
совпадают дословно).
|
||||
|
||||
Повторно не перепроверял содержательные AC1/AC2/AC3 — см. «Унаследовано из
|
||||
r1»: код этих коммитов не менялся со времени r1, только родитель.
|
||||
|
||||
### AC1–AC3
|
||||
|
||||
Не перепроверяю с нуля: диффы идентичны (см. выше), доказательства и способность
|
||||
тестов падать уже установлены в r1 исполнением с намеренной порчей
|
||||
(откат вызова для AC2, разбор резолва пути для AC1). Дельта этого раунда их не
|
||||
касается.
|
||||
|
||||
## Закрытие раунда r1
|
||||
|
||||
r1 не содержал находок — вердикт был зелёный, High 0, Medium 0, Low 0.
|
||||
Таблицу «находка | чем закрыта | где видно» строить не из чего: раунд не
|
||||
возвращал работу автору, он не прошёл по чисто техническому отказу пуша
|
||||
(нет прав `workflow` у токена конвейера), который ревьюер не создавал и не
|
||||
находил. Единственное действие между r1 и r2 — ребейз на `dev` силами автора
|
||||
и регенерация `docs/reviews/INDEX.md`, оба проверены выше.
|
||||
|
||||
## Унаследовано из r1
|
||||
|
||||
Принято без повторной проверки по существу — документ `docs/reviews/CODE-REVIEW-749-r1.md`,
|
||||
материал `9bf35aec…` (дерево `3075c1fc6dae…`, не резолвится после ребейза,
|
||||
что ожидаемо и не находка):
|
||||
|
||||
- Разбор AC1 (`publish-push-refusal.test.mjs`, якорь и шаг #413 — версия
|
||||
`dev`, тест умеет падать) — код идентичен, повторно не проверял.
|
||||
- Разбор AC2 (`process-integrate-tools.test.mjs`, ни один шаг `integrate` не
|
||||
зовёт `scripts/` рабочей копии, снимок один и самодостаточен, 12 вызовов 6
|
||||
скриптов через `$TOOLS`) — код идентичен, повторно не проверял.
|
||||
- Разбор AC3 (совместимость, канон PROCESS.md §10.4, синхронизация мутанта
|
||||
`process-label-step-combined-again`, `entry-cost`/`process-digests`) — код
|
||||
идентичен; `entry-cost --check` перепрогнал сам (см. выше), остальное не
|
||||
перепроверял.
|
||||
- Маршрут §5 (`route: fix`, все критерии трека show пройдены) — основания не
|
||||
менялись, перепроверке не подлежат.
|
||||
- Проверка «ни один из 6 скриптов не тянет `node_modules`» — код скриптов не
|
||||
менялся, не перепроверял.
|
||||
|
||||
## Что проверено и корректно (дельта r2)
|
||||
|
||||
- Ребейз не исказил содержимое ранее одобренного коммита: построчное
|
||||
совпадение статистики диффа по каждому из 10 файлов.
|
||||
- Конфликт ребейза ограничился генерируемым `docs/reviews/INDEX.md` и разрешён
|
||||
штатной пересборкой, а не ручной правкой — `--check` подтверждает свежесть,
|
||||
числа в шапке сверены независимым подсчётом файлов.
|
||||
- Нет следов незакрытого конфликта по всему дереву.
|
||||
- PROCESS.md §10.4 не повреждён переносом.
|
||||
- Ключевые тесты дельты (`process-integrate-tools`, `publish-push-refusal`,
|
||||
`reviews-index`) и `entry-cost --check` зелёные на `fd13f82e` при независимом
|
||||
прогоне.
|
||||
- Трейлеры корректны на всех трёх коммитах; `User-Visible: no` верно для всех.
|
||||
|
||||
## Чего не проверял
|
||||
|
||||
- `npx tsc --noEmit`, `npm run test` (полный), `npm run build` + сверка трёх
|
||||
копий бандла — не перегонял: Validate на `fd13f82e` зелёный (ссылка выше),
|
||||
это тот же набор, что уже был принят в r1, дельта этого раунда его не
|
||||
затрагивает.
|
||||
- Содержательный повторный разбор AC1/AC2/AC3 «с нуля» — не требуется:
|
||||
дифф, который их доказывает, не менялся со времени r1 (см. «Унаследовано из
|
||||
r1»); проверено только то, что ребейз это не исказил.
|
||||
- `npm run golden:verify` — не прогонял: метки `ci:golden` нет, диффа в пути
|
||||
отрисовки плана нет, как и в r1.
|
||||
- `python -m pytest tests_backend -q` — не прогонял: `custom_components/**/*.py`
|
||||
не менялся.
|
||||
- `npm run invariants -- --config <export>` — не прогонял: геометрия и ссылки
|
||||
на неё не затронуты.
|
||||
- performance-профили — не прогонял: не названы в AC, диффа в
|
||||
производительность-чувствительном коде нет.
|
||||
- Браузерные смоки — не прогонял заново: `smoke-select.mjs` в r1 уже ответил
|
||||
«frontend-диффа нет», а фронтенд этим раундом не тронут (дельта — только
|
||||
ребейз и генерируемый индекс).
|
||||
- `node scripts/mutation-gate.mjs --check` — не перегонял: мутант
|
||||
`process-label-step-combined-again` синхронизирован кодом, который не
|
||||
менялся со времени r1, где прогон подтверждён; код снимка и вызовов не
|
||||
затронут ребейзом.
|
||||
- Ручной/визуальный прогон реального `integrate` на GitHub Actions — не
|
||||
проводился; эквивалент по разделу «Повторный раунд» — детерминированные
|
||||
тесты на временных origin, прогнанные выше.
|
||||
|
||||
## Находки
|
||||
|
||||
Нет. High: 0, Medium: 0, Low: 0.
|
||||
|
||||
## Вердикт
|
||||
|
||||
Зелёный. Дельта раунда — чисто техническая (ребейз на `dev` после отказа
|
||||
пуша токеном без права `workflow`, регенерация `docs/reviews/INDEX.md`):
|
||||
содержимое ранее одобренного коммита не изменилось ни байтом, конфликт
|
||||
ограничился генерируемым файлом и разрешён штатным скриптом, PROCESS.md §10.4
|
||||
цел, ключевые тесты дельты зелёные при независимом прогоне. Основания r1
|
||||
(AC1–AC3 доказаны исполнением, маршрут §5 пройден, трейлеры корректны)
|
||||
наследуются без повторной проверки по существу.
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `issue/749-integrate-scripts-from-dev`, коммит `fd13f82eb788` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||
- Дерево материала: `423cbf12d42361d3c6b2286df1070f16577a859c`
|
||||
```
|
||||
git log --all --format='%H %T' | grep 423cbf12d423
|
||||
```
|
||||
- Тело issue: `919ed6e376e783bf41ef44ab421e87da6a984ead0f91203f0011393437c2485e`
|
||||
- Вердикт конвейера: `green` · High 0 · маршрут `fix`
|
||||
<!-- hp:usage input_tokens=4351 output_tokens=14904 cache_creation_input_tokens=68242 cache_read_input_tokens=1246901 num_turns=22 -->
|
||||
Reference in New Issue
Block a user