From 88dc61dd40a5a728f103b3e56c606399b601090a Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 29 Aug 2026 10:38:57 +0300 Subject: [PATCH] =?UTF-8?q?ci:=20=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE?= =?UTF-8?q?=D0=BD=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?process.yml=20=D1=81=20dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Конвейер исполняет версию из ветки по умолчанию, поэтому файл обязан совпадать в main и dev побайтово. Содержательная правка сделана в dev (#365), здесь копия. Issue: #365 User-Visible: no --- .github/workflows/process.yml | 51 ++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/.github/workflows/process.yml b/.github/workflows/process.yml index 21a1dcf9..cf99cfb2 100644 --- a/.github/workflows/process.yml +++ b/.github/workflows/process.yml @@ -642,14 +642,31 @@ jobs: marker=CODE-REVIEW if [ "$STAGE" = "spec" ]; then marker=SPEC-REVIEW; fi doc="docs/reviews/${marker}-${NUM}-r${CYCLE}.md" - # Рабочая копия отбрасывается ДО того, как документ попадёт в дерево: - # ревьюер правит код, проверяя «умеет ли тест падать», и его правки - # публиковаться не должны. - git checkout -- . 2>/dev/null || true - # docs/reviews исключён из уборки: ревьюер мог написать документ по - # старому пути, и клин не должен его съесть до `git add` — ровно так - # оба пути остаются работоспособными. - git clean -fd -e docs/reviews -e node_modules >/dev/null 2>&1 || true + # Документ спасается ПЕРВЫМ делом. Ревьюер мог написать его по старому + # пути прямо в рабочую копию, а дальше эта копия будет отброшена + # целиком — и вместе с ней пропал бы артефакт (#220). + if [ ! -f "$SOURCE" ] && [ -f "$doc" ]; then + cp "$doc" "$SOURCE" + echo "документ найден в рабочей копии и сохранён в $SOURCE" + fi + # Reset, а не checkout+clean, и вот почему (#365). + # + # 28.08 коммит bb2919f уехал в dev с тридцатью файлами вместо одного + # markdown: откатил отревьюженную реализацию #359, вернул старые чанки + # и держал dev откаченным три часа. Механизм воспроизведён: + # `git checkout -- .` восстанавливает рабочее дерево ИЗ ИНДЕКСА, а + # `git clean -fd` убирает неотслеживаемое — ни то, ни другое индекс не + # трогает. Ревьюер работает с Bash и в ходе проверки «умеет ли тест + # падать» вполне может сделать `git add`; всё, что осталось у него в + # индексе, прежняя уборка сохраняла, и следующий же `git commit` + # забирал это вместе с документом. Сообщение при этом невинное, и от + # рутины инцидент отличается только диффом. + # + # `reset --hard` снимает и индекс, и дерево разом. Терять нечего: + # документ приезжает извне репозитория, из RUNNER_TEMP. + git fetch -q origin "$target" + git reset -q --hard "origin/$target" + git clean -fdq -e node_modules >/dev/null 2>&1 || true # Документ приезжает извне репозитория (#220). Три раунда подряд он # терялся, пока лежал некоммитнутым файлом в том же дереве, которое # ревьюер мутирует и затем восстанавливает: `git checkout -- .` плюс @@ -661,11 +678,12 @@ jobs: cp "$SOURCE" "$doc" echo "документ взят из $SOURCE ($(wc -c < "$doc") байт)" else - # Совместимость: ревьюер мог написать по старому пути, если промпт - # ещё не обновился в этой ветке. - echo "::warning::$SOURCE не найден — ищу документ в рабочей копии" + echo "::warning::$SOURCE не найден — документа для публикации нет" fi - git add docs/reviews 2>/dev/null || true + # Индексируется ровно один путь, а не каталог: `git add docs/reviews` + # забрал бы всё, что там окажется, а после reset там не должно быть + # ничего постороннего — но полагаться на «не должно» здесь нельзя. + git add -- "$doc" 2>/dev/null || true if git diff --cached --quiet; then # Пустая рабочая копия — ещё не провал: ревьюер иногда коммитит # документ сам, своим app-токеном мимо этого шага (CODE-REVIEW-150-r1, @@ -683,6 +701,8 @@ jobs: echo "::error::вердикт есть, а документа нет: ни $SOURCE, ни $doc в рабочей копии, ни $doc в $target — ревью без артефакта (#171, #220)" exit 1 fi + # Первый рубеж: что вообще проиндексировано. + git diff --cached --name-only | node scripts/review-doc-guard.mjs git -c user.name="claude[bot]" \ -c user.email="209825114+claude[bot]@users.noreply.github.com" \ commit -q -F - <