Codex: gpt-6-astra intermittently deletes spaces at word/number boundaries in emitted text
Nobody has claimed this yet.
- 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
- 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. - 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. - 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. - 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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