fix(codex): recognize dim status suffix - #141
Merged
Merged
Conversation
Owner
This was referenced Aug 30, 2026
AltanS
added a commit
that referenced
this pull request
Aug 30, 2026
Brings #140, #141, #142 and #121 across. Two of them needed a hand on the way in, because git merged the text and not the meaning: · codex/markers.ts — #141 was written against main's `CONTROL_CHARS` regex. v1 replaced that constant with `hasControlChar()`, which scans by code unit the way links.ts does. The merge took #141's new `isDimSuffixFieldSegment` verbatim, so it called a name v1 had deleted. Swapped to the function; the two are byte-equivalent, tab exempted on both sides. · omp/markers.test.ts — #142's new cases bind `const row`, and this file has a module-level `row(name, i)` helper. main has no lint gate so it passed there; v1's oxlint calls it no-shadow, and it is right to. Renamed to `borderRow`, which is what v1's own version of the conflicted case already used. The one textual conflict was the same assertion under two names. Took main's "painted in one foreground end to end" — after #142 the rule reads a colour CHANGE, so v1's older "no unstyled text to anchor against" no longer describes what is being tested.
AltanS
added a commit
that referenced
this pull request
Aug 30, 2026
AltanS
added a commit
that referenced
this pull request
Aug 31, 2026
fix(codex): recognize dim status suffix
AltanS
added a commit
that referenced
this pull request
Aug 31, 2026
Brings #140, #141, #142 and #121 across. Two of them needed a hand on the way in, because git merged the text and not the meaning: · codex/markers.ts — #141 was written against main's `CONTROL_CHARS` regex. v1 replaced that constant with `hasControlChar()`, which scans by code unit the way links.ts does. The merge took #141's new `isDimSuffixFieldSegment` verbatim, so it called a name v1 had deleted. Swapped to the function; the two are byte-equivalent, tab exempted on both sides. · omp/markers.test.ts — #142's new cases bind `const row`, and this file has a module-level `row(name, i)` helper. main has no lint gate so it passed there; v1's oxlint calls it no-shadow, and it is right to. Renamed to `borderRow`, which is what v1's own version of the conflicted case already used. The one textual conflict was the same assertion under two names. Took main's "painted in one foreground end to end" — after #142 the rule reads a colour CHANGE, so v1's older "no unstyled text to anchor against" no longer describes what is being tested.
AltanS
added a commit
that referenced
this pull request
Aug 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The symptom
Every reply sent from Collie to a current Codex pane was refused with:
The composer was visibly present and held an ordinary one-line draft (
test); no dialog was open.The cause
Current Codex paints the final collaboration-mode status field together with its separator as one
dim ANSI segment:
Collie's context-less status-row detector accepted only alternating coloured fields and standalone
dim separators. It therefore rejected this valid status row, so
locateComposerreturnednulland the guarded reply path refused to type.
This is separate from #140: that PR fixes deeper indentation in multiline draft continuation rows;
this failure occurs with a one-line draft and is in the status-row parser.
The fix
Accept one combined dim
separator + fieldsuffix only when it follows at least two ordinarycoloured fields and is the final segment. The existing paint checks, field bounds, control-character
rejection, and tail-anchored prompt/status shape remain intact. Unstyled lookalikes still fail closed.
Evidence
The parser was run directly against the affected live pane's
format:ansioutput after the change:{"composerReady":true,"draft":"test","status":[" gpt-5.6-sol medium · ~/.herdr/worktrees/kausate/feature-kau-6102-repair-dex-services-and-run-tabs · Main [default]"]}The rebuilt Collie page was reloaded against that pane; the false refusal disappeared and the draft
remained ready to send.
Tests
collie-ctl.test.sh: passedscripts/check-version.sh: passed at 0.36.0Per
CLAUDE.md, version files andCHANGELOG.mdremain untouched because this is a fork PR.Suggested changelog line: