chore(ai-review 狀態): 解決 resolve.js findings 並補誤報排除
AI / 計算版本號 (pull_request) Successful in 2s
AI / Code Review (pull_request) Successful in 48s

This commit is contained in:
Jeffery
2026-06-23 12:58:43 +08:00
parent 5f468c0d03
commit 3ea75d5136
2 changed files with 37 additions and 109 deletions
+36
View File
@@ -398,5 +398,41 @@
"role": "Leo",
"original_finding": "將 `REVIEW_SEVERITY_LABELS`、`REVIEW_SEVERITY_PATTERN` 和 `reviewSeverityLabel` 這些與評論格式相關的常數與函式,提取到一個獨立的共用模組中(例如 `app/utils/reviewComments.js`),並讓測試檔案和任何需要用到它們的應用程式邏輯都從該模組匯入。這樣能確保「評論格式」的定義只有一個來源,提升可維護性。",
"reason": "誤判。這些常數與 `reviewSeverityLabel` 只用於 `app/comments.test.js` 內部驗證 review comment body 格式,production code 沒有使用同一段解析邏輯;抽成共用模組會把測試專用輔助程式提升為正式 API,增加不必要的維護負擔。"
},
{
"location": "app/resolve.js:52",
"role": "Assassin",
"original_finding": "在 `parseBotReviewComment` 函式中,從 Gitea comment 內文解析出的 `problem` 和 `suggestion` 欄位若包含惡意內容且未經適當輸出編碼,可能導致 XSS 攻擊。",
"reason": "誤判。這些字串只會寫入 `.gitea/ai-review/findings.json` 與 Gitea review comment bodyGitea 的 Markdown 渲染器會在伺服器端對輸出做 HTML 淨化;本 action 不自行將其渲染到任何自製網頁或 UI,輸出編碼屬消費端(Gitea)責任。"
},
{
"location": "app/resolve.js:207",
"role": "Leo",
"original_finding": "正規化邏輯(`normalizeKey` 等)過於激進且未快取,既可能導致語意相近建議被誤判為相同,也在頻繁比較時造成效能浪費。",
"reason": "誤判/過度設計。積極正規化是刻意設計,用來對行號漂移與標點差異產生穩定簽章以利去重;`findingSig` 已是獨立 helper,且比對對象為單一 PR 的小量 findings,memoize 在此規模沒有實質效益。"
},
{
"location": "app/resolve.js:187",
"role": "Mage",
"original_finding": "在 `reconcileConversations` 函式中,並行(`Promise.all`)呼叫 `resolveComment`,即使個別呼叫失敗也僅記錄為 rejected 並 warn;若失敗是 token 過期或權限不足,後續所有 resolve 都會失敗,程式碼未對這些錯誤分類並提前停止。",
"reason": "不適用。resolve 呼叫已改為 `Promise.allSettled` 一次並行送出,不存在「後續逐一嘗試」可中止;個別失敗已降級記錄並把該對話保留為未解決,不影響其他對話與整體流程。"
},
{
"location": "app/resolve.js:77",
"role": "Rogue",
"original_finding": "大量使用字串拼接產生暫存物件,以及並行請求未限制數量,在高負載下可能導致 GC 壓力或觸發 API 限流;建議引入 p-limit 等並行限制。",
"reason": "過度設計。對話來源為單一 PR 的行內 review comment,數量級小,無限並行不致造成 GC 壓力或觸發限流;引入 p-limit 相依與額外複雜度在此情境不符成本效益。"
},
{
"location": "app/resolve.js:195",
"role": "Mage",
"original_finding": "對 `botFinding` 的存取缺乏防禦性檢查。",
"reason": "誤判。`pushCarried` 進入時即有 `if (!conversation.botFinding) return` 防禦,resolvedFindings 的 push 也有 `if (c.botFinding)` 判斷,存取前皆已檢查物件存在。"
},
{
"location": "app/resolve.js:173",
"role": "Rogue",
"original_finding": "`Promise.allSettled` 的結果處理邏輯過於冗長,產生不必要的中間變數。",
"reason": "主觀風格。`resolveOutcome` Map 是為了讓並行結果能依原 open 索引亂序對齊(保留 carried/resolved 的順序與 botFinding 對應),現有寫法清楚且正確,非缺陷。"
}
]