diff --git a/.gitea/ai-review/exclusions.json b/.gitea/ai-review/exclusions.json index 1b0b4f2..96f241e 100644 --- a/.gitea/ai-review/exclusions.json +++ b/.gitea/ai-review/exclusions.json @@ -449,5 +449,126 @@ "endLine": 181, "problem": "新 API `addIssueDependency` 未見測試驗證 endpoint 與 IssueMeta payload。`issueNumber` 與 `dependency` 的方向一旦顛倒,請求仍可能成功,卻會建立相反的阻擋關係;只靠主流程成功測試不容易察覺。", "reason": "Paladin:可排除(重複)。歷史 finding 已指出 addIssueDependency 缺少 endpoint、HTTP method、payload 與相依方向的測試,與本條指控相同。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Assassin", + "severity": "嚴重", + "file": "src/lib/review.js", + "startLine": 74, + "endLine": 77, + "problem": "攻擊者可在 PR diff 中植入機密或個資,誘使 AI CLI 在失敗時原樣回顯;此處卻預設把 stderr 與 stdout 寫入長期保存的 CI log。`redactSecrets()` 只是可繞過的黑名單,例如 `Authorization: Bearer <憑證>` 只會遮掉 `Bearer`,後方憑證仍會留下,且電子郵件、姓名、短 token 與未知格式完全不會被遮罩,違反回應不得含 PII 的規範。", + "reason": "Paladin:可排除(重複)。歷史 finding 已指出除錯模式輸出 AI CLI stderr/stdout、黑名單式遮罩可繞過,以及機密或個資外洩的相同問題。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Bard", + "severity": "建議", + "file": "src/index.js", + "startLine": 183, + "endLine": 229, + "problem": "新增的 `postComment`、`ensureIssueCreated`、`issueBuffer` 與可變的 `issue` 全部嵌在本就冗長的 `main()` 中,且第二個函式透過閉包同時讀寫多個外部狀態。讀者要在主流程、留言路由與 issue 生命週期三條旋律間來回切換,主流程輪廓因此被大量細節淹沒。", + "reason": "Paladin:可排除(重複)。與 F005 及歷史 finding 指涉相同的 main() 職責膨脹、閉包狀態與 issue 發布流程耦合問題。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Leo", + "severity": "警告", + "file": "src/index.js", + "startLine": 181, + "endLine": 229, + "problem": "`main()` 新增了 `issueBuffer`、`issue`、`postComment` 與 `ensureIssueCreated` 等可變狀態及閉包,並在後續流程散落多個 `ctx.createIssue` 分支。留言路由、issue 建立、緩衝區清空與主審查編排因此緊密耦合;半年後新增第三種發布方式或調整 issue 建立時機時,維護者必須同時追蹤整個 `main()` 的狀態轉移,也很難獨立單元測試發布行為。", + "reason": "Paladin:可排除(命中已知排除事項且重複)。既有紀錄已涵蓋 main() 內留言路由、issue 狀態、緩衝佇列與發布職責耦合的問題。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Leo", + "severity": "警告", + "file": "src/index.js", + "startLine": 344, + "endLine": 382, + "problem": "一般模式在嚴重問題與彙整留言發布前就呼叫 `resolveOldComments`。若後續 `postSevereComments` 或 `postComment` 因 API 暫時失敗而中斷,舊的完整審查結果已被標成過時,新回合卻只留下工具、diff、角色等情境留言。這與本次變更宣稱的「成功產生結果後才清舊留言」保證不一致,也讓未來維護者難以判斷何時才算發布完成。", + "reason": "Paladin:可排除(命中已知排除事項)。維護者已明確裁示舊留言須刻意在本回合結果發布前標記為過時,以免舊資訊繼續誤導審查人員。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Mage", + "severity": "嚴重", + "file": "src/index.js", + "startLine": 213, + "endLine": 225, + "problem": "建立追蹤 issue 與寫入暫存留言不是原子操作。最小重現:`gitea.createIssue` 成功後,第 2 則 `createCommentOnIssue` 因暫時性 API 錯誤失敗;主流程會中止,但遠端已留下內容不完整的 issue。工作重跑時沒有查找或續寫既有 issue 的機制,因此會再建立一張重複 issue,且先前已成功寫入的留言也可能重複。", + "reason": "Paladin:可排除(命中已知排除事項且重複)。建立 issue 後沖刷暫存留言失敗、重跑產生孤兒或重複 issue,已由多筆既有紀錄完整涵蓋。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Mage", + "severity": "嚴重", + "file": "src/index.js", + "startLine": 342, + "endLine": 344, + "problem": "舊審查留言仍在新結果完整發布前被標記為過時。最小重現:防守方裁決與 findings 寫檔成功後,`resolveOldComments` 先清除舊結果;接著 `postSevereComments`、`postComment` 或最後的 commit/push 任一步失敗,流程便以失敗結束,PR 上只剩工具/角色等情境留言,既有問題已過時、新問題卻未完整發布。這仍違反本次改動宣稱的「失敗時保留舊結果」語義。", + "reason": "Paladin:可排除(命中已知排除事項且與 F006 重複)。維護者已裁示不得將舊留言清理延後至新結果完整發布之後。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Maya", + "severity": "警告", + "file": "src/lib/gitrepo.js", + "startLine": 105, + "endLine": 159, + "problem": "新增的 merge-base 補抓流程沒有對應測試驗證。尚未確認非淺層/淺層 repository、首次 fetch 失敗、unshallow 成功、deepen base 或 HEAD 才成功,以及所有策略失敗時的診斷與 `cause`;這些分支會直接決定送審 diff 的基準,未經試煉仍可能漏審或錯審。", + "reason": "Paladin:可排除(重複)。歷史 finding 已記錄 resolveMergeBase 多階段 fetch 在淺層、非淺層、停止條件、降級與最終失敗診斷等路徑缺少測試。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Maya", + "severity": "警告", + "file": "src/lib/gitrepo.js", + "startLine": 267, + "endLine": 308, + "problem": "新增的 `pushToken` 推送分流與 `pushWithCredential` 失敗降級沒有測試覆蓋。尚未驗證有 PAT 時確實略過 origin、無 PAT 時 origin 成功不重試、origin 失敗才使用一般 token,以及認證環境變數與固定錯誤訊息不會帶出 token;這是本次 CI 再觸發機制的核心行為。", + "reason": "Paladin:可排除(重複)。歷史 finding 已涵蓋 pushToken、origin 與一般 token 的推送策略、呼叫順序、認證遮蔽及失敗路徑缺少測試。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Maya", + "severity": "警告", + "file": "src/index.js", + "startLine": 309, + "endLine": 387, + "problem": "建問題模式被大幅改寫,但 diff 中沒有測試驗證各分支的外部行為。尤其 `kept` 為空時必須不建 issue、不碰 PR 留言;有問題時必須依序建立 issue、沖出暫存留言、發布各類 finding、回貼 PR 連結;標籤挑選與相依 API 失敗又必須降級而不中斷。這些成功與失敗路徑目前都未被驗證。", + "reason": "Paladin:可排除(重複)。歷史 findings 已涵蓋建問題模式的 issue 建立條件、暫存留言、問題分流、標籤降級、PR 回貼及相依 API 失敗等核心分支缺少測試。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Maya", + "severity": "警告", + "file": "src/lib/review.js", + "startLine": 16, + "endLine": 82, + "problem": "新增的失敗診斷與機密遮罩邏輯沒有測試驗證邊界。尚未確認 Authorization、token/password/secret、URL 內嵌帳密、GitHub 樣式 token、長字串、控制字元,以及機密剛好跨越 2,000 字截斷邊界時是否仍會被完整遮蔽;也未驗證 timeout、數字/字串 code、signal 與空輸出的摘要。", + "reason": "Paladin:可排除(重複)。歷史 finding 已涵蓋失敗診斷與遮罩對空值、控制字元、各類憑證、URL 帳密、截斷及退出狀態等邊界缺少測試。" + }, + { + "addedAt": "2026/07/20 16:39:40", + "prNumber": 6, + "reviewer": "Maya", + "severity": "建議", + "file": "src/lib/gitea.js", + "startLine": 171, + "endLine": 195, + "problem": "新加入的 `addIssueDependency` API 封裝沒有契約測試,尚未驗證 URL 中使用相依方 PR 編號,而 request body 的 `index` 使用阻擋來源 issue 編號;兩者若對調,請求可能仍是合法格式,卻會建立反向的相依關係。", + "reason": "Paladin:可排除(重複)。歷史 finding 已指出 addIssueDependency 缺少 endpoint、HTTP method、payload 與相依方向的契約測試。" } ]