From 21470c7a4a1abbf7cfdb7eb0d05e0454b55f89c8 Mon Sep 17 00:00:00 2001 From: latte Date: Mon, 29 Dec 2025 10:30:55 +0000 Subject: [PATCH] fix: Prevent duplicate workflow runs on @codebot mentions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Critical fix for workflow routing that was causing 3x duplication on every @codebot mention. All three workflows (ai-chat, ai-comment-reply, ai-issue-triage) were triggering simultaneously. Changes: - ai-issue-triage.yml: Only runs on '@codebot triage' (unchanged, already specific) - ai-comment-reply.yml: Only runs on specific commands (help, explain, suggest, etc) - ai-chat.yml: Only runs on free-form questions (excludes all specific commands) Workflow routing logic: 1. '@codebot triage' → ai-issue-triage.yml ONLY 2. '@codebot ' → ai-comment-reply.yml ONLY 3. '@codebot ' → ai-chat.yml ONLY (fallback) This prevents the massive duplication issue where every @codebot mention triggered all three workflows simultaneously, causing 10+ redundant runs. Updated documentation in CLAUDE.md with workflow routing architecture. --- .gitea/workflows/ai-chat.yml | 75 ++++++++++++++++----------- .gitea/workflows/ai-comment-reply.yml | 17 +++++- .gitea/workflows/ai-issue-triage.yml | 4 ++ CLAUDE.md | 17 ++++-- 4 files changed, 76 insertions(+), 37 deletions(-) diff --git a/.gitea/workflows/ai-chat.yml b/.gitea/workflows/ai-chat.yml index b23191f..0b620e9 100644 --- a/.gitea/workflows/ai-chat.yml +++ b/.gitea/workflows/ai-chat.yml @@ -1,42 +1,57 @@ name: AI Chat (Bartender) +# WORKFLOW ROUTING: +# This workflow handles FREE-FORM questions/chat (no specific command) +# Other workflows: ai-issue-triage.yml (@codebot triage), ai-comment-reply.yml (specific commands) +# This is the FALLBACK for any @codebot mention that isn't a known command + on: - issue_comment: - types: [created] + issue_comment: + types: [created] # CUSTOMIZE YOUR BOT NAME: -# Change '@ai-bot' below to match your config.yml mention_prefix +# Change '@codebot' in all conditions below to match your config.yml mention_prefix # Examples: '@bartender', '@uni', '@joey', '@codebot' jobs: - ai-chat: - # Only run if comment mentions the bot - if: contains(github.event.comment.body, '@codebot') # <-- Change this to your bot name - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 + ai-chat: + # Only run if comment mentions the bot but NOT a specific command + # This prevents duplicate runs with ai-comment-reply.yml and ai-issue-triage.yml + if: | + contains(github.event.comment.body, '@codebot') && + !contains(github.event.comment.body, '@codebot triage') && + !contains(github.event.comment.body, '@codebot help') && + !contains(github.event.comment.body, '@codebot explain') && + !contains(github.event.comment.body, '@codebot suggest') && + !contains(github.event.comment.body, '@codebot security') && + !contains(github.event.comment.body, '@codebot summarize') && + !contains(github.event.comment.body, '@codebot review-again') && + !contains(github.event.comment.body, '@codebot setup-labels') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 - - uses: actions/checkout@v4 - with: - repository: Hiddenden/openrabbit - path: .ai-review - token: ${{ secrets.AI_REVIEW_TOKEN }} + - uses: actions/checkout@v4 + with: + repository: Hiddenden/openrabbit + path: .ai-review + token: ${{ secrets.AI_REVIEW_TOKEN }} - - uses: actions/setup-python@v5 - with: - python-version: "3.11" + - uses: actions/setup-python@v5 + with: + python-version: "3.11" - - run: pip install requests pyyaml + - run: pip install requests pyyaml - - name: Run AI Chat - env: - AI_REVIEW_TOKEN: ${{ secrets.AI_REVIEW_TOKEN }} - AI_REVIEW_REPO: ${{ gitea.repository }} - AI_REVIEW_API_URL: https://git.hiddenden.cafe/api/v1 - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} - OLLAMA_HOST: ${{ secrets.OLLAMA_HOST }} - SEARXNG_URL: ${{ secrets.SEARXNG_URL }} - run: | - cd .ai-review/tools/ai-review - python main.py comment ${{ gitea.repository }} ${{ gitea.event.issue.number }} "${{ gitea.event.comment.body }}" + - name: Run AI Chat + env: + AI_REVIEW_TOKEN: ${{ secrets.AI_REVIEW_TOKEN }} + AI_REVIEW_REPO: ${{ gitea.repository }} + AI_REVIEW_API_URL: https://git.hiddenden.cafe/api/v1 + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} + OLLAMA_HOST: ${{ secrets.OLLAMA_HOST }} + SEARXNG_URL: ${{ secrets.SEARXNG_URL }} + run: | + cd .ai-review/tools/ai-review + python main.py comment ${{ gitea.repository }} ${{ gitea.event.issue.number }} "${{ gitea.event.comment.body }}" diff --git a/.gitea/workflows/ai-comment-reply.yml b/.gitea/workflows/ai-comment-reply.yml index 745db55..a845400 100644 --- a/.gitea/workflows/ai-comment-reply.yml +++ b/.gitea/workflows/ai-comment-reply.yml @@ -1,17 +1,30 @@ name: AI Comment Reply +# WORKFLOW ROUTING: +# This workflow handles SPECIFIC commands: help, explain, suggest, security, summarize, review-again, setup-labels +# Other workflows: ai-issue-triage.yml (@codebot triage), ai-chat.yml (free-form questions) + on: issue_comment: types: [created] # CUSTOMIZE YOUR BOT NAME: -# Change '@ai-bot' below to match your config.yml mention_prefix +# Change '@codebot' in the 'if' condition below to match your config.yml mention_prefix # Examples: '@bartender', '@uni', '@joey', '@codebot' jobs: ai-reply: runs-on: ubuntu-latest - if: contains(github.event.comment.body, '@codebot') # <-- Change this to your bot name + # Only run for specific commands (not free-form chat or triage) + # This prevents duplicate runs with ai-chat.yml and ai-issue-triage.yml + if: | + (contains(github.event.comment.body, '@codebot help') || + contains(github.event.comment.body, '@codebot explain') || + contains(github.event.comment.body, '@codebot suggest') || + contains(github.event.comment.body, '@codebot security') || + contains(github.event.comment.body, '@codebot summarize') || + contains(github.event.comment.body, '@codebot review-again') || + contains(github.event.comment.body, '@codebot setup-labels')) steps: - uses: actions/checkout@v4 diff --git a/.gitea/workflows/ai-issue-triage.yml b/.gitea/workflows/ai-issue-triage.yml index b3a3289..48a10ed 100644 --- a/.gitea/workflows/ai-issue-triage.yml +++ b/.gitea/workflows/ai-issue-triage.yml @@ -1,5 +1,9 @@ name: AI Issue Triage +# WORKFLOW ROUTING: +# This workflow handles ONLY the 'triage' command +# Other workflows: ai-comment-reply.yml (specific commands), ai-chat.yml (free-form questions) + on: issue_comment: types: [created] diff --git a/CLAUDE.md b/CLAUDE.md index 9024fa6..749662b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -186,14 +186,21 @@ Optional: ## Workflow Architecture -Workflows are located in `.gitea/workflows/`: +Workflows are located in `.gitea/workflows/` and are **mutually exclusive** to prevent duplicate runs: -- **ai-review.yml** / **enterprise-ai-review.yml** - Triggered on PR open/sync -- **ai-issue-triage.yml** - Triggered on `@codebot triage` mention in issue comments -- **ai-comment-reply.yml** - Triggered on issue comments with @bot mentions -- **ai-chat.yml** - Triggered on issue comments for chat (non-command mentions) +- **enterprise-ai-review.yml** - Triggered on PR open/sync +- **ai-issue-triage.yml** - Triggered ONLY on `@codebot triage` in comments +- **ai-comment-reply.yml** - Triggered on specific commands: `help`, `explain`, `suggest`, `security`, `summarize`, `review-again`, `setup-labels` +- **ai-chat.yml** - Triggered on `@codebot` mentions that are NOT specific commands (free-form questions) - **ai-codebase-review.yml** - Scheduled weekly analysis +**Workflow Routing Logic:** +1. If comment contains `@codebot triage` → ai-issue-triage.yml only +2. If comment contains specific command (e.g., `@codebot help`) → ai-comment-reply.yml only +3. If comment contains `@codebot ` (no command) → ai-chat.yml only + +This prevents the issue where all three workflows would trigger on every `@codebot` mention, causing massive duplication. + **Note**: Issue triage is now **opt-in** via `@codebot triage` command, not automatic on issue creation. Key workflow pattern: -- 2.49.1