Repository navigation
The tmux e2e suite is 7/18 red on the trunk, and nothing in CI would ever say so #1361
Description
What is wrong
TestTUIE2E — the only suite that drives the real binary in a real terminal
against a real model — fails 7 of its 18 subtests on clean santos/dev2, and
no scheduled job runs it, so nothing reports this.
Measured twice on the Spark cluster with a real model, same result both times.
Clean origin/santos/dev2 at 8a83f4132, 837 seconds:
| subtest | what the screen says |
|---|---|
home_opens_on_launch_as_seven_panels |
home's foot is not the resting sentence (tui_e2e_test.go:391) |
a_real_conversation_on_the_panels_and_its_search_card |
where you were does not lead with this window's own here row (:510) |
answer_from_home_across_two_windows |
the asking row is not under needs you (:1131), although the chips themselves are offered |
the_projects_panel_is_the_view_by_project |
the projects panel has no row for groupws, alpha, beta or gamma (:1367) |
a_refused_task_proposal_draws_no_schema_sentence |
waited 30s for enter open its room and saw nothing (:1943) |
space_in_the_task_room_pages_the_card |
same cause as the row above |
TaskOnTheRunEngine |
the run's plan row is deduped away by title, so Enter opens an empty room (:2173, :2231) |
Why nothing noticed
Three gaps compound, and each one alone would be survivable.
- No workflow runs the tagged suite.
.github/workflows/ci.ymland
ci-full.ymlmention e2e only as "the words the e2e suite waits for" — the
untagged gate. The nightlyFull checkruns the full tests in three shards,
the cross-build matrix andmake test-remote, and has apage on a red nightlyjob ready to open an issue, but the tagged suite is not among its
legs. So it runs only when a person runs it. - The untagged words gate cannot see this class of rot.
internal/e2e/tuiwords_test.gois read back againstinternal/tui3's own
sources, which catches a respelled string. It does not catch a needle that
still exists but no longer sits where the assertion looks: home's foot fails on
homeFootWord + " · " + placeHintTailbeing adjacent while both words are
present in the source. Adjacency, row order, and which heading a row is filed
under all pass the gate and fail the drive. - There is no ledger to check a red against.
.github/known-red.txtburned
to zero on 2026-09-12 (provider, cmd/aforge: the last loose locks hold their mutex from a defer (review needed) #1012) and the file is gone, deliberately — the
Makefile's read survives so a ledger cannot quietly return. That is the right
end state, and it means every one of the seven is unaccounted-for debt rather
than a known shape.
This is #184 recurring, with the cause #576 named: a suite nobody runs reports
green by not running.
Replication a stranger can run
Needs a provider key resolved the way the product resolves one (liveKey goes
through config.APIKeyAt, so OPENROUTER_API_KEY, OPENAI_API_KEY or the
profile's own api_key row all work), tmux, and about fifteen minutes and a few
cents:
git worktree add --detach /tmp/e2e-baseline origin/santos/dev2
cd /tmp/e2e-baseline
make build
go test -tags e2e -count=1 -timeout 40m -v -run '^TestTUIE2E$' ./internal/e2e/ > /tmp/e2e.log 2>&1
grep -E '^\s*--- (PASS|FAIL): ' /tmp/e2e.logCapture to a file; the screens it logs are far too wide to read through a pipe.
Acceptance
End-to-end first, on the real door.
- Every subtest above either passes under
go test -tags e2e -count=1 -timeout 40m -v -run 'TestTUIE2E/<name>' ./internal/e2e/
with its PASS line quoted, or is a filed defect with the subtest left red on
purpose and a sentence saying which. - A scheduled job runs the tagged suite and pages on a red, the way
ci-full.yml'spage on a red nightlyjob already does for the shards. The
suite needs a key and costs money, so this is a decision about budget and
cadence rather than a line to add: a keyed nightly ondev, or a leg on the
way intostaging, or a recorded human ritual with a stated cadence. Any of
the three closes the gap; leaving it to whoever remembers does not. - A test that fails when the words gate's blind spot returns — that is, one
asserting the screen's adjacency for at least the foot sentence, so the
next drift is caught by the cheap untagged run rather than by a paid drive.
Not in scope here
TaskOnTheRunEngine's cause is being fixed separately, because making the worker
harness the default belt promotes it from an opt-in road to the one everybody
gets.
Drafted with CodeAF · reviewed and owned by the author
Activity
santoshkumarradha commentedon Sep 22, 2026
Correction: all six are the suite, not the product. Two of my suspicions were wrong.
The triage is done and every one of the six was the suite falling behind a
deliberate surface change. No defect issue needed filing. PR #1360 repairs
them and all six now pass against a real model:
Where I was wrong, since the reasoning matters more than the verdict:
projectspanel drew no rows. It drew all four. tui3: a home panel stands where its content puts it #1046 pinnedprojectsandspendto the rail — the RIGHT column — and the helperpanelColumn(screen, "projects", tuiPlain/2)cut every line at cell 60 andread sixty blank cells. The panel was plainly on the screen in the capture I
was reading.
needs you. It was. tui3: a home panel stands where its content puts it #1046 struck thelive count off that heading, and the assertion had been matching
needs you ·to tell the heading from the front of the gate's ownneeds your ok …. It was matching a string home had stopped drawing.tui_e2e_test.go:1943; Restore the one-shot exec harness on chat-v2 #5 fails in a different file(
refusedargs_e2e_test.go:58) on a synchronisation wait, and its two realassertions were already passing.
So the lesson lands harder than the one in the issue, not softer: a panel
geometry helper given a hardcoded column fraction is a check that cannot fail
honestly. It reported four missing rows for a panel that was drawn correctly,
and it would have gone on doing so through any future change. #1360 replaces it
with
panelBlock, which finds a panel by its heading's own position and boundsthe read to that panel's own columns, so a row on the panel beside it still
fails.
One cause worth naming for the record: #1046 alone accounts for four of the
six. One wave moved home's foot clause, moved
hereout of the row margininto the description, struck the count off a heading, and pinned two panels to
the rail. Each move was deliberate and entered in the changelog; none of them
could be seen by the untagged words gate, because every needle still existed
somewhere in
internal/tui3. That is the blind spot this issue's thirdacceptance item asks to close, and it is now the most valuable of the three.
The other two causes: #938 replaced a 5s sleep in the refused-proposal scenario
with a reminder-card wait borrowed from another scenario, so that assertion was
wrong from the day it landed; and #905 folded every family on the tasks page
shut, so the
Downthe room scenario pressed had nowhere to go.Acceptance items 2 and 3 of this issue are still open and still worth doing:
nothing runs the tagged suite on a schedule, and nothing cheap catches
adjacency.
TaskOnTheRunEngineremains red and is being fixed separately.build: the pull-request gate runs on santos/dev2 as well as dev (#1362)
AbirAbbas commentedon Sep 24, 2026
Hand test on 2026-09-24 with
deepseek/deepseek-v4-flash: #1410 atbdb08cfa1passed 9 and failed 10 taggedTestTUIE2Esubtests; merge-basec26ea9c98passed 9 and failed 9. Eight were red on both:home_opens_on_launch_as_seven_panels,ask_here_end_to_end,the_firing_reaches_the_person,answer_from_home_across_two_windows,hover_previews_the_match_under_the_pointer,the_projects_panel_is_the_view_by_project,space_in_the_task_room_pages_the_card, andTaskOnTheRunEngine. New in #1410,TaskOnTheDefaultBeltfails again alone: it waits for arunningplan row,→ what ran under it,✓ · done · branch kept, and a note box; the surface shows aworkingtask row andenter open the chat, then a settled page withbrief/notes/stepsand no note box. It looks like the same shape asTaskOnTheRunEngineabove; not diagnosed further.