Codex 與 Claude Code 的比較,重點不在於找出一個放諸四海皆準的贏家,而在於選擇一種你能每天信賴的工作模式。. 這兩款產品都能檢視儲存庫、編輯多個檔案、執行指令、執行測試,以及解釋修補程式。兩者間的實質差異在於:您如何委派工作、多頻繁地引導代理程式、能檢視多少相關證據,以及每項工具如何融入您現有的開發環境。.
在我們進行的四項任務受控儲存庫測試中,Codex 獲得 98/100 分,而 Claude Code 則獲得 99/100 分。 兩者均完成了核心工作。Claude Code 展現出更廣泛的審查範圍與邊界案例覆蓋率,而 Codex 則常以較小的範圍達到所需結果,並在我們的測試環境中產生了更強有力的執行層級證據。在一個小型 Python 測試案例中僅有一分的差距,並不足以作為宣布整體勝者的依據。.
開發者若不希望其工作流程的其他部分受限於單一編碼代理,可將 GlobalGPT 作為獨立的多模型與多模態層加入。 GlobalGPT 將 100 多個頂尖模型(例如 GPT 5.6、Claude Opus 5 及 GPT Image 2)整合於單一儀表板中。此外,該 GlobalGPT 命令列介面, MCP 及 Skill 路線可透過 Codex 或 Claude Code 進行第二意見徵詢、規劃、文件編寫或其他受支援的模型,而原生編碼主機則持續掌控儲存庫的編輯與測試。.

此項比較綜合了官方計畫資訊、實作儲存庫、完整且可擴充的輸出結果,以及標示清晰的社群使用經驗。其目標是協助獨立開發者選擇主要程式設計工具,同時避免因訂閱權限、額外積分及 API 計費等問題而感到困惑。.
Codex 與 Claude 編碼一覽
| 決策因素 | 《古籍》 | 克勞德·科德 |
|---|---|---|
| 核心儲存庫相關工作 | 可在受支援的 Codex 介面上讀取、編輯、執行指令,並驗證變更 | 用於閱讀、編輯、執行命令及驗證變更的對話式終端代理程式 |
| 在我們的測試中觀察到的風格 | 在部分實作與錯誤修復方面更為精簡 | 在儲存庫分析、測試及審查範圍方面更為全面 |
| 對儲存庫的理解 | 關於「凍結任務」的功能性關聯 | |
| 程式碼檢閱 | 發現並修復了兩個有效的較高嚴重性缺陷 | 回報了更多可重現的問題,並將 19/20 修正為 18/20 |
| 觀測速度 | 結果參差不齊;各賽場的條件不夠相當,因此無法選出一位絕對的冠軍 | |
| 消費級入門款 | 每月 $20,透過相關的 ChatGPT 計畫 | Claude Pro:美國地區每月 $20 |
| 使用量較高的階層 | $100 和 $200 等級 | 在 $100 設定下最高 5 倍,在 $200 設定下最高 20 倍 |
此表格描述的是購買決策,而非模型排行榜。不同的模型設定、儲存庫、權限配置或任務規格都可能影響結果。若您已使用某項產品,最佳的比較方式是選用您自身程式碼庫中一個範圍明確的任務,且該任務需使用相同的成功指令,並避免進行品質重擲。.
受控測試設定檔
第一個有效結果,採用相同的固定評分標準。各條形圖的數值均已根據各任務的最高分進行歸一化處理。.
這張圖表顯示了這1分差距的來源;它並未將一場小比賽轉化為普遍性的排名。.
「Codex」與「Claude Code」究竟是什麼
Codex 和 Claude Code 是代理產品,並非單純的型號名稱。其底層的 用於編碼的人工智慧模型 這固然重要,但周邊的框架也決定了代理程式能看到哪些檔案、可執行哪些指令、審批機制如何運作、上下文如何保留,以及任務完成後哪些證據會被保留下來。若僅比較模型的聲譽,便忽略了開發者所購買的體驗中很大一部分。.
Codex 涵蓋了命令列、整合開發環境(IDE)、桌面及雲端導向的工作流程。這種廣泛的適用範圍使其既適合直接的本地協作,也適合範圍更有限的任務委派。Claude Code 以對話式終端工作流程為核心,具備支援的整合功能與豐富的自訂選項;這 Claude 編碼使用指南 對該工作流程提供了更廣泛的介紹。對某些開發人員而言,看著代理程式在終端機中運作會讓人感到安心;對其他人來說,重要的產出則是最終的差異報告、測試結果和稽核軌跡,而非持續的對話。.
這種區別也解釋了為何兩項使用名義上強大模型的測試,其表現會有所不同。主機決定指令的呈現方式、工具的呼叫方式,以及何時需要人類批准某項動作。若在社群比較中忽略了測試框架,便可能將產品層級的行為誤認為模型層級的真相。.
- 該模型 提供推理與生成能力。.
- 代理程式連接線組 管理檔案、指令、情境、核准及復原。.
- 使用者的任務合約 決定範圍、成功檢定,以及代理人應在何時停止。.

工作流程與管控:授權還是持續引導?
關於 Codex 與 Claude Code 的最實用問題,通常並非「哪個能寫出更好的程式碼?」,而是「我希望如何運用它?」 對於明確且範圍界定的任務,可以透過設定精確的目標、允許的範圍以及驗證指令來委派。至於模糊不清的重構任務,則需要透過討論、階段性檢視,並在代理程式進行過多變更之前,及時引導其調整方向,才能獲得最佳成效。.
當需求不斷演變,或架構判斷仍在協商之中時,持續式引導具有其價值。但當代理程式反覆要求做出本可透過儲存庫指示解決的決策時,這便會成為一種成本。當任務合約穩定時,自主執行具有其價值。但當代理程式做出未經核實的假設,或在缺乏明確回滾路徑的情況下擴展範圍時,這便會帶來風險。.
一份日期為 2026 年 4 月 13 日的 Reddit 詳細報告描述了在一個約有 80,000 行 Python 和 TypeScript 程式碼、包含約 2,800 個測試用例的專案中,使用 Claude Code 約 100 小時,以及使用 Codex 約 20 小時的經驗。 作者將 Claude 描述為速度較快且互動性更高,但需要更多人工干預;而 Codex 則速度較慢且運作更為穩健。這份報告之所以格外實用,在於它包含了專案背景與使用經驗的脈絡,但它終究僅代表一位開發者的工作流程。.

根據我們自身的測試結果,並未得出明確的勝者。Claude 在前兩項任務中完成得較快,而 Codex 則在後兩項任務中完成得較快。此外,當 Claude 的 CLI 驗證路徑不可用時,它啟用了子代理備用機制,因此兩者的執行路徑並不完全等同於實驗室環境。 合理的結論是:執行速度取決於任務、選用的模型、工作量設定、情境以及主機——而非某款產品總是更快。.
對儲存庫的理解與情境管理
對儲存庫的理解不僅僅是為資料夾命名。一個實用的分析工具必須能追蹤資料在檔案間的流動方式、識別限制變更的合約、定位測試、區分症狀與其可能的來源,並說明編輯錯誤層級所帶來的風險。詳盡的映射圖能揭露隱藏的不一致性;簡明的映射圖則能讓開發人員更快做出安全的實作決策。.
在我們的唯讀 T1 任務中,兩款工具均獲得 20/20 分,且其答案皆以儲存庫為依據。Claude Code 的分析更為詳盡,並揭示了更多合約不一致之處;Codex 則更為簡潔,但仍能識別出相關檔案、風險及實施計畫。這兩種風格並無絕對優劣之分。 在處理不熟悉的遷移與稽核時,詳盡性有助益;當開發人員已熟悉架構並希望獲得重點明確的變更計畫時,簡潔性則更為實用。.
T1 · 受控儲存庫測試
在修改不熟悉的儲存庫之前,請先了解其內容
繪製架構圖、追蹤資料流、識別優先功能所面臨的風險,且不對檔案進行任何變更。.
架構:模型、儲存庫、服務,以及一個未連線的時間輔助程式。 主要風險:未明確定義的優先順序語義、相容性、順序、驗證,以及範圍不符。.
評論者觀點: 簡潔、以檔案為依據,且足以作為凍結決策的依據。.
三層架構加上一個孤立模組。無循環;依賴注入量極少。 此外,還揭露了識別碼分配、非對稱錯誤合約,以及測試覆蓋率不足的問題。.
評論者觀點: 更為詳盡,同時仍符合相同的唯讀合約。.
檢視完整的 Codex 輸出內容
完整的、經過清理的、首次有效的輸出
## 架構
這是一個僅使用標準函式庫的小型 Python 套件,包含四個功能層:
- **資料模型:** [`Job`]() 是一個不可變的資料類別,包含 `identifier`、`name` 和 `owner`。`Job.to_dict()` 會透過 `dataclasses.asdict()` 將其序列化。
- **儲存庫:** [`JobRepository`]() 將工作儲存在以識別碼為鍵的記憶體內字典中。此處不使用資料庫,亦無持久化儲存機制。
- **服務:** [`SchedulerService`]() 負責識別碼的分配、輸入正規化、建立、列出及刪除。
- **時間輔助函式:** [`next_daily_run()`]() 用於計算下一次執行時間,但沒有任何內容將其導入或與 `Job`、`SchedulerService` 或 `JobRepository` 建立連結。
- **公開 API:** [`scheduler.__init__`]() 僅導出 `SchedulerService`。
儘管儲存庫名稱如此,目前工作並未包含排程資訊,且不存在執行佇列。 因此,優先級雖可影響儲存的元資料及清單排序,但在未大幅擴展系統的情況下,無法影響實際的任務執行。
## 建立與清單顯示的資料流
透過 `SchedulerService.create_job(name, owner)` 建立:
1. [`create_job()`]() 會拒絕僅由空白字元組成的名稱。
2. 它會修剪 `name` 和 `owner`,然後使用服務的 `_next_identifier` 建立一個不可變的 `Job` 物件。
3. [`JobRepository.save()`]() 將該物件寫入 `_jobs[job.identifier]`。
4. 該服務將 `_next_identifier` 遞增,並返回相同的 `Job` 物件。
透過 `SchedulerService.list_jobs()` 列出清單:
1. [`list_jobs()`]() 直接委派給 `repository.all()`。
2. [`JobRepository.all()`]() 會按字典鍵的數值進行排序。
3. 因此,工作會依照識別碼/建立時間的升序返回,而非依照排程或優先級順序。
## 可能受工作優先級影響的檔案
必修:
- [`scheduler/models.py`]():新增 priority 欄位及其預設值。 由於 `to_dict()` 使用 `asdict()`,因此會自動包含該欄位。
- [`scheduler/service.py`]():接受、驗證並將優先級傳遞給 `Job`。
- [`tests/test_scheduler.py`]():測試預設值、明示值、無效值、序列化及排序行為。
條件性:
- [`scheduler/repository.py`]():僅當優先級旨在控制清單排序時,才修改 `all()`。應使用 `identifier` 等確定性次要鍵來處理並列情況。
- [`scheduler/__init__.py`]():僅當優先級成為公開枚舉或值物件時才進行更新。
- [`README.md`]():應記錄可接受的值、預設值以及排序語義。
可能不受影響:
- `scheduler/time_rules.py`,因為其唯一的符號僅作用於傳入的日期時間參數,且與工作或清單排序無關。
## 主要風險
- **未定義的語義:** 程式碼未提供任何先例說明較大或較小的數值是否代表較高優先級、哪些數值是有效的,或是優先級是否會影響清單排序。
- **相容性:** 若在 `Job` 或 `create_job()` 中新增必填參數,將導致現有呼叫方無法運作,例如當前測試中的 `create_job("Daily report", "Alex")`。設定預設值可維持該呼叫的正常運作。
- **位置參數建構器的相容性問題:** 目前 `Job` 在 `SchedulerService.create_job()` 中是以位置參數方式建構的。欄位位置及未來的位置參數呼叫可能會在無警示的情況下賦予錯誤的值;採用關鍵字建構會更安全。
- **順序變更:** 替換 `JobRepository.all()` 中的識別碼順序會改變既定行為。優先級相同時需要一個穩定的決策機制。
- **驗證模糊性:** 若未限制 Python 值的類型,可能會允許字串、布林值或任意整數,這會導致難以進行一致的比較。
- **執行範圍不符:** 目前不存在調度器或執行佇列。聲稱優先級會影響哪個工作先執行,此行為目前沒有任何符號能支持。
- **記憶體內限制:** 優先級與其他所有工作項目欄位一樣,會在程序結束時消失,因為 `_jobs` 僅是一個實例字典。
## 實作與驗證計畫
1. 首先定義合約:表示形式、允許的值、預設值、優先級方向、平局決策,以及是否會改變清單排序順序。
2. 將 `priority` 新增至 `Job`,最好設定為向後相容的預設值。
3. 擴充 `SchedulerService.create_job()`,加入預設的優先級參數,進行驗證,並使用關鍵字參數建構 `Job`。
4. 若清單排序會考量優先級,則將 `JobRepository.all()` 修改為先按優先級排序,再按識別碼排序;否則維持儲存庫的原始排序不變。
5. 新增以下測試:
- 現有的雙參數建立方式。
- 明示優先級的保留。
- 預設優先級。
- 類型不正確及數值超出範圍的情況。
- `Job.to_dict()` 的輸出結果。
- 多優先級清單的排序順序。
- 優先級相同時的穩定排序。
- 現有空白名稱的行為。
6. 更新 README,明確列出公開介面規範。
7. 執行完整的離線測試套件:`python3 -m unittest discover -s tests -v`。
## 驗證已完成
- 基準測試套件:**2 項測試通過**。
- 確認全儲存庫符號搜尋結果顯示 `next_daily_run()` 已斷開連結,且不存在任何現有優先級符號。
- 變更檔案:**無**。
- 功能實作:**未執行**,符合要求。
> **結論 + 決策**
>
> 若優先級僅為元資料或清單排序,則變更範圍較小:主要涉及 `models.py`、`service.py`、`repository.py` 及測試程式。在實作前,需決定優先級是僅用於描述工作,還是會改變 `list_jobs()` 的排序,並需確定數值範圍、預設值、方向及平手決策規則。.檢視完整的 Claude 程式碼輸出
完整的交接記錄,包含第一項有效的輸出內容的逐字記錄
# T1 執行紀錄 — 對陌生儲存庫的理解
## 執行參數
| 欄位 | 值 |
| --- | --- |
| 任務 | `T1` |
| 凍結提示詞 | `01-prompts/T1.md` |
| 凍結提示詞 SHA-256 | `a571ff15c2502ec29b172ae2e77dd9ab0caca2869b91f9468d47571434d16c17` |
| 執行單元 | 隔離的 Claude 子代理,`通用型`,全新上下文 |
| 隔離方法 | **子代理備用方案**(已記錄的降級 — 參見 `results/isolation-decision.md`) |
| 指派的乾淨副本 | `runtime/workspaces/T1` |
| Claude 程式碼版本 | `2.1.220` |
| 模型設定 | `claude-opus-5` |
| start_utc | `2026-07-28T10:27:31Z` |
| end_utc | `2026-07-28T10:28:32Z` |
| 執行時間 | 61 秒(與 T2–T4 同時進行;非純粹的延遲測量) |
| 嘗試次數 | 1 |
| 狀態 | `有效` |
| 人為干預 | 無 |
## Safe 工具摘要
`date`、`find`、`ls`、`wc`、`stat`、`grep`、對 7 個工作區檔案的 `Read` 操作、`python3 -V`、
`python3 -m unittest discover -s tests -v`。所有讀取操作均限於指定工作區內。
無網路連線、無安裝、無寫入操作。
## 離線檢查結果
`python3 -m unittest discover -s tests -v` → 2 項測試,通過 (退出代碼 0)。 由
協調員在工作區外部重新驗證:請參閱 `results/checks/T1-public.txt`。
## 修補程式
無。`results/T1/patch.diff` 為空,且 `diff -ru 02-fixture runtime/workspaces/T1`
未回傳任何差異。此任務僅需檢查而不需修改檔案;此為
經確認而非預設結果。
## 已修正的錯誤
一個可恢復的 shell 錯誤:初始的 `grep` 指令使用了未加引號的 `--include=*.py` 模式,
導致 shell 嘗試進行通配符擴展;重新執行時將模式加引號後即成功。此錯誤對檢查結果無影響。
## 可見輸出(逐字)
### 1. 此儲存庫的內容
一個名為 `local-scheduler-1.0.0`(`fixture-manifest.json`)的自包含 Python 標準函式庫固定套件,採用 MIT 授權,無網路或生產環境依賴項(`README.md`,`"network_required": false`)。 其體積非常小:包含 8 個原始碼/文件檔案加上清單檔案,總計 103 行。內建的解釋器為 **Python 3.9.6**。 此儲存庫中沒有 `pyproject.toml`、`setup.py`、CI 設定、語法檢查器或類型檢查器設定——唯一宣告的工作流程是 `python3 -m unittest discover -s tests -v`(`README.md`)。
### 2. 架構
三層架構外加一個獨立模組,全都位於 `scheduler/` 目錄下:
| 層級 | 檔案 | 符號 | 職責 |
|---|---|---|---|
| 套件門面 | `scheduler/__init__.py` | `__all__ = ["SchedulerService"]` | 僅重新導出 `SchedulerService`;`Job`、`JobRepository` 及 `time_rules` 不屬於公開介面 |
| 領域模型 | `scheduler/models.py` | `Job` (`@dataclass(frozen=True)`) | 不可變值物件,包含欄位 `identifier: int`、`name: str`、`owner: str`,並實作 `to_dict()` 為 `asdict(self)` |
| 持久化 | `scheduler/repository.py` | `JobRepository` | 以 `identifier` 為鍵的內存 `dict`;提供 `save`、`get`、`all`、`delete` 方法 |
| 應用程式服務 | `scheduler/service.py` | `SchedulerService` | 驗證、識別碼分配、協調:`create_job`、`list_jobs`、`delete_job` |
| 孤立模組 | `scheduler/time_rules.py` | `next_daily_run` | 週期運算 — **未被任何模組導入** |
依賴關係方向清晰且為單向:`service.py` 從 `.models` 和 `.repository` 導入;`repository.py` 從 `.models` 導入;`models.py` 僅導入 `dataclasses`。無循環。 雖然存在依賴注入,但程度極輕微 — `SchedulerService.__init__(self, repository=None)` 會執行 `self.repository = repository or JobRepository()`,因此可在測試中替換為模擬的儲存庫。
請注意,`scheduler/time_rules.py` 目前已是死碼。 我已對整個程式碼樹進行 `time_rules` 和 `next_daily_run` 的 grep 搜尋;唯一的搜尋結果僅有其自身的定義,以及在 `fixture-manifest.json` 的 `expected_files` 中的列舉。該檔案雖已包含在發行版本中,但未被實作。
### 3. 資料流
**建立工作** — `SchedulerService.create_job(name, owner)`:
1. 檢查條件:`if not name.strip(): raise ValueError('name is required")`。 這是系統中*唯一的*驗證 — `owner` 從未被檢查,因此接受留空的擁有者。
2. 建構:`Job(self._next_identifier, name.strip(), owner.strip())` — 位置參數建構,且兩個字串皆透過去除空格進行標準化。
3. 持久化:`self.repository.save(job)`,此操作會執行 `self._jobs[job.identifier] = job` 並返回該工作。
4. 遞增計數器:`self._next_identifier += 1` —— 此操作發生在 `save` 之後,因此若發生例外狀況,計數器將保持未消耗狀態。
5. 返回 `Job` 實例(該服務返回其自身的本地 `job`,而非儲存庫的返回值)。
識別碼的分配由 **服務** 負責,而非儲存庫(在 `SchedulerService.__init__` 中執行 `self._next_identifier = 1`)。這是個重要的接合點:若注入一個已包含工作的儲存庫,將會在無警示的情況下覆寫這些工作,因為新建立的服務會將編號重新從 1 開始。
**列出工作項目** — `SchedulerService.list_jobs()` 直接轉發至 `JobRepository.all()`,該方法會傳回 `[self._jobs[key] for key in sorted(self._jobs)]`。 因此排序方式為 **依整數識別碼升序**,目前這與插入順序一致。每次呼叫都會建立新的清單,但 `Job` 物件是共用參照 — 之所以安全,僅因 `Job` 已被凍結。
**刪除** — `SchedulerService.delete_job(identifier)` 會委派給 `JobRepository.delete`,該方法實質上是 `self._jobs.pop(identifier)` 且無預設值,因此若識別碼不存在,會拋出 `KeyError`。 這與 `JobRepository.get` 不一致,後者在相同條件下會傳回 `None`。
**這些路徑的測試覆蓋率** — `tests/test_scheduler.py` 僅包含兩個測試案例:`test_create_and_list_jobs`(驗證 `job.identifier == 1` 以及 `[job] == service.list_jobs()`)與 `test_blank_name_is_rejected`。 這兩項測試在當前樹狀結構中均通過。
### 4. 可能受新增工作優先級影響的檔案
按確定性由高至低排序:
1. **`scheduler/models.py`** — 確定。 `Job` 需要新增 `priority` 欄位。由於該資料類別設定了 `frozen=True`,且欄位為位置型,因此新欄位必須設定預設值(例如 `priority: int = 0`),或者必須置於現有三個欄位之後;否則所有現有的位置型建構都會失效。 `to_dict()` 無需修改 — `asdict(self)` 會自動擷取該欄位,這屬於無聲的序列化合約變更,而非程式碼變更。
2. **`scheduler/service.py`** — 確定。 `create_job` 需要一個 `priority` 參數,並必須在第 13 行將其傳入 `Job(...)` 的位置參數建構函式中。若需驗證優先級(範圍、枚舉成員資格),則該驗證條件應置於現有的 `name.strip()` 檢查旁。 若清單必須按優先級排序,且希望儲存庫保持為「被動儲存」的角色,則應在 `list_jobs` 中定義排序策略。
3. **`scheduler/repository.py`** — 可能性較高。`JobRepository.all()` 中的 `sorted(self._jobs)` 是根據字典 *鍵*(即識別碼)進行排序。 若要實現依優先級排序的清單,需將此處修改為根據 `(-job.priority, job.identifier)` 等鍵值對進行排序,或新增獨立的有序存取器。切勿將平手處理留作隱含行為:字典的插入順序並非可依賴的穩定合約。
4. **`tests/test_scheduler.py`** — 確定。 新增了預設優先級、顯式優先級、排序以及無效優先級拒絕等測試案例。請注意,現有的 `assertEqual([job], service.list_jobs())` 比較的是 *同一個* 物件,因此即使新增欄位仍能通過測試;若其比較的是新建立的 `Job` 字面量,則無法通過測試。
5. **`README.md`** — 可能需要,若需在任何地方說明優先級語義(範圍兩端哪一方優先、預設值等)。
6. **`scheduler/__init__.py`** — 僅當需要與 `SchedulerService` 一同導出優先級枚舉或常數時才需修改。
7. **`fixture-manifest.json`** —— 僅當您新增模組檔案時才需修改;其 `expected_files` 陣列是明確的清單,若未更新會導致不一致。
8. **`scheduler/time_rules.py`** — *切勿*修改。優先級與重複性互不相關,且此模組未與其他模組連結。
### 5. 主要風險
- **排序語義屬於隱性行為變更。** `JobRepository.all()` 目前保證按識別碼升序排列,而 `list_jobs` 繼承此行為。任何依賴此保證的使用者,其程式邏輯都將因重新排序而失效。 請明確決定:是讓 `list_jobs()` 的含義發生改變,還是同時新增一個 `list_jobs_by_priority()` 方法?前者是風險較高的選項,而現有的測試 `test_create_and_list_jobs` 過於薄弱,無法偵測到回歸問題(單元素清單)。
- **排序方向確實存在歧義。** 在某些系統中,「優先級 1」慣例上表示 *最高*,而在其他系統中則表示 *最低*。此儲存庫中沒有任何內容——無論是註解、文檔字串還是 README 說明——能明確釐清這一點。 請選定一種慣例,在 `models.py` 中進行文件化,並透過包含至少三種不同優先級的測試來錨定排序方向。
- **排序平局處理不穩定。** 若兩個工作具有相同優先級,結果仍須具有確定性。Python 的 `sorted` 函式是穩定的,但穩定性僅在輸入順序本身已定義時才有意義。請務必將 `identifier` 作為明確的次要鍵納入。
- **Frozen-dataclass 欄位排序。** `Job` 採用 `@dataclass(frozen=True)` 並包含三個位置型別欄位,而 `service.py:13` 會依位置建構該物件。若將 `priority` 插入最後一個位置以外的任何位置,或未設定預設值,將構成破壞性變更,而現有的兩項測試可能無法明確揭露此問題。
- **`to_dict()` 合約擴展。** `asdict(self)` 會反映所有欄位。新增 `priority` 會改變每個序列化載荷,而 `models.py` 中的方法本體並未進行任何可見的修改。任何基於精確字典結構進行斷言的程式碼都會失效。
- **Python 3.9.6 限制。** 不支援 `@dataclass(slots=True)`(3.10+),不支援 `kw_only=True`(3.10+),且若未使用 `from __future__ import annotations`,PEP 604 的 `int | None` 註解將在執行時失敗。 若將優先級建模為枚舉類型,`enum.StrEnum` 需 Python 3.11 以上版本,目前不可用。上述任一情況都將導致此解釋器上的固定裝置無法運作。
- **識別碼分配位於錯誤的層級。** `SchedulerService._next_identifier` 表示服務負責識別碼生成,而儲存庫負責儲存。若優先級相關功能促使實作第二個儲存庫或預載固定裝置,此分離將導致識別碼衝突及工作被覆寫。
- **錯誤合約不對稱。** `JobRepository.get` 在未找到時返回 `None`,而 `JobRepository.delete` 則拋出 `KeyError`。任何與優先級相關的新查詢都應刻意採用其中一種規範,而非無意間繼承這種不一致性。
- **驗證缺口先例。** `create_job` 會驗證 `name` 但不會驗證 `owner`。請勿將此鬆散做法套用至 `priority` —— 未經驗證的優先級會傳播至排序鍵中,並可能在 `sorted` 函式深處(例如將 `int` 與 `None` 進行比較)拋出 `TypeError`,而非在呼叫處拋出。
- **死碼陷阱。** `scheduler/time_rules.py` 看似排程邏輯,因此容易吸引編輯。但該檔案未被任何程式所導入,且其自身的 docstring 也承認了這個錯誤:它會增加 24 小時的 UTC 經過時間,並「在夏令時轉換期間調整本地實時鐘時間」。 修改此處對受測系統毫無可觀察的影響,因此投入的精力純屬浪費,且針對此處編寫的任何測試都無法驗證實際發布版本中的任何內容。
- **薄弱的安全網。** 僅有兩項測試,無持續整合(CI)、無程式碼檢查工具(linter)、無類型檢查。除了您自己編寫的代碼外,沒有任何機制能偵測到回歸問題。 請將現有的測試套件視為覆蓋率不足的基準,而非通過門檻。
### 6. 實作計畫(未執行)
1. **首先以書面形式釐清語義。** 優先級類型(`int` 對比枚舉)、有效範圍、現有/未指定工作的預設值,以及排序方向。將其記錄為 `scheduler/models.py` 中 `Job` 的 docstring —— 這是所有層級目前唯一依賴的位置。
2. **擴充模型。** 在 `scheduler/models.py` 中,將 `priority: int = 0` 作為 `Job` 的 *最後* 一個欄位加入,同時維持與 `service.py:13` 的位置相容性,並保留 `to_dict()` 不作變更。
3. **將其整合至服務中。** 在 `SchedulerService.create_job` 中新增預設值的 `priority` 參數,在現有的 `name.strip()` 驗證條件旁進行驗證(拋出 `ValueError`,與既定的錯誤類型相符),並將其傳遞給 `Job` 建構函式。
4. **明確決定清單的契約。** 首選的低風險方案:保留 `JobRepository.all()` 作為按識別碼排序的原始方法,並新增一個獨立的按優先級排序的存取器。 若 `list_jobs()` 必須變更其含義,則將 `JobRepository.all()` 的列表推導式修改為根據包含 `identifier` 作為平局決策基準的顯式複合鍵進行排序,並在 `README.md` 中註明此變更。
5. **僅當引入了公開的枚舉或常數時,才需保持 `scheduler/__init__.py` 與之同步**。
6. **請勿修改 `scheduler/time_rules.py`**,且除非在同一項變更中更新了 `fixture-manifest.json` 中的 `expected_files`,否則請勿新增檔案。
### 7. 驗證計畫
- **先確認基準狀態。** 在進行任何編輯前,請執行 `python3 -m unittest discover -s tests -v`,並確認有 2 項測試通過。我已經執行過此步驟——測試結果完全通過。
- **回歸測試門檻。** 兩項現有測試在未修改的情況下必須仍能通過。若 `test_create_and_list_jobs` 需要編輯,這表示該變更會導致回歸,而非編輯測試的理由。
- **`tests/test_scheduler.py` 中的新測試案例:**
- 當以舊版雙參數簽名呼叫 `create_job` 時的預設優先級(用以驗證向後相容性)。
- 透過 `create_job` → `list_jobs` 進行的顯式優先級往返測試。
- 包含 **三個或更多** 不同優先級的排序,並驗證完整清單 — 這是決定排序方向的關鍵。
- 平局處理:兩個優先級相等的任務將按識別碼升序返回。
- 無效的優先級會引發 `ValueError`,與名稱留空的情況一致。
- `to_dict()` 會將 `priority` 包含在內,並採用預期值。
- 注入式儲存庫路徑:`SchedulerService(repository=fake)` 仍能正確指派優先級,並驗證 `repository 或 JobRepository()` 的縫合機制。
- **相容性檢查。** 確認所有功能皆可在 Python 3.9.6 環境下運行 — 無 `slots=`、無 `kw_only=`、無裸 PEP 604 聯合類型、無 `StrEnum`。
- **清單檢查。** 重新讀取 `fixture-manifest.json`,並確認磁碟上的檔案集仍與 `expected_files` 相符。
- **確定性。** 執行測試套件兩至三次;涉及字典迭代順序的錯誤可能間歇性出現。
- **程式碼整潔度。** 設定 `PYTHONDONTWRITEBYTECODE=1` 執行測試,以避免 `__pycache__` 目錄在清單中顯示為未追蹤的偏移項目。.
測試環境限制:這是一個小型離線 Python 儲存庫。Claude 在 CLI OAuth 過期後會使用子代理作為備用方案,因此隔離狀態與憑證可見性並不完全一致。.
此結果並不能證明該工具在大型單一儲存庫(monorepo)或為期一週的自主執行環境中的表現。本次測試環境是刻意設計得規模小且受控的。若要進行實際評估,應從唯讀提示開始:在允許編輯之前,請要求每個工具繪製呼叫路徑、列出會被修改的檔案名稱、識別測試用例,並列出尚未釐清的假設。.
實作風格、修補範圍與錯誤修正
多檔案功能操作
相同的通過行為可能源自不同的工程設計選擇。在 T2 測試中,這兩款產品均獲得 30/30 分,並通過了「凍結隱藏驗證器」測試。Claude Code 在多個邊界處設置了驗證機制,並增加了更廣泛的直接模型測試與閾值測試;Codex 則採用了規模較小、以服務為中心的實作方式,同樣符合合約要求。.
對獨立開發者而言,這確實是一項權衡取捨。當物件是透過多種路徑建立時,更廣泛的驗證能保護不變條件;若僅有一個服務作為預期的入口點,較小的修補程式則能減少回歸風險範圍並縮短審查時間。正確的答案取決於儲存庫的所有權規則,而非單純計算變更的程式碼行數或測試數量。.
T2 · 受控儲存庫測試
在多個檔案中實作一項優先級功能
新增「凍結」行為、維持相容性,並通過公開與隱藏的檢查。.
將優先順序新增至不可變模型中,於服務邊界進行驗證,並在儲存庫中維持順序。 所有七項公開測試以及已凍結的隱藏驗證器均通過。.
評論者觀點: 一個規模較小、以服務為中心的實作,完整涵蓋了所有凍結行為。.
已在服務邊界和不可變模型兩處驗證優先級,保留了儲存庫篩選功能,並新增了閾值覆蓋率。 十四項公開測試及隱藏驗證器均通過。.
評論者觀點: 直接模型與閾值模型的涵蓋範圍更廣,但未展現出功能分數上的優勢。.
檢視完整的 Codex 輸出內容
完整的、經過清理的、首次有效的輸出
已實作排程工作優先級功能。 變更的檔案: - [scheduler/models.py](./scheduler/models.py:5) — 新增序列化 `priority` 屬性,預設值為 `0`。 - [scheduler/service.py](./scheduler/service.py:11) — 新增驗證、儲存功能,以及在維持識別碼順序的同時,新增 `list_jobs(min_priority=0)` 篩選機制。 - [tests/test_scheduler.py](./tests/test_scheduler.py:16) — 針對預設值、序列化、儲存、邊界、無效值及篩選功能新增了程式碼覆蓋率測試。 測試執行結果: ```text python3 -m unittest discover -s tests -v 執行了 7 項測試 — 成功 ``` **結論:** 凍結任務已完成並通過驗證。 **需決策事項:** 無。.
檢視完整的 Claude 程式碼輸出
完整的交接記錄,包含第一項有效的輸出內容的逐字記錄
# T2 執行記錄 — 多檔案優先級功能 ## 執行參數 | 欄位 | 值 | | --- | --- | | 任務 | `T2` | | 凍結提示 | `01-prompts/T2.md` | | 凍結提示詞 SHA-256 | `8476a56034c4e719b97ee4081b32b4c73efd45feafe1bda9d477c83cb8fdb698` | | 執行單元 | 隔離的 Claude 子代理,`通用型`,全新上下文 | | 隔離方法 | **子代理備用方案**(已記錄的降級 — 參見 `results/isolation-decision.md`) | | 指派的乾淨副本 | `runtime/workspaces/T2` | | Claude 程式碼版本 | `2.1.220` | | 模型設定 | `claude-opus-5` | | start_utc | `2026-07-28T10:27:52Z` | | end_utc | `2026-07-28T10:29:33Z` | | 持續時間 | 101 秒(與 T1、T3、T4 同時進行;非純粹的延遲測量) | | 嘗試次數 | 1 | | 狀態 | `有效` | | 人為干預 | 無 | ## 安全工具摘要 `date`、僅限於指定工作區內的 `讀取`/`編輯`/`寫入`、`grep`、 `python3 -m unittest discover`、`python3 -m compileall`、內嵌 `python3 -c` 煙霧測試。 無網路連線、無安裝程式,僅使用標準函式庫。 ## 變更的檔案 `scheduler/models.py`、`scheduler/repository.py`、`scheduler/service.py`、 `tests/test_scheduler.py`。 沒有新增或移除檔案,因此 `fixture-manifest.json` 仍保持 準確。完整修補檔:`results/T2/patch.diff`。 ## 離線檢查結果 由任務執行器回報: | 檢查項目 | 結果 | | --- | --- | | `python3 -m unittest discover -s tests -v`(基準,變更前) | 2 通過,0 失敗 | | `python3 -m compileall -q scheduler tests` | 無錯誤 | | 內嵌煙霧測試(舊式 3 參數結構、關鍵字/位置參數閾值、`to_dict`) | 通過 | | `python3 -m unittest discover -s tests -v`(最終) | **14 通過,0 失敗** | 由協調員在工作區外部獨立重新驗證: | 檢查項目 | 退出狀態 | 結果 | | --- | --- | --- | | 公開測試套件(`results/checks/T2-public.txt`) | 0 | 14 項測試,正常 | | 隱藏驗證器 `03-checks/test_t2_hidden.py` (`results/checks/T2-hidden.txt`) | 0 | 2 項測試,通過 | 隱藏驗證器在使用原始固定裝置副本時失敗(退出代碼 1),這證實了通過結果具有 實質意義。請參閱 `results/checks/validator-controls.md`。 ## 金標準地圖行為覆蓋率 `03-checks/gold-map.json` 中所有五項必備行為均已滿足: | 必備行為 | 證據 | | --- | --- | | 優先級預設值為 0 | `Job.priority: int = MIN_PRIORITY`; `create_job(..., priority=MIN_PRIORITY)`;`test_priority_defaults_to_zero` | | 整數範圍 0 至 9 | `validate_priority` 會拒絕非整數及超出範圍的值; `test_out_of_range_priority_is_rejected`、`test_non_integer_priority_is_rejected` | | 序列化後的優先級 | 透過 `asdict` 呼叫 `to_dict()`; `test_priority_appears_in_serialized_output` 驗證序列化輸出中是否包含精確的字典 | | 最低優先級篩選 | `list_jobs(min_priority=0)` → `JobRepository.all(min_priority)`; `test_filter_is_inclusive_of_the_threshold` | | 識別碼排序 | 篩選器應用於現有的 `sorted(self._jobs)` 理解式中; `test_filter_preserves_ascending_identifier_order` | ## 已清理的錯誤 無。測試執行產生的 `__pycache__` 殘留檔案已由任務執行器移除;協調器 掃描確認工作區已清理乾淨。 ## 可見輸出(逐字) 在本地排程器固定裝置的模型、儲存庫及服務層級中,為已排程的工作新增了整數 `priority` 欄位,並包含過濾後的清單。 **`scheduler/models.py`** — 新增模組常數 `MIN_PRIORITY = 0` / `MAX_PRIORITY = 9`,以及可重複使用的 `validate_priority(priority)` 函式,該函式會針對非整數值,以及超出 0 至 9(含)範圍的值拋出 `ValueError`。 儘管 `bool` 是 `int` 的子類別,但仍會被明確拒絕,因此 `True` 無法以優先級 1 的形式混入。 凍結的 `Job` 資料類別新增了帶有預設值的尾隨欄位 `priority: int = MIN_PRIORITY`,以維持現有 3 參數建構方式的運作;同時新增了會呼叫驗證器的 `__post_init__` 方法,確保無論透過何種路徑都無法建立無效的優先級。 `to_dict()` 維持為 `asdict(self)`,因此優先級會自動以欄位順序出現在序列化輸出中。 **`scheduler/repository.py`** — `JobRepository.all()` 接受一個可選的 `min_priority` 參數,並在現有的 `sorted(self._jobs)` 理解式中進行篩選,因此可透過原本就已提供此功能的單一程式路徑來保證識別碼的升序排列,而非在篩選後重新建立。 預設參數保留了對現有呼叫者的原有無參數行為。儲存機制本身無需變更:儲存庫儲存完整的 `Job` 實例,因此優先級得以保留,並在 `save`/`get`/`all` 之間來回傳遞。 **`scheduler/service.py`** — `create_job` 接受一個可選的尾隨 `priority` 參數(預設值為 0),並在建立 `Job` 之前進行驗證,因此錯誤會在服務邊界觸發,其 `ValueError` 合約與現有的空名稱檢查相同。 `list_jobs(min_priority=0)` 會將處理權委派給儲存庫。排序與篩選功能集中於單一位置,而非重複實現。 **關於 `min_priority` 驗證的設計說明:** 雖然其類型檢查為整數,但刻意*未*將範圍限制在 0–9 之間。 0–9 規則會限制工作項目可儲存的值;閾值屬於查詢參數,若拒絕例如 `min_priority=10`,將會將一個合法的「無匹配結果」查詢轉為錯誤。 當沒有任何工作具有優先級 9 時,`list_jobs(min_priority=9)` 會返回 `[]`,此情況已由測試涵蓋。 已閱讀 `scheduler/time_rules.py` 但未進行任何修改——其文件中記載的夏令時轉換機制屬於既有的預設行為,超出本次任務範圍,且變更此機制將構成無關的行為變更。 由於未新增或移除任何檔案,因此 `fixture-manifest.json` 仍保持準確(已透過程式驗證)。 ### 新增測試覆蓋率 預設值為 0;透過 `JobRepository` 進行儲存往返;`to_dict()` 輸出中的優先級;接受邊界值 0 和 9;拒收超出範圍的 −1/10/100; 非整數 `"3"`/`3.5`/`None`/`True` 被拒絕;直接在模型層級進行驗證;未過濾的清單順序;過濾後清單仍保留識別碼升序;包含邊界的閾值;空結果;非整數 `min_priority` 被拒絕。.
測試環境限制:這是一個小型離線 Python 儲存庫。Claude 在 CLI OAuth 過期後會使用子代理作為備用方案,因此隔離狀態與憑證可見性並不完全一致。.
邊緣情況下的錯誤修正
T3 測試了夏令時排程的缺陷。兩位代理均獲得 30/30 分,並通過了相同的春季與秋季隱藏檢查。Claude Code 針對模稜兩可及被跳過的地方時間、簡單粗糙的輸入,以及多日滾動,新增了明確的覆蓋範圍。Codex 對日曆日進行了更細微的調整,並通過了凍結合約的測試。.
當函式庫被廣泛重複使用,或排程錯誤的代價很高時,更廣泛的邊界案例測試能帶來信心。當缺陷已明確隔離,且團隊希望將行為變更降至最低時,局部變更便具有吸引力。 實際的審查問題並非「哪一方寫的程式碼更多?」而是該修補程式是否修正了所述的根本原因、是否維持了周邊的合約,以及是否驗證了高風險的邊界。.
T3 · 受控儲存庫測試
修復夏令時轉換期間的每日排程
在春季與秋季的過渡期間,維持所要求的紐約壁鐘時間。.
根本原因:該實作增加了 24 個 UTC 經過小時。 修正方式:將時間向前推進一個當地日曆日。春季與秋季的凍結檢查均通過。.
評論者觀點: 該較窄的修正案通過了這份完全凍結的合約。.
已涵蓋春季、秋季、遺漏及不明確的當地時間、簡單粗略的輸入,以及多日滾動處理。 在擴大回歸測試範圍後,兩項凍結的隱藏檢查均通過。.
評論者觀點: 對邊緣案例的涵蓋範圍更廣;在「凍結」評分標準下,功能分數保持不變。.
檢視完整的 Codex 輸出內容
完整的、經過清理的、首次有效的輸出
已實作夏令時修正。 變更的檔案: - [scheduler/time_rules.py](./scheduler/time_rules.py) - [tests/test_time_rules.py](./tests/test_time_rules.py) 變更內容: - 將時間向前調整一個當地日曆日,而非 24 個 UTC 小時。 - 新增紐約春夏時間與秋季時間的回歸測試。 - 驗證所經過的 UTC 時間間隔分別為 23 小時與 25 小時。 檢查結果: - 單元測試:4 項通過。 - 內存語法檢查:7 個 Python 檔案通過。 - 由於 Python 將其快取重定向至指定工作區之外,導致位元組碼編譯受阻;未寫入任何外部檔案。 **結論:** `next_daily_run` 現已能在夏令時轉換期間保留所要求的實時小時。無需做出任何決策。.
檢視完整的 Claude 程式碼輸出
完整的交接記錄,包含第一項有效的輸出內容的逐字記錄
# T3 執行記錄 — DST 錯誤修正
## 執行參數
| 欄位 | 值 |
| --- | --- |
| 任務 | `T3` |
| 凍結提示 | `01-prompts/T3.md` |
| 凍結提示詞 SHA-256 | `3fee50d0230f27f8d6dd7f12e050fa3f0b7f5fb77d9559361fee96e5f1a47307` |
| 執行單元 | 隔離的 Claude 子代理,`通用型`,全新上下文 |
| 隔離方法 | **子代理備用方案**(已記錄的降級 — 參見 `results/isolation-decision.md`) |
| 指派的乾淨副本 | `runtime/workspaces/T3` |
| Claude 程式碼版本 | `2.1.220` |
| 模型設定 | `claude-opus-5` |
| start_utc | `2026-07-28T10:28:05Z` |
| end_utc | `2026-07-28T10:30:03Z` |
| 持續時間 | 118 秒(與 T1、T2、T4 同時進行;非純粹的延遲測量) |
| 嘗試次數 | 1 |
| 狀態 | `有效` |
| 人為干預 | 無 |
## Safe 工具摘要
僅限於指定工作區內的 `date`、`Read`/`Edit`,`python3 -m unittest discover`、
`python3 -m compileall`、一次記憶體內的陰性對照執行,以及一份清單完整性檢查。
僅使用標準函式庫(`datetime`、`zoneinfo`、`unittest`)。無網路連線,無安裝程序。
## 變更的檔案
`scheduler/time_rules.py`(修正內容 — 僅修改 `next_daily_run` 的主體與 docstring),
`tests/test_scheduler.py`(新增 `NextDailyRunTests`,8 個測試,以及一個 `_elapsed` 輔助函式;
現有測試未修改)。未觸及其他模組,亦未新增檔案。完整修補檔:
`results/T3/patch.diff`。
## 離線檢查結果
由任務執行器回報:
| 檢查項目 | 結果 |
| --- | --- |
| `python3 -m unittest discover -s tests -v` | **10 通過,0 失敗**(2 個既有測試 + 8 個新測試) |
| `python3 -m compileall -q scheduler tests` | 無錯誤 |
| 清單完整性與 `fixture-manifest.json` 比對 | 0 項缺失,0 項異常 |
| 負面對照組:在記憶體中修補種子實作,僅限 `NextDailyRunTests` | 執行 8 項,**5 項如預期失敗**,包含兩項夏令時間測試 |
由協調員在工作區外部獨立重新驗證:
| 檢查項目 | 退出狀態 | 結果 |
| --- | --- | --- |
| 公開測試套件(`results/checks/T3-public.txt`) | 0 | 10 項測試,通過 |
| 隱藏驗證器 `03-checks/test_t3_hidden.py` (`results/checks/T3-hidden.txt`) | 0 | 2 項測試,通過 |
隱藏驗證器在使用原始固定裝置副本時失敗(退出代碼 1)。請參閱
`results/checks/validator-controls.md`。
## 黃金地圖行為覆蓋率
`03-checks/gold-map.json` 中所有四項必備行為均已滿足:
| 必備行為 | 證據 |
| --- | --- |
| 實時鐘小時數維持不變 | 對原始本地實時鐘進行增量調整,時區重新綁定;於每項夏令時測試中均通過驗證 |
| 春季轉換已涵蓋 | `test_spring_forward_keeps_requested_hour` — 維持 09:30 時,偏移量 `-04:00`,歷時 23 小時 |
| 涵蓋秋季轉換 | `test_fall_back_keeps_requested_hour` — 維持 09:30 時,時區偏移量 `-05:00`,歷時 25 小時 |
| 使用 IANA 時區 | 來自標準函式庫的 `ZoneInfo("America/New_York")` |
除了必測集之外,執行器還涵蓋了 PEP 495 的兩個邊界案例 —— 因「春令時」而
被跳過的牆鐘時間,以及「秋令時」期間的模糊牆鐘時間 —— 加上橫跨每次轉換的七天
滾動,以及「天真輸入」行為。
## 已修正的錯誤
兩項因自身原因導致的測試斷言失敗:針對共享同一
`tzinfo` 的兩個日期時間進行 `following - previous` 運算時,會減去原始牆鐘時間,因此經過時間的斷言顯示為 1 天而失敗。
實作是正確的,但斷言有誤;已透過 `_elapsed`
輔助函式修正,該函式會先將兩個操作數轉換為 UTC。無工具、匯入或環境錯誤。
執行後已移除 `__pycache__` 殘留檔案。
## 可見輸出 (原文照錄)
**重現步驟**
在 2024 年夏令時轉換前後,分別以 `America/New_York` 日期時間作為參數呼叫 `scheduler/time_rules.py::next_daily_run`:
```
2024-03-09T09:30:00-05:00 -> 2024-03-10T10:30:00-04:00 # 時區偏移 +1
2024-11-02T09:30:00-04:00 -> 2024-11-03T08:30:00-05:00 # 小時偏移 -1
```
一項預定於當地時間 09:30 執行的任務,在夏令時開始後於 10:30 觸發,而在冬令時開始後則於 08:30 觸發。
**根本原因**
預設實作將「每日」視為固定的絕對時間長度:
```python
elapsed = previous_run.astimezone(timezone.utc) + timedelta(hours=24)
return elapsed.astimezone(previous_run.tzinfo)
```
先轉換為 UTC 會使 `timedelta(hours=24)` 的經過時間精確為 24 小時。 但在 IANA 時區中,當地日曆日於「春令時」調整日為 23 小時,而「秋令時」調整日則為 25 小時,因此固定 24 小時的偏移量必然會導致結果與請求的實時時間相差一小時。
**修正方案**(`scheduler/time_rules.py`)
每日重複是一項日曆規則,因此現在會先將增量套用至原始的本地實時鐘,之後再重新附加時區:
```python
tzinfo = previous_run.tzinfo
naive_next = previous_run.replace(tzinfo=None) + timedelta(days=1)
if tzinfo is None:
return naive_next
candidate = naive_next.replace(tzinfo=tzinfo, fold=0)
return candidate.astimezone(timezone.utc).astimezone(tzinfo)
```
為何此方法正確:
- 針對原始值進行的實時鐘運算與時區偏移量無關,因此所要求的時:分在設計上會被保留; 接著 `zoneinfo` 會提供新日期當時生效的 UTC 偏移量(已驗證:春日調快後為 `-04:00`,秋日調回後為 `-05:00`,實際經過時間分別為 23 小時與 25 小時)。
- `fold=0` 加上 UTC 往返處理,可處理純牆鐘運算所留下的兩個未定義邊界情況。根據 PEP 495,一個 *被跳過* 的牆鐘時間 (2024-03-10 02:30)在 `fold=0` 時具有轉換前的偏移量,因此往返處理會將其正規化為實際時刻 03:30 EDT,而非返回一個未指定具體時刻的 datetime 物件。 一個 *模稜兩可* 的牆鐘時間(2024-11-03 01:30)會確定性地解析為其首次出現的時間點(EDT),而非隨機結果。
- 原始輸入保留其原有含義(純粹增加 1 個日曆日)——不會對呼叫方施加新的 `tzinfo` 要求。
變更範圍保持狹窄:僅 `next_daily_run` 的主體/文檔字串有所變更。 `service.py`、`models.py`、`repository.py` 及 `__init__.py` 均未更動,未新增任何檔案,且測試套件清單仍完全吻合(無遺漏或意外檔案)。僅使用標準函式庫(`datetime`、`zoneinfo`、`unittest`)。
**回歸測試**(`tests/test_scheduler.py`、 新的 `NextDailyRunTests`,共 8 個測試)涵蓋:普通日穩定性、夏令時開始(時區偏移量 + 23 小時已過)、冬令時開始(時區偏移量 + 25 小時已過)、橫跨各轉換時點的七日循環、跳過實際時間、模糊實際時間,以及簡單輸入。
有兩點值得注意。首先,我最初的經過時間斷言使用了 `following - previous`;由於 Python 會忽略共用的 `tzinfo` 並直接減去原始牆鐘時間,因此兩者皆返回 1 天而測試失敗。 其實實現是正確的,但斷言有誤——透過一個將兩個操作數轉換為 UTC 的 `_elapsed` 輔助函式來修正。 其次,我透過對內存中已初始化的實作副本重新執行 `NextDailyRunTests`,驗證了這些測試確實能偵測到原始缺陷:8 個測試中有 5 個失敗,包括兩個夏令時測試。 在存在錯誤的版本中通過測試的這三個案例(普通日、跳過、模糊情況)僅是記錄行為,而非偵測回歸錯誤——跳過與模糊情況之所以結果一致,純屬巧合,因為 +24 小時的絕對偏移剛好落在同一個正規化時刻上。.
測試環境限制:這是一個小型離線 Python 儲存庫。Claude 在 CLI OAuth 過期後會使用子代理作為備用方案,因此隔離狀態與憑證可見性並不完全一致。.
程式碼審查品質與人工驗證
程式碼審查任務所展現的技能,與功能實作有所不同。一位稱職的審查者必須找出可重現的問題、評估其影響程度、精確指出程式碼路徑,並能區分真正的缺陷與純屬推測的警告。修復問題時還需通過另一項測試:修補程式絕不能引入新的回歸問題。.
Claude Code 在 T4 環節中展現出最明顯的優勢。 該團隊報告了五項可獨立重現的發現,其中包含兩項預設審查目標,因此獲得 19/20 分。Codex 報告並修復了兩項有效的較高嚴重性缺陷,但未提及那對預設缺陷,因此獲得 18/20 分。Codex 的發現並非誤報;兩者之間的差異在於檢測範圍的廣度,而非基本正確性。.
T4 · 受控儲存庫測試
找出可重現的缺陷,並修復可信度最高的問題
檢視測試案例、重現實際缺陷、實施允許的修正,並證明回歸測試能有效驗證該行為。.
1. 高 — 現有工作可能被悄然覆寫。 2. 中 — 每日執行的任務在夏令時轉換期間出現偏移。 驗證結果:四項測試通過,零項失敗。.
評論者觀點: 雖然發現了有用的高嚴重性問題並進行了針對性修正,但未能達成兩項預先設定的審查目標。.
D1 DST 偏移 · 高 D2 簡單時區取得 · 中 D3 識別碼衝突 · 高 D4 缺少刪除操作會引發 KeyError · 中 D5 所有者未經驗證 · 低
評論者觀點: 審查範圍更廣泛,且未出現任何重複的假陽性結果;其中兩項與合約相關的發現則未予修正。.
檢視完整的 Codex 輸出內容
完整的、經過清理的、首次有效的輸出
## 需採取行動的發現事項 1. **高風險 — 現有工作可能被無預警地覆寫** - 證據:[service.py](./scheduler/service.py:8) 中的識別碼初始化,結合 [repository.py](./scheduler/repository.py:9) 中的字典替換。 - 影響:若使用現有儲存庫建立服務,可能會重複使用識別碼 `1`,從而取代已儲存的工作並導致資料遺失。 - 最簡重現步驟:儲存 `Job(1, ...)`,建立 `SchedulerService(repository)`,然後建立另一個工作。在修正前,僅剩新建立的工作。 - 修正:從儲存庫中現有的最高識別碼開始初始化下一個識別碼。 - 回歸測試:[test_scheduler.py](./tests/test_scheduler.py:22)。 2. **中等 — 每日執行時間在夏令時轉換期間產生偏差** - 證據:已修正 [time_rules.py](./scheduler/time_rules.py:4) 中的計算邏輯。 - 影響:一項排定於 09:00 執行的每日工作,在春季夏令時轉換後於 10:00 執行。 - 最簡重現步驟:計算 `2026-03-07 09:00 America/New_York` 之後的下一次執行時間。 修正前,結果為 `2026-03-08 10:00`。 - 修正方式:增加一個當地日曆日,而非 24 小時的 UTC 經過時間。 - 回歸測試:[test_scheduler.py](./tests/test_scheduler.py:33)。 ## 已變更的檔案 - [scheduler/service.py](./scheduler/service.py) - [scheduler/time_rules.py](./scheduler/time_rules.py) - [tests/test_scheduler.py](./tests/test_scheduler.py) ## 驗證 - 觀察到兩項回歸測試在修正前均失敗。 - 每項測試在對應的修正後均通過。 - `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v` - 結果:**4 項測試通過,0 項失敗**。 - 沒有任何生成的 Python 快取產物殘留。 ## 結論與決策 - **結論:** 兩項已確認的缺陷均已修復,並由針對性的回歸測試涵蓋。 - **需決策事項:** 無。.
檢視完整的 Claude 程式碼輸出
完整的交接記錄,包含第一項有效的輸出內容的逐字記錄
# T4 執行紀錄 — 測試與程式碼審查
## 執行參數
| 欄位 | 值 |
| --- | --- |
| 任務 | `T4` |
| 凍結提示 | `01-prompts/T4.md` |
| 凍結提示詞 SHA-256 | `5e69546007ea776f40b3d334ddb75671ff684c151c77551bad27de3b0fdce640` |
| 執行單元 | 隔離的 Claude 子代理,`通用型`,全新上下文 |
| 隔離方法 | **子代理備用方案**(已記錄的降級 — 參見 `results/isolation-decision.md`) |
| 指派的乾淨副本 | `runtime/workspaces/T4` |
| Claude 程式碼版本 | `2.1.220` |
| 模型設定 | `claude-opus-5` |
| start_utc | `2026-07-28T10:28:22Z` |
| end_utc | `2026-07-28T10:32:17Z` |
| 執行時間 | 235 秒(與 T1–T3 並行執行;非純粹的延遲測量) |
| 嘗試次數 | 1 |
| 狀態 | `有效` |
| 人為干預 | 無 |
凍結提示中的條件 ——「若凍結的執行配置允許
修正,則進行修正」 —— 由協調器從 `00-control/run-config.json` 及
`00-control/safety-policy.json` 中解析,該設定允許寫入隔離的測試套件副本。執行器
已獲告知允許進行修正。系統未向其顯示任何控制檔。
## 安全工具摘要
`date`、僅限於指派工作區內的 `Read`/`Edit`/`Write`、`grep`、
`python3 -m unittest discover`、`python3 -m compileall`、一次臨時副本的空運行、一次
清單存在性檢查。無網路、無安裝、僅使用標準函式庫。
## 變更的檔案
`scheduler/time_rules.py`(已修改)、`scheduler/service.py`(已修改)、
`tests/test_scheduler.py`(已修改,新增 2 項測試)、`tests/test_time_rules.py`(新增,5 項測試)。
完整修補檔:`results/T4/patch.diff`。
## 離線檢查結果
由任務執行器回報:
| 檢查項目 | 結果 |
| --- | --- |
| `python3 -m unittest discover -s tests -v` | **9 通過,0 失敗,0 跳過**(基準 2) |
| `python3 -m compileall -q scheduler tests` | 通過 |
| 對照 `expected_files` 檢查清單是否存在 | 全部 8 個皆存在 |
| 針對還原後的原始實作執行 vacuity 檢查 | 5 次失敗,4 次通過,符合預期 |
由協調員在工作區外部獨立重新驗證:
| 檢查項目 | 退出狀態 | 結果 |
| --- | --- | --- |
| 公開測試套件 (`results/checks/T4-public.txt`) | 0 | 9 項測試,正常 |
資訊性交叉檢查,不計分:T3 隱藏驗證器對此
工作區亦通過(退出代碼 0),因為 T4 已獨立修復了相同的 `next_daily_run` 缺陷。請參閱
`results/checks/validator-controls.md`。
## Gold-map 缺陷覆蓋率
`03-checks/gold-map.json` 為 T4 評分預設了兩個缺陷。兩者均已被發現:
| 預設缺陷 | 已發現 | 回報狀態 |
| --- | --- | --- |
| 空白所有者已接受 | 是 | **D5**,`scheduler/service.py:11,13`,嚴重性:低,已回報且刻意未修正 |
| 刪除不存在的識別碼會引發 `KeyError` | 是 | **D4**,`scheduler/repository.py:19` → `service.py:22`,嚴重程度「中」,已回報且刻意未修復 |
除預設缺陷集外,另有三項發現被回報。均非誤報:
- **D1** — `next_daily_run` 中的夏令時偏移。這是
`03-checks/seeded-defects.md` 中列出的第三個缺陷(其評分歸類於 T3 而非 T4,但確實是預設的真實錯誤)。
- **D2** — `next_daily_run` 的簡單輸入會默默取得主機時區,並回傳一個
已知時區的 datetime 物件。此為真實缺陷且取決於主機;協調員已根據測試套件原始碼進行驗證。
- **D3** — 服務與注入或共用儲存庫之間的識別碼衝突,導致
無警示的覆寫。真實缺陷:`SchedulerService._next_identifier` 始終從 1 開始,而
`JobRepository.save` 則為未受保護的字典賦值。 T1 獨立地從原始測試案例中識別出相同的
漏洞。
誤報數量:**0**。執行器亦正確回報未發現任何安全問題,並指出
該測試案例不存在網路、I/O、反序列化、子程序或憑證暴露面。
## 值得記錄的偏差
凍結提示要求針對「信心度最高的兩個缺陷」進行測試與修復。 該
執行者選擇了 D1/D2(單一修正,同一個函式)以及 D3,而非黃金地圖中預設的
兩個缺陷 D4 和 D5。其陳述的理由是合理的:D4 和 D5 皆取決於未明定的 API
合約,因此修正它們將是憑空猜測。 偵測成績不受影響——兩項預設缺陷
均已被發現,並附有檔案、行號、嚴重性、影響範圍及重現步驟。所套用的修正針對的是真實
缺陷,且已通過空值檢查驗證。
## 已修正的錯誤
因使用 `tzinfo` 時,將日期時間的「實時」與「絕對時間」相減,導致兩次自造的測試失敗;
已修正並重新驗證。無工具或環境錯誤。執行後已移除 `__pycache__`
殘留檔案。
## 可見輸出(逐字)
### 缺陷報告
**D1 — `scheduler/time_rules.py:10-11` — 每日排程在夏令時期間出現一小時偏差 — 嚴重性:高**
`next_daily_run` 透過 UTC 往返傳輸增加 24 小時的 *實際耗時*,而非推進日曆日期。 由於每日工作是根據實時(wall-clock time)定義的,因此自夏令時轉換日起,位於實施夏令時時區的每個工作都會在不知不覺中提早或延遲一小時執行,且此錯誤會持續存在(每次執行都會從偏移後的時間重新初始化)。該函式自帶的說明字串(docstring)本身已承認此行為。
```
prev = datetime(2024, 3, 9, 9, 0, tzinfo=ZoneInfo("America/New_York"))
next_daily_run(prev) # -> 2024-03-10 10:00:00-04:00,預期值為 09:00-04:00
prev = datetime(2024, 11, 2, 9, 0, tzinfo=ZoneInfo("America/New_York"))
next_daily_run(prev) # -> 2024-11-03 08:00:00-05:00,預期時間為 09:00-05:00
```
**D2 — `scheduler/time_rules.py:10-11` — 未經處理的輸入會默默採用系統的本地時區 — 嚴重性:中等**
同樣的兩行程式碼。對「未意識時區」的 `datetime` 物件呼叫 `.astimezone(timezone.utc)` 會假設系統本地時間,而 `.astimezone(None)` 則會傳回「意識時區」的 `datetime` 物件。 若以「未意識時區」的值作為輸入,則會返回「已意識時區」的值,因此結果無法與呼叫者的其他「未意識時區」值進行比較(比較時會引發 `TypeError`),且結果取決於主機的 `TZ`。
```
next_daily_run(datetime(2024, 1, 1, 9, 0))
# -> datetime(2024, 1, 2, 9, 0, tzinfo=timezone(timedelta(hours=8), "CST")) # 取決於主機
```
**D3 — `scheduler/service.py:8,13,15`(前綴)— 識別碼衝突會默默銷毀已儲存的任務 — 嚴重性:高**
ID 計數器是針對每個 `SchedulerService` 設定的,且始終從 1 開始,忽略注入儲存庫的內容。 任何使用共用儲存庫的第二個服務,或任何使用預先填入資料的儲存庫的服務,都會重新發放 ID 1;由於 `JobRepository.save` 屬於字典賦值,因此現有工作會被覆寫且不會觸發錯誤。導致資料遺失。
```
repo = JobRepository()
SchedulerService(repo).create_job("夜間備份", 'Alex') # id 1
SchedulerService(repo).create_job("薪資匯出", "Blake") # 再次產生 id 1
repo.all() # -> [Job(1, "薪資匯出", "Blake")] — Alex 的工作已消失
```
**D4 — `scheduler/repository.py:19` → `scheduler/service.py:22` — `delete_job` 因未知 ID 而拋出 `KeyError` — 嚴重性:中等**
`delete` 方法在未設定預設值的情況下使用 `dict.pop`,而其同級方法 `get`(第 13 行)在未找到對應項時會傳回 `None`。 此不一致性會透過 `SchedulerService.delete_job` 洩漏原始的 `KeyError`,而呼叫方極可能無法擷取此錯誤。重現步驟:`SchedulerService().delete_job(999)` → `KeyError: 999`。 修正方式可採用 `pop(identifier, None)` 或拋出明確的領域例外 — 刻意未進行修正,因為正確的行為規範(靜默無操作 vs. 類型化錯誤)應由擁有者透過 API 決策決定。
**D5 — `scheduler/service.py:11,13` — `owner` 欄位未經驗證 — 嚴重性:低**
`name` 會檢查是否為空,但 `owner` 則不會:`create_job('ok', ' ')` 會儲存 `owner=""`。 這兩個參數皆在未加防護的情況下呼叫 `.strip()`,因此 `None` 會以 `AttributeError: "NoneType" object has no attribute 'strip'` 的形式顯現,而非 API 通常用於處理錯誤輸入的 `ValueError`。未修正 — 該測試環境中並未在任何處說明預期的所有者合約。
**安全性:** 無發現問題。此測試套件不涉及網路、I/O、反序列化、子程序或憑證暴露;儲存空間為進程內的字典。
**覆蓋率缺口:** 在本次執行之前,`scheduler/time_rules.py` 和 `scheduler/repository.py` 的測試覆蓋率為零;那兩個預先設定的測試僅驗證了服務的正常流程。
### 已套用測試與修正
信心度最高的兩個缺陷為 **D1/D2**(同一個函式,單一修正)與 **D3**。
**修正 1 — `scheduler/time_rules.py`:** 將 UTC 往返計算替換為 `previous_run + timedelta(days=1)`。 Python 會對「意識到時區」的日期時間進行實時運算,而 `zoneinfo` 會根據新的實時時間懶惰地重新解析 UTC 偏移量 — 因此 09:00 仍維持 09:00,而偏移量則正確地從 `-05:00` 調整為 `-04:00`。 這同時修復了 D1 和 D2:原始輸入現在會保持原始狀態,且絕不會推斷本地時區。關於「無法到達」與「模糊」的轉換時段情況,文件中已說明將遵循 tzinfo 的折疊規則。
**修正 2 — `scheduler/service.py`:** 移除了每實例的 `_next_identifier` 計數器;識別碼現在於建立時,從儲存庫狀態中以 `max(現有 ID, 預設值=0) + 1` 的方式分配。此做法對於共享及預先填充的儲存庫皆正確。 權衡:每次建立時耗時 O(n) 而非 O(1),對於以字典為後端的內存儲存而言尚可接受,且相較於無法檢視其寫入目標儲存區的計數器,此方式更為正確。
**測試 — `tests/test_time_rules.py`(新增,5 項測試):** 春進與秋回時鐘時間保存機制、跨時區轉換期間 23 小時/25 小時的絕對經過時間、UTC 偏移量重新解析、「簡單模式保持簡單模式」以及純粹的 UTC 日期前進。若未找到 IANA 資料庫,則會乾淨俐落地跳過測試。
**測試 — `tests/test_scheduler.py`(擴充,新增 2 項測試):** 兩個共用同一儲存庫的服務必須發出不同的 ID 並保留兩項工作;若某服務存取的儲存庫中已預先填入 ID 1 和 7,則該服務必須發出 ID 8 並保持現有工作不變。
**空值檢查:** 我在臨時副本中還原了兩個原始實作,並重新執行測試套件 — 所有 5 項新測試均失敗(`FAILED (failures=5)`),而針對已修正的程式碼則全部通過。這些測試確實鎖定了缺陷。
執行過程中有一處修正:我的初稿將經過的夏令時間(DST)計算為 `result - previous`,當兩個操作數共用同一個 tzinfo 時,Python 會將其視為實時鐘運算,因此讀取結果為 `24h`,導致測試失敗。 現在的斷言會在減法運算前先轉換為 UTC。失敗的原因出在我的測試程式中,而非修正程式。
### 給負責人的備註
由於 `fixture-manifest.json` 未被修改,因此 `tests/test_time_rules.py` 是一個未列於 `expected_files` 中的有效新檔案——若檢查機制要求檔案集完全一致,請更新該清單。 此外,D4/D5 雖已通報但刻意未修正:兩者皆取決於 API 合約的決策(刪除時未命中語義、擁有者驗證規則),而這些決策在測試套件中並未明文規定,因此選擇其中一項將只是猜測,而非真正的修正。.
測試環境限制:這是一個小型離線 Python 儲存庫。Claude 在 CLI OAuth 過期後會使用子代理作為備用方案,因此隔離狀態與憑證可見性並不完全一致。.
無論採用哪種評分方式,都無法取代人工審查的必要性。當任一代理程式完成修復後,請檢查已變更的介面、意外的檔案作用域、缺失的負面測試、權限或指令歷史紀錄,以及回滾路徑。即使能給出令人信服的解釋,也無法取代可重現的測試。.
權限、沙盒機制與運作安全性
編碼代理程式能夠讀取私有程式碼、執行 shell 指令、修改大量檔案,並呼叫外部工具。這使得權限設計成為產品品質的一部分。相關的問題包括:哪些操作需要批准、代理程式預設可存取哪些內容、它會多清楚地預覽高風險操作,以及開發人員能否檢視所產生的變更。.
請勿認為審核提示越少就越好。在沒有憑證或生產環境連線的獨立測試環境中,低干擾性確實很有用。但在連接到部署腳本、真實客戶資料或廣泛雲端權限的儲存庫中,同樣的行為卻可能帶來風險。反之,過多的審核提示可能會使安全的自動化變得不切實際,並促使使用者在未仔細閱讀請求內容的情況下就予以批准。.
我們的測試使用的是全新的本地副本,未涉及生產系統、未進行部署,且未經人工干預以確保執行有效。因此,此測試旨在評估在安全條件下任務的完成情況,而非兩款產品的相對安全性。 在將任一工具應用於重要工作之前,請先以唯讀權限開始,定義允許存取的目錄與指令,檢視差異報告,並在可恢復的環境中執行客觀檢查。.
- 從唯讀架構開始,否則將面臨風險。.
- 請僅批准您已充分理解其範圍與後果的指令。.
- 請將憑證、生產資料及部署存取權限保留在試用範圍之外。.
- 在接受結果之前,必須提供差異報告、測試結果以及明確的回滾路徑。.
MCP、技能、專案說明及客製化
這兩種生態系統皆可進行擴展,但「擴展」一詞不應被視為同義詞。專案指示會告知代理程式在儲存庫中應如何運作;可重複使用的技能(Reusable Skills)則將可重複的工作流程或專業知識封裝起來;MCP 則將主機與外部工具或資料連接起來;而掛鉤(Hooks)與指令(Commands)則能自動化開發循環中的特定環節。 一款產品可以在某一層面表現出色,而無需在另一層面與特定功能一對一地對應。.
採購時的關鍵不在於是否存在整合標誌,而在於該連接能否在您實際使用的主機上完成安裝、驗證、核准並投入運作。此外,其故障模式也必須清晰易懂。 一台在互動模式下運作正常,但在無人值守會話中需等待核准的 MCP 伺服器,雖然仍有其用處,但不應被描述為「無摩擦自動化」。.
可重複使用的指示也有類似的注意事項。冗長的指示檔案並不能保證合規性,而過於複雜的規則集可能會忽略上下文,或造成矛盾。請確保儲存庫指引簡短、可測試,並緊貼程式碼。應明確列出必要的驗證指令、受保護區域、風格規則,以及代理程式何時必須暫停並尋求指示。.
- 專案說明: 儲存庫專屬的規則與驗證指令。.
- 技能: 可重複使用的程序或專業知識套件。.
- MCP: 與外部工具及資料的連線。.
- 掛鉤與指令: 針對定義好的工作流程事件進行自動化處理。.
Codex 與 Claude 代碼的定價及使用限制
「Clean Consumer」方案的起價為每月 $20。透過相關的 $20 ChatGPT 方案,可享有 Codex 存取權限;而 Claude Pro 方案在美國的月費為 $20,並包含 Claude Code。 兩者均提供月費為 $100 及 $200 的高用量消費者方案。標價相近並不代表容量完全相同。.
Claude Max 5x 每月費用為 $100,而 Max 20x 每月費用為 $200。 「5x」和「20x」的名稱描述的是相對於 Pro 方案的單次會話使用量,而非保證的編碼任務數量。Claude 與 Claude Code 共享會話及每週配額。上下文長度、附加檔案、模型選擇及功能使用方式,皆可能影響配額耗盡的速度。.

啟用 Claude 的選用使用額度後,在包含的使用量用罄後,符合資格的工作仍可繼續進行,而這些額度將依照標準 API 費率另行計費。API 金鑰驗證則是另一種獨立的計費途徑。若將任一途徑稱為「無限」,將掩蓋其真正的邊際成本。.

Codex 同樣會將包含在內的消費者方案用量、符合資格的已購買額度,以及 API 計費分開處理。本地訊息與雲端聊天共享五小時的時段,且可能另有每週上限。CLI 日誌中的代幣欄位無法直接轉換為五小時的百分比、訂閱額度或 API 帳單金額。.
若只是偶爾進行單人編碼,無論選擇哪一側的 $20 層級,都是合理的起點。 若需每日處理具有長上下文的儲存庫工作,或許有理由選擇更高使用層級,但必須在觀察實際重置情況與任務消耗後再行決定。高強度並行工作則需要更加謹慎:即使付費升級至更高層級,仍需控制上下文、拆分任務,並將高成本的推理資源保留給需要高度判斷力的工作。.
我們針對 Codex 與 Claude 編碼所進行的對照測試結果
在兩個代理程式開始運作之前,我們預先鎖定了四項英文提示、一個公開的 Python 測試案例、客觀檢查項目、評分標準,以及「首個有效結果」規則。任務涵蓋對陌生儲存庫的理解、多檔案功能、DST 錯誤修復,以及包含修正的程式碼審查。 有效的結果不會受到人工干預,而雖然表現較弱但仍屬有效的輸出,則無法重新執行以爭取更高分數。.
Codex 針對獨立的 CLI 程序執行了測試,並保留了原始 JSONL 以及 CLI 產生的標記欄位。由於該同事的 Claude CLI OAuth 會話已過期,因此 Claude Code 使用了一個具備全新子代理上下文的協調器。 我們在乾淨的稽核副本中重建了 Claude 的修補程式,並重新執行公開與隱藏的檢查。此舉產生了可信的實務證據,但並未產生完全相同的隔離環境或模型控制面。.
| 任務 | 《古籍》 | 克勞德·科德 | 有界詮釋 |
|---|---|---|---|
| T1:對儲存庫的理解 | 20/20 | 20/20 | 平局;精簡式與詳盡式 |
| T2:多檔案功能 | 30/30 | 30/30 | 功能性關聯;不同的驗證與測試範圍 |
| T3:DST 修復 | 30/30 | 30/30 | 兩者均通過測試;較窄的修補範圍與較寬的邊緣覆蓋範圍 |
| T4:檢修與修復 | 18/20 | 19/20 | Claude 代碼顯示出更廣泛的審查範圍 |
受控測試 · 固定評分標準
Codex 98/100 對比 Claude Code 99/100
這一點之差並非放諸四海皆準的勝出訊號。真正有用的差異取決於具體任務。.
| 決策區域 | 觀察結果 | 實用閱讀 |
|---|---|---|
| 對儲存庫的理解 | 平手 · 各得 20/20 分 | Claude 的內容更為詳盡;Codex 則更為簡潔。. |
| 多檔案功能 | 平手 · 各30/30 | 兩者均通過了隱藏檢查;Claude 增加了更廣泛的測試。. |
| 夏令時錯誤修復 | 平手 · 各30/30 | Claude 覆蓋的邊緣範圍較廣;Codex 則採用較窄的修補片。. |
| 檢視與維修 | Claude 19/20;Codex 18/20 | Claude 發現了更多可重現的缺陷。. |
| 觀測速度 | 混合 | Claude 領先 T1/T2;Codex 領先 T3/T4。. |
披露: 使用相同的提示字元和測試框架,但隔離路徑不同。請勿將此小型測試結果泛化至每個儲存庫、模型層或獨立執行階段。.
由於此測試框架規模過小,無法針對大型儲存庫、所有程式語言、所有模型層級或長時間的自主執行會話來評估其效能。這一個點數的總差距,最恰當的解讀應為「兩者均成功,但審查範圍有所差異」,而非一種普適性的排名。.
真實用戶的反饋——以及該相信多少
當社群回饋包含專案、任務、模型、工作模式及時間範圍等資訊時,其價值便顯著提升;若貼文僅表示某款產品「感覺更聰明」或「速度快得多」,則其參考價值較低。不同使用者會比較不同的儲存庫、訂閱方案、提示詞、擴充功能以及監督程度。.
上述 Reddit 的情境範例顯示了一種互動上的權衡:快速且具對話感的互動可能需要更多注意力,而審慎的執行雖然感覺較慢,但所需的修正卻較少。 我們的受控測試與該帳號的情況僅部分重疊。測試結果顯示,在有效的執行次數中,速度表現參差不齊且未見人為干預,因此無法驗證「人工監控」的說法。這正是為何應將社群證據與受控證據一併呈現,而非將兩者混為一談。.
關於 X 型設計的評論還提出了一個有用的觀點:編碼結果屬於整個系統,而不僅僅是模型標籤。這兩篇個別貼文都不應被視為調查數據。應利用它們來釐清自身實驗中需要探討的問題——干預次數、差異大小、測試品質,以及從錯誤假設中恢復的能力。.
透過 GlobalGPT 擴展 Codex 和 Claude 編碼
GlobalGPT 是一種 多模型、多模態工作區, 並非用來取代原生儲存庫代理程式。其實際作用在於擴展現有主機的功能:利用另一種可用的代理程式模型來提供第二意見、進行計畫審查、完成文件核對,或產生特殊輸出;而 Codex 或 Claude Code 則仍負責處理儲存庫存取、shell 指令、測試及核准等事宜。.
GlobalGPT 發布了針對以下產品的第一方 CLI 指南: 《古籍》 和 克勞德·科德, ,以及 Cursor。在我們安全的 T5 整合測試中,CLI 在這兩種比較環境中均成功完成了相同的凍結任務。在 Codex 中,我們還驗證了唯讀的 MCP 模型清單呼叫,並安裝、載入及使用了 GlobalGPT 技能。.
GlobalGPT 整合 · 不計入編碼分數
CLI 已在兩個工作流程中均通過驗證;MCP 與 Skill 已在 Codex 中通過驗證
這項指標衡量的是整合路徑,而非 GlobalGPT 是否取代了任一原生編碼因子。.
| 路徑 | Codex 環境 | Claude 同事跑步活動 |
|---|---|---|
| GlobalGPT 命令列介面 | 已透過 gpt-5.6-sol 和 gpt-5.6-luna 進行驗證 | 已透過相同的凍結任務進行驗證 |
| MCP | 已驗證互動式唯讀模型清單 | 執行期間未連線 |
| 技能 | 已安裝、載入並進行測試 | 已安裝,但未用於處理凍結通話 |
| 無人值守的 MCP | 觀察到核准限制 | 未經測試 |
檢視完整的整合證據
# GlobalGPT 整合測試摘要 # # 範圍 T5 用於評估 GlobalGPT 的整合情況,且不計入原生 Codex 編碼分數。本次測試未使用 Yukie。 ## 模型鎖定與就緒狀態 - 模型 A:`gpt-5.6-sol` - 模型 B:`gpt-5.6-luna` - 兩款模型均出現在即時模型清單中。 - 兩種輕量級就緒性探測均返回有效且可解析的文字。 - 模型在正式的 T5A 和 T5B 輸出呼叫前已鎖定。 ## 正式 CLI 結果 | 任務 | 模型 | 狀態 | 耗時 | 提示詞標記數 | 完成詞標記數 | 所需標題數 | |---|---|---|---:|---:|---:|---:| | T5A | gpt-5.6-sol | 有效 | 27 秒 | 2,116 | 1,207 | 6/6 | | T5B | gpt-5.6-luna | 有效 | 14 秒 | 2,116 | 1,441 | 6/6 | 這兩次正式呼叫皆透過 `glbgpt exec` 使用相同的凍結版英文產品規劃任務,僅返回英文可見輸出,且未洩露任何憑證。未進行品質重跑。 ## MCP 結果 - `codex mcp list` 顯示 `globalgpt` 已啟用。 - 一個非互動式 Codex 會話偵測到並嘗試執行 `mcp__globalgpt__glbgpt_list_models`,但因無法取得無人值守的 MCP 批准,該呼叫遭取消。未放寬任何安全設定。 - 活躍的互動式 Codex 工作階段成功呼叫了相同的唯讀 GlobalGPT MCP 工具,並取得九個聊天模型。 - 結果:已驗證互動式 MCP 存取權限;無人值守的非互動式 MCP 執行仍受批准限制。 ## 技能結果 - 透過連結至捆綁的 CLI 技能套件,已將 GlobalGPT 和 GlobalGPT 編碼技能安裝至 Codex 技能目錄中。 - 已載入 GlobalGPT 技能並進行測試,以驗證已配置的會話檢查、即時模型選取、就緒狀態、信用安全選項及失敗處理。 - 結果:已在活躍的 Codex 工作流程中安裝並執行。 ## 有限結論 本次執行驗證了 GlobalGPT CLI 呼叫可正常運作、從 Codex 發起的互動式 GlobalGPT MCP 唯讀呼叫,以及已安裝且被使用的 GlobalGPT 技能路徑。 此測試並未證明每個模型、媒體工具、主機、帳戶或無人值守的 MCP 配置皆能正常運作。此測試亦未測試 Yukie,亦不支持「GlobalGPT 可取代 Codex 或 Claude Code」之主張。.
已驗證範圍:特定的 CLI 呼叫、一次互動式 MCP 讀取,以及一個已安裝/使用的技能路徑。這並不能證明所有模型、媒體工具、主機或無人值守配置均已通過驗證。.
邊界至關重要。該同事執行的 Claude 測試驗證的是 CLI 路徑,而非 Claude 端的 MCP。該技能雖已安裝於該處,但並未用於處理那些被凍結的通話。 即使嘗試以無人值守模式執行 Codex MCP,仍需人工核准。模型的可用性與信用額度亦取決於當前的 GlobalGPT 方案,因此開發人員應查閱實際清單,而非假設所有模型均已包含在內。.
GlobalGPT 還涵蓋了圖片、影片、音訊以及帶有指引的 Agent 工作流程。 Yukie 的「簡報」、「文件」和「圖片」項目則屬於不同類別:它們針對無需編碼的任務,提供明確的範本和逐步的瀏覽器指引。這比開啟程式設計命令列介面(CLI)來製作簡報或結構化文件來得容易,但並不能取代讀取儲存庫、執行測試或進行程式碼審查。.
不同的工作流程類別
Yukie 指導的瀏覽器代理程式測試
適用於特定任務的網頁工作流程;尚未經過測試,無法取代儲存庫的編碼代理程式。.
| 工作流程 | 已滿足的標準 | 第一個有效的結果 |
|---|---|---|
| 幻燈片 | 5/6 | 已生成五張投影片的簡報;講者備註無法驗證。. |
| 文件 | 6/6 | 結構化的研究摘要,附有匯出功能及版本歷史紀錄。. |
| 圖片 + 圖說 | 5/6 | 強烈的方形視覺效果;應有的圖說缺失。. |
合理的結論:明確的切入點與引導式的多模式工作流程。缺乏依據的結論:無限制使用、確切價格,或完全取代 Codex/Claude Code。.
獨立開發者應該選擇哪種編碼工具?
- 選擇 Codex 當緊湊且受限的執行方式、其可用的表面組合,或是您設定中可用的執行證據,符合您的工作方式時。.
- 選擇 Claude 代碼 當對話終端迴圈、您已驗證的客製化功能,或是如我們測試案例中所觀察到的更廣泛的審查行為更為重要時。.
- 若遇到不熟悉的儲存庫,請使用其中任一種 只有在通過唯讀架構與風險評估後,這兩款工具才成功處理了這項任務。.
- 請有選擇性地同時使用這兩者 在何種情況下,由第二個代理進行審查所產生的額外訂閱與協調成本是值得的。請要求第二個工具對差異或計畫提出質疑,而非盲目地重複該任務。.
- 加入 GlobalGPT 當多模型路由或多模式作業是缺失的一層時,請將原生儲存庫操作保留在編碼主機中。.
為期七天的試用,比排行榜更能提供實質資訊。 挑選一項真實但非生產環境的功能、錯誤及審查項目。凍結提示語與成功指令。記錄第一個有效的 diff、通過的測試、耗時、人工干預、意外範圍,以及這項工作如何影響您的可用配額。更好的產品,是那種你能偵測到其錯誤,且能維持其工作流程的產品。.
Codex 與 Claude 代碼常見問題解答
Codex 是否比 Claude 編碼更優越?
並非普遍如此。兩者均完成了我們測試套件中的四項任務。Claude Code 在審查範圍方面領先,而 Codex 在部分實作與錯誤修復方面則更為精簡。.
對於大型儲存庫來說,哪一種比較好?
我們這個小工具無法回答這個問題。在允許進行變更之前,請先從您自己的儲存庫中,針對只讀架構任務對兩者進行評估。.
哪種編碼劑所需的監控較少?
這取決於任務的明確性、模型設定、儲存庫說明,以及期望的互動風格。一位 Reddit 用戶曾提及不同的監督模式,但該個人的經驗並不能作為適用於整個產品的規則。.
哪一個比較便宜?
主要消費層級分別為每月 $20、$100 及 $200,但所包含的容量與限額機制有所不同。選配額度與 API 計費則屬獨立項目。.
Claude 與 Claude 的代碼共享使用限制是否相同?
是的。在已串聯的 Pro 或 Max 方案中,Claude 及 Claude Code 會採用共享的連線時段與每週上限。.
Codex 的本地任務與雲端任務是否共用配額?
本地訊息與雲端聊天皆設有五小時的時限,且可能另有每週上限。.
GlobalGPT 能否取代 Codex 或 Claude Code?
不。它雖能透過新增的模型、命令列介面(CLI)、MCP、技能及多模態工具來擴展任一工作流程,但儲存庫存取權限與編碼代理程式(coding-agent)的行為仍由主機端掌控。.
我可以同時使用這兩款產品中的 GlobalGPT 嗎?
GlobalGPT 針對這兩者皆提供官方的 CLI 教學指南。我們已驗證這兩種環境中的 CLI 使用方式,並在 Codex 中驗證了 MCP 搭配 Skill 的使用情況,其中無人值守的 MCP 存在核准限制。.
價格、方案規則、整合功能及來源依據均於 2026 年 7 月進行過核對。產品詳情可能有所變更。.
開盤價 GlobalGPT 如果您希望在現有的編碼工作流程中加入多模型與多模態層。.


