Repository navigation
An ask-back on a turn-blocking question lets the turn end, and the question is withdrawn out from under the person who asked #1006
Description
What happened
On 2026-09-12, twice in a row, TestQuestionsE2E/TheRoomComparesAnnotatesAsksBackAndSends on deepseek/deepseek-v4-flash reached the page, opened the compare table, left a comment, and pressed ? to ask the asker one thing about an answer. The exchange arrived and was kept with the answer — and then the question went away before it could be answered:
› Call the ask tool now, exactly once, and run nothing else. head "which store should the ledger sit on?", …
▸ worked 29s · 2 steps · 2 tool calls · ctrl+e
They countered your pick mid-flight — the question is on their screen but they added a
constraint: "does the reporting job read it directly?" That changes the dimensions. I
need to answer that inline rather than re-ask.
Answer: The reporting job reads it directly — it already queries the postgres instance
where the ledger table would live. …
─ ledger schema change store decision · deepseek/deepseek-v4-flash · ⠿ auto · via wafer · main ──── /…
⊘ which store should the ledger sit on? — no longer needed · the turn moved on without it
› 2
The question was raised with blocking {"turn":true}. A person who used the door the page offers — ?, "ask it one thing about this answer" — is answered in prose and then told the decision they were being asked for is no longer needed, with their 2 sitting unsent in the box. Nothing was decided; the turn simply moved on.
— no longer needed · the turn moved on without it is the withdrawal's own wording, which is right for a question whose subject went away. Here the subject did not go away: the person is still being asked, and the asker answered the side question and then stopped.
Replication
Deterministic (no model). The half that can be pinned without one is the engine's: a question raised with Blocking.Turn and an ask-back exchange outstanding may not be withdrawn by the turn ending — the turn is what it is blocking. That is a internal/session test around the withdrawal door: raise a turn-blocking question, deliver an ask-back, let the turn end, and assert the question is still open (and the turn is not).
Field (real models). Fires on the scenario written for the page:
make build
go test -tags e2e -run 'TestQuestionsE2E/TheRoomComparesAnnotatesAsksBackAndSends' -count=1 -timeout 20m -v ./internal/e2e/Needs OPENROUTER_API_KEY (via liveKey) and tmux; about four and a half minutes and a cent or two. Observed on two consecutive runs at 10:44 and 10:52 UTC on 2026-09-12, from fix/e2e-question-needles (e05b0ffa5 and b37a9a4d2, both branches off dev@0ce30c776 touching only internal/e2e and one manual line). Every step before the ask-back passes: the page opens, → detail hands the arrows to the evidence pane, x builds the compare table on the asker's dimensions, c attaches a comment. The failures are the three assertions after it —
questions_e2e_test.go:649: waited 15s for ["answering "] and never saw it
questions_e2e_test.go:655: waited 30s for ["✓ "] and never saw it
questions_e2e_test.go:683: the answer never reached the asker: no tool result in this conversation's journal carries the pick and the words typed beside it
What makes it fire: an ask-back on a question the turn is blocked on, where the model chooses to answer in prose rather than re-raise. It is not specific to this steer — it is what a model does when a question comes back at it mid-turn.
Where
- The withdrawal the screen shows: search
no longer neededandthe turn moved on without it. - The ask-back road:
questionAskBackPromptWordandaskBackCmdininternal/tui3/questionroom.go. - The blocking claim:
Blockingonsession.Question, and whatever ends a turn while one is outstanding ininternal/session's loop. - The scenario:
questionsRoomininternal/e2e/questions_e2e_test.go, afterpress(t, r, "?").
The fix
A question the turn is blocked on is not something the turn may walk away from. Either the turn stays open until the question is answered or put off — which is what blocking {"turn":true} says — or, if a turn genuinely may end under one, the question survives it and the person's answer still reaches the asker on the next turn. What must not happen is the third thing: the question withdrawn, the person's keystrokes dropped, and a receipt for a decision nobody made.
An ask-back is the case that exposes it because it is the one door that hands the model something to do while the question stands.
Acceptance
- e2e:
TestQuestionsE2E/TheRoomComparesAnnotatesAsksBackAndSendspasses ondeepseek/deepseek-v4-flash: after the ask-back is answered, the foot still saysanswering,entersends, the receipt's settled mark appears, and the journal carries a tool result with the pick and the words typed beside it (\"picked\":[\"2\"]andbut keep the sqlite file as the source of truth). - Unit: a
internal/sessionlaw that a turn-blocking question is not withdrawn by its turn ending — and, if that is allowed by design, that the answer still reaches the asker afterwards. Name whichever the ruling picks. - The screen never says
— no longer neededabout a question a person is standing in front of with an answer composed.
Found on 2026-09-12 while un-rotting the questions e2e needles (#998). Not caused by that work: the scenario could not reach this point at all before, because it was waiting on needles #933 had respelled.
Drafted with CodeAF · reviewed and owned by the author
Activity
santoshkumarradha commentedon Sep 17, 2026
Confirmed on a clean dev, three runs out of three.
2026-09-16,
dev@09299019b(fresh checkout on the spark host, verified equal togit ls-remote origin refs/heads/dev,make buildthere):TheRoomComparesAnnotatesAsksBackAndSendsred in all three runs (254.68s, 267.68s, 257.74s), with the same two needles this issue names:One difference from the runs recorded above:
questions_e2e_test.go:649(waited 15s for ["answering "]) passed here, so the foot did sayanswering. The captured screen at failure shows the asker's transcript reading "Option 2 (SQLite) was picked, with 'but keep the sqlite file as the source of truth' typed beside it." The receipt never rendered and no journal tool result carries the pick and the words.The same three runs pass
TestQuestionsE2E/ACardCountsDownToItsPickAndEnterTakesIt(11.00s, 10.23s, 10.56s), and a manual arrows-then-Enter drive on the same binary took the answer and left the receipt, so the swallow is on this road and not on the key.Logs on the spark host:
/tmp/qe2e_run1.log,/tmp/qe2e_run2.log,/tmp/qe2e_run3.log.drafted with CodeAF