⚓ ci: Settle the E2E Reply Before the Double-Click Quote - #14840
Merged
Conversation
`agent-skills-added.spec.ts` drives the composer's `+` command, which opens the
added-model popover. That path is gated on MULTI_CONVO.USE:
if (!hasMultiConvoAccess || !plusCommandEnabled || isAssistantsEndpoint(endpoint)) return;
The mock config never sets `interface.multiConvo`, so the permission falls
through to the seeded role default and `handlePlusCommand` returns before
opening the popover. The spec then fails on a popover that is absent from the
DOM entirely, which reads as a selector or timing problem rather than a missing
permission.
Set it explicitly, the same way `contextCost` is set just above for the usage
gauge — the mock config's job is to make each exercised feature's gate explicit
rather than inherit a default.
`quotes.spec.ts` › 'summons the popup from a native double-click word selection' double-clicks a word as soon as `mockReply` becomes visible. But `sendMessage` resolves on the stream *response*, not on the final render, so the reply can still be re-rendering. A streaming markdown re-render swaps out the text node the selection points at, which collapses the selection — the same mechanism the sibling `selectionchange` test documents deliberately. A double-click landing mid-stream therefore loses its selection before the popup can be clicked, and because the whole gesture is wrapped in `toPass`, every retry re-runs into the same still-streaming reply rather than recovering from a one-off. This is a different race from the one #14777 fixed. That one is the *selection* still settling (touch long-press, native handle drags, block-granularity gestures) and is handled inside QuoteButton. This one is the *reply* still streaming, which no amount of component-side settling can absorb. Observed on a downstream fork running this suite on slower hardware: the test fails all three attempts, deterministically on the in-memory stream store while the Redis lane passes the same shard — the in-memory store's final re-renders land late enough to outlive the gesture. Four separate runs, same split. Wait for the reply text to hold steady before selecting.
danny-avila
force-pushed
the
danny-avila/e2e-quotes-reply-settle
branch
from
August 15, 2026 12:44
4b2804f to
4867994
Compare
danny-avila
force-pushed
the
danny-avila/e2e-multiconvo-permission
branch
from
August 15, 2026 12:44
b92e4c8 to
cb0d6f5
Compare
`playwright.config.mock.ts` sets `video: 'on-first-retry'`, but the runner only installs `install-deps chrome`, which does not include ffmpeg. Without it the first retry fails inside `browserContext.newPage` while setting up video recording — before the test body runs. The cost is the retry itself: a genuinely flaky test loses the attempt that would have recovered it, and the reported failure is a video-setup error rather than the original symptom. Bounded and non-fatal on purpose. The CLI has been observed hanging after the download completes on these runners, so the step is wrapped in `timeout` and its failure is swallowed — if ffmpeg cannot be installed the job proceeds exactly as it does today, and no lane is blocked on it. Applied to both jobs that run Playwright (`e2e_shards` and `mcp_tool_list_changed`), since both configure retries.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stack 3/4 — base
danny-avila/e2e-multiconvo-permission. Content isindependent; only the base is chained.
Problem
quotes.spec.ts› summons the popup from a native double-click word selectiondouble-clicks as soon as
mockReplyis visible. ButsendMessageresolves onthe stream response, not the final render — so the reply can still be
re-rendering.
A streaming markdown re-render swaps out the text node the selection points at,
collapsing the selection. That's the same mechanism the sibling
selectionchangetest documents deliberately. A double-click landing mid-streamloses its selection before the popup can be clicked — and because the gesture is
wrapped in
toPass, every retry re-runs into the same still-streaming replyrather than recovering from a one-off.
This is not the race #14777 fixed
QuoteButtonNo amount of component-side selection settling absorbs a text node that gets
replaced underneath it.
Evidence
Observed on a downstream fork running this suite on slower hardware: the test
fails all three attempts, and does so deterministically on the in-memory
stream store while the Redis lane passes the same shard — the in-memory
store's final re-renders land late enough to outlive the gesture. Four separate
runs, same split.
Change
Wait for the reply text to hold steady before selecting. Local helper, no
change to any other test.