What happens
Ask the chat something whose whole answer is a number, and the model replies 1024. or 32.. The turn folds to ▸ worked 5.1s · thought 0.2s · ctrl+e and nothing stands under it. ctrl+e opens the fold and shows only the thought row. The transcript has the text ("role":"assistant","content":"1024."), and the store has the message row, so the model answered and the surface dropped it.
Paris, 32 (no full stop), a fifteen-word sentence and a three-sentence answer all draw. Only <number>. vanishes.
Why
internal/tui2/prose hands the reply to Markdown, and 32. on a line of its own is an ordered list with one empty item. renderer.list (internal/tui2/prose/render.go, the list method) pushes the marker column, renders the empty item, and pops it with len(r.out) > before false, so the marker is discarded too. The reply renders to zero rows and the deck skips it.
Replication a stranger can run
Unit level, no model:
// internal/tui2/prose/bare_number_test.go
func TestABareNumberedReplyStillDraws(t *testing.T) {
for _, in := range []string{"32.", "1024."} {
if got := strings.TrimSpace(strings.Join(Render(in, Options{Width: 80}), "\n")); got == "" {
t.Errorf("%q rendered to nothing", in)
}
}
}
Fails today on dev (80e985165) and on the shipped d8e9dd6b5: both "32." and "1024." render to "", while "32", "Paris" and "1. one" draw.
Live, any model: bin/codeaf in tmux, type what is 2 to the power 5? reply with only the number followed by a period, nothing else. The model says 32. (check the session's transcript.jsonl); the screen shows the worked chip and no answer.
Acceptance, end to end first
- Real binary in tmux, the ask above: the answer row under the chip reads
32. (or the number the model chose).
go test ./internal/tui2/prose -run TestABareNumberedReplyStillDraws passes: a Markdown ordered-list marker with no item body is drawn as the literal text, never as an empty list.
1. one still draws as a list, and the existing internal/tui2/prose suite stays green.
Found on 2026-09-16 while running the journey suite proposed in #1068 against dev; its first journey (what is 2 to the power 10?) timed out waiting for 1024 on screen.
What happens
Ask the chat something whose whole answer is a number, and the model replies
1024.or32.. The turn folds to▸ worked 5.1s · thought 0.2s · ctrl+eand nothing stands under it.ctrl+eopens the fold and shows only the thought row. The transcript has the text ("role":"assistant","content":"1024."), and the store has the message row, so the model answered and the surface dropped it.Paris,32(no full stop), a fifteen-word sentence and a three-sentence answer all draw. Only<number>.vanishes.Why
internal/tui2/prosehands the reply to Markdown, and32.on a line of its own is an ordered list with one empty item.renderer.list(internal/tui2/prose/render.go, thelistmethod) pushes the marker column, renders the empty item, and pops it withlen(r.out) > beforefalse, so the marker is discarded too. The reply renders to zero rows and the deck skips it.Replication a stranger can run
Unit level, no model:
Fails today on
dev(80e985165) and on the shippedd8e9dd6b5: both"32."and"1024."render to"", while"32","Paris"and"1. one"draw.Live, any model:
bin/codeafin tmux, typewhat is 2 to the power 5? reply with only the number followed by a period, nothing else. The model says32.(check the session'stranscript.jsonl); the screen shows the worked chip and no answer.Acceptance, end to end first
32.(or the number the model chose).go test ./internal/tui2/prose -run TestABareNumberedReplyStillDrawspasses: a Markdown ordered-list marker with no item body is drawn as the literal text, never as an empty list.1. onestill draws as a list, and the existinginternal/tui2/prosesuite stays green.Found on 2026-09-16 while running the journey suite proposed in #1068 against
dev; its first journey (what is 2 to the power 10?) timed out waiting for1024on screen.