Daily Edition Sources +10

Watching Codex Can Change When Its Tools Start

New request observers expose outcomes and available token usage. Where you put them in the sequence changes when a tool can leave the queue.

repo openai/codex evidence
10 source signals 1 repo 10 source signals
Evidence: 10 source signals / October 19, 2026 / Daily Edition
Open Edition Evidence below

On October 18, openai/codex merged two hooks around model sampling attempts. A team can record what happened without putting the observer’s output into the model’s conversation. There is a timing choice. Try it.

01 / The handoffMerged code · Release unverified

WATCH THE
HANDOFF.

One response. One tool call. Choose where the observer sits.

RESPONSEReady to stream
OBSERVERWaiting for response end
TOOL DISPATCHCall not received yet

A response produces a tool call. With a synchronous post observer, dispatch waits for the response and observer to finish. In background mode, dispatch can start while the response is still streaming.

  1. 1Response starts
  2. 2Tool call arrives
  3. 3Response ends
  4. 4Observer works
  5. 5Observer finishes
The response begins.

Our example has one configured post-request observer. It has nothing to record until this sampling attempt ends.

Order is illustrated. Durations are not measured.Inspect the ordering test ↗
The choice

A record before dispatch.
Or observation alongside work.

A synchronous PostModelRequest observer holds tool dispatch until it finishes. A background observer preserves streaming dispatch. If any post handler is synchronous, that waiting rule wins.

02 / Behind one answer

The first attempt can disappear
from the happy ending.

The retry test fails one stream, then succeeds. The new hooks surround both sampling attempts.

Attempt 1FAILEDPre → Post
Token usage: unavailable
Attempt 2COMPLETEDPre → Post
Token usage: supplied

“Completed” describes the model response. A deferred tool may not have started yet.

03 / The boundary

It can watch.
Its reply cannot steer.

“Block this request.”Diagnostic text

These observers treat returned control directives as diagnostics. Their output cannot veto the request or add model context. Their command programs can still perform ordinary side effects; existing tool permissions still apply.

Open the Diagram Punk poster
Two paper conveyor paths compare waiting for a Codex observer before tool dispatch with dispatch branching off while the response still streams.
Diagram Punkthe observer changes ordering, not permission. Schematic; no measured speed.

Ask about this article

Watching Codex Can Change When Its Tools Start

Article link and summary included. Continue using your ChatGPT account; you may need to sign in.

If your question doesn’t appear in ChatGPT, copy it here and paste it there.

Your immediate reaction

How did this article land?

A thumb saves immediately. Notes stay private and are discussed with the editor before shaping future articles.

Evidence Trail

Receipts below the story

The article above is the public narrative. This section keeps the source trail and limits on the same page.

Edition
DateOctober 19, 2026
LaneDaily Edition
Confidence91%
Sources10
Reposopenai/codex

Primary Evidence

  • October 18 merge: configurable request observers: https://github.com/openai/codex/pull/55144
    • Shows: Adds PreModelRequest and PostModelRequest to the hooks framework. The article describes merged implementation, not verified availability in a released client.
  • Earlier request/response extension hooks: https://github.com/openai/codex/pull/47679
    • Shows: September 23 work already exposed Rust extension contributors and response interceptors. October adds a narrower configurable hook interface; it is not the first instrumentation mechanism.
  • Official hooks documentation: https://learn.chatgpt.com/docs/hooks
    • Shows: Describes logging and analytics use, and synchronous versus asynchronous hook execution. At inspection the event table did not include the new pair; this is context, not proof of shipping availability.

Evidence Limits

  • Source and test definitions were inspected; the Rust tests and live Codex workload were not executed. The interaction illustrates causal order and uses no measured duration, speed, cost or reliability result.
  • The change was merged on October 18. Availability in a containing client release was not established. The inspected latest stable release predates the merge.
  • Sampling attempts are not every HTTP retry or all internal model traffic. The payload has no dedicated attempt identifier or model-internal reasoning.
  • Completed is a model-response outcome, not successful tool execution or task completion. Existing tool controls remain independent of the observer.
  • Observation-only describes returned control semantics. Arbitrary hook commands may still perform side effects and take time.