fix(diagnostics): 處理 ai review findings #32
@@ -1208,5 +1208,115 @@
|
||||
"endLine": 276,
|
||||
"problem": "提供 pushToken 時仍把 Git HTTP 使用者名稱固定為 ai-review-bot;若 PAT 屬於其他帳號,伺服器會以錯誤的帳號/PAT 組合驗證,導致 push 失敗。",
|
||||
"reason": "誤報(管理員於 issue #10 留言明確指示列為誤報)。Gitea 的 HTTP Basic 認證以密碼欄(token/PAT)判定身分,使用者名稱欄不影響認證結果,故固定為 ai-review-bot 不會造成 push 失敗。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Assassin",
|
||||
"severity": "嚴重",
|
||||
"file": "src/lib/review.js",
|
||||
"startLine": 73,
|
||||
"endLine": 76,
|
||||
"problem": "攻擊者可以把惡意內容塞進 PR diff,誘導 AI CLI 在失敗時把環境資訊、原始提示、程式碼片段或秘密印到 stdout/stderr;這裡預設把 stderr/stdout 片段寫進 CI log。`redactSecrets` 只是盡力遮罩,擋不住短 token、雲端 access key、JWT 片段、email、PR 內容中的 PII,等於把不可信子程序輸出變成長期保存且多人可讀的洩漏面。",
|
||||
"reason": "Paladin:可排除(重複)。歷史 finding 已針對 AI CLI 失敗時將 stderr/stdout 寫入 CI log、黑名單式遮罩不足,以及機密或個資外洩風險提出相同問題。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Bard",
|
||||
"severity": "建議",
|
||||
"file": "src/index.js",
|
||||
"startLine": 199,
|
||||
"endLine": 237,
|
||||
"problem": "`main()` 內新增兩個帶完整 JSDoc 的閉包,篇幅與抽象程度已不像局部小工具;主流程原本應像總譜一樣清楚推進,現在在步驟開始前先插入大段支線說明,閱讀節奏被拉長。",
|
||||
"reason": "Paladin:可排除(重複)。歷史 finding 已指出 `main()` 內新增兩個帶完整 JSDoc 的閉包,讓留言路由與 issue 建立細節打斷主流程閱讀。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Bard",
|
||||
"severity": "建議",
|
||||
"file": "action.yml",
|
||||
"startLine": 3,
|
||||
"endLine": 4,
|
||||
"problem": "檔頭的用途句過長,且「更新時間」仍停在 `2026/07/17 18:49:58`,與本次檔案變更時間脈絡不一致。文件開場若時間與篇幅都失準,後續讀者很難相信這份註解仍被細心維護。",
|
||||
"reason": "Paladin:可排除(重複)。歷史 finding 已針對 `action.yml` 檔頭手寫更新時間過期、易與實際變更不同步提出相同問題。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Leo",
|
||||
"severity": "警告",
|
||||
"file": "src/index.js",
|
||||
"startLine": 180,
|
||||
"endLine": 223,
|
||||
"problem": "`main()` 現在同時負責審查流程編排、PR 留言、issue 暫存、issue 建立與暫存留言 flush。這些模式差異靠 `ctx.createIssue`、`issueBuffer`、`issue` 這幾個閉包狀態散在後續流程判斷;半年後要新增第三種輸出目的地或調整步驟順序時,很容易漏改某個分支,造成留言發錯位置或暫存內容被丟棄。",
|
||||
"reason": "Paladin:可排除(命中已知排除事項且重複)。既有紀錄已涵蓋 `main()` 內留言路由、issue 狀態、緩衝佇列與發布職責耦合的問題。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Leo",
|
||||
"severity": "警告",
|
||||
"file": "src/index.js",
|
||||
"startLine": 309,
|
||||
"endLine": 388,
|
||||
"problem": "建問題模式的生命週期被拆散在多個區塊:先依 `kept.length` 建 issue、再分別處理 severe/others、最後回貼 PR 連結與設定 dependency。這些區塊都隱含「只要有 severe 或 others,`issue` 一定存在」的前置條件,但前置條件沒有被型別或函式邊界保護,只靠讀者追完整個流程才能確認。後續若有人改了 `kept` 分組、靜默通過規則或 issue 建立條件,這段會很容易產生 null issue 或部分內容漏發。",
|
||||
"reason": "Paladin:可排除(重複)。此條仍指向建問題模式的 issue 生命週期與跨區塊可變狀態耦合,與 F007 及歷史 Leo findings 所述同一設計問題重複。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Maya",
|
||||
"severity": "警告",
|
||||
"file": "src/index.js",
|
||||
"startLine": 183,
|
||||
"endLine": 389,
|
||||
"problem": "建問題模式新增了完整分流行為,但這次變更沒有看到對應測試驗證。這裡不只是換留言目的地,而是新增「先暫存留言、確定有保留問題才建 issue、無保留問題靜默通過、嚴重問題才掛 PR 相依、PR 回貼 issue 連結」等多個分支;若其中任一條件判斷錯,可能造成 PR 沒有審查結果、issue 漏留言,或警告問題誤阻擋合併。",
|
||||
"reason": "Paladin:可排除(重複)。歷史 Maya findings 已涵蓋建問題模式暫存留言、無保留問題靜默通過、問題分流、PR 回貼 issue 連結與 dependency 等核心分支缺少測試。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Maya",
|
||||
"severity": "警告",
|
||||
"file": "src/lib/gitrepo.js",
|
||||
"startLine": 102,
|
||||
"endLine": 158,
|
||||
"problem": "`resolveMergeBase` 新增多段 fetch fallback 與診斷彙整,但沒有測試覆蓋淺層 checkout、fetch 失敗、每次補抓後立即重試 merge-base、以及最終失敗時錯誤訊息與 `cause` 的行為。這段是 PR diff 基準的核心邏輯,未驗證時很容易在 shallow clone 或 PR head 歷史不足時漏審/誤審。",
|
||||
"reason": "Paladin:可排除(重複)。歷史 findings 已針對 `resolveMergeBase` 多階段 fetch、淺層與非淺層路徑、fetch 失敗後降級、停止條件與最終診斷缺少測試提出相同問題。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Maya",
|
||||
"severity": "警告",
|
||||
"file": "src/lib/gitrepo.js",
|
||||
"startLine": 268,
|
||||
"endLine": 325,
|
||||
"problem": "`commitAndPushFindings` 改成一律透過 `pushWithCredential` 用 PAT extraheader 推送,且宣稱會清掉 checkout 自動 token、避免 token 進 argv、失敗時不外洩 URL/憑證;但這些安全與觸發 CI 的關鍵行為沒有測試驗證。未測的失敗路徑尤其危險,因為一旦環境變數組錯,可能推送失敗或回到自動 token 而不觸發下一輪檢查。",
|
||||
"reason": "Paladin:可排除(重複)。歷史 findings 已涵蓋 `commitAndPushFindings`/`pushWithCredential` 的推送認證路徑、token 不進 argv、錯誤不外洩憑證與 CI 觸發相關行為缺少測試。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Maya",
|
||||
"severity": "警告",
|
||||
"file": "src/lib/review.js",
|
||||
"startLine": 13,
|
||||
"endLine": 74,
|
||||
"problem": "`agentFailureDetail` 現在會把 AI CLI 的 stderr/stdout 片段寫進 CI log,並依賴 `redactSecrets` 遮罩機密與控制字元;這是新增的失敗診斷行為,但沒有看到測試驗證邊界與失敗輸出。若遮罩規則漏掉,測試沒守住就可能把 token、Authorization header 或含換行的偽造 log 直接輸出。",
|
||||
"reason": "Paladin:可排除(重複)。歷史 findings 已記錄 `agentFailureDetail`/`redactSecrets` 對 Authorization、token、URL 帳密、控制字元、截斷與空輸出等邊界缺少測試。"
|
||||
},
|
||||
{
|
||||
"addedAt": "2026/07/20 18:07:26",
|
||||
"prNumber": 6,
|
||||
"reviewer": "Maya",
|
||||
"severity": "警告",
|
||||
"file": "src/lib/gitea.js",
|
||||
"startLine": 169,
|
||||
"endLine": 195,
|
||||
"problem": "新增 `addIssueDependency` 封裝 Gitea issue dependency endpoint,但沒有對 endpoint、HTTP method 與 body 語意補測試。這個 API 的方向性很重要:是讓 PR 相依於追蹤 issue;若 body 的 `index` 或 URL 上的 issue number 寫反,測試沒抓到就會變成錯誤的阻擋關係,甚至完全沒有阻擋效果。",
|
||||
"reason": "Paladin:可排除(重複)。歷史 findings 已指出 `addIssueDependency` 缺少 endpoint、HTTP method、payload 與相依方向的契約測試,與本條指控相同。"
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user