feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #6

Merged
admin merged 79 commits from ai-review-resolve/develop-20260717-185330 into develop 2026-07-21 09:39:48 +00:00
Showing only changes of commit 4b779ee00b - Show all commits
+110
View File
@@ -944,5 +944,115 @@
"endLine": 84, "endLine": 84,
"problem": "`agentFailureDetail` 現在會把 AI CLI 的 stderr/stdout 片段寫進 CI log,並依賴 `redactSecrets` 遮罩機密;但新增的遮罩規則與截斷規則沒有測試。這是典型失敗路徑,平常快樂路徑不會跑到,沒測過就無法相信它真的能處理 Authorization、token、URL 帳密、控制字元與長金鑰。", "problem": "`agentFailureDetail` 現在會把 AI CLI 的 stderr/stdout 片段寫進 CI log,並依賴 `redactSecrets` 遮罩機密;但新增的遮罩規則與截斷規則沒有測試。這是典型失敗路徑,平常快樂路徑不會跑到,沒測過就無法相信它真的能處理 Authorization、token、URL 帳密、控制字元與長金鑰。",
"reason": "Paladin:可排除(重複)。歷史 findings 已涵蓋 `redactSecrets``agentFailureDetail` 對 Authorization、token、URL 帳密、控制字元、長輸出與空輸出等邊界缺少測試。" "reason": "Paladin:可排除(重複)。歷史 findings 已涵蓋 `redactSecrets``agentFailureDetail` 對 Authorization、token、URL 帳密、控制字元、長輸出與空輸出等邊界缺少測試。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Assassin",
"severity": "警告",
"file": "src/lib/review.js",
"startLine": 58,
"endLine": 72,
"problem": "`agentFailureDetail` 現在預設把 AI CLI 的 `stderr` 與 `stdout` 片段寫進 CI log。攻擊者可以在 PR diff 或提示注入內容中放入敏感資料形狀的字串,再誘導 CLI 失敗並回顯 prompt`redactSecrets` 只是盡力遮罩,擋不住短密碼、內部 URL、email、客戶資料或非典型 token。這等於把不可信輸入與可能含機密的工具輸出灌進長期保存、多人可讀的 log。",
"reason": "Paladin:可排除(重複)。歷史 finding 已針對 AI CLI stderrstdout 寫入 CI log、黑名單式遮罩可繞過,以及機密或個資外洩風險提出相同問題。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Bard",
"severity": "警告",
"file": "src/index.js",
"startLine": 119,
"endLine": 151,
"problem": "流程說明把「步驟 2」描述成延後到步驟 8 之後才執行,後面程式又用 `步驟 2(延後執行)` 回頭標示。這段樂譜的拍號倒著走,讀者必須在時間順序與編號順序之間來回換算,註解、log 與 README 流程圖都因此變得不直覺。",
"reason": "Paladin:可排除(重複)。歷史 finding 已指出流程步驟編號硬編碼於主流程註解、日誌與 README,調整流程時容易失準;本條是同一類步驟編號與執行順序不直覺問題。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Bard",
"severity": "建議",
"file": "src/index.js",
"startLine": 186,
"endLine": 224,
"problem": "`postComment` 與 `ensureIssueCreated` 是 `main()` 內部閉包,卻各自塞入完整 JSDoc,再加上前後多段長註解,使主流程像在旋律中突然插入大段腳註。這會稀釋真正重要的 10 步驟編排,可讀性變得厚重。",
"reason": "Paladin:可排除(重複)。歷史 finding 已指出 main() 內新增兩個帶完整 JSDoc 的閉包與長段註解,打斷主流程閱讀節奏。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Leo",
"severity": "警告",
"file": "src/index.js",
"startLine": 180,
"endLine": 390,
"problem": "`main()` 這次把「一般模式 PR 留言」、「建問題模式暫存留言」、「建立 issue」、「回貼 PR 連結」、「設定 issue dependency」都塞進同一段流程與閉包狀態(`issueBuffer`、`issue`、`postComment`、`ensureIssueCreated`)。半年後要改留言落點或新增第三種輸出模式時,維護者必須同時理解整條 10 步驟流程與這些隱含狀態轉移,出錯點會集中在同一個長函式裡。",
"reason": "Paladin:可排除(命中已知排除事項且重複)。既有紀錄已涵蓋 main() 內留言路由、issue 生命週期、緩衝佇列與發布職責耦合,並提出相同的發布器抽離方向。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Mage",
"severity": "嚴重",
"file": "src/index.js",
"startLine": 405,
"endLine": 426,
"problem": "在 `create-issue: true` 且有嚴重問題、但 `exclusionsChanged === false` 的情境下,流程不會產生任何結果 commit`filesToCommit` 會是空陣列,接著進入略過 commit/push 的分支,最後仍固定 `return 0`。最小重現:PR 產生 1 條保留的「嚴重」 finding、防守方沒有排除項目,因此 `exclusions.json` 不變;若問題相依 API 未啟用或設定失敗,程式只記 WRN,沒有 failure commit 觸發下一輪步驟 1,也沒有非 0 exit code,CI 會通過。這和註解宣稱「嚴重問題由 `[failure]` 結果 commit 於下一輪回報」的契約衝突。",
"reason": "Paladin:可排除(重複)。此條與 F001 指涉同一建問題模式 fail-open 問題:嚴重 finding 可能因沒有 failure commit 且 issue dependency 失敗被降級而讓 CI 通過。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Maya",
"severity": "警告",
"file": "src/lib/gitrepo.js",
"startLine": 102,
"endLine": 155,
"problem": "新增的 `resolveMergeBase` 淺層 checkout 補抓流程沒有看到對應測試驗證。這段現在有多個分支:初次 `merge-base` 成功、`deepen base` 後成功、`deepen HEAD` 後成功、淺層 repo 才跑 `--unshallow`、所有策略失敗時要帶診斷與 `cause`。這些都是會直接影響送審 diff 範圍的核心行為,沒被試煉過我會先當作未完成。",
"reason": "Paladin:可排除(重複)。歷史 finding 已針對 resolveMergeBase 的多階段 fetch、淺層與非淺層分支、停止條件及最終失敗診斷缺少測試提出相同問題。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Maya",
"severity": "警告",
"file": "src/lib/gitrepo.js",
"startLine": 265,
"endLine": 298,
"problem": "push 行為從「先 origin、失敗再帶 token URL」改成「一律透過 `pushWithCredential` 用 `GIT_CONFIG_*` extraheader 推送」,但 diff 沒有新增測試驗證成功路徑、失敗路徑與機密不進 argv。這段一旦組錯環境變數或 refspec,結果 commit 就推不上去;一旦錯誤訊息回顯 argv,也會破壞你想保護 token 的保證。",
"reason": "Paladin:可排除(重複)。歷史 finding 已涵蓋 findings 推送認證路徑、token push 目標、錯誤不含憑證與相關測試缺口。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Maya",
"severity": "警告",
"file": "src/index.js",
"startLine": 184,
"endLine": 397,
"problem": "建問題模式新增了大量流程分支,但沒有看到對應測試驗證留言去向與邊界。現在行為包含:issue 建立前先暫存工具/diff/角色留言、沒有保留問題時靜默通過、有保留問題才建 issue、嚴重問題才設定 PR 相依、只有警告/建議時不阻擋合併、最後回貼 issue 連結到 PR。這些不是單純註解調整,是使用者可觀察到的流程改變,若沒測試很容易在重構時漏發或發錯位置。",
"reason": "Paladin:可排除(重複)。歷史 findings 已涵蓋建問題模式的暫存留言、無 finding 靜默通過、有 finding 才建 issue、嚴重與其他問題分流、PR 回貼及相依 API 分支缺少測試。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Maya",
"severity": "警告",
"file": "src/lib/review.js",
"startLine": 16,
"endLine": 72,
"problem": "`redactSecrets` / `agentFailureDetail` 新增了把 AI CLI 的 stderr/stdout 寫進 CI log 的行為,但沒有看到測試驗證遮罩規則與截斷邊界。這裡的失敗路徑特別需要測:Authorization、token/password、URL 內嵌帳密、長 token、控制字元與超長輸出都應被處理,否則一個未覆蓋的格式就可能把敏感內容留下來。",
"reason": "Paladin:可排除(重複)。歷史 finding 已記錄 redactSecretsagentFailureDetail 對 Authorization、token、URL 帳密、控制字元、截斷與 debug 開關等邊界缺少測試。"
},
{
"addedAt": "2026/07/20 17:43:56",
"prNumber": 6,
"reviewer": "Maya",
"severity": "建議",
"file": "src/lib/gitea.js",
"startLine": 172,
"endLine": 194,
"problem": "新增的 `addIssueDependency` API wrapper 沒有看到測試確認 endpoint 與 body。這段雖然薄,但語意很容易寫反:URL 上的是被阻擋的 PR/issuebody 的 `index` 才是 dependency。少了測試,未來調整時很可能把相依方向顛倒而不自知。",
"reason": "Paladin:可排除(重複)。歷史 finding 已指出 addIssueDependency 缺少 endpoint、HTTP method、payload、錯誤傳遞與相依方向測試,與本條相同。"
} }
] ]