Skip to content

⚓ ci: Settle the E2E Reply Before the Double-Click Quote - #14840

Merged
danny-avila merged 3 commits into
devfrom
danny-avila/e2e-quotes-reply-settle
Aug 15, 2026
Merged

⚓ ci: Settle the E2E Reply Before the Double-Click Quote#14840
danny-avila merged 3 commits into
devfrom
danny-avila/e2e-quotes-reply-settle

Conversation

@danny-avila

Copy link
Copy Markdown
Owner

Stack 3/4 — base danny-avila/e2e-multiconvo-permission. Content is
independent; only the base is chained.

Problem

quotes.spec.tssummons the popup from a native double-click word selection
double-clicks as soon as mockReply is visible. But sendMessage resolves on
the 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
selectionchange test documents deliberately. A double-click landing mid-stream
loses 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 reply
rather than recovering from a one-off.

This is not the race #14777 fixed

race handled
#14777 the selection is still settling (touch long-press, handle drags, block gestures) in QuoteButton
here the reply is still streaming needs an explicit wait

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

`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
danny-avila force-pushed the danny-avila/e2e-quotes-reply-settle branch from 4b2804f to 4867994 Compare August 15, 2026 12:44
@danny-avila
danny-avila force-pushed the danny-avila/e2e-multiconvo-permission branch from b92e4c8 to cb0d6f5 Compare August 15, 2026 12:44
@danny-avila danny-avila changed the title test(e2e): wait for the reply to settle before the double-click quote ⚓ test(e2e): Settle the Reply Before the Double-Click Quote Aug 15, 2026
`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.
Base automatically changed from danny-avila/e2e-multiconvo-permission to dev August 15, 2026 14:47
@danny-avila danny-avila changed the title ⚓ test(e2e): Settle the Reply Before the Double-Click Quote ⚓ ci: Settle the E2E Reply Before the Double-Click Quote Aug 15, 2026
@danny-avila
danny-avila merged commit e1ac7d2 into dev Aug 15, 2026
7 checks passed
@danny-avila
danny-avila deleted the danny-avila/e2e-quotes-reply-settle branch August 15, 2026 14:48
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.

1 participant