feat(ai-review 對話收斂): 讀 PR review 留言判斷解決狀態並收斂 findings #45

Merged
admin merged 69 commits from develop into master 2026-06-23 08:30:28 +00:00
Showing only changes of commit 7b311f1e8f - Show all commits
+66 -1
View File
@@ -1 +1,66 @@
[] [
{
"level": "warning",
"role": "Maya",
"problem": "函式 `judgeConversationsResolved` 缺少對 AI 回傳結果中元素缺少 `idx` 或 `resolved` 欄位的測試案例。雖然程式碼有過濾處理,但此邊界條件應被明確驗證。",
"suggestion": "請新增測試案例,模擬 `chatFn` 回傳的陣列中,有些物件缺少 `idx` 或 `resolved` 屬性時,確認這些無效的結果會被正確過濾,且其他有效結果能被正確處理。",
"location": "app/resolve.js:91",
"is_new": false
},
{
"level": "warning",
"role": "Maya",
"problem": "函式 `parseBotReviewComment` 缺少對 `problem` 存在但 `suggestion` 為空字串的測試案例。程式碼有 `suggestion: suggestion || problem || ''` 處理,但此行為應被明確驗證。",
"suggestion": "請新增測試案例,模擬評論內文只包含 `問題` 欄位而無 `建議` 欄位時,確認 `suggestion` 會正確地使用 `problem` 的內容。",
"location": "app/resolve.js:41",
"is_new": false
},
{
"level": "warning",
"role": "Maya",
"problem": "函式 `judgeConversationsResolved` 缺少對 `chatFn` 拋出錯誤情境的測試。雖然上層呼叫者有處理,但此函式本身的錯誤行為應被驗證。",
"suggestion": "請新增測試案例,模擬 `chatFn` 拋出錯誤時,確認 `judgeConversationsResolved` 會正確地將錯誤向上拋出,以便呼叫者處理。",
"location": "app/resolve.js:90",
"is_new": false
},
{
"level": "warning",
"role": "Maya",
"problem": "函式 `reconcileConversations` 缺少對 `judge` 拋出錯誤情境的明確測試。雖然程式碼有 `try-catch` 處理,但應有專門的測試案例來驗證此失敗路徑的行為。",
"suggestion": "請新增測試案例,模擬 `judge` 函式拋出錯誤時,確認 `reconcileConversations` 能正確捕獲錯誤,記錄警告,並將所有待判斷的對話都視為未解決(即 `verdicts` 應全部為 `resolved: false`)。",
"location": "app/resolve.js:144",
"is_new": false
},
{
"level": "warning",
"role": "Maya",
"problem": "函式 `parseBotReviewComment` 缺少對 `levelRaw` 為空但其他欄位存在時的測試案例。程式碼有 `level: level || 'warning'` 處理,但此行為應被明確驗證。",
"suggestion": "請新增測試案例,模擬評論內文缺少 `嚴重等級` 或 `等級` 欄位,但有 `審查員` 和 `問題`/`建議` 欄位時,確認 `level` 會正確地預設為 `warning`。",
"location": "app/resolve.js:40",
"is_new": false
},
{
"level": "warning",
"role": "Assassin",
"location": "app/usage.js:166",
"problem": "在 `fetchAccountQuota` 中,使用 `axios.get` 直接請求傳入的 `baseURL`。如果 `baseURL` 是由設定檔動態讀取,攻擊者可能會透過修改設定檔將其導向惡意伺服器(SSRF),進而竊取 API Key 或發送偽造請求。",
"suggestion": "應對 `baseURL` 進行嚴格的白名單校驗,確保其僅能連線至合法的 API 提供商域名。不要信任外部設定檔中的 URL。",
"is_new": true
},
{
"level": "warning",
"role": "Mage",
"location": "app/usage.js:15",
"problem": "extractUsage 中對於 OpenAI 相容格式的處理:`const total = num(u.total_tokens) || prompt + completion;`。如果 API 回傳了 `total_tokens: 0`(雖然極少見但非零可能),這裡的邏輯會觸發 `prompt + completion` 的計算,導致數值不準確。",
"suggestion": "應明確判斷 `u.total_tokens != null` 而非僅檢查其 truthiness,以確保在 API 明確回傳 0 時能正確讀取。",
"is_new": true
},
{
"level": "info",
"role": "Leo",
"location": "app/usage.js",
"problem": "`usage.js` 模組目前承擔了 Token 計算、Rate Limit 記錄、以及各平台帳號額度查詢等多重職責(SRP),未來若支援更多平台,這個檔案會變得非常龐大且難以維護。",
"suggestion": "建議將各平台的 `QuotaStrategy` 拆分至獨立的策略檔案,或至少將 usage 計算與額度查詢邏輯分開,保持各類別的職責單一。",
"is_new": true
}
]