openai / openai/codex

Codex: gpt-6-astra intermittently deletes spaces at word/number boundaries in emitted text

Open
#45,021 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug CLI model-behavior
Dominant language
Rust
Stars
125k
Forks
19.5k
PR merge metrics
PR metrics pending

Description

BUG REPORT — Codex: model deletes the space between a word and a following number

MODEL: gpt-6-astra
CLI: 0.153.1, 0.153.4, 0.154.0-alpha.6.2 (all affected; CLI version is not a factor)
SURFACE: Codex CLI (exec / apply_patch / send_message_to_thread tool bodies)
FIRST SEEN: 2026-09-04T20:58:39.923Z — the first day gpt-6-astra is used on this machine

SUMMARY
gpt-6-astra silently deletes the space at some word/number boundaries in the text it emits. The
text it produces is then written verbatim into files on disk. There is no error, warning, or
marker. The rate is low — roughly one site per 100,000+ characters of emitted prose — but the
affected tokens are receipts, ids, counts, hashes and quoted measurements, and the loss is not
recoverable by search: a search for "lead 1011" no longer matches "lead1011".

EXAMPLES (verbatim, all from gpt-6-astra output)
"passed 6 declared" -> "passed6 declared"
"1136 artifact hashes" -> "1136artifact hashes"
"Of 27 retained rows, 17 have ... and 10 ..." -> "Of27retained rows,17have ... and10have ..."
"ScreenPal graph 706 did not freshly pay" -> "ScreenPal graph706 did not freshly pay"
"Broader probe 155 passed/3 failed" -> "Broader probe155 passed/3 failed"
"Final focused 39/39 passed" -> "Final focused39/39 passed"
"spend $1.33439500" -> "spend$1.33439500"
"receipt 09:57:06 UTC" -> "receipt09:57:06UTC"
"the 31 recent ReadyToSend manifest" -> "the31 recent ReadyToSend manifest"
Note the non-uniformity: 18 occurrences of "graph 706" and 2 of "focused 39/39" in the same
session are intact, while one occurrence of each is joined. It is not a rendering or copy step.

EVIDENCE

  1. First occurrence — ~/.codex/sessions/2026/09/04/rollout-2026-09-04T13-26-06-01a06d74-cd6b-7323-946a-e0afd308afb2.jsonl
    This one process switched model mid-file: gpt-5.6-sol through line 2404, gpt-6-astra from line
    2405 at 19:50:50Z. The first join is at 20:58:39.923Z, in a custom_tool_call (name=exec,
    apply_patch body) — and the identical text appears in the mirrored event_msg item_completed
    FileChange unified_diff, so it was emitted, not received. The gpt-5.6-sol portion of the same
    file contains zero joins; every join in the file is in the gpt-6-astra portion.
  2. It reaches durable files. Committed at HEAD: AGENT_MEMORY.md contains "passed6 declared" and
    "1136artifact hashes" on line 7. 325 join sites across 94 markdown files in the repository.
  3. It propagates between sessions. At 2026-09-05T19:01:19.514Z a gpt-6-astra session emitted a
    send_message_to_thread prompt containing "suite257 passed" and "the31 recent ReadyToSend
    manifest"; the receiving session logged the same text at 19:01:24.002Z, so a joined token is
    carried into a different agent's transcript and its files.
  4. It is in the model's own output, not in a tool. The joined tokens appear in the model's
    reasoning records as well as in tool bodies, and compaction is not the cause: the 09-03 session
    has 53 compaction records, the 09-12 session has none, and both contain joins.

WHAT IT IS NOT

  • Not the CLI version. No gpt-5.6-sol-only session in the corpus (911 transcripts under
    ~/.codex/sessions and ~/.codex/archived_sessions, spanning 2025-09-15 to 2026-09-12 and CLI
    0.35.0 to 0.154.0-alpha.6.2) contains a join, including a 400 MB, a 271 MB and a 119 MB session.
  • Not a display or console artifact: confirmed with File.ReadAllText(path, UTF8) and per-character
    U+XXXX dumps; the file encoding is clean (115 real U+2014 em dashes, 0 mojibake).
  • Not repository tooling: no repo tool writes these files; the joins are present in the
    custom_tool_call input and in the mirrored FileChange diff.
  • Not base64 or ciphertext: matches were filtered by a preceding character class
    ([A-Za-z0-9,)]] (word)[0-9]{1,4}( [a-z]|[a-z]+[A-Z])) and inspected by hand; a bare pattern
    matches base64 bodies and gives false positives.
  • Not Claude Code: 0 hits across 236 transcripts under ~/.claude/projects.

IMPACT
Silent, permanent corruption of the durable record. Two adjacent numbers can merge into a
different number, so a quoted measurement can change value and no reader can tell a corrupted
token from an authored one. Source code is unaffected (0 occurrences in any .cs file; 0 in 189
rows of PromptVersions), so this is a record-integrity defect rather than a data-path defect.

REPRODUCTION
No minimal deterministic repro: it is a low-rate sampling defect. Run gpt-6-astra on a task that
emits long prose containing numbers after words (audit summaries and receipts reproduce it
readily); expect roughly one joined token per 100k characters of emitted text.

REQUEST
Confirm whether this is known, whether a fix has shipped, and whether gpt-6-astra can be pinned to
a dated snapshot so a model change under a fixed name is detectable from the client. The model name
carries no snapshot identifier, so we cannot tell which revision we are talking to — the 09-04
session and the 09-12 session report the same model name with different behavior.

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.

Research direction

Start by reviewing the cited files under ~/.codex/sessions and ~/.codex/archived_sessions, including the custom_tool_call, apply_patch, and send_message_to_thread records. There is no deterministic minimal reproduction or source file named; done would require confirming the model-side cause, identifying whether a fix has shipped, or establishing a dated model snapshot.

Written by the indexing model from the issue text.

Assessment

Domain
ai, cli
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.