簡化變更
由變更作者進行的編輯審查:在你的分支上,於開啟 PR 之前執行一次,並在推送大型修復之前再執行一次。此步驟先於審查,且絕不取代審查。繼承任務的範疇與修復權限;僅有審查要求的請求會獲得「發現事項」而非實際編輯。所選的維護者工作流程掌管發佈、審查與合併。
差異比較是一個提案。 通過測試僅證明它能運作,而非證明其架構或每一個新增的測試都是必要的。
規則: 根目錄 AGENTS.md 中的「設計優先順序」、「單一擁有者,完整切換」、「執行時期與程式碼安全措施」以及「產品與驗證」章節,加上最近的範圍化 AGENTS.md。步驟 2 與 3 會對每個變更的檔案套用所有規則。
1. 重新推導最小且完整的修復
閱讀使用者的結果與最新範疇、針對目標合併基礎的完整差異比較,以及保留的證明。重複使用已收集的會話上下文。然後問:
從基礎開始,使用已存在的擁有者,最小且完整的修復是什麼?我是否仍會引入這個架構?
首先檢查最大的新增模組、狀態、適配器與測試框架。閱讀它們的直接呼叫者與相關歷史:看似多餘的行為可能是在保護某個已上線的設定或先前的迴歸問題。範疇是變更的系統以及它所取代的路徑。
追蹤每個變更區塊到所述結果。一個服務於其他目標的區塊應離開此變更:將其刪除或移至其自己的 PR。
計算非機械性的變更行數。超過約 800 行,或對於複雜邏輯超過約 500 行,則指出可以優先合併的最小連貫階段,並將變更縮減至該階段。
當你可以用一句話分別陳述缺陷、所需的不變量以及最小且完整的修復,且每個剩餘的區塊都服務於該修復時,即完成此步驟。
2. 移除不必要的架構
在差異比較中套用每一項支援的簡化:
- 單一決策擁有者。 將重複的呼叫端政策移至擁有該決策的操作中。遷移受影響的呼叫者,並移除舊的實作、匯出與修補分支。不同的傳輸可以共享同一個決策,同時保留各自的傳遞合約。
- 優先使用現有狀態。 挑戰新的結構定義、管理器、快取與組合式表示。當現有擁有者的生命週期、權限、原子性與清理機制符合需求時,重複使用它。僅在遷移確實不必要時才移除它;保留能在更新後維持現有設定與狀態正常運作的遷移。新的狀態應放在一個有意義的欄位中。
- 刪除冗餘路徑。 移除並行的渲染器、重複的解析器、僅為取得結果而使用的虛擬生命週期操作、呼叫端已可取得的衍生狀態,以及僅轉發或重新命名的包裝器。偏好一個更簡單的表示,而非圍繞舊表示使用降級模式。
- 最後打磨。 在每個變更區塊中,僅保留周圍檔案的維護者會寫入的內容:
- 解釋擁有權、生命週期、排序或約束的註解;
- 與周圍模組匹配並保護真實狀態的檢查與
try/catch區塊; - 真實型別,而非洗白轉型(
as any、as unknown as T、先拓寬再斷言); - 新增領域意義、消除重複或簡化控制流程的變數與輔助函式;
- 有命名上線合約與移除計畫作為依據的墊片、別名、重試與降級方案;
- 與周圍檔案匹配的命名、控制流程、匯入與格式化。
保留請求的修復與支援的行為,而非提案的偶然設計。保留真實的領域差異與正當的公開相容性。當歷史記錄(git log -p -S <符號>)無法明確說明某個路徑的用途時,請保留它並回報。將新的產品決策、破壞性合約、不相關的清理與破壞性分支替換回報為給擁有者的發現事項。
3. 保留針對失敗的測試
對於每個新增或變更的測試群組及其設定輔助函式,指出它所捕捉的獨特可觀察失敗。
保留針對實際缺陷與不同邊界情況的迴歸測試:排序、取消、權限過期、重新啟動、拒絕、真實錯誤以及受影響消費者的差異。保留獨立保護真實邊界的靜態合約防護。移除重複的相同路徑案例、模擬回聲、偶然的欄位複製或措辭斷言、對靜態定義值的斷言、僅證明已移除邏輯不存在的測試、過時實作的測試,以及框架或僅用於測試的生產環境鉤子。將有用的案例合併到現有擁有者的測試套件中。
移除測試絕不能削弱剩餘的斷言、真實邊界的覆蓋率或基準線。
當每個剩餘的測試群組都有一個命名的失敗案例時,即完成此步驟。
4. 證明較小的變更並移交
批次編輯,然後針對已變化合約與受影響消費者重新執行再現與聚焦檢查。重複使用其輸入未改變的證明。保留的重新啟動、升級或傳輸主張需要適用的證明。現有工作流程會選擇更廣泛的檢查。
當完整的差異比較已被檢查、每個規則對每個變更的檔案都有裁決、支援的簡化已套用、被取代的路徑已無法到達、受影響的行為仍有證明時,即完成此步驟。當現有形狀有正當理由時,「無變更」是有效的結果。目標是淨減少程式碼,而非達到刪除配額。
在 PR 主體或現有任務證據中回報:已消失的責任或機制、仍受保護的行為,以及與合併基礎相比的生產/測試差異。將針對先前版本的縮減與整體變更的差異分開標記。指出任何必要的剩餘增長或未解決的決策。
然後開啟或更新 PR。在後續修復之後,在推送它們之前,僅簡化新變更以及它們所觸及的擁有者。