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 a3472119e1 - Show all commits
+1 -74
View File
@@ -1,74 +1 @@
[
{
"level": "critical",
"role": "Maya",
"location": "app/resolve.js:142",
"problem": "`reconcileConversations` 核心流程中,對於 `getFileContent` 失敗或內容為空的處理邏輯,直接降級為空字串並視為未解決,但若檔案內容實際上非空且未解決,這可能導致判斷偏差。",
"suggestion": "補測試案例,模擬 `getFileContent` 拋出錯誤時,`reconcileConversations` 是否正確地將對話保留為未解決,且後續統計數字(`carriedFindings`)是否正確。",
"is_new": true
},
{
"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` 缺少對 `problem` 存在但 `suggestion` 為空字串的測試案例。程式碼有 `suggestion: suggestion || problem || ''` 處理,但此行為應被明確驗證。",
"suggestion": "請新增測試案例,模擬評論內文只包含 `問題` 欄位而無 `建議` 欄位時,確認 `suggestion` 會正確地使用 `problem` 的內容。",
"location": "app/resolve.js:41",
"is_new": false
},
{
"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` 缺少對 `levelRaw` 為空但其他欄位存在時的測試案例。程式碼有 `level: level || 'warning'` 處理,但此行為應被明確驗證。",
"suggestion": "請新增測試案例,模擬評論內文缺少 `嚴重等級` 或 `等級` 欄位,但有 `審查員` 和 `問題`/`建議` 欄位時,確認 `level` 會正確地預設為 `warning`。",
"location": "app/resolve.js:40",
"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",
"location": "app/resolve.js:89",
"problem": "在 `judgeConversationsResolved` 函數中,AI 判斷回傳結構如果不符合預期(非陣列),雖有降級處理,但未驗證當 AI 回傳包含無效 `idx` 或缺少 `resolved` 欄位的物件時,對應邏輯是否正確過濾。",
"suggestion": "補測試案例,模擬 AI 回傳包含無效結構(如 `idx` 為字串、缺少 `resolved`)的 JSON,確保系統能正確忽略無效項並將其視為未解決。",
"is_new": true
},
{
"level": "warning",
"role": "Maya",
"location": "app/usage.js:173",
"problem": "`fetchAccountQuota` 策略在處理 API key 時,假設 `apiKeys` 陣列存在並取第一個,若傳入的 `config.apiKeys` 為空陣列或 undefined,缺乏明確的防禦與測試。",
"suggestion": "補測試案例,模擬 `config.apiKeys` 為空或無效的情境,確認系統降級行為是否符合預期。",
"is_new": true
},
{
"level": "warning",
"role": "Maya",
"location": "app/usage.js:211",
"problem": "`resolveRemainingPercent` 函數負責處理額度計算,但針對 `quota.limit` 為 0 的情況缺乏顯式處理,可能會導致除以零或錯誤的百分比計算結果。",
"suggestion": "補測試案例,模擬 `quota.limit` 為 0 的情境,確認系統是否正確處理或返回錯誤訊息,避免計算偏差。",
"is_new": true
}
]
[]