
審查發現的競爭條件,依原因退回的停滯作業
一個案例的規範與提交指明 Claude 負責實作、Codex 負責審查;另一個案例讓停滯作業變得可診斷。
May 19, 2026
配額耗盡即停止的變更,連同審查發現的競爭條件,在同一個 PR 中修正
人人
行動配額耗盡即停止支出 · 不自動備援
- 交接實作限制→ 實作檢查點 · 中止 · 手動恢復 (Claude)
程式開發代理Claude
行動實作檢查點 · 中止 · 手動恢復
- 交接同一 PR 審查→ 審查意見:競爭條件 · 重複的狀態轉換 (Codex)
審查 · 驗證Codex
觀測 · 審查意見審查意見:競爭條件 · 重複的狀態轉換
- 退回競爭條件 · 冪等性→ 在同一個 PR 中:列鎖定 · 唯一分數鍵 · 原子性轉換 (同一個 PR)
產出物同一個 PR
產出物在同一個 PR 中:列鎖定 · 唯一分數鍵 · 原子性轉換
- 交接→ 本機 fixture · DB 整合檢查記錄 (同一個 PR)
產出物同一個 PR
產出物本機 fixture · DB 整合檢查記錄
- 不是有記錄的執行已檢查的範圍→ 未收集新的 CI 或正式環境部署結果 (同一個 PR)
產出物同一個 PR
規範 · 未確認未收集新的 CI 或正式環境部署結果
- 背景
- 人設定的條件是配額用盡時停止支出,且不自動備援。Claude 實作了檢查點、中止與手動恢復,透過專案 MCP 執行的 Codex 審查則發現狀態轉換中的競爭條件與重複。
- 結果
- 進入與恢復的轉換在鎖定內執行,評判分數帶有防止重複的唯一鍵,並設定了交易邊界。這並不表示所有競爭條件都已消除。
- 限制
- 提交中記載 140 項檢查,之後的整合 CHANGELOG 記載 160 項,因此不合併為單一的執行次數。依規範,Codex 審查是可選的本機步驟,因此並不表示過去每個 PR 都經過它。
依據與尚存的限制
- 規範記錄了順序:Claude 實作,Codex 透過專案 MCP 在本機審查,審查附加到 PR,意見分歧時與 Claude 的審查代理一起調查。CI 中的自動 Codex 審查當時已延後。
- 開發檢查使用 fixture 與 mock,實際模型呼叫需另訂範圍。審查意見併入同一個 PR,並以 squash 方式合併 feature → main。
May 26, 2026
讓停滯作業可診斷,並依原因退回
開發對象翻譯 worker · 佇列
觀測 · 審查意見停留在 draft 的作業 · 嘗試用盡
- 交接觀測值→ 比對 failedReason · 結束代碼 · draft 狀態 (開發者)
人開發者
行動比對 failedReason · 結束代碼 · draft 狀態
- 交接→ 原因:繼承的 NODE_OPTIONS 在子行程中衝突 (開發者)
人開發者
觀測 · 審查意見原因:繼承的 NODE_OPTIONS 在子行程中衝突
- 退回繼承選項衝突→ 移除 NODE_OPTIONS · 每個行程的並行上限 (程式碼變更)
工作階段程式碼變更
行動移除 NODE_OPTIONS · 每個行程的並行上限
- 交接→ 佇列狀態:waiting · active · failed · stale (程式碼變更)
工作階段程式碼變更
行動佇列狀態:waiting · active · failed · stale
- 交接→ 停滯清查:不在佇列中 vs 嘗試已用盡,依是否有結果分支 (程式碼變更)
工作階段程式碼變更
行動停滯清查:不在佇列中 vs 嘗試已用盡,依是否有結果分支
- 交接一個週期→ 開發環境清查:200 個候選 → 移動 106 · 重新排入 2 · 錯誤 0 (產出物)
產出物產出物
產出物開發環境清查:200 個候選 → 移動 106 · 重新排入 2 · 錯誤 0
- 不是有記錄的執行解讀的界限→ 這 106 個不是成功的翻譯 (產出物)
產出物產出物
規範 · 未確認這 106 個不是成功的翻譯
- 背景
- 比對 BullMQ 的 failedReason、子行程結束代碼與停留在 draft 的作業後,發現繼承的 NODE_OPTIONS 在子行程中衝突。之後,相同情況可作為佇列狀態看見。
- 結果
- 停滯作業分為不在佇列中的,以及已用盡嘗試的;後者依是否有結果,連同原因移到 needs_review 或 needs_credential。人工審核維持不變。
- 限制
- 並行上限以行程為單位。審查的資料中沒有原始執行日誌;由於未記錄所請求的模型與 effort,延遲數字予以省略。僅有建置與發布程式碼,不是公開部署的依據。
依據與尚存的限制
- CHANGELOG 記錄了平行轉接器分支的提議,但並未轉為實際平行執行的記錄。
- 200 個中的其餘部分,在此記錄中未細分。