6.6 KiB
6.6 KiB
開發階段 TODO
階段一:基本流程串接
- 目標:確保 action 可以被觸發,pipeline 各步驟依序執行,log 出每個主要階段的進入與完成。
- 驗收:log 中能看到每個階段(如「Step1: pipeline start」、「Step2: findings merge」等)明確訊息,且流程能走完(即使還沒產生 findings)。
- 已驗收:
code-reviewjob 的 log 已完整出現Step1到Step8,並以Pipeline 完成結束。
階段二:Git Diff 排除 .gitea/ 資料夾
- 目標:讀取 Git Diff 時排除
.gitea/資料夾內的所有檔案,以及.amazonq/、.claude/、.codex/、.gemini/、.github/、CLAUDE.md、GEMINI.md、TODO.md、README.md,避免 AI 分析 workflow 設定、skill 入口與文件等非業務程式碼。 - 驗收:PR 中有上述路徑或檔案的變更時,diff 內容不包含該區塊,AI 分析結果不含這些路徑相關問題。
- 已驗收:
app/gitea.js已在取得 diff 時過濾.gitea/區塊,且相關單元測試已覆蓋。
階段三:Findings 產生與合併
- 目標:各角色(style/security/performance/maintainability/testing)能產生 findings,並正確合併新舊 findings。
- 驗收:log 中能看到每個角色 findings 數量、合併後 findings 統計,並有「Step3: merged findings total=...」等訊息。
- 已驗收:log 已顯示 5 個角色皆有分析結果,並出現
Step3 merged findings total=13。
階段四:AI 去重與角色確認
- 目標:嘗試呼叫 LLM 進行 findings 去重與角色確認,API 額度不足時要有降級處理 log。
- 驗收:log 中能看到 deduplication/resolution confirmation 成功或失敗(如 402),降級時有「保留所有問題」等明確訊息。
- 已驗收:log 已出現
AI 去重: 13 -> 11 筆,且程式具備失敗時保留所有問題的降級處理。
階段五:AI 排除問題過濾
- 目標:讀取排除問題檔案(
.gitea/ai-review/exclusions.json)進行規則過濾,並呼叫 AI 判斷剩餘問題是否為誤報或不適用,兩層過濾後產生最終問題清單。 - 驗收:log 中能看到排除問題檔案讀取成功或不存在的訊息、規則過濾數量變化,以及「AI 誤報過濾: N -> M 筆」或降級訊息。
- 部分驗收:log 已顯示
讀取排除問題: 50 筆與排除過濾: 11 -> 0 筆,但這次未進入AI 誤報過濾: N -> M 筆的正向路徑。 - 可驗收紀錄情境:當
排除過濾後仍保留 1 筆以上 findings 時,log 會出現AI 誤報過濾: N -> M 筆;若 API 額度不足或回傳失敗,則會出現AI 誤報過濾失敗(...),降級:保留所有問題。
階段六:findings 寫入與 comment 發布
- 目標:
.gitea/ai-review/findings.json正確寫入,comment 發布順序正確(舊問題→非嚴重→嚴重),每步有 log。 - 驗收:log 中能看到
.gitea/ai-review/findings.json寫入、comment sync 的詳細訊息與順序。 - 部分驗收:
findings.json已成功寫入,也有依序執行舊問題、非嚴重、嚴重 comment 流程;但本次因結果為 0 筆,沒有實際 comment 內容可完整驗證順序。 - 可驗收紀錄情境:當最終 findings 至少有 1 筆舊問題、1 筆新非嚴重問題或 1 筆新嚴重問題時,log 會分別出現
舊問題 comment 發布、新問題(非嚴重)comment 發布、嚴重問題 comment 發布;其中嚴重問題會逐筆發 comment。
階段七:階段六後驗證 JSON 格式
- 目標:階段六完成後驗證
findings.json與exclusions.json是否為合法 JSON 格式,格式錯誤時先嘗試透過 AI 修正內容,再重新驗證;修正後仍不合法才 exit 1;之後才檢查檔案是否存在,不存在則建立並寫入[]。 - 驗收:log 中能看到兩個檔案的驗證結果(成功或失敗),格式錯誤時有 AI 修正嘗試與修正後再次驗證的訊息;若檔案不存在,會在驗證完成後看到建立並寫入
[]的訊息;修正失敗時 workflow 狀態為失敗。 - 已驗收:log 已明確顯示
.gitea/ai-review/findings.json與.gitea/ai-review/exclusions.json都是JSON 格式正確。
階段八:記憶區 commit/push 與錯誤處理
- 目標:記憶區能成功 commit/push,且一併包含
triage-findingsskill 與各平台入口檔;skill 檔案已存在時一律以來源覆蓋,workspace 沒有的同步檔則保留記憶區既有內容,不做刪除;錯誤時有明確 log,流程結束有總結訊息。 - 驗收:log 有「persisted findings」、「commit=...」、「push=...」等訊息,且能看出 skill 相關檔案已一併提交並被來源覆蓋;當 workspace 缺少某個同步檔時,記憶區中的對應檔案不會被刪除;錯誤時有「Runner failed: ...」等明確錯誤說明。
- 已驗收:log 已出現
persisted findings commit=b867eaa push=feat/解決問題,代表 commit/push 成功;本次已補上「來源覆蓋、缺檔不刪除」的同步規則,相關單元測試也已覆蓋。
階段九:阻擋嚴重問題 PR(第 8 點)
- 目標:如果 PR 問題表格中有嚴重(critical)問題,workflow 需直接 exit 1,不讓流程成功。
- 驗收:log 中能看到「critical 問題存在,workflow 結束(exit 1)」等明確訊息,且 workflow 狀態為失敗。
- 已驗收:這次 log 已明確出現
❌ 發現 2 個嚴重問題,workflow 結束(exit 1),且 job 以失敗結束,證明阻擋分支確實生效。 - 補充紀錄:
Step8的退出訊息屬於預期行為,不代表 Step7 commit/push 失敗。
階段十:API Key 輪替
- 目標:所有平台的 API Key 支援逗號分隔傳入多個,隨機順序各嘗試一次,單一 Key 失敗時自動換下一個,全部失敗則 exit 1。
- 驗收:log 中能看到「key[N/M] 失敗」等訊息,換 key 後繼續執行;傳入單一 Key 時行為與原本相同;全部 Key 失敗時 log「所有 API Key 均失敗,終止流程」且 workflow 狀態為失敗。
- 已驗收:
review.yaml已以逗號串接多把 Gemini key,且app/llm.js與單元測試已覆蓋輪替與失敗退出行為。
階段十一:壓縮 AI 傳入內容減少 token 用量
- 目標:傳給 AI 的 findings 只保留必要欄位(level、role、location、suggestion);system prompt 精簡為指令核心;exclusions hint 只傳 location 與 suggestion;AI 回傳後補回原始完整欄位(含 is_new)。
- 驗收:AI 呼叫的 payload 不含 is_new 等內部欄位,去重與誤報過濾後的 findings 仍保有完整欄位供後續流程使用。
- 已驗收:
app/findings.js已只傳必要欄位給 AI,並在回傳後補回原始 findings 的完整欄位。