17 KiB
SPEC-REVIEW-727-r2
Issue: #727 · этап: spec · трек: ask · заход: r2 · блокирующих циклов израсходовано (после этого раунда): 1/4
Скоуп
#727 — первая из двух независимых частей, выделенных из #707 п.3: ночное
пакетное ship-ревью на dev и переиспользование его результата в гейте беты
(ship-review.mjs check). Контракт не изменился с r1: К1 (патч-набор по
git patch-id --stable), К2 (ночной режим tag=nightly, имя документа
SHIP-REVIEW-<база>-dev-<sha12>.md), К3 (shipCoverage:
clean/high/stale/none), К4 (гейт check по покрытию), К5 (дельта
беты), К6 (job в _nightly.yml), К7 (индекс и архив узнают ночное имя), К8
(комментарий в задачу при High), К9 (канон). Красная ночь — отдельный issue E,
не входит. Продуктового кода нет, User-Visible: no, трек ask обоснован
(см. r1 и подтверждение ниже).
Этот раунд — правка автора по единственной находке r1 (Medium, К7/АС7): К7
переписан, в АС7 добавлены четыре конкретных примера вход→выход. Комментарий
автора 2026-10-01T00:13:45Z («ТЗ исправлено по ревью r1 ... Возвращаю на
ревью ТЗ») и пометка в ТЗ («Правка по ревью r1 сверена с a49f7095: файлы,
которые называет ТЗ, между этими коммитами не менялись») задают материал
раунда. Разбор — по дельте (§2.10): объём сопоставим с одной находкой,
ребейза, смены контракта или новой подсистемы нет — сокращаю объём разбора,
не строгость.
Как проверялось
- Закрытие находки r1 — построчное сравнение текста К7/АС7 r1 (квоты в
docs/reviews/SPEC-REVIEW-727-r1.md) с текущим телом issue + текст комментария автора, описывающий правку. - Проверка новой логики по коду на материале ревью (
HEADрабочей копииa49f7095ce77def25cc1ec4d48b390ec62d84bfd, совпадает с материалом, названным в задаче): прочитан целикомscripts/reviews-archive.mjs(archivePlan,compareStable,stableTagsThrough),scripts/reviews-index.mjs(parseDocName,SHIP_DOC_NAME),test/ship-review.test.mjs(тест #696, строка 79-93) — каждый новый технический пример АС7 (а/б/в/г) проверен на реализуемость существующими примитивами. - Локальность дельты:
git diff 40607aa37f13..HEAD --statи точечныйgit diffпо файлам, которые называет ТЗ (scripts/ship-review.mjs,scripts/reviews-index.mjs,scripts/reviews-archive.mjs,.github/workflows/_nightly.yml,.github/workflows/_ship-review.yml,.github/workflows/ship-review.yml,test/ship-review.test.mjs,test/nightly-workflow.test.mjs,test/process-digests.test.mjs,PROCESS.md,docs/process/REVIEWER.md) — пусто: материал r1 не устарел. - Сверка текущего §11.7 PROCESS.md с формулировкой «публичного контракта» в
обосновании трека
ask. - Гейты:
npx tsc --noEmit(узел не содержитnode_modules, зависимости на этапе spec не ставились — #696, ожидаемо и не блокирует), мутант иentry-costпроверены точечным чтением/запуском (ниже).
Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
Medium (К7/АС7): правило «база — стабильный тег → первая архивируемая линия новее базы» не реализуемо точным совпадением archivePlan, и АС7 не даёт для этой ветки ни одного примера вход→выход |
К7 переписан: явно разделены две ветки архивации (база-бета — точное совпадение, как сегодня; база-стабильный тег — «наименьшая архивируемая линия строго новее базы», compareStable, названа как новая логика). АС7 получил четыре конкретных примера (а: база-бета → v1.79.0; б: [v1.78.0, v1.79.0], база v1.78.0 → v1.79.0; в: [v1.78.0, v1.78.1, v1.79.0] → v1.78.1, ближайшая, не последняя; г: линии новее нет → kept с новой причиной) |
Тело issue #727, раздел «Контракт поведения» → К7 (три подпункта: база-бета / база-стабильный тег / подходящей линии нет); таблица «Критерии приёмки» → АС7 (все 4 примера); раздел «Граничные случаи» (окно между релизом и бетой) и «Чем краснеет» (два новых отрицательных случая, явно привязанных к АС7 б/г) |
Проверка покрытия по существующему коду:
compareStable(scripts/reviews-archive.mjs:46-50) иstableTagsThrough(:53-57) уже существуют и реализуют именно сравнение, которое нужно для «наименьшая линия строго новее базы» — К7 корректно называет существующий примитив, а не выдумывает его.- Сегодняшняя ветка
stage === 'ship'(scripts/reviews-archive.mjs:91-97) действительно ищет точное совпадение (tags.has(line)) и не умеет искать «следующий по порядку» тег — ровно тот пробел, который r1 называл находкой; К7 теперь явно описывает его как новую логику, а не как уже работающую. - Пример (б) и (в) оба реализуемы одной и той же операцией:
ordered.filter(l => compareStable(l.tag, base) > 0)[0](гдеordered— уже отсортированный по возрастанию массив строк кода) — даёт «ближайшую, не последнюю» линию без дополнительных допущений. - Пример (а) — существующая ветка, не меняется; тест
#696(test/ship-review.test.mjs:78-93) продолжает работать как сегодня, АС7 это прямо фиксирует («deepEqualтеста#696не меняется») — проверено построчным чтением теста, сигнатураassert.deepEqual(parseDocName('SHIP-REVIEW-v1.79.0-beta.1.md'), { stage: 'ship', issue: null, round: null, suffix: null, tag: 'v1.79.0-beta.1' })не содержит поляnightly— реализация обязана добавлятьnightly: trueтолько условно (для ночных имён), что соответствует формулировке АС7 («nightly: true» называется только для нового примера, не для старого) и не противоречит незыблемости старого теста.
Находка закрыта полно: ветка, для которой АС7 не имел примера, теперь имеет все четыре требуемых случая (положительный×3 с различием «одна линия / несколько линий / ближайшая vs последняя», отрицательный), и реализуемость каждого подтверждена существующими примитивами, а не только декларацией.
Унаследовано из r1
Без повторной проверки принято всё, что r1 зафиксировал в разделе «Что
проверено и корректно» (docs/reviews/SPEC-REVIEW-727-r1.md, материал —
origin/dev 40607aa37f13819c9db37a392a1d99f30382b3c0), поскольку дельта его
не касается и диапазон 40607aa3..a49f7095 не трогает ни один из файлов,
которые называет ТЗ (проверено git diff --stat в этом раунде, см. «Как
проверялось» п.3):
- существование и сигнатуры
readCandidateHistory,issueTrailers,shipReviewDocPath,isShipIssue,specSection,shipIssuesInRange,renderShipBrief,anchorBlock,parseAnchorBlock,shipReviewProblems,readShipDoc; RELEASE_TAG_RE, текущий машинный блок документа беты и его поля;- реальность тега
v1.79.0-beta.1, документаSHIP-REVIEW-v1.79.0-beta.1.md, коммитаdca0fd28с трейлерамиIssue:/Release:; SHIP_DOC_NAME/parseDocNameсегодня не знают ночной суффикс;- содержимое
_nightly.yml(jobdispatch, ожидание до 3 минут, токенgithub.token), входы и права тонких файловship-review.yml; HP_PROCESS_TOKENкак существующий секрет публикации;- мутант
ship-review-ignores-merge-marker(scripts/mutation-registry.mjs), командаnode scripts/entry-cost.mjs --check; - существование
test/process-digests.test.mjs,test/ship-review.test.mjs,test/nightly-workflow.test.mjs; - обязательные разделы §7.1 присутствуют и в правильном порядке;
- обоснование трека
ask(сложность/риск >3, публичный контракт §11.7).
Точечно переподтверждено в этом раунде (не просто унаследовано): §11.7
PROCESS.md прочитан заново (строки 1555-1583) — формулировка «документ обязан
лежать в кандидате или в dev, покрывать их все и не нести High» совпадает
дословно с тем, что обоснование трека ask называет «сегодняшним» правилом.
Что проверено и корректно (этот раунд)
- К7/АС7 — полностью, см. «Закрытие раунда r1» выше.
- «Принято предположительно» — пункт 7 (новый): «Линия ночного документа со стабильной базой — ближайшая архивируемая линия новее базы, а не линия по трейлерам его задач» — корректно резюмирует именно то решение, что описано в К7, не вводит противоречия с остальными 6 пунктами (не изменились).
- «Чем краснеет» — два новых отрицательных случая («ночной документ со стабильной базой не уходит в каталог самой базы (АС7 б)», «без более новой линии остаётся на месте (АС7 г)») точно соответствуют новым примерам АС7, не дублируют и не противоречат трём прежним пунктам.
- «Затронутые файлы» — уточнение «(
archivePlan: новая ветка для ночного документа со стабильной базой)» верно называет функцию, которую правка действительно трогает (проверено чтениемscripts/reviews-archive.mjs, не исполнением — продуктового кода задачи ещё нет). - Материал не устарел: файлы ТЗ не менялись между
40607aa3иa49f7095(гейт «материал ревью не запушен/не устарел» выполнен).
Чего не проверял
- Гейты (
npx tsc --noEmit,npm test,npm run build) не прогонял по существу —node_modulesне установлены (зависимости на этапе spec не ставятся, #696), а задача не меняет ни одного файла репозитория на этом этапе: показывать «зелёный»/«красный» тестов, которых ещё нет, не на чем. Обязательны наS7-code-review. - Не проверял, что
ordered.filter(...)(конкретная реализация «ближайшей линии новее базы», которую я предложил как пример реализуемости) — единственно возможная или будущая реализация автора; это право реализатора, спецификация фиксирует только вход/выход АС7. - Golden/смоки/бэкенд-pytest/инварианты модели — не относится: задача класса A не содержит, геометрии и визуала не касается.
- Не проверял повторно всё, что уже подтверждено в r1 (список — раздел «Унаследовано из r1»); точечно перепроверено только §11.7 PROCESS.md.
- Не проверял реальный прогон
git patch-id --stableиworkflow_dispatchмежду workflow-файлами — та же причина, что в r1 (документированное поведение инструментов, не специфика этого кода); дельта этого раунда их не касается.
Вердикт
Единственная находка r1 (Medium, К7/АС7) закрыта: правило архивации для
ночного документа со стабильной базой теперь описано отдельной веткой с
названным существующим примитивом (compareStable), и АС7 содержит четыре
конкретных примера вход→выход, включая отрицательный случай — реализуемость
каждого подтверждена чтением существующего кода, а не только текстом ТЗ.
Новых находок в дельте нет. Материал не устарел (файлы ТЗ не менялись между
40607aa3 и a49f7095). Трек ask обоснован с r1 без изменений.
Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0
Материал раунда
- Этап: spec. Материал — тело issue #727 на момент комментария Matysh 2026-10-01T00:13:45Z («ТЗ исправлено по ревью r1 ... Возвращаю на ревью ТЗ»).
- Кода/ветки продукта не существует (инфраструктурная задача до реализации);
факты сверены с рабочей копией на
HEAD=a49f7095ce77def25cc1ec4d48b390ec62d84bfd.
Материал раунда
- Ветка:
dev, коммитa49f7095ce77— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
b65ac0114507ee69bdb435b2ba9f006de09b4e26git log --all --format='%H %T' | grep b65ac0114507 - Тело issue:
8ce2942ca915bc938c8c5b4a720bb71d5a06d18c13db0692ee802f6a55662b7a - Вердикт конвейера:
green· High 0