From df5be154eec66b9edc83c6ccd34ef42c87fb0843 Mon Sep 17 00:00:00 2001 From: Matysh Date: Thu, 13 Aug 2026 13:05:13 +0300 Subject: [PATCH] ci: sync the process workflow into dev Keeps dev identical to main so the broken revision does not come back at the next promotion. The workflow only fires from the default branch, but a stale copy here would overwrite the working one. Issue: #114 User-Visible: no --- .github/workflows/process.yml | 73 ++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 15 deletions(-) diff --git a/.github/workflows/process.yml b/.github/workflows/process.yml index 4aa0c585..711e97a1 100644 --- a/.github/workflows/process.yml +++ b/.github/workflows/process.yml @@ -6,13 +6,16 @@ name: Process # S4-spec-review -> ревью ТЗ -> S5-ready | S3-spec # S7-code-review -> код-ревью -> S8-merged | S6-in-progress # -# Две вещи, без которых конвейер молча не работает: +# Три вещи, без которых конвейер молча не работает: # # 1. Метки переставляются токеном HP_PROCESS_TOKEN, а не GITHUB_TOKEN. GitHub # намеренно не запускает workflow от событий, вызванных GITHUB_TOKEN, чтобы # не было циклов — цепочка оборвалась бы после первого шага. # 2. Этот файл обязан лежать в ветке по умолчанию (main). Для события `issues` # GitHub берёт workflow только оттуда, независимо от того, что в dev. +# 3. Многострочный текст внутри `run:` — только через heredoc. Строка с нулевым +# отступом обрывает блок YAML, и скрипт обрезается без ошибки парсера. +# Проверять не только YAML, но и каждый `run` через `bash -n`. on: issues: @@ -99,6 +102,7 @@ jobs: # в issue/-slug. Если ветка запушена — переключаемся на неё, иначе # ревьюер прочтёт dev и не найдёт того, что должен оценивать. - name: Перейти на ветку задачи + id: branch env: NUM: ${{ github.event.issue.number }} run: | @@ -107,6 +111,7 @@ jobs: if [ -n "$branch" ]; then git checkout -q "origin/$branch" echo "материал ревью: ветка $branch, $(git rev-parse --short HEAD)" + echo "name=$branch" >> "$GITHUB_OUTPUT" else echo "::warning::ветка issue/${NUM}-* не найдена на origin — ревью пойдёт по dev" echo "МАТЕРИАЛ НЕ ЗАПУШЕН" >> "$GITHUB_STEP_SUMMARY" @@ -177,18 +182,53 @@ jobs: S1-new. «Оставили в тексте ревью» закрытием не считается и прямо запрещено §12. - Оставь в issue комментарий с разбором: находки с воспроизведением, - что проверено и корректно, чего не проверял. Первой строкой — - вердикт в формате §7.2: + Напиши полный документ ревью в файл + docs/reviews/-REVIEW-${{ github.event.issue.number }}-r${{ needs.guard.outputs.cycle }}.md + (SPEC для этапа spec, CODE для code): скоуп, как проверялось, + находки с воспроизведением, что проверено и корректно, чего не + проверял. Каталог docs/reviews/ создай, если его нет. Больше не + пиши ничего: любой файл вне docs/reviews/ опубликован не будет. + + Затем оставь в issue краткий комментарий: вердикт, ключевые находки + и ссылка на документ. Первой строкой — вердикт в формате §7.2: `Вердикт: зелёный/жёлтый/красный · цикл r${{ needs.guard.outputs.cycle }}/${{ needs.guard.outputs.limit }} · High: N · Medium: N → #…` Затем верни JSON по схеме. Это последнее действие и оно обязательно: без него метка не переставится и конвейер встанет. claude_args: | --max-turns 150 - --allowedTools Read,Grep,Glob,Bash,mcp__github__add_issue_comment,mcp__github__issue_write,mcp__github__issue_read + --allowedTools Read,Write,Grep,Glob,Bash,mcp__github__add_issue_comment,mcp__github__issue_write,mcp__github__issue_read --json-schema '{"type":"object","properties":{"verdict":{"type":"string","enum":["green","yellow","red"]},"high":{"type":"integer"},"medium":{"type":"integer"},"summary":{"type":"string"}},"required":["verdict","high","medium","summary"]}' + # Ревьюер пишет только в docs/reviews/. Что именно попадёт в коммит, + # решает этот шаг, а не модель: всё остальное откатывается. + - name: Опубликовать документ ревью + env: + TOKEN: ${{ secrets.HP_PROCESS_TOKEN }} + BRANCH: ${{ steps.branch.outputs.name }} + NUM: ${{ github.event.issue.number }} + run: | + if [ -z "$BRANCH" ]; then + echo "ветки задачи нет — документ некуда класть"; exit 0 + fi + git checkout -- . 2>/dev/null || true + git clean -fd -e docs/reviews >/dev/null 2>&1 || true + git add docs/reviews 2>/dev/null || true + if git diff --cached --quiet; then + echo "документ ревью не создан"; exit 0 + fi + git -c user.name="claude[bot]" \ + -c user.email="209825114+claude[bot]@users.noreply.github.com" \ + commit -q -F - < /tmp/failure.md <