Skip to content

Retarget the seated-decision tests onto a widget that declares the seat - #151

Merged
max-sixty merged 1 commit into
mainfrom
fix/issue-147
Aug 31, 2026
Merged

Retarget the seated-decision tests onto a widget that declares the seat#151
max-sixty merged 1 commit into
mainfrom
fix/issue-147

Conversation

@leaf-agent

Copy link
Copy Markdown
Collaborator

Problem

ci on main has been red on two nightly browser tests since 292de9c, and #147 diagnosed why: both guard the layer's one split between the reader's list and the unanswered decisions — a thread standing in a widget's own x-conversation seat takes it off the reader's list without answering it — and lf-options was the only shipped entry that both awaited and seated. That commit made the reader's cell an add form and dropped x-conversation, so the pair the split needs can no longer be produced by the shipped layer, and neither test could reach the behaviour it was written for.

Solution

The split is layer-generic on both sides (seat_with_agent in Python, standingIn reading unansweredDecisions in the runtime), and both halves are still implemented and still described. So the pair is declared in the test layer rather than borrowed from whichever shipped tag happens to carry it: a project-package entry and module handed to serve through layer_registry/layer_widgets, the way lf-feed and lf-tally already are. Its module paints the answer before it sends, which is what lf-options does with a pick and the reason the browser door matters as much as the POST one.

This is option 2 of the three #147 lays out, and the only one that decides nothing about the product: it changes no shipped registry entry, module, theme rule or runtime file. Whether lf-options should seat a conversation again (option 1, which would also give an options group its inline thread view back) and whether the split should be retired (option 3) are both still open — this just stops main being red while they are.

tests/CLAUDE.md gains the rule the change follows, so the next guard over a declaration-driven reading is written against a widget that declares it rather than against today's shipped carrier.

Why the substitutions #147 tried do not work

Reproduced from #147's analysis, all three confirmed here:

  • an honored chosen pick takes the group off the reader's list but answers it, so actionAvailable's awaiting prerequisite legitimately refuses the press;
  • a lf-task talk seat is x-awaits: {rollup: true}, so it never enters the visible list, and a local x-awaits added in an overlay is refused at the registry door (x-awaits local decision declares no answer verbs);
  • putting x-conversation back on lf-options in a test overlay builds a layer the render gate rejects (missingConversations), because conversationBox placement is the module's.

Testing

On this branch, rebased onto aa41f7a:

  • uv run pytest tests — 740 passed, 6 skipped. Run one rebase earlier, on 7d219d1; the two named tests were re-run after the rebase onto aa41f7a and pass there.
  • Both named tests pass under --run-nightly, and both were mutation-checked against the reading they exist for. Flipping answeredContext to context(false) (the reader's list) fails the controls test at assert [] == ['settle'] — the same shape as the assert [] == ['choose'] the old fixture produced. Flipping standingIn to read openDecisions() fails the navigation test at the ring: #shape-decision wears no data-lf-decision.
  • uv run pytest tests/test_render_controls.py tests/test_render_navigation.py --run-nightly — 119 passed, 6 failed. I re-ran all six on a clean main and each failed identically there, so none is caused by this branch. Update the option-group tests for the removed seat, and ring the add field #148 edits two of them (test_a_questions_digits_are_drawn_whole, test_c_in_a_seated_conversation_reaches_the_thread_it_is_in) and its theme.css change is the fix its body claims for test_every_ring_the_layer_draws_is_shown_whole_somewhere_in_the_corpus; the remaining three — test_a_label_press_keeps_the_controls_keyboard_standing, test_the_responsive_action_shelf_keeps_primary_actions_in_reach and test_coarse_pointer_resize_reach_stays_reachable_without_trapping_scroll — are red on main independently of both branches.
  • pre-commit run --files over the diff — passed.

No overlap with #148, which fixes the other seventeen failures from the same commit and explicitly leaves these two here.


Closes #147

The two guards over the split between the reader's list and the unanswered
decisions — a thread standing in a widget's own `x-conversation` seat takes it
off the reader's list without answering it — rested on `lf-options`, the one
shipped entry that both awaited and seated. 292de9c made the reader's cell an
add form and dropped `x-conversation`, so the pair could no longer be produced
and both tests have failed on every `ci` run since.

The split is layer-generic on both sides (`seat_with_agent`, `seatWithAgent`),
so declare the pair in the test layer rather than borrowing whichever shipped
tag happens to carry it: a project-package entry and module supplied through
`serve`'s `layer_registry`/`layer_widgets`, the way `lf-feed` and `lf-tally`
already are. Whether `lf-options` should seat a conversation again is left open.

Closes #147
@leaf-agent

Copy link
Copy Markdown
Collaborator Author

Rebased onto 4b5b4b8. The branch had gone CONFLICTING once #148 landed: both branches add a name to render_support.py's render_cases_interaction import block and to __all__ at the same two points, #148's SEATED_QUESTION_PAGE and this branch's SEATED_ASK_LAYER/SEATED_ASK_WIDGETS. Both sets are still used — SEATED_QUESTION_PAGE by test_render_drafts.py, the two seat names by test_render_controls.py and test_render_navigation.py — so the resolution is the union, in alphabetical order like the rest of both lists. Nothing else in the diff moved.

Verified on the rebased tree: uv run pytest tests/test_render_controls.py tests/test_render_navigation.py --run-nightly — 126 passed, which is both files whole rather than only the two tests this fixes; uv run pytest tests — 740 passed, 6 skipped.

Dispatched by the nightly run 33342915540 on 2d46d4a, where test_a_seat_conversation_leaves_the_pick_it_is_about_live and test_the_ring_holds_on_a_seat_the_agent_has_still_to_answer were 2 of 31 failures. Rerunning all 31 against 4b5b4b8 leaves these two, test_a_coined_class_cannot_reach_the_chromes_rules (#152) and the catalog preview digest (#134).

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ci-fix: two nightly tests guard a seat no shipped widget still has

2 participants