Codex 已經在改 code,test 也跑起來了。你回來看一眼,發現 diff 裡居然開始長出 database migration,偏偏 task 一開始就寫得很清楚:schema 不准碰。
這時最容易做的事,是按停再重來。問題是很多長一點的工作根本不需要整包丟掉。它可能只是方向歪了,也可能只是你突然想到一件「等等再做」的事。
兩種情況看起來都像再丟一句 prompt,對 Codex 來說卻不是同一件事。

Figure 1|本文用來整理 Codex 操作狀態的 Control Stack。這是操作心智模型,不是 OpenAI 官方 taxonomy。
先看你現在想改的是哪一段工作
Codex App Server 把 Thread 當成可以持續存在的一條 conversation。它能 resume、fork、archive,也會保留事件歷史。[3]
Turn 則是 Thread 裡的一輪工作。你送一次 input,Codex 可能接著讀很多檔案、跑 command、呼叫工具、改 code、測試、失敗、再試一次,最後才把結果交回來。[2]
所以「做到一半歪掉」時,我先看那個 Turn 還值不值得救。
Payment service 正在 refactor,結果 Codex 自己準備改 schema,但其他調查和修改方向都還是對的。這種我會直接 Steer:
保留現有 schema。不要做 migration,把修改限制在 service layer 和 adapter。
Mid-turn steering 會把新的方向放回正在進行的工作裡,不需要把已經查過的 context 全部丟掉。[1][7]
如果 Turn 沒走歪,我只是突然想到「做完後補一份 migration note」,那就 Queue。這件事應該排在後面,不值得拿來打斷現在的 refactor。[1]
如果 REST 方案已經做到一半,但我真的想完整試另一個 event-driven 設計,我會 Fork。原本的 history 留著,另一條路自己長,不要用十幾句 Steering 把兩種方案揉在一起。[1]
只是旁邊想問「這個 library 為什麼 deprecated?」可以放 Side,問完回主線。[1][8]
至於一個 Turn 如果從一開始就是錯的,diff 還在越長越大,那就 Interrupt。Codex 有中斷 in-flight Turn 的路徑,官方 repo 也留下 Esc / turn/interrupt 的相關紀錄。[9][10]
有個小邊界要記得:Turn 被中斷,不等於所有 background terminal process 都一定跟著被殺掉。背景程序可能有自己的 lifecycle。

Figure 2|不要看到 Agent 還在跑就只想到 Stop,先選最小、最精準的控制方式。
Plan 是拿來把「不知道」先縮小,不是每個 task 的開場儀式
「登入偶爾失敗」通常還不是一個可以直接施工的邊界。
問題可能在 token refresh、session state、proxy、backend dependency,也可能只是 frontend state。連故障到底活在哪一層都還不知道,直接開始改 code,很容易做出一包看起來很完整、其實建立在猜測上的 diff。
Plan 的價值就在這裡。先把 repository、config、tests、schema、相關文件裡能直接查到的東西查掉,再把真的需要人選的 trade-off 留下來。[1][4]
跨多個 service、會碰 migration 或 compatibility、有明確 do-not-touch 區域,或 implementation path 還有幾條在競爭,這些都值得先 Plan。
反過來,一個 bug 已經定位到單一檔案,旁邊又有 focused test 可以直接驗證,我通常就修。為了讓流程看起來完整而硬加 Plan,沒有額外獎品。
Plan 也不會替你改權限。歷史上的 Plan / Code mode 討論可以看到,mode instructions 會影響 Agent 怎麼合作;Sandbox 和 Approval 則是另一件事,它們決定 execution 能走到哪裡、什麼時候要停下來等人。[5][6]
Plan 是避免太早做錯事。Sandbox 和 Approval 是限制「就算想做,也不一定能直接做」。
我在哪裡控制 Codex,和 Codex 在哪裡跑,可以完全不是同一個地方
這個差別到 Mobile 最明顯。
我可以拿手機看 Thread、回 clarification、處理 approval、Steer 方向,但 repo、files、credentials、permissions 和 local setup 仍然留在真正執行 Codex 的 machine 上。[11]
換成手機,並沒有把 code 搬進手機。
Web 也一樣。Browser 是我下任務的地方,worker 可以留在 provisioned cloud environment 裡。關掉 browser tab,不代表 worker 跟著停止。[3]
平常我會把這件事拆成三個問題:
| 問題 | 常見例子 |
|---|---|
| 我在哪裡控制它? | CLI、IDE、Desktop、Web、Mobile |
| 工作實際在哪裡跑? | Local、Worktree、Cloud、remote host / devbox |
| 這次能用什麼能力? | Shell、Browser、Computer Use、MCP、Skills、Plugins |
不用把這三列背成產品 taxonomy。它只是防止自己把「介面換了」「execution 搬了」「多了一個 tool」講成同一件事。
CLI 適合 terminal-first 的工作。[2] 人還大量讀 code、選區塊、自己改一部分時,IDE 的 open files 和 selection 很方便。[12]
Desktop 到多 Thread 時差別就明顯了。Codex App 把 projects、threads、review、worktrees 和平行工作放在同一個地方。[13] 一條修 bug、一條 refactor、另一條查 failing test,這時比起開一排 terminal session,我更想要一個能看見幾條工作線的控制面。
Web 適合把工作交出去跑;Mobile 則是在我離開 workstation 後,還需要回一句 clarification、看進度、批准 action 或拉回方向時有用。[3][11][12]
同一個 task 從 CLI 開始,後來用 Desktop 顧幾條 Thread,出門後再用 Mobile 看進度,完全正常。操作位置可以換,execution 不一定要跟著換。
Surface switch、Handoff、Fork 看起來很像,其實搬的是不同東西
Desktop 換到 Mobile 看同一台 host,只是換 Control Surface;files 和 runtime 可以完全不動。[11]
Handoff 比較接近把工作交到另一個 execution context。Codex App 曾把 Sync 流程改名為 Handoff,也支援 Local 和 Worktree 間的 Thread 移動。[1]
Fork 則不搬 execution,它改的是 conversation history:原本那條保留,再從某個位置長出另一條。[1]
我會這樣記:換 Surface 是我換位置;Handoff 是工作換地方;Fork 是 history 分岔。
三個動作有時會連著發生,但出問題時一定要知道自己到底搬了哪一種 state。
最後才回到權限
Plan、Steer、Queue、Fork、Side 都是在調整工作怎麼往前走。Sandbox 和 Approval 處理的是 execution 被允許做到哪裡。OpenAI 對 Codex 安全部署的說明,也把 sandboxing 和 approval policy 分成不同控制。[6]
Browser、Computer Use 是能力;Remote 會改變人怎麼碰到工作;Hooks 可以插進 lifecycle。這些功能之後還會繼續長,但每天真正要做的判斷沒那麼花俏。
一個小 bug 可能一個 CLI Turn 就收掉。Scope、風險、等待時間或並行工作變大,再把 Plan、Fork、Handoff、Remote supervision 加進來。
控制不是開得越多越厲害。Codex 做到一半出問題時,先看是哪一段 state 真的需要改,再動最小的那個 control,通常就夠了。
參考資料
- OpenAI, ChatGPT & Codex changelog. https://developers.openai.com/codex/changelog
- OpenAI, Michael Bolin, Unrolling the Codex agent loop, 2026-01-23. https://openai.com/index/unrolling-the-codex-agent-loop/
- OpenAI, Celia Chen, Unlocking the Codex harness: how we built the App Server, 2026-02-04. https://openai.com/index/unlocking-the-codex-harness/
- OpenAI Codex GitHub, Plan Mode issue #2101, historical rollout evidence. https://github.com/openai/codex/issues/2101
- OpenAI Codex GitHub, Mode switch Plan -> Code still behaves like Plan issue #10185, historical collaboration-mode evidence. https://github.com/openai/codex/issues/10185
- OpenAI, Running Codex safely at OpenAI, 2026-05-08. https://openai.com/index/running-codex-safely/
- OpenAI, Introducing GPT-5.3-Codex, 2026-02-05. https://openai.com/index/introducing-gpt-5-3-codex/
- OpenAI Codex GitHub, Docs: /side works in Codex App but is missing from App commands page issue #24817, 2026-05-27. https://github.com/openai/codex/issues/24817
- OpenAI Codex GitHub, Clarify or fire Stop hook when a turn is interrupted with Esc issue #22858, 2026-05-15. https://github.com/openai/codex/issues/22858
- OpenAI Codex GitHub, Error: turn/interrupt failed in TUI when submitting steer instruction during review issue #22815, 2026-05-15. https://github.com/openai/codex/issues/22815
- OpenAI, Work with Codex from anywhere, 2026-05-14. https://openai.com/index/work-with-codex-from-anywhere/
- OpenAI, Introducing upgrades to Codex, 2025-09-15. https://openai.com/index/introducing-upgrades-to-codex/
- OpenAI, Introducing the Codex app, 2026-02-02. https://openai.com/index/introducing-the-codex-app/