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 <