feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #22

Closed
opened 2026-07-20 09:54:00 +00:00 by admin · 12 comments
Owner

變更摘要

本 PR 將 ai-code-review action 分支的完整成果併入 develop,主要含四塊:

  1. 建問題模式重構(feat)create-issue: 'true' 時,審查留言(工具/diff/角色/嚴重問題/警告+建議)全部改發到追蹤 issue、不再張貼到 PR;不執行「舊留言標過時/resolve」;issue 延後到「確定有保留問題」才建立;無保留問題或無可審查變更則不建 issue、PR 也完全不留言(靜默通過);有問題時最後在 PR 回貼一則 issue 連結並補掛標籤,形成雙向關聯。
  2. 審查流程步驟調整(refactor):將「標記舊留言過時/resolve」提前到偵測 AI 工具之前,並依新順序重編所有步驟編號與說明。
  3. 修正(gitrepo):補抓淺層 checkout 的 base 歷史,避免 merge-base 計算失敗。
  4. 文件與 CI:補齊 action.ymlsrc 各模組文件、重建 readme.md,新增 .gitea/workflows/ci.yaml(多工具 code review 驗證)並啟用建問題模式。

影響範圍

範圍 說明
action 執行流程 src/index.js main() 依模式分流:留言去向、跳過 resolveOldComments、issue 延後建立、severe/others 導向 issue、有問題才在 PR 回貼連結
Gitea API src/lib/gitea.js 新增 addLabelsToIssue
留言模板 src/lib/templates.js 新增 issueLinkComment
審查核心 src/lib/review.js 新增 postSevereToIssue,移除 createIssueWithFindingssortFindingsForIssue
git base 解析 src/lib/gitrepo.js 補抓淺層 checkout 的 base 歷史
文件與 CI readme.mdaction.yml.gitea/workflows/ci.yaml.gitea/workflows/readme.md

風險與注意事項

  • 建問題模式行為明顯改變:啟用後 PR 上不再有審查留言(有問題時改為 issue + 一則連結留言;無問題時完全不留言),請確認團隊流程可接受。
  • 端對端行為需靠 CI 實測:本地僅完成語法與模組載入驗證,實際 issue/PR 互動需一次 CI 觸發確認。
  • readme.md 尚未反映「建問題模式導向 issue」的最新行為與新/移除的函式,建議後續以 doc-funcs 重建文件。
  • 各檔頭部「更新時間」時間戳仍為 2026/07/17 18:49:58,未刷新。

本問題由 AI Code Review 依 PR #6 的審查結果自動建立,問題明細見下方留言。

<!-- ai-code-review --> ## 變更摘要 本 PR 將 ai-code-review action 分支的完整成果併入 `develop`,主要含四塊: 1. **建問題模式重構(feat)**:`create-issue: 'true'` 時,審查留言(工具/diff/角色/嚴重問題/警告+建議)全部改發到追蹤 issue、不再張貼到 PR;不執行「舊留言標過時/resolve」;issue 延後到「確定有保留問題」才建立;**無保留問題或無可審查變更則不建 issue、PR 也完全不留言(靜默通過)**;有問題時最後在 PR 回貼一則 issue 連結並補掛標籤,形成雙向關聯。 2. **審查流程步驟調整(refactor)**:將「標記舊留言過時/resolve」提前到偵測 AI 工具之前,並依新順序重編所有步驟編號與說明。 3. **修正(gitrepo)**:補抓淺層 checkout 的 base 歷史,避免 merge-base 計算失敗。 4. **文件與 CI**:補齊 `action.yml`/`src` 各模組文件、重建 `readme.md`,新增 `.gitea/workflows/ci.yaml`(多工具 code review 驗證)並啟用建問題模式。 ## 影響範圍 | 範圍 | 說明 | | --- | --- | | action 執行流程 | `src/index.js` `main()` 依模式分流:留言去向、跳過 resolveOldComments、issue 延後建立、severe/others 導向 issue、有問題才在 PR 回貼連結 | | Gitea API | `src/lib/gitea.js` 新增 `addLabelsToIssue` | | 留言模板 | `src/lib/templates.js` 新增 `issueLinkComment` | | 審查核心 | `src/lib/review.js` 新增 `postSevereToIssue`,移除 `createIssueWithFindings`、`sortFindingsForIssue` | | git base 解析 | `src/lib/gitrepo.js` 補抓淺層 checkout 的 base 歷史 | | 文件與 CI | `readme.md`、`action.yml`、`.gitea/workflows/ci.yaml`、`.gitea/workflows/readme.md` | ## 風險與注意事項 - **建問題模式行為明顯改變**:啟用後 PR 上不再有審查留言(有問題時改為 issue + 一則連結留言;無問題時完全不留言),請確認團隊流程可接受。 - **端對端行為需靠 CI 實測**:本地僅完成語法與模組載入驗證,實際 issue/PR 互動需一次 CI 觸發確認。 - `readme.md` 尚未反映「建問題模式導向 issue」的最新行為與新/移除的函式,建議後續以 doc-funcs 重建文件。 - 各檔頭部「更新時間」時間戳仍為 `2026/07/17 18:49:58`,未刷新。 --- > 本問題由 AI Code Review 依 PR #6 的審查結果自動建立,問題明細見下方留言。
Author
Owner

🤖 AI Code Review|審查工具

項目 內容
工具 codex
版本 codex-cli 0.144.6
模型 gpt-5.5
審查 commit b5264141c4f7eda12c0479604ac85cb4da6c3195
Run Job #43
flowchart LR
    A[整理 git diff] --> B[⚔️ 攻擊方找問題]
    B --> C[🛡️ 防守方裁決]
    C --> D[保存 findings]
    D --> E[留言到 PR]
<!-- ai-code-review --> ## 🤖 AI Code Review|審查工具 | 項目 | 內容 | | --- | --- | | 工具 | `codex` | | 版本 | `codex-cli 0.144.6` | | 模型 | `gpt-5.5` | | 審查 commit | `b5264141c4f7eda12c0479604ac85cb4da6c3195` | | Run Job | [#43](https://gitea.jsc.idv.tw/node-actions/ai-code-review/actions/runs/1612) | ```mermaid flowchart LR A[整理 git diff] --> B[⚔️ 攻擊方找問題] B --> C[🛡️ 防守方裁決] C --> D[保存 findings] D --> E[留言到 PR] ```
Author
Owner

📋 變更摘要(送審 git diff)

檔案 用途 git diff 長度 最後更新時間
action.yml 定義 Action 參數與執行入口 88 行/4025 字元 2026/07/20 17:24:18
readme.md 說明專案用法與審查流程 276 行/23829 字元(過長截斷送審) 2026/07/20 16:01:05
src/index.js 編排 AI Code Review 主流程 351 行/15670 字元 2026/07/20 17:33:20
src/lib/agents.js 偵測並執行 AI CLI 工具 14 行/503 字元 2026/07/20 09:46:12
src/lib/context.js 載入 workflow 與 PR 上下文 15 行/769 字元 2026/07/20 17:24:18
src/lib/gitea.js 封裝 Gitea API 操作 121 行/5278 字元 2026/07/20 16:01:05
src/lib/gitrepo.js 封裝 git diff 與提交操作 221 行/9361 字元 2026/07/20 17:51:21
src/lib/review.js 處理審查結果與 AI 判讀 580 行/24901 字元(過長截斷送審) 2026/07/20 16:37:15
src/lib/roles.js 載入並分類審查角色提示 14 行/586 字元 2026/07/20 09:46:12
src/lib/templates.js 產生 PR 留言 Markdown 模板 165 行/5949 字元 2026/07/20 15:00:32

共 10 個檔案納入審查;另有 8 個檔案依 .reviewignore 排除。

<!-- ai-code-review --> ## 📋 變更摘要(送審 git diff) | 檔案 | 用途 | git diff 長度 | 最後更新時間 | | --- | --- | --- | --- | | `action.yml` | 定義 Action 參數與執行入口 | 88 行/4025 字元 | 2026/07/20 17:24:18 | | `readme.md` | 說明專案用法與審查流程 | 276 行/23829 字元(過長截斷送審) | 2026/07/20 16:01:05 | | `src/index.js` | 編排 AI Code Review 主流程 | 351 行/15670 字元 | 2026/07/20 17:33:20 | | `src/lib/agents.js` | 偵測並執行 AI CLI 工具 | 14 行/503 字元 | 2026/07/20 09:46:12 | | `src/lib/context.js` | 載入 workflow 與 PR 上下文 | 15 行/769 字元 | 2026/07/20 17:24:18 | | `src/lib/gitea.js` | 封裝 Gitea API 操作 | 121 行/5278 字元 | 2026/07/20 16:01:05 | | `src/lib/gitrepo.js` | 封裝 git diff 與提交操作 | 221 行/9361 字元 | 2026/07/20 17:51:21 | | `src/lib/review.js` | 處理審查結果與 AI 判讀 | 580 行/24901 字元(過長截斷送審) | 2026/07/20 16:37:15 | | `src/lib/roles.js` | 載入並分類審查角色提示 | 14 行/586 字元 | 2026/07/20 09:46:12 | | `src/lib/templates.js` | 產生 PR 留言 Markdown 模板 | 165 行/5949 字元 | 2026/07/20 15:00:32 | > 共 10 個檔案納入審查;另有 8 個檔案依 `.reviewignore` 排除。
Author
Owner

⚔️ 攻擊方登場

角色 面向 個性
🗡️ Assassin 安全性(security) 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用
🎼 Bard 風格(style) 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版
🧰 Leo 可維護性(maintainability) 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來
🔮 Mage 邏輯(logic) 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」
🧪 Maya 測試(testing) 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑
Rogue 效率(efficiency) 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」
<!-- ai-code-review --> ## ⚔️ 攻擊方登場 | 角色 | 面向 | 個性 | | --- | --- | --- | | 🗡️ **Assassin** | 安全性(security) | 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用 | | 🎼 **Bard** | 風格(style) | 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版 | | 🧰 **Leo** | 可維護性(maintainability) | 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來 | | 🔮 **Mage** | 邏輯(logic) | 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」 | | 🧪 **Maya** | 測試(testing) | 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑 | | ⚡ **Rogue** | 效率(efficiency) | 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」 |
Author
Owner

🛡️ 防守方登場

角色 面向 個性
🛡️ Paladin 裁決(verdict) 沉穩公正、就事論事,不護短也不冤枉,只依排除事項與原始碼脈絡裁定問題成立與否
<!-- ai-code-review --> ## 🛡️ 防守方登場 | 角色 | 面向 | 個性 | | --- | --- | --- | | 🛡️ **Paladin** | 裁決(verdict) | 沉穩公正、就事論事,不護短也不冤枉,只依排除事項與原始碼脈絡裁定問題成立與否 |
Author
Owner

🔴 嚴重|🗡️ Assassin

位置src/index.js 第 409–415 行

問題描述

建問題模式遇到嚴重問題時,把「PR 相依於追蹤 issue」當成唯一阻擋合併的防線,但 API 失敗時只記 WRN 後繼續。攻擊者只要讓目標 repo 未啟用 issue dependencies、token 權限不足,或 Gitea 版本不支援該 endpoint,就能讓含嚴重漏洞的 PR 仍以 exit 0 收場;若 exclusions.json 沒變更,後續也不一定會推出 [failure] 結果 commit 觸發下一輪失敗檢查。這是合併門禁的 fail-open。

修改建議

有嚴重問題時,若無法成功建立阻擋合併的相依關係,就必須 fail closed:直接拋錯或回傳失敗,不可只降級為警告。若仍想維持「下一輪讀結果 commit」模型,建問題模式也要保證嚴重問題時一定會產生可觸發 CI 的 failure marker。

建議寫法

if (severe.length > 0) {
  try {
    await gitea.addIssueDependency(ctx, ctx.prNumber, issue.number);
    log('建問題', 'INF', `有嚴重問題:已將 PR #${ctx.prNumber} 設為相依於 issue #${issue.number}。`);
  } catch (err) {
    log('建問題', 'ERR', `有嚴重問題但無法設定 PR 相依:${err.message}。`);
    throw new Error('有嚴重問題但無法建立合併阻擋關係,為避免繞過審查門禁而中止。');
  }
}
<!-- ai-code-review --> ### 🔴 嚴重|🗡️ Assassin **位置**:`src/index.js` 第 409–415 行 **問題描述** 建問題模式遇到嚴重問題時,把「PR 相依於追蹤 issue」當成唯一阻擋合併的防線,但 API 失敗時只記 WRN 後繼續。攻擊者只要讓目標 repo 未啟用 issue dependencies、token 權限不足,或 Gitea 版本不支援該 endpoint,就能讓含嚴重漏洞的 PR 仍以 exit 0 收場;若 exclusions.json 沒變更,後續也不一定會推出 `[failure]` 結果 commit 觸發下一輪失敗檢查。這是合併門禁的 fail-open。 **修改建議** 有嚴重問題時,若無法成功建立阻擋合併的相依關係,就必須 fail closed:直接拋錯或回傳失敗,不可只降級為警告。若仍想維持「下一輪讀結果 commit」模型,建問題模式也要保證嚴重問題時一定會產生可觸發 CI 的 failure marker。 **建議寫法** ``` if (severe.length > 0) { try { await gitea.addIssueDependency(ctx, ctx.prNumber, issue.number); log('建問題', 'INF', `有嚴重問題:已將 PR #${ctx.prNumber} 設為相依於 issue #${issue.number}。`); } catch (err) { log('建問題', 'ERR', `有嚴重問題但無法設定 PR 相依:${err.message}。`); throw new Error('有嚴重問題但無法建立合併阻擋關係,為避免繞過審查門禁而中止。'); } } ```
Author
Owner

🟠 警告| Rogue

位置src/index.js 第 305–305 行

問題描述

攻擊方沒有找出任何 finding 時,這裡還是照樣啟動防守方 runDefenders。空陣列沒有東西可裁決,卻會多跑一輪 AI CLI/sub agent、讀 exclusions/history、組 prompt;每個乾淨 PR 都被偷走 1 次防守方呼叫的 CPU、等待時間與 token。

修改建議

findings.length === 0 時直接略過防守方裁決,令 kept/excluded 都是空陣列,直接進入保存結果與收尾。這不是微優化,是整輪 AI 呼叫直接歸零。

建議寫法

const { kept, excluded } = findings.length === 0
  ? { kept: [], excluded: [] }
  : await review.runDefenders({ tool, model: ctx.model, cwd, defenders, findings });
<!-- ai-code-review --> ### 🟠 警告|⚡ Rogue **位置**:`src/index.js` 第 305–305 行 **問題描述** 攻擊方沒有找出任何 finding 時,這裡還是照樣啟動防守方 `runDefenders`。空陣列沒有東西可裁決,卻會多跑一輪 AI CLI/sub agent、讀 exclusions/history、組 prompt;每個乾淨 PR 都被偷走 1 次防守方呼叫的 CPU、等待時間與 token。 **修改建議** 在 `findings.length === 0` 時直接略過防守方裁決,令 `kept/excluded` 都是空陣列,直接進入保存結果與收尾。這不是微優化,是整輪 AI 呼叫直接歸零。 **建議寫法** ``` const { kept, excluded } = findings.length === 0 ? { kept: [], excluded: [] } : await review.runDefenders({ tool, model: ctx.model, cwd, defenders, findings }); ```
Author
Owner

🟠 警告|🧪 Maya

位置src/index.js 第 409–416 行

問題描述

這次把「本輪有嚴重問題」的 exit code 從直接 1 改成一律 0,改由下一輪讀 [failure] commit 才失敗,但 diff 沒看到測試固定這個兩階段失敗語意。這是 CI 成敗判定的關鍵行為,若沒有測試,很難確保嚴重 finding 仍會透過結果 commit 讓後續檢查失敗。

修改建議

補測兩個路徑:一是本輪產生嚴重 finding 時,應 commit [failure] 並回傳 0;二是最新 commit subject 已是 [ai-review-bot][failure] 時,步驟 1 應直接回傳 1。斷言 commit message、commitAndPushFindingsresult 參數與 main() 回傳值。

<!-- ai-code-review --> ### 🟠 警告|🧪 Maya **位置**:`src/index.js` 第 409–416 行 **問題描述** 這次把「本輪有嚴重問題」的 exit code 從直接 `1` 改成一律 `0`,改由下一輪讀 `[failure]` commit 才失敗,但 diff 沒看到測試固定這個兩階段失敗語意。這是 CI 成敗判定的關鍵行為,若沒有測試,很難確保嚴重 finding 仍會透過結果 commit 讓後續檢查失敗。 **修改建議** 補測兩個路徑:一是本輪產生嚴重 finding 時,應 commit `[failure]` 並回傳 0;二是最新 commit subject 已是 `[ai-review-bot][failure]` 時,步驟 1 應直接回傳 1。斷言 commit message、`commitAndPushFindings` 的 `result` 參數與 `main()` 回傳值。
Author
Owner

🟠 警告| Rogue

位置src/lib/gitrepo.js 第 139–139 行

問題描述

deepen HEAD 用的是 git fetch --deepen=1000 origin HEAD,這抓的是遠端預設 HEAD,不一定是 PR 目前的 head 分支。淺層 checkout 遇到 feature branch 時,這一步很可能沒有補到需要的歷史,接著就掉到成本最高的 --unshallow,大型 repo 會白白多下載全史,網路與磁碟 I/O 都爆掉。

修改建議

把 PR 的 headRef 傳進 resolveMergeBase,精準 deepen PR head 分支;不要用遠端預設 HEAD 猜。這樣在多數淺層 PR 上可以停在固定深度補抓,不必拉完整歷史。

建議寫法

function resolveMergeBase(cwd, baseRef, headRef) {
  const remoteBase = `origin/${baseRef}`;
  const remoteHead = `origin/${headRef}`;
  // ...
  const strategies = [
    ['deepen base', 'fetch', '--no-tags', '--deepen=1000', 'origin', `+refs/heads/${baseRef}:refs/remotes/${remoteBase}`],
    ['deepen head', 'fetch', '--no-tags', '--deepen=1000', 'origin', `+refs/heads/${headRef}:refs/remotes/${remoteHead}`],
  ];
}

// caller
const base = gitrepo.resolveMergeBase(cwd, ctx.baseRef, ctx.headRef);
<!-- ai-code-review --> ### 🟠 警告|⚡ Rogue **位置**:`src/lib/gitrepo.js` 第 139–139 行 **問題描述** `deepen HEAD` 用的是 `git fetch --deepen=1000 origin HEAD`,這抓的是遠端預設 HEAD,不一定是 PR 目前的 head 分支。淺層 checkout 遇到 feature branch 時,這一步很可能沒有補到需要的歷史,接著就掉到成本最高的 `--unshallow`,大型 repo 會白白多下載全史,網路與磁碟 I/O 都爆掉。 **修改建議** 把 PR 的 `headRef` 傳進 `resolveMergeBase`,精準 deepen PR head 分支;不要用遠端預設 HEAD 猜。這樣在多數淺層 PR 上可以停在固定深度補抓,不必拉完整歷史。 **建議寫法** ``` function resolveMergeBase(cwd, baseRef, headRef) { const remoteBase = `origin/${baseRef}`; const remoteHead = `origin/${headRef}`; // ... const strategies = [ ['deepen base', 'fetch', '--no-tags', '--deepen=1000', 'origin', `+refs/heads/${baseRef}:refs/remotes/${remoteBase}`], ['deepen head', 'fetch', '--no-tags', '--deepen=1000', 'origin', `+refs/heads/${headRef}:refs/remotes/${remoteHead}`], ]; } // caller const base = gitrepo.resolveMergeBase(cwd, ctx.baseRef, ctx.headRef); ```
Author
Owner

🔵 建議|🎼 Bard

位置src/lib/gitrepo.js 第 310–310 行

問題描述

pushWithCredential 的參數名叫 secret,但同一檔其他區段與呼叫端都稱它為 token;同一個旋律忽然換調,讀者需要多花心力確認這是不是另一種憑證。

修改建議

沿用既有命名,把 secret 改成 token,並同步調整 JSDoc 與 Buffer.from 內的引用。

建議寫法

function pushWithCredential(cwd, remoteUrl, token, refspec, serverUrl) {
  const basic = Buffer.from(`ai-review-bot:${token}`).toString('base64');
  // ...
}
<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`src/lib/gitrepo.js` 第 310–310 行 **問題描述** `pushWithCredential` 的參數名叫 `secret`,但同一檔其他區段與呼叫端都稱它為 `token`;同一個旋律忽然換調,讀者需要多花心力確認這是不是另一種憑證。 **修改建議** 沿用既有命名,把 `secret` 改成 `token`,並同步調整 JSDoc 與 `Buffer.from` 內的引用。 **建議寫法** ``` function pushWithCredential(cwd, remoteUrl, token, refspec, serverUrl) { const basic = Buffer.from(`ai-review-bot:${token}`).toString('base64'); // ... } ```
Author
Owner

🔵 建議|🧰 Leo

位置src/lib/review.js 第 31–46 行

問題描述

agentFailureDetail 的註解前後語意不一致:開頭寫「原始輸出預設隱藏」,但後段又說預設會附上遮罩後的 stderr/stdout;最後還提到用 ACTIONS_STEP_DEBUG=true 取得原始輸出,但程式碼沒有任何 debug flag 分支。這種文件與實作脫節,會讓未來維護者誤判 CI log 會暴露多少診斷內容。

修改建議

把註解改成符合目前實作:預設輸出限長且遮罩後的 stderr/stdout;若要支援 debug 模式,再補實作分支。不要在註解承諾程式沒有做的行為。

<!-- ai-code-review --> ### 🔵 建議|🧰 Leo **位置**:`src/lib/review.js` 第 31–46 行 **問題描述** `agentFailureDetail` 的註解前後語意不一致:開頭寫「原始輸出預設隱藏」,但後段又說預設會附上遮罩後的 stderr/stdout;最後還提到用 `ACTIONS_STEP_DEBUG=true` 取得原始輸出,但程式碼沒有任何 debug flag 分支。這種文件與實作脫節,會讓未來維護者誤判 CI log 會暴露多少診斷內容。 **修改建議** 把註解改成符合目前實作:預設輸出限長且遮罩後的 stderr/stdout;若要支援 debug 模式,再補實作分支。不要在註解承諾程式沒有做的行為。
Author
Owner

🔵 建議|🎼 Bard

位置src/lib/templates.js 第 337–340 行

問題描述

issueFindingComment 是一般 finding 留言模板,但註解只寫 review.postSevereToIssue 的嚴重問題用途;和主流程中「警告+建議也逐條發到 issue」的描述不一致,註解像只唱了半段副歌。

修改建議

把 remarks 改成涵蓋嚴重、警告與建議的共用用途,避免後續維護者誤以為此模板只服務嚴重問題。

<!-- ai-code-review --> ### 🔵 建議|🎼 Bard **位置**:`src/lib/templates.js` 第 337–340 行 **問題描述** `issueFindingComment` 是一般 finding 留言模板,但註解只寫 `review.postSevereToIssue` 的嚴重問題用途;和主流程中「警告+建議也逐條發到 issue」的描述不一致,註解像只唱了半段副歌。 **修改建議** 把 remarks 改成涵蓋嚴重、警告與建議的共用用途,避免後續維護者誤以為此模板只服務嚴重問題。
Member

🧩 code-review-resolve 處理進度

本議題為 AI Code Review 建問題模式的追蹤議題。以 --issue all 併同 .gitea/ai-review/findings/ 逐條處理後結果如下(對照目前程式碼與 exclusions.json):

# 等級 審查員 位置 處理結果 說明
1 🔴 嚴重 Assassin src/index.js 第 409–415 行 🚫誤報 合併門禁的兩階段失敗模型(exclusions.json 無變更時不推 [failure] commit、失敗押下一輪)已列入 exclusions(Mage 嚴重),為刻意設計,不重複裁決。
2 🟠 警告 Rogue src/index.js 第 305–305 行 ⏭️待人工 空 findings 仍跑 runDefenders 屬 Rogue 效能取捨,skill 規範不得硬改,須人工評估。
3 🟠 警告 Maya src/index.js 第 409–416 行 🚫誤報 建問題模式兩階段失敗語意缺測試屬 Maya testing 缺測試指控,已列入 exclusions。
4 🟠 警告 Rogue src/lib/gitrepo.js 第 139–139 行 已解決 現行 gitrepo.js 已改用 git rev-parse HEAD 取 headSha 以 deepen PR HEAD 補抓,不再用遠端預設 HEAD。
5 🔵 建議 Bard src/lib/gitrepo.js 第 310–310 行 ⏭️待人工 pushWithCredential 參數 secret 與呼叫端 token 命名不一致屬 Bard 風格取捨,須人工研判。
6 🔵 建議 Leo src/lib/review.js 第 31–46 行 ⏭️待人工 agentFailureDetail 註解「原始輸出預設隱藏」與 ACTIONS_STEP_DEBUG 措辭仍存於現行碼,屬註解描述判斷,非誤報亦非已修。
7 🔵 建議 Bard src/lib/templates.js 第 337–340 行 ⏭️待人工 issueFindingComment 的 JSDoc 用途描述過窄屬 Bard 風格取捨,須人工研判。

小計 已解決 1 條、🚫 誤報(已列入 exclusions)2 條、⏭️ 待人工處理 4 條。

⏭️ 待人工處理項目屬設計/效能/慣例取捨(skill 規範不得硬改),已將「只來自議題」的待人工問題(依主題去重)寫回 .gitea/ai-review/findings/2026-07-20-18:31:07.json 追蹤,關閉本議題不會遺失待辦。

  • 已解決:問題於目前程式碼已修復(如 resolveMergeBase 補抓策略調整、deepen PR HEAD 改用 head SHA、留言閉包改名、push-token input 移除等)。
  • 🚫 誤報:與 .gitea/ai-review/exclusions.json 既有裁決等價,不重複新增排除條目。

處理完成,依 code-review-resolve 流程關閉本議題。

<!-- code-review-resolve --> ## 🧩 code-review-resolve 處理進度 本議題為 AI Code Review 建問題模式的追蹤議題。以 `--issue all` 併同 `.gitea/ai-review/findings/` 逐條處理後結果如下(對照目前程式碼與 `exclusions.json`): | # | 等級 | 審查員 | 位置 | 處理結果 | 說明 | | --- | --- | --- | --- | --- | --- | | 1 | 🔴 嚴重 | Assassin | `src/index.js` 第 409–415 行 | 🚫誤報 | 合併門禁的兩階段失敗模型(exclusions.json 無變更時不推 [failure] commit、失敗押下一輪)已列入 exclusions(Mage 嚴重),為刻意設計,不重複裁決。 | | 2 | 🟠 警告 | Rogue | `src/index.js` 第 305–305 行 | ⏭️待人工 | 空 findings 仍跑 runDefenders 屬 Rogue 效能取捨,skill 規範不得硬改,須人工評估。 | | 3 | 🟠 警告 | Maya | `src/index.js` 第 409–416 行 | 🚫誤報 | 建問題模式兩階段失敗語意缺測試屬 Maya testing 缺測試指控,已列入 exclusions。 | | 4 | 🟠 警告 | Rogue | `src/lib/gitrepo.js` 第 139–139 行 | ✅已解決 | 現行 gitrepo.js 已改用 git rev-parse HEAD 取 headSha 以 deepen PR HEAD 補抓,不再用遠端預設 HEAD。 | | 5 | 🔵 建議 | Bard | `src/lib/gitrepo.js` 第 310–310 行 | ⏭️待人工 | pushWithCredential 參數 secret 與呼叫端 token 命名不一致屬 Bard 風格取捨,須人工研判。 | | 6 | 🔵 建議 | Leo | `src/lib/review.js` 第 31–46 行 | ⏭️待人工 | agentFailureDetail 註解「原始輸出預設隱藏」與 ACTIONS_STEP_DEBUG 措辭仍存於現行碼,屬註解描述判斷,非誤報亦非已修。 | | 7 | 🔵 建議 | Bard | `src/lib/templates.js` 第 337–340 行 | ⏭️待人工 | issueFindingComment 的 JSDoc 用途描述過窄屬 Bard 風格取捨,須人工研判。 | **小計**:✅ 已解決 1 條、🚫 誤報(已列入 exclusions)2 條、⏭️ 待人工處理 4 條。 > ⏭️ 待人工處理項目屬設計/效能/慣例取捨(skill 規範不得硬改),已將「只來自議題」的待人工問題(依主題去重)寫回 `.gitea/ai-review/findings/2026-07-20-18:31:07.json` 追蹤,關閉本議題不會遺失待辦。 - ✅ 已解決:問題於目前程式碼已修復(如 `resolveMergeBase` 補抓策略調整、`deepen PR HEAD` 改用 head SHA、留言閉包改名、`push-token` input 移除等)。 - 🚫 誤報:與 `.gitea/ai-review/exclusions.json` 既有裁決等價,不重複新增排除條目。 處理完成,依 code-review-resolve 流程關閉本議題。
Sign in to join this conversation.
No labels
2 Participants
Notifications
Due Date
No due date set.
Reference: node-actions/ai-code-review#22