reviews-index: свежесть индекса после ребейзов конвейера, первый абзац находки целиком (#635 r3)

r2 H1: INDEX.md — снимок каталога, и ребейз ветки на dev, получивший чужие
документы ревью, устаревал его молча. Теперь `--commit-if-stale` пересобирает
и коммитит индекс коммитом конвейера после приведения к dev (process.yml) и
после ребейза кандидата (merge-candidate.mjs); тест «индекс свеж» сравнивает
закоммиченный файл с пересборкой и красит Validate при расхождении.

r2 M1: находка без заголовка — первый абзац секции, склеенный из перенесённых
строк, без маркера буллета и кода `**M1.**`; «не найдено», служебные скобки
«(унаследовано…)» — не находка. Нумерованные пункты тоже забирают перенесённые
строки. Мутант reviews-index-paragraph-tail. PROCESS.md §2.10 дополнен.

Issue: #635
User-Visible: no
This commit is contained in:
Claude
2026-09-23 13:52:23 +00:00
committed by claude[bot]
parent f855cee891
commit 49bae62e9a
8 changed files with 288 additions and 100 deletions
+6
View File
@@ -396,6 +396,7 @@ jobs:
# #539: тем же токеном спрашивается REST — через него идёт и диспатч.
GH_TOKEN: ${{ secrets.HP_PROCESS_TOKEN }}
BRANCH: ${{ steps.branch.outputs.name }}
NUM: ${{ github.event.issue.number }}
# rebase, в отличие от commit, не принимает -c user.*: он запускает
# свои процессы и требует личность в окружении, иначе падает с
# «unable to auto-detect email address».
@@ -427,6 +428,11 @@ jobs:
printf 'конфликтуют:\n%s\n' "${files:-(git не назвал файлы)}"
exit 0
fi
# #635 r2: ребейз мог принести в docs/reviews документы других задач,
# а закоммиченный INDEX.md — снимок каталога — их не знает. Свежесть
# держит тест «индекс свеж» в Validate, поэтому индекс пересобирается
# здесь же, коммитом конвейера (класс C), до фиксации материала.
node scripts/reviews-index.mjs --dir=docs/reviews --commit-if-stale --issue="$NUM"
# --force-with-lease с явным ожидаемым значением обязателен: между
# fetch и push автор мог запушить коммит, и слепой --force потерял бы
# его молча. Расхождение lease — падение прогона, а не предупреждение: