TUI 0.145.0: completed response appeared in a different GNOME Terminal window while rollouts stayed isolated

Open
#35,554 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
38/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Quiet
Tech stack
linux, rust

Research direction

Start by reproducing the report with multiple independent Codex TUI processes in GNOME Terminal, then instrument the TUI/PTY stdout ownership, inline viewport restoration, completion consolidation, redraw handling, and app-server event routing areas named in the issue. Compare process UUIDs, terminal screens, and rendered output during replay, focus changes, and teardown. Done means one process can never paint another process's response into its terminal, with the isolation covered by a regression test or reproducible verification.

Written by the indexing model from the issue text.

Description

bug CLI TUI
What version of Codex CLI is running?

codex-cli 0.145.0

What platform and terminal are you using?
  • Ubuntu 24.04.4 LTS, Linux 6.17 x86_64
  • GNOME Terminal / VTE 7600
  • TERM=xterm-256color, COLORTERM=truecolor
  • Several independent Codex TUI processes open in separate GNOME Terminal screens
What issue are you seeing?

A completed response from one long-running Codex TUI appeared in another terminal window that was being used for a different concurrent task. The visible response was a Xenon evaluation summary (beginning with “v0.7.3 real evaluation completed” and then discussing XENON_CREDENTIALS_PATH).

This initially looked like a cross-session context leak. Local forensic inspection narrows it down substantially: the response and its task_complete event were persisted only in the owning Xenon thread, while the other concurrent rollouts did not contain that text. The suspected defect is therefore in TUI/terminal output ownership, replay, or repaint routing rather than model context construction.

The event is not explained by the normal completion-notification preview on this setup. Codex detects GNOME/VTE as unsupported for OSC 9 and selects the BEL backend; BelBackend::notify discards the message body and emits only \x07. The full response text therefore should not be able to appear in another terminal as an ordinary Codex desktop notification.

Local forensic evidence

All timestamps below are UTC on 2026-07-27.

  • Owning thread: 019fa164-c491-7032-a1ea-5862c708575b
  • Owning process UUID: pid:2548877:e09e616f-523a-4bd4-9c07-bf0966fcd27a
  • Owning GNOME Terminal screen: /org/gnome/Terminal/screen/9dfbcc97_184c_43b0_9bcf_0e0419cce111
  • The response streamed from 04:56:12 through 04:56:17.
  • Its rollout contains the matching agent_message, response item, and task_complete at 04:56:17.
  • SQLite TUI trace rows for every delta are associated only with process 2548877.
  • A concurrently active TUI had thread 019fa168-8f20-7db3-ae53-54e36eeccd53, process 2549631, and a different GNOME Terminal screen (b3090aeb...). Its rollout does not contain the Xenon response text.
  • Another independent thread was created shortly afterward as 019fa1f0-e398-7ab1-88e8-3ed02ad0cbad, process 2598347, screen c0ce2e5e.... Its first user message is the pasted response plus the report of the apparent cross-window leak; it did not receive the response as model history.
  • ~/.codex/goals_1.sqlite contained no active goals or continuations when inspected.
  • No external notify command or explicit TUI notification override was configured.

This is evidence against inference-context contamination, but it does not explain how the owning TUI's rendered response became visible in the wrong terminal window.

Steps that led to the observation

The behavior has not yet been reproduced deterministically.

  1. Open multiple GNOME Terminal tabs/windows.
  2. Start an independent codex TUI in each one, from the same home-directory cwd but for different long-running tasks.
  3. Let one TUI stream a long final response while working in another TUI.
  4. Observe the first task's completion text/status appearing in the other terminal window.

The affected run used a long-lived thread with many streamed/tool events, while other Codex TUIs were active concurrently.

Expected behavior

Each independent TUI process and terminal screen should render only the app-server events for the thread(s) owned by that TUI. Output from another OS process must never be painted into the current terminal, even during completion consolidation, replay, focus changes, or inline viewport redraw.

Actual behavior

The user observed another task's completed response/status in the wrong terminal window. Durable rollouts remained isolated, so the apparent leak was visible-output-level rather than persisted conversation history.

Why this is worth investigating

Even if no model context or credentials crossed the boundary, wrong-terminal rendering is security-relevant because a response can contain source code, paths, or secret-adjacent operational details. It can also cause the user to act on the wrong task status.

Potential areas to instrument or audit:

  • PTY/stdout ownership around TUI teardown and redraw
  • inline viewport / alternate-screen restoration
  • completion consolidation and pending redraws
  • app-server event routing and replay ownership
  • whether the shared GNOME Terminal service can expose a screen-targeting edge case

Possibly related but not identical:

  • #30714 (cross-session/stale TUI after interrupt, Windows)
  • #30767 (stale final-response ownership within a turn transition)
  • #15027 (cross-session /review leakage)

This report differs because the persisted rollouts and process UUIDs remain cleanly separated, there was no /review, and the observation occurred across distinct Linux GNOME Terminal screens.

Dominant language
Rust
Stars
125k
Forks
19.5k
Avg merge
1m
Merged PRs (30d)
1k

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from openai/codex

All issues in openai/codex

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.