chore(ai-review 狀態): 解決 usage.js findings 並補 SRP 誤報排除
This commit is contained in:
@@ -434,5 +434,11 @@
|
||||
"role": "Rogue",
|
||||
"original_finding": "`Promise.allSettled` 的結果處理邏輯過於冗長,產生不必要的中間變數。",
|
||||
"reason": "主觀風格。`resolveOutcome` Map 是為了讓並行結果能依原 open 索引亂序對齊(保留 carried/resolved 的順序與 botFinding 對應),現有寫法清楚且正確,非缺陷。"
|
||||
},
|
||||
{
|
||||
"location": "app/usage.js",
|
||||
"role": "Leo",
|
||||
"original_finding": "`usage.js` 模組目前承擔了 Token 計算、Rate Limit 記錄、以及各平台帳號額度查詢等多重職責(SRP),未來若支援更多平台會變得龐大難維護;建議將各平台 QuotaStrategy 拆分至獨立檔案。",
|
||||
"reason": "過早最佳化。目前 usage.js 仍圍繞單一「使用量」領域且體積適中(約 250 行),token 計算與額度查詢彼此關聯(同屬使用量呈現);在尚未有多平台 strategy 膨脹的實際痛點前拆檔,徒增檔案與匯入複雜度。待 strategy 數量明顯成長再拆分較合適。"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,66 +1 @@
|
||||
[
|
||||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
[]
|
||||
|
||||
Reference in New Issue
Block a user