From 9a88c9b4f2c7fcffce9c7da9cd4bdb154e8c5f06 Mon Sep 17 00:00:00 2001 From: Ilya Shatalov Date: Thu, 5 Feb 2026 14:43:34 +0100 Subject: [PATCH] Skip extra approvals for docs-only PRs --- .github/workflows/ai-gatekeeper.yaml | 42 +++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ai-gatekeeper.yaml b/.github/workflows/ai-gatekeeper.yaml index 577b80d..2e43089 100644 --- a/.github/workflows/ai-gatekeeper.yaml +++ b/.github/workflows/ai-gatekeeper.yaml @@ -37,6 +37,7 @@ jobs: printf 'summary=%s\n' "No PR context; skipping gatekeeper checks." >> "$GITHUB_OUTPUT" echo "details=" >> "$GITHUB_OUTPUT" echo "is_bot=false" >> "$GITHUB_OUTPUT" + echo "docs_only=false" >> "$GITHUB_OUTPUT" exit 0 fi @@ -59,10 +60,44 @@ jobs: printf 'summary=%s\n' "Not a Devin-authored PR. Skipping human-review enforcement." >> "$GITHUB_OUTPUT" echo "details=" >> "$GITHUB_OUTPUT" echo "is_bot=false" >> "$GITHUB_OUTPUT" + echo "docs_only=false" >> "$GITHUB_OUTPUT" exit 0 fi echo "is_bot=true" >> "$GITHUB_OUTPUT" + # 2b. Docs-only changes skip additional approvals + PR_FILES=$(gh api "repos/$REPO/pulls/$PR/files" --paginate) + DOCS_ONLY=$( + echo "$PR_FILES" | jq -r ' + if length == 0 then + "false" + else + all(.[]; ( + (.filename | test("(?i)^(docs|doc)/")) + or (.filename | test("(?i)\\.(md|mdx|markdown|rst|adoc)$")) + or (.filename | test("(?i)(^|/)(README|CHANGELOG)(\\..*)?$")) + )) | tostring + end + ' + ) + + if [ "$DOCS_ONLY" = "true" ]; then + FILES_LIST=$(echo "$PR_FILES" | jq -r '[.[].filename] | map("- " + .) | join("\n")') + echo "docs_only=true" >> "$GITHUB_OUTPUT" + echo "conclusion=success" >> "$GITHUB_OUTPUT" + printf 'summary=%s\n' "Docs-only changes detected. Additional approvals are not required." >> "$GITHUB_OUTPUT" + { + echo "details<> "$GITHUB_OUTPUT" + echo "approvals_list=" >> "$GITHUB_OUTPUT" + echo "approvals_missing=0" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "docs_only=false" >> "$GITHUB_OUTPUT" + # 3. Reduce to latest review per human LATEST_REVIEWS_JSON=$( echo "$PR_DATA" | jq -c ' @@ -153,11 +188,16 @@ jobs: APPROVERS: ${{ steps.evaluate.outputs.approvals_list }} MISSING: ${{ steps.evaluate.outputs.approvals_missing }} CONCLUSION: ${{ steps.evaluate.outputs.conclusion }} + DOCS_ONLY: ${{ steps.evaluate.outputs.docs_only }} run: | set -euo pipefail MARKER="" APPROVER_LINE="Current approvals: ${APPROVERS:-none}" - if [ "$CONCLUSION" = "success" ]; then + if [ "$DOCS_ONLY" = "true" ]; then + MSG=$(printf "%s\n%s" \ + "$MARKER" \ + "📝 **Docs-only changes**: additional approvals are not required.") + elif [ "$CONCLUSION" = "success" ]; then MSG=$(printf "%s\n%s\n\n**%s**" \ "$MARKER" \ "✅ **Review Requirements Satisfied**: 2 different human approvals are present." \