Back to Tooljet

AppBuilder Cypress Suite — Overnight Fix Status

cypress-tests/.suite-fix/STATUS.md

3.20.188-lts25.1 KB
Original Source

AppBuilder Cypress Suite — Overnight Fix Status

Started: 2026-06-19 (overnight run) Branch: test/cypress-real-dnd-drag-fix Server: http://localhost:8082 (must stay up)

Guardrails

  • Never weaken/gut assertions to force green.
  • Legitimate fixes only: selectors, waits, changed flows, drag command.
  • Real product regression or correctly-failing assertion → QUARANTINE (.skip + // QUARANTINED: reason) and report.
  • Serial runs only (one shared DB).
  • Max 3 fix attempts per spec, then quarantine.

Legend

⬜ todo · 🔄 in progress · ✅ pass · 🟡 partial · ⛔ quarantined · ❌ blocked

Spec Status (21 active)

#SpecStatusNotes
1components/buttonHappyPath🟡UN-SKIPPED — 2 pass / 0 fail / 6 pending, exit 0. The cold-first-drag THROW is now recovered in dragAndDropWidget (commands.js cy.on('fail') trap → re-arm + re-drive). Body modernized (inline rename+blur, Label/Additional Actions literals, inspector-tree verify). Quarantined tests: position (moveComponent grid-coord — shared), properties tail (verifyAndModifyToggleFx loading-state fx field — shared commonWidget.js), styles (texts stale + color-picker flake), preview, csa.
2components/componentDuplicationHappypath4 it.skip (exit 0). FIXED & KEPT: tooltip-input-field data-cy restored via FRONTEND fix (SingleLineCodeEditor.jsx + Code.jsx: trim paramLabel before truthiness so showLabel:false fields fall back to cyLabel, not "-input-field"; WidgetTooltip.jsx data-cy="widget-tooltip"); modernized addBasicData (Label+Tooltip-field+Background); texts/button.js "Background color"→"Background"; toast "Component cloned successfully". REMAINING (real product bug, not spec): right-panel Duplicate AND Ctrl+D clone produce DEFAULT config (clone drops live property/style edits — confirmed via inspector); copy-paste needs system clipboard (headless empty). Frontend clone-snapshot fix needed to un-quarantine.
3components/componentsBasicHappypathdescribe.skip (exit 0, ~42 pending). ALL 40 tests fail at first drag: dragAndDropWidget("Toggle Switch",300,300) never creates draggable-widget-toggleswitch1 (it.only repro x3 fresh runs, ~2m38s each incl. drag-retry exhaustion). Search id correct (widget-list-box-toggle-switch, WidgetBox.jsx:48); panel opens + search resolves, but real-dnd drop produces no component. beforeEach: modifyCanvasSize 1200x900 + resizeQueryPanel(0), NO cy.viewport (other working specs set viewport 1800). Needs drag-cmd/canvas-position work (forbidden to touch dragAndDropWidget).
4components/csadescribe.skip (exit 0, 12 pending). All CSA tests fail (Tabs/Form/Dropdown/Textarea confirmed) — multi-drag + selectEvent("Control Component") + selectCSA flake on 2nd in-test drag after popover ("No dragIntercepted"), SAME blocker quarantined in text/number/password CSA. FIXED & KEPT: beforeEach [data-tooltip-content="Hide query panel"] (gone) → resizeQueryPanel(0) + import — spec now runs to tests instead of dying in hook.
5components/datePickerHappyPath🟡REGENERATED for DatePickerV2 (commit 09845a64cc). 4 pass / 0 fail / 3 pending, exit 0, stable 3 runs. Old spec tested the DEPRECATED legacy datepicker via closeAccordions(["General","Properties","Devices"]) — widget is now DatePickerV2 (no widget-accordion-general). Passing: exposed vars+fns, default value+disable+visibility, events (On select→Show Alert), styles (border radius). Quarantined (.skip + reason): V2 calendar day/time pick (need live V2 popper selectors), custom-validation msg (V2 error div has NO data-cy — product gap, DatepickerInput.jsx:106), preview (depends on calendar). Also: docs/docs/widgets/datepicker.md is STALE (describes legacy).
6components/listViewHappyPath🟡REGENERATED (commit 6f8d55b048). 3 pass / 0 fail / 3 pending, exit 0, stable 2 runs. Root cause: container sub-canvases reuse data-cy=real-canvas (Container.jsx:262) so shared forceClickOnCanvas matched 4 els — scoped to unique #real-canvas spec-locally; replaced legacy rename/fx-default. Pass: properties, styles, Record-clicked event. Quarantined: box-shadow colour (selectColourFromColourPicker ends with real-canvas click → 4-el ambiguity, SHARED), nested {{listItem.*}} binding (in-container 2nd-drag flake + flat inspector), tooltip (List View tooltip field has showLabel:false → data-cy="-input-field").
7components/modalHappyPath🟡REGENERATED for ModalV2 (commit 6f8d55b048). 4 pass / 0 fail / 2 pending, exit 0, stable 2 runs. Modal→ModalV2: launch button is <name>-launch-button (RenderWidget.jsx:329, NOT draggable-widget- prefixed); header/body/footer slots replace modal-title; re-open inspector after each modal open (setSelectedComponentAsModal swaps context, ModalV2.jsx:132). Pass: default trigger open/close, properties, trigger visibility/disable, On open event. Quarantined: styles (per-accordion swatches all displayName "Background" → selector collision, modalV2.js:213), csa (suite-wide post-popover drag flake). Files: modalHappyPath.cy.js + modal.js.
8components/numberInputHappyPath🟡REWRITTEN (commit b11622060d). 5 pass / 0 fail / 1 pending, exit 0 (4 runs to green). Full rewrite vs 2-tab inspector: default/edit, field props (disable aria-disabled, visibility), events (On enter pressed), min/max validation feedback, styles (border-radius on -actionable-section, BaseInput.jsx:209). Quarantined: CSA (post-popover drag flake). NOTE stale shared constant noEventHandlerMessage=no-items-banner → should be no-event-handler-message (worked around spec-locally).
9components/passwordInputHappyPath🟡REWRITTEN (commit b11622060d). 5 pass / 0 fail / 3 pending, exit 0. Full rewrite (mirrors numberInput): exposed vars+fns, field props, min/max length validation, On enter pressed event, styles. Quarantined: canvas event-trigger toast (testIsolation:false leaks prior passwordinput2 position:fixed overlap → Enter keydown misroutes), preview, CSA (drag flake). data-cy all existed (BaseInput/PasswordInput).
10components/tableRegression🟡MIGRATED to NewTable (commit b11622060d). 2 pass / 0 fail / 10 pending, exit 0, stable 2 runs. NewTable data-cy schema: search <name>-search-input-field, cells <name>-<col>-row-<i> (no -cell-), headers <col>-column-header, footer footer-number-of-records, pagination-section, filter select-column-dropdown-<i>/select-operation-dropdown-<i>/filter-value-input-<i>; default = 10-row demo data. Pass: components/labels (+sort), filters (contains/AND/not-contains). Quarantined 10: deeper NewTable rewrites (column options/datatypes, action-button column, styles classes), flat→tree inspector, download dropdown, server-side pagination. SHARED: clearAndTypeOnCodeMirror can't set multi-line/brace table data (commands.js); duplicate draggable-widget data-cy on Table (wrapper+inner table).
11components/textHappyPath🟡exposed-values ✅ (1 pass, exit 0). Rewrote it to working openAndVerifyNode/verifyNodes/verifyNodeData (spec imported nonexistent verifyValue/verifyfunctions). text default = "Hello The👋" (dev user firstName="The", text.js:305). CSA ⛔ QUARANTINED: wiring fully fixed (selectEvent opens right Inspector via config handle; selectCSA rewritten for OptionCombobox popover — see SHARED FIX 8; "Set visibility" label vs stale "Visibility") but 2nd in-test drag flakes "No dragIntercepted" after popover even with cy.realDragInit(). Same reason all other CSA tests are .skip.
12multipage/multipageHappypath🟡REGENERATED for the new Pages UI. 2 pass / 0 fail / 1 pending, exit 0, stable 2 runs. Pages UI migrated LEFT sidebar → RightSideBar Page settings (right-sidebar-page-settings-button → AddEditPagePopup popover; pages-name-<cy>, #add-new-page). Rewrote selectors/multipage.js + multipage util for the popover flow. Pass: add page, hide/home/delete/disable/page-events. Quarantined test 1 (legacy ~40-element inventory of the removed left-sidebar UX — needs a new element spec). Popover page-name/handle/home/hide controls have NO data-cy (text-scoped).
13newSuits/appTitle🟡Title asserts FIXED (dashboard/editor/preview), verified vs whiteLabelling.js+useAppData.js. Fixes: releaseApp is exported fn not cy cmd (import+call); workspace slug≠workspaceId UUID → assert not.include /apps/; preview of UNRELEASED app has NO "Preview - " prefix (useAppData passes no preview flag) → `${appName}
14newSuits/componentsBasics/button2 pass / 1 pending (CSA .skip). Stable over 3 runs. Inspector + events fixes below
15newSuits/componentsBasics/checkbox1 pass / 2 pending (events+CSA pre-existing .skip). Only needed testIsolation:false + cy.hideTooltip()
16newSuits/componentsBasics/numberInput1 pass / 2 pending (events+CSA pre-existing .skip). Only needed testIsolation:false + cy.hideTooltip()
17newSuits/componentsBasics/textInput1 pass / 2 pending (events+CSA pre-existing .skip). Only needed testIsolation:false + cy.hideTooltip()
18newSuits/globalSetingsHappyPath🟡FIXED — 1 pass / 0 fail / 0 pending, exit 0, stable 2 runs. Un-skipped. Root cause: canvas color picker data-cy="color-picker-canvas" was a DEAD prop — ColorSwatches/BaseColorSwatches key the trigger off cyLabel (${cyLabel}-picker, BaseColorSwatches.jsx:139), which was undefined. FRONTEND FIX (data-cy only, no behavior change): added cyLabel="canvas-bg-color" to ColorSwatches (CanvasSettings.jsx:146) → renders canvas-bg-color-picker matching the existing helper. Flow now covers: header title, max-width/bg labels, canvas bg color applied to real-canvas, preview navbar, maintenance toggle+confirm. QUARANTINED tails: hide-header toggle (PRODUCT REMOVAL — HideHeaderToggle.jsx imported by nothing, never mounts, GlobalSettings/index.jsx:34), release+launch maintenance check (EE env release-util rewrite, same as appTitle).
19newSuits/inspectorHappypath🟡REWRITTEN for 2-layer tree+detail inspector. 2 pass / 0 fail / 1 pending, exit 0. inspector.js: ADDED backward-compatible helpers openSubNode/backFromDetail/openSubNodeAndVerify (no existing signatures changed → green importers unaffected). FRONTEND: TreeViewHeader.jsx data-cy="inspector-detail-header-back" (breadcrumb had no selector). Pass: globals values via subnode detail panel, dynamic items (set-variable event → variables subnode + component exposed values + copy-path). Quarantined: delete-component (PRODUCT REMOVAL — Delete Component has enableInspectorTreeView:false, no affordance renders).
20newSuits/queries/chainingOfQueries🟡FIXED — test 1 green (3 consecutive runs), test 2 pre-existing .skip. (a) PG datasource payload aligned with postgresHappyPath → 201 (the "500" was payload drift, NOT an env block). (b) chainQuery uses OptionCombobox first-visible-input + role=option. (c) action Radix Select opened via KEYBOARD {downarrow} in queries.js selectRunQueryEvent (popover scroll-lock swallows trigger clicks; autoOpenActionSelect prop fights them) — gated on data-state. Files: chainingOfQueries.cy.js + queries.js.
21component-new/imageAll 3 tests QUARANTINED. Spec is hard-wired to a REMOTE fixture app (appbuilder-v3-lts-eetestsystem.tooljet.com/applications/image-app-automation) that no longer exists → redirects to /error/invalid-link (404 app-authentication-config + 403 session). Blocked by missing EXTERNAL test data, not selector drift. Also removed {baseUrl:null} (broke the @cypress/code-coverage after-all hook). Spec now clean: 3 pending, exit 0.

✅ COLD-FIRST-DRAG THROW — FIXED (suite-wide #1 blocker)

cy.dragAndDropWidget reliably THREW [cypress-real-dnd] No Input.dragIntercepted on a spec's first drag and re-cold after every apiCreateApp+openApp navigation in beforeEach. Root: cy.realDragAndDropcy.task("cdpRealDrag"); on a cold pipeline the plugin's Input.setInterceptDrags arm is absorbed by Cypress's settling CDP traffic. The plugin's warmup (cached cdpPromise) runs ONCE per spec run, NOT per navigation, so both its internal attempts can miss and the TASK REJECTS — an un-catchable command-queue failure that killed beforeEach (the count-based retry never ran). FIX (test-side only, commands.js dragAndDropWidget — node_modules untouched): (1) re-arm cy.realDragInit() before the run AND before EACH drag (per-navigation warmup the plugin doesn't do); (2) drive each attempt under a scoped, single-shot cy.on('fail') trap (installFailTrap): on a cold-intercept throw it re-arms + re-drives the FULL attempt (open→search→drag→count-poll) and returns false to swallow the failure; any other error or exhausted budget (4) re-throws honestly; (3) the count-based confirmDropOrRetry still handles the SILENT miss. VALIDATED: buttonHappyPath un-skipped → 2 pass / 0 fail / 6 pending, exit 0 (and run time dropped 6m→1m — no more retry-exhaustion). ZERO dragIntercepted throws in any run. Green regression newSuits/componentsBasics/button.cy.js still 2/0/1 — no regression. componentsBasicHappypath re-quarantined for a DIFFERENT blocker (NOT the throw): beforeEach modifyCanvasSize(1200,900) shrinks #real-canvas to a ~2%-wide sliver because the Max-canvas-width field gained a %/px unit (CanvasSettings.jsx:78) the shared modifyCanvasSize doesn't set → drop at (300,300) lands off-canvas (silent miss) → needs shared modifyCanvasSize + body-util rewrite.

CRITICAL root cause — drag command itself (fixed)

The real-dnd drag was creating NO component (probe: draggable-widget-button1: no). Chain of causes, all now handled in commands.js dragAndDropWidget:

  1. Canvas drop position comes from useGridStore.getGhostDragPosition() (appCanvasUtils), NOT react-dnd coords. useGridStore is NOT on window, so the old (and my first) manual ghost injection was a silent no-op.
  2. The FIRST real-drag of a spec run silently loses its CDP intercept (cypress-real-dnd arms Input.setInterceptDrags lazily) → react-dnd fires but no component. Warms up after first attempt.
  3. The components panel button is a TOGGLE, and the drag's isDragging effect (DragLayer.jsx) async-flips the sidebar — racing any panel open/close. FIX: retry full open→search→drag until a new [data-cy^=draggable-widget-] appears (max 3); self-healing ensureComponentsPanelOpen (presence-based, re-click until search box rendered); 1200ms settle. VALIDATED: 1st drag now creates the widget. ✅

SHARED FIXES APPLIED (knowledge base for remaining specs)

  1. Drag command (commands.js dragAndDropWidget) — FULLY REWORKED. cypress-real-dnd + (a) self-healing ensureComponentsPanelOpen (presence of widget-search-box-search-bar = panel open; re-click toggle until open), (b) source selector requires .draggable-box[draggable="true"]:has(widget-list-box-X) + assert exists (react-dnd connector timing), (c) cy.realDragInit() before drag (arms CDP intercept; else "No dragIntercepted" throw), (d) retry full open→search→drag up to 3× until a new [data-cy^=draggable-widget-] appears (cold-intercept first-drag silent miss), (e) 1200ms settle. Position comes from useGridStore.getGhostDragPosition() which is NOT on window — don't try to inject it.
  2. events.js — popover model: add-event-handler (popover trigger) → add-event-menuevent-trigger-option-<value> (pick by visible label, case-insensitive) → event-handler-cardpopover-cardaction-selection is a RocketSelect (role=option items). Intercept changed from PUT "events"cy.intercept(/\/events(\/|\?|$)/) (real API is POST /events + PATCH /events/:id). chooseRocketOption helper added. NOTE: changeEventType still uses OLD event-handler/event-selection — fix when a spec needs it.
  3. Tooltip — replace raw cy.get(".tooltip-inner").invoke("hide") with cy.hideTooltip() (guarded). 13 files have the raw pattern.
  4. inspector.js openNode timeout 1000→15000ms. Tree node types: queries/components/globals/variables/page/constants. inspector-<type>-expand-button exists at level 1.
  5. LEFT INSPECTOR OPEN — ROOT CAUSE FOUND & FIXED. commonWidgetSelector.sidebarinspector was [data-cy='left-sidebar-inspector'], which is on the OUTER sidebar wrapper div (LeftSidebar.jsx:236), NOT the clickable Inspector button. The button is a SidebarItem whose data-cy is generated from its tip: left-sidebar-${generateCypressDataCy("Inspector")}-button = left-sidebar-inspector-button (SidebarItem.jsx:49). Clicking the wrapper div is a no-op, so the panel never opened and inspector-components-expand-button was never found. FIX: sidebarinspector now points at [data-cy='left-sidebar-inspector-button'] (constants/selectors/common.js:400). Shared — used by ~15 specs; the change is strictly more correct (clicks the real button). button.cy.js test1 now passes.
  6. CONFIG HANDLE selectors changed. widgetConfigHandle (-config-handle) is STALE. Current canvas config handle (ConfigHandle.jsx) exposes per-component buttons: <name>-inspect-button (opens LEFT state inspector for that component), <name>-properties-styles-button (opens RIGHT Inspector: setRightSidebarOpen(true) + CONFIGURATION tab, ConfigHandle.jsx:277-288), <name>-delete-component-button. To open a component's right Events/Properties panel: hover draggable-widget-<name> then click <name>-properties-styles-button. The drag leaves the widget selected but the RIGHT inspector can be collapsed — relying on it is flaky, open it explicitly.
  7. Styles tab selector (buttonStylesEditorSideBar common.js) — #inspector-tab-styles (react-bootstrap id) is STALE. Inspector tabs are now custom ToolJetUI <Tabs id="inspector"> (Tabs.jsx) — each tab a button[role="tab"] with only a .tab-label, no id/data-cy. Two tabs (Properties, Styles — Inspector.jsx:594-599); Styles is #inspector .nav-link:eq(1).
  8. Accordion data-cy (accordion() common.js) — AccordionItem.js:38 builds widget-accordion-${title.toLowerCase().replace(/\s+/g,'-')}; multi-word titles need spaces→hyphens (e.g. "Additional actions" → widget-accordion-additional-actions). Helper now replaces spaces.
  9. Inspector close button (buttonCloseEditorSideBar common.js) — inspector-close-iconinspector-close-button (Inspector.jsx:707). NOTE side effect: editAndVerifyWidgetName (commonWidget.js:103) now actually CLOSES the right inspector — callers must reopen it (openEditorSidebar) before touching accordions.
  10. Style colour picker (selectColourFromColourPicker commonWidget.js) — popover now opens on a Theme/Color-picker ToggleGroup (ee ColorSwatches.jsx:99-118). Default may be "Theme" swatches (no react-color SketchPicker → no rc-editable-input). FIX: after opening the swatch, click [data-cy="togglr-button-color"] (ToggleGroupItem.jsx:13, togglr-button-${value}) to reveal the editable hex/rgba inputs. ALSO the large SketchPicker popover overlaps the NEXT swatch — dismiss it (click canvas topRight) at the end of each call or the following swatch click is "covered".
  11. Component name → data-cy casing — component names are saved verbatim (Inspector.jsx:237, no lowercasing) and the canvas widget data-cy is draggable-widget-${component.name} (RenderWidget.jsx:95,308). draggableWidget() lowercases via cyParamName, so specs renaming to a capitalized fake.widgetName (e.g. "Jamey") never match draggable-widget-jamey. Rename to a lowercased name.
  12. events.js selectCSA — REWRITTEN for OptionCombobox. The CSA Component/Action fields (action-options-component-selection-field, action-options-action-selection-field) now wrap a Rocket Combobox (shared.jsx OptionCombobox → ComboboxInput + portalled role="option" listbox), NOT a react-select with one typeable input. Old .find("input").type(...) threw cy.type() can only be called on a single element (InputGroup nests >1 input). New pickComboboxOption(fieldSelector,label) helper: click field → type into .first():visible input to filter → click exact role="option". Also: CSA action display names come from the widget config actions[].displayName (e.g. Text = "Set visibility"/"Set text"/"Clear"/"Set loading"/"Set disable") — specs carrying old bare labels like "Visibility" must use the real label.
  13. events.js selectEvent — two more fixes (after the popover rewrite): (a) event-handler-card is the Radix popover trigger; gate the "open the popover" re-click on data-state !== "open" and FORCE the click (open Radix popover sets body{pointer-events:none} scroll-lock, which blocks a normal click). (b) A new handler is created with actionId:'show-alert' already set (EventManager.jsx:441), so re-picking "Show Alert" fires NO PATCH /events — the post-action cy.wait("@events") must be skipped for the default action or it hangs 30s. Now skipped when action matches /^show alert$/i. (c) addSupportCSAData now ensures the popover-card is open (reopen last event-handler-card if the <field>-input-field is absent) before typing — RocketSelect action pick can momentarily re-render/close the popover.

Useful run command

npx cypress run --browser chrome --headless --spec "<path>" --config baseUrl=http://localhost:8082 Backend API is on :3000, UI on :8082. 409 on POST /api/apps = duplicate app name (test data pollution) → just re-run.

Root-cause findings (shared utils)

  • ✅ FIXED events.js selectEvent/addMultiEventsWithAlert: event flow rewritten to popover model. Old event-handler row + event-selection dropdown → new add-event-handler (popover trigger) → event-trigger-option-<value>event-handler-cardaction-selection. Blast radius: 12 specs. Validating via button.cy.js.
  • 🔄 INVESTIGATING inspector.js openNode/openAndVerifyNode/verifyNodeData: button.cy.js "exposed values on inspector" test failing (attempts 1-2). Uses [data-cy="inspector-<node>-expand-button/-label/-value"]. Blast radius: 8 specs. Need exact failure from run.
  • NOTE: changeEventType (events.js) still uses old [data-cy="event-handler"] — fix pending validation of selectEvent hypothesis.

Run log

  • baseline button.cy.js: 0 pass / 2 fail / 1 pending, 3m40s. Drag worked; failed at event handler step.
  • appTitle.cy.js: title asserts (dashboard/editor/preview) FIXED & verified; release tail quarantined (EE multi-env flow drift). Final: 1 pending, exit 0.
  • inspectorHappypath.cy.js: 3 tests quarantined — spec targets OLD flat inspector; current is 2-layer tree+detail (helpers no longer map). Applied testIsolation:false + hideTooltip. Final: 3 pending, exit 0.
  • image.cy.js: 3 tests quarantined — remote fixture app (image-app-automation) gone → /error/invalid-link. Removed {baseUrl:null} (broke code-coverage after-all hook). Final: 3 pending, exit 0.

FINAL SWEEP (9 specs) — 2026-06-19, all exit-0

SpecFinalP/F/PendBlocker (one-line)
globalSetingsHappyPath⛔ quarantined0/0/1canvas color picker data-cy drift (color-picker-canvas vs helper canvas-bg-color-picker) + old release flow. FIXED header label.
queries/chainingOfQueries⛔ quarantined0/0/2server 500 on postgres apiCreateDataSource (env). FIXED dsName→dataSourceName + query-selection-field combobox.
componentsBasicHappypath⛔ describe.skip0/0/~42first drag ("Toggle Switch") creates no widget (repro x3); drag-cmd/canvas-position (forbidden to touch).
csa⛔ describe.skip0/0/12CSA multi-drag/popover "No dragIntercepted" flake (suite-wide). FIXED beforeEach "Hide query panel"→resizeQueryPanel(0).
datePickerHappyPath⛔ describe.skip0/0/3widget-accordion-general not found in editAndVerifyWidgetName→closeAccordions (legacy inspector).
listViewHappyPath⛔ describe.skip0/0/3beforeEach cy.click() 2/4 elements (canvas/panel selector multi-match).
modalHappyPath⛔ describe.skip0/0/4draggable-widget-modal1-launch-button not found (ModalV2 trigger render/timing) + CSA.
tableRegression⛔ describe.skip0/0/12beforeEach resizeWidget [class="bottom-right"] matches 2 els (commands.js:375) + old inspector.
multipage/multipageHappypath⛔ describe.skip0/0/3Pages UI fully migrated LEFT→RightSideBar PageSettingsTab; all multipageSelector stale.

Cheap fixes landed this sweep (verified vs frontend source)

  1. globalSettings header: [data-cy="label-global settings"].global-settings-header-title (GlobalSettingsHeader.jsx:8).
  2. chainingOfQueries: apiAddQueryToApp param dsNamedataSourceName (apiCommands.js:131); query-selection-field → OptionCombobox first-visible-input + role=option (SHARED FIX 8).
  3. csa beforeEach: [data-tooltip-content="Hide query panel"] (gone) → resizeQueryPanel(0) + import.
  4. tableRegression: 2× raw cy.get(".tooltip-inner").invoke("hide")cy.hideTooltip().
  5. testIsolation:false added to all multi-test describes (csa, datePicker, listView, modal, tableRegression, multipage, componentsBasic).
  6. lowercased fake.widgetName (SHARED FIX 13) in datePicker (x2), listView, modal.