Files
2026-10-01 15:35:16 +00:00

16 KiB
Raw Permalink Blame History

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 пройден, трейлеры корректны) наследуются без повторной проверки по существу.


Материал раунда

  • Ветка: issue/749-integrate-scripts-from-dev, коммит fd13f82eb788 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 423cbf12d42361d3c6b2286df1070f16577a859c
    git log --all --format='%H %T' | grep 423cbf12d423
    
  • Тело issue: 919ed6e376e783bf41ef44ab421e87da6a984ead0f91203f0011393437c2485e
  • Вердикт конвейера: green · High 0 · маршрут fix