Spun out of daily-failure triage #1057 (run 30444299314, 2026-07-29).
Upstream: not filed
Corrected 2026-07-30 from the run artifacts. The original body attributed this
flake to the error-feedback selector and claimed a single test with no grouping. The
JSON reports of all three runs show the timeout is in setupChatFlow, waiting for
the sidebar search input to become visible — before the error is ever provoked — and
that three further specs hit the same condition. Symptom, grouping, preliminary read
and investigation directive were rewritten accordingly; see the correction comment for
the raw call logs.
Symptom
Four @stable specs flaked (recovered on retry) with the same shape — [data-testid="sidebar-search-input"] is present in the DOM but never becomes visible, so the sidebar-entry step of the setup times out. In every case the failure is in the setup that enters a blank flow and filters the sidebar, before the test's own subject is exercised.
| Spec (line) |
Waits for |
Signature |
tests/tests-automations/regression/ui-ux/execution-error-notification.spec.ts:54 ("executing flow with server error shows error feedback", declared at :139) |
waitForSelector('[data-testid="sidebar-search-input"]') — state visible, 30 s |
TimeoutError: page.waitForSelector: Timeout 30000ms exceeded. |
tests/tests-automations/regression/core-functionality/playground/playground-clear-history.spec.ts:43 ("clear chat on Default session must remove messages but keep the session", declared at :110) |
getByTestId('sidebar-search-input').fill(...) — 20 s |
TimeoutError: locator.fill: Timeout 20000ms exceeded. |
tests/tests-automations/regression/core-components/api-request-component-regression.spec.ts:100 ("API Request component — non-2xx HTTP response propagates status_code without crashing", declared at :560) |
getByTestId('sidebar-search-input').fill(...) — 20 s |
TimeoutError: locator.fill: Timeout 20000ms exceeded. |
tests/tests-automations/regression/core-functionality/playground/output-modal-copy-button.spec.ts:67 ("copy button copies Chat Input output and toggles Check icon", declared at :39) |
getByTestId('sidebar-search-input').fill(...) — 20 s |
TimeoutError: locator.fill: Timeout 20000ms exceeded. |
Occurrences by run:
| Run |
Date |
Specs hit |
| 30444299314 |
2026-07-29 |
execution-error-notification, playground-clear-history |
| 29822019255 |
2026-07-21 (10:23) |
execution-error-notification, api-request-component-regression |
| 29832136328 |
2026-07-21 (12:55) |
output-modal-copy-button (execution-error-notification passed) |
The 12:55 run of 07-21 is not the entry recorded in reports/daily-history.jsonl for that date (only 29822019255 is), so its signature is cited from the run's JSON artifact rather than the history row.
The line numbers in the first column are the failing lines; the history rows key on the test() declaration line, which is what the original body carried as the failure site.
Why these failures are one cause
The shared dimension is the element and its state, not the signature: all four resolve [data-testid="sidebar-search-input"] successfully and then time out because it is not visible.
execution-error-notification uses page.waitForSelector (default state visible), and the call log records 4 × locator resolved to hidden <input … data-testid="sidebar-search-input" …>.
- The other three use
locator.fill, whose actionability check is visible, enabled and editable; their call logs record repeated element is not visible against the same resolved input — playground-clear-history logs 2 ×, then element was detached from the DOM, retrying, then a further 39 × invisible over the 20 s.
The signatures differ (page.waitForSelector 30 s vs. locator.fill 20 s) purely because the specs use different Playwright APIs against the same element with different timeouts. TimeoutError: locator.fill: Timeout 20000ms exceeded. is generic on its own, so the grouping does not rest on it: the second shared dimension is the identical testid plus the identical actionability reason (not visible on a resolved element) plus the identical step (entering a blank flow, then filtering the sidebar).
All four specs are also structurally identical at the failure point: awaitBootstrapTest → click blank-flow → wait on / fill sidebar-search-input.
Cross-day recurrence is a property of this condition, not of any single spec: it appears on 2026-07-21 and 2026-07-29, and on 07-21 it hit two different specs in two different runs while execution-error-notification passed in one of them.
Preliminary read (descriptive — NOT a verdict)
The 2026-07-29 run was a mass-failure day (10 hard + 12 flaky, guard threshold 5 crossed). The triage verdict on the day itself was environmental for the hard failures: 6 of the 10 are a 20 s timeout on GET /api/v1/auto_login in shards where every provider was green and the post-collect-models health gate had already passed (#1030), and two shards executed zero tests after a credentials-preflight abort (#1058). That verdict governs the hard failures and does not extend to this cluster.
The 2026-07-21 10:23 occurrence is on a run that recorded only 3 hard failures and did not trip the guard, so the condition is not confined to mass-failure days.
Two observations bound the search, both descriptive:
- The failure is in setup, not in the subject under test. For
execution-error-notification specifically, the provoked 503 is served by page.route(…).fulfill() — resolved in the browser, never reaching the backend — and that route is registered only after setupChatFlow and openPlayground return. The provoked request therefore cannot be the thing that hangs. What does reach the backend before the failing wait is the blank-flow bootstrap and the sidebar's component load, which is where an instance-saturation influence would have to act.
- The element is not missing and the testid has not drifted. It resolves every time; it stays invisible. Whatever renders the sidebar collapsed / zero-size, or remounts it invisible (
element was detached from the DOM, retrying), is the surface to look at — not the selector.
Investigation directive
Investigate all paths independently, product as prime suspect first:
- On the current nightly, confirm whether the sidebar reliably becomes visible after entering a blank flow — and determine what state the sidebar is in when it does not (collapsed, zero-width, mid-remount, behind a still-closing templates modal). Rule out a Langflow regression in the flow-page sidebar mount before concluding anything test-side.
- Establish a rate at
--retries=0. The signal is load-dependent (it appeared in runs of 236–410 tests in parallel and recovered on retry every time), so an isolated local run coming back green does not clear the condition — reproduce under parallel load, or from the CI lane.
- From the 07-21 and 07-29 traces, determine whether the sidebar's component-list request had returned by the time the wait started, and whether the remount recorded in
playground-clear-history correlates with a backend response arriving late.
- Only after ruling out a product regression, consider: (a) transient saturation → prove on 3 environments and restore; (b) wait-strategy fragility → the four specs each hand-roll the sidebar-entry wait, so decide whether the deterministic observable belongs in a shared helper rather than being re-derived per spec.
Note that the original directive's items on the provoked request hanging, on error-feedback selector drift, and on replacing the live failing execution with a deterministic error injection are moot: the run is already deterministic and client-side mocked, and the failing selector is not the error-feedback one.
Deliverables (Done when)
Flake signal
The condition is confirmed recurrent (dailies 2026-07-21 and 2026-07-29). One spec was quarantined at triage in PR #1064 — @stable removed and test.fixme added — so it stops running in every context (daily, PR impacted-specs gate, full suite) until this issue is worked:
tests/tests-automations/regression/ui-ux/execution-error-notification.spec.ts (test declared at line 139, fails at line 54)
Lifting that quarantine after the fix (remove test.fixme + restore @stable) is a deliverable of this issue.
Two scope notes on the quarantine, both open decisions for whoever works this:
- It does not cover the sibling tests in the same file.
executing flow with network error shows error feedback (declared at line 105) is still @stable and calls the same setupChatFlow, so it hits the identical line-54 wait. flow run button shows loading state during execution (line 175) likewise.
- The other three specs are not quarantined. Each has a single recorded occurrence, so the per-spec flake criterion does not call for quarantine; what is recurrent is the shared condition. They remain
@stable:
tests/tests-automations/regression/core-functionality/playground/playground-clear-history.spec.ts (test at line 110)
tests/tests-automations/regression/core-components/api-request-component-regression.spec.ts (test at line 560)
tests/tests-automations/regression/core-functionality/playground/output-modal-copy-button.spec.ts (test at line 39)
Spun out of daily-failure triage #1057 (run 30444299314, 2026-07-29).
Upstream: not filed
Symptom
Four
@stablespecs flaked (recovered on retry) with the same shape —[data-testid="sidebar-search-input"]is present in the DOM but never becomes visible, so the sidebar-entry step of the setup times out. In every case the failure is in the setup that enters a blank flow and filters the sidebar, before the test's own subject is exercised.tests/tests-automations/regression/ui-ux/execution-error-notification.spec.ts:54("executing flow with server error shows error feedback", declared at :139)waitForSelector('[data-testid="sidebar-search-input"]')— statevisible, 30 sTimeoutError: page.waitForSelector: Timeout 30000ms exceeded.tests/tests-automations/regression/core-functionality/playground/playground-clear-history.spec.ts:43("clear chat on Default session must remove messages but keep the session", declared at :110)getByTestId('sidebar-search-input').fill(...)— 20 sTimeoutError: locator.fill: Timeout 20000ms exceeded.tests/tests-automations/regression/core-components/api-request-component-regression.spec.ts:100("API Request component — non-2xx HTTP response propagates status_code without crashing", declared at :560)getByTestId('sidebar-search-input').fill(...)— 20 sTimeoutError: locator.fill: Timeout 20000ms exceeded.tests/tests-automations/regression/core-functionality/playground/output-modal-copy-button.spec.ts:67("copy button copies Chat Input output and toggles Check icon", declared at :39)getByTestId('sidebar-search-input').fill(...)— 20 sTimeoutError: locator.fill: Timeout 20000ms exceeded.Occurrences by run:
execution-error-notification,playground-clear-historyexecution-error-notification,api-request-component-regressionoutput-modal-copy-button(execution-error-notificationpassed)The 12:55 run of 07-21 is not the entry recorded in
reports/daily-history.jsonlfor that date (only 29822019255 is), so its signature is cited from the run's JSON artifact rather than the history row.The line numbers in the first column are the failing lines; the history rows key on the
test()declaration line, which is what the original body carried as the failure site.Why these failures are one cause
The shared dimension is the element and its state, not the signature: all four resolve
[data-testid="sidebar-search-input"]successfully and then time out because it is not visible.execution-error-notificationusespage.waitForSelector(default statevisible), and the call log records4 × locator resolved to hidden <input … data-testid="sidebar-search-input" …>.locator.fill, whose actionability check isvisible, enabled and editable; their call logs record repeatedelement is not visibleagainst the same resolved input —playground-clear-historylogs2 ×, thenelement was detached from the DOM, retrying, then a further39 ×invisible over the 20 s.The signatures differ (
page.waitForSelector30 s vs.locator.fill20 s) purely because the specs use different Playwright APIs against the same element with different timeouts.TimeoutError: locator.fill: Timeout 20000ms exceeded.is generic on its own, so the grouping does not rest on it: the second shared dimension is the identical testid plus the identical actionability reason (not visibleon a resolved element) plus the identical step (entering a blank flow, then filtering the sidebar).All four specs are also structurally identical at the failure point:
awaitBootstrapTest→ clickblank-flow→ wait on / fillsidebar-search-input.Cross-day recurrence is a property of this condition, not of any single spec: it appears on 2026-07-21 and 2026-07-29, and on 07-21 it hit two different specs in two different runs while
execution-error-notificationpassed in one of them.Preliminary read (descriptive — NOT a verdict)
The 2026-07-29 run was a mass-failure day (10 hard + 12 flaky, guard threshold 5 crossed). The triage verdict on the day itself was environmental for the hard failures: 6 of the 10 are a 20 s timeout on
GET /api/v1/auto_loginin shards where every provider was green and the post-collect-modelshealth gate had already passed (#1030), and two shards executed zero tests after a credentials-preflight abort (#1058). That verdict governs the hard failures and does not extend to this cluster.The 2026-07-21 10:23 occurrence is on a run that recorded only 3 hard failures and did not trip the guard, so the condition is not confined to mass-failure days.
Two observations bound the search, both descriptive:
execution-error-notificationspecifically, the provoked 503 is served bypage.route(…).fulfill()— resolved in the browser, never reaching the backend — and that route is registered only aftersetupChatFlowandopenPlaygroundreturn. The provoked request therefore cannot be the thing that hangs. What does reach the backend before the failing wait is the blank-flow bootstrap and the sidebar's component load, which is where an instance-saturation influence would have to act.element was detached from the DOM, retrying), is the surface to look at — not the selector.Investigation directive
Investigate all paths independently, product as prime suspect first:
--retries=0. The signal is load-dependent (it appeared in runs of 236–410 tests in parallel and recovered on retry every time), so an isolated local run coming back green does not clear the condition — reproduce under parallel load, or from the CI lane.playground-clear-historycorrelates with a backend response arriving late.Note that the original directive's items on the provoked request hanging, on error-feedback selector drift, and on replacing the live failing execution with a deterministic error injection are moot: the run is already deterministic and client-side mocked, and the failing selector is not the error-feedback one.
Deliverables (Done when)
--retries=0runs, under parallel load), fixing the sidebar-entry wait as needed.@stable.test.fixmeand restore@stableontests/tests-automations/regression/ui-ux/execution-error-notification.spec.ts, re-validated perCONTRIBUTING.md. Force-fail scope is the whole file: all three of its tests sharesetupChatFlow.langflowai/langflow-nightly:latest(or therelease-1.x.xbranch), is re-validated there, and@stableis restored — not on a test-side mute.Flake signal
The condition is confirmed recurrent (dailies 2026-07-21 and 2026-07-29). One spec was quarantined at triage in PR #1064 —
@stableremoved andtest.fixmeadded — so it stops running in every context (daily, PR impacted-specs gate, full suite) until this issue is worked:tests/tests-automations/regression/ui-ux/execution-error-notification.spec.ts(test declared at line 139, fails at line 54)Lifting that quarantine after the fix (remove
test.fixme+ restore@stable) is a deliverable of this issue.Two scope notes on the quarantine, both open decisions for whoever works this:
executing flow with network error shows error feedback(declared at line 105) is still@stableand calls the samesetupChatFlow, so it hits the identical line-54 wait.flow run button shows loading state during execution(line 175) likewise.@stable:tests/tests-automations/regression/core-functionality/playground/playground-clear-history.spec.ts(test at line 110)tests/tests-automations/regression/core-components/api-request-component-regression.spec.ts(test at line 560)tests/tests-automations/regression/core-functionality/playground/output-modal-copy-button.spec.ts(test at line 39)