From 22dc15c6021e0b4df5ea956e1c75e70e2bf95e9a Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 28 Aug 2026 02:15:36 +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 побайтово — это проверяет шаг `process.yml идентичен в main и dev` в Validate. Содержательная правка сделана в dev (#343), здесь только копия. Issue: #343 User-Visible: no --- .github/workflows/process.yml | 41 +++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/.github/workflows/process.yml b/.github/workflows/process.yml index ec41b543..818423bc 100644 --- a/.github/workflows/process.yml +++ b/.github/workflows/process.yml @@ -327,6 +327,41 @@ jobs: --add-label S6-in-progress --remove-label S7-code-review echo "S7-code-review -> S6-in-progress (ревью не запускалось)" + # Ревьюер перегонял tsc, юниты и сборку заново в каждом раунде, хотя + # Validate на том же SHA уже зелёный (#343). Это не тщательность: бюджет + # ревью тратится на повторение CI вместо чтения кода. + # + # Доказательство здесь такое же строгое, как у reuse-маркеров (#208): не + # «недавно было зелено», а «completed success ровно на этом SHA». После + # ребейза SHA другой, прогона для него нет — и ревьюер честно гоняет сам. + - name: Зелёные гейты на этом SHA + id: validated + if: steps.rebase.outputs.conflict != 'true' + env: + GH_TOKEN: ${{ secrets.HP_PROCESS_TOKEN }} + run: | + sha=$(git rev-parse HEAD) + short=$(git rev-parse --short HEAD) + row=$(gh run list --repo "${{ github.repository }}" --workflow validate.yml \ + --commit "$sha" --limit 5 \ + --json status,conclusion,url \ + --jq '[.[] | select(.status=="completed" and .conclusion=="success")][0] // empty') + { + echo 'note<s+=d).on("end",()=>process.stdout.write(JSON.parse(s).url||""))') + echo "**Дешёвые гейты на этом SHA уже подтверждены** (#343). Validate на \`$short\` завершился success: $url" + echo "" + echo "Значит \`npx tsc --noEmit\`, \`npm test\` и \`npm run build\` со сверкой копий бандла перегонять не нужно — сошлись на этом прогоне, назвав его ссылкой. Бюджет раунда тратится на чтение кода." + echo "" + echo "Что Validate НЕ покрывает и остаётся за тобой: смоки, выбранные по диффу; golden, если diff трогает рендер; инварианты модели на конкретной конфигурации; и любой гейт, который требуют AC задачи." + else + echo "**Зелёного Validate на этом SHA (\`$short\`) нет** — прогон не найден, не завершён либо не success. Дешёвые гейты прогоняешь сам и называешь результат." + fi + echo 'EOF_NOTE' + } >> "$GITHUB_OUTPUT" + if [ -n "$row" ]; then echo "Validate на $short: зелёный"; else echo "Validate на $short: зелёного нет"; fi + # Зависимости ставятся ПОСЛЕ переключения на ветку задачи: lockfile мог # измениться именно в ней, и установка по копии из dev дала бы не то дерево. - name: Установить зависимости @@ -453,8 +488,10 @@ jobs: правке — не тщательность, а потеря времени: полные наборы это предрелизный гейт (PROCESS.md §8), а не гейт ревью. - Всегда, они дешёвые, и в повторном раунде тоже: код изменился, - а стоят они минуты: + ${{ steps.validated.outputs.note }} + + Если зелёного прогона на этом SHA нет — прогоняешь сам, они дешёвые, + и в повторном раунде тоже: код изменился, а стоят они минуты: `npx tsc --noEmit`, `npm test`, `npm run build` со сверкой трёх копий бандла. Плюс `node scripts/check-docs.mjs`, если diff трогает `src/**`: отпечаток скриншотов документации считается по всему