Skip to content

The tmux e2e suite is 7/18 red on the trunk, and nothing in CI would ever say so #1361

Open

Description

@santoshkumarradha

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.

  1. No workflow runs the tagged suite. .github/workflows/ci.yml and
    ci-full.yml mention e2e only as "the words the e2e suite waits for" — the
    untagged gate. The nightly Full check runs the full tests in three shards,
    the cross-build matrix and make test-remote, and has a page on a red nightly job ready to open an issue, but the tagged suite is not among its
    legs. So it runs only when a person runs it.
  2. The untagged words gate cannot see this class of rot.
    internal/e2e/tuiwords_test.go is read back against internal/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 + " · " + placeHintTail being 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.
  3. There is no ledger to check a red against. .github/known-red.txt burned
    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.log

Capture 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.

  1. 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.
  2. A scheduled job runs the tagged suite and pages on a red, the way
    ci-full.yml's page on a red nightly job 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 on dev, or a leg on the
    way into staging, or a recorded human ritual with a stated cadence. Any of
    the three closes the gap; leaving it to whoever remembers does not.
  3. 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

  1. santoshkumarradha commented on Sep 22, 2026

    @santoshkumarradha
    MemberAuthor

    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:

    --- PASS: TestTUIE2E (173.93s)
        --- PASS: TestTUIE2E/home_opens_on_launch_as_seven_panels (4.23s)
        --- PASS: TestTUIE2E/a_real_conversation_on_the_panels_and_its_search_card (5.87s)
        --- PASS: TestTUIE2E/answer_from_home_across_two_windows (15.69s)
        --- PASS: TestTUIE2E/the_projects_panel_is_the_view_by_project (3.21s)
        --- PASS: TestTUIE2E/a_refused_task_proposal_draws_no_schema_sentence (69.83s)
        --- PASS: TestTUIE2E/space_in_the_task_room_pages_the_card (75.09s)
    

    Where I was wrong, since the reasoning matters more than the verdict:

    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 bounds
    the 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 here out of the row margin
    into 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 third
    acceptance 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 Down the 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. TaskOnTheRunEngine remains red and is being fixed separately.

  2. added
    sev:seriousWrong or missing behaviour a person meets in ordinary use
    area:testsThe suite itself — flakes, harnesses, laws, CI reds
    on Sep 23, 2026
  3. AbirAbbas commented on Sep 24, 2026

    @AbirAbbas
    Collaborator

    Hand test on 2026-09-24 with deepseek/deepseek-v4-flash: #1410 at bdb08cfa1 passed 9 and failed 10 tagged TestTUIE2E subtests; merge-base c26ea9c98 passed 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, and TaskOnTheRunEngine. New in #1410, TaskOnTheDefaultBelt fails again alone: it waits for a running plan row, → what ran under it, ✓ · done · branch kept, and a note box; the surface shows a working task row and enter open the chat, then a settled page with brief/notes/steps and no note box. It looks like the same shape as TaskOnTheRunEngine above; not diagnosed further.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:testsThe suite itself — flakes, harnesses, laws, CI redsbugSomething the code does that it should notsev:seriousWrong or missing behaviour a person meets in ordinary use

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions