Skip to content

fix(workspace): preserve scoped projects after main sync #17046

fix(workspace): preserve scoped projects after main sync

fix(workspace): preserve scoped projects after main sync #17046

Triggered via pull request August 1, 2026 05:26
Status Cancelled
Total duration 16m 16s
Artifacts 7

ci.yml

on: pull_request
Resolve runner profiles
11s
Resolve runner profiles
Detect validation scopes
23s
Detect validation scopes
Static gate
32s
Static gate
Matrix: playwright_critical
Matrix: playwright_visual
Matrix: ui_p0
Preflight
3m 57s
Preflight
Workspace unit tests
1m 57s
Workspace unit tests
Windows tools-pack payload tests
2m 20s
Windows tools-pack payload tests
Web workspace tests
8m 51s
Web workspace tests
E2E Vitest
4m 53s
E2E Vitest
Validate workspace
2s
Validate workspace
Runtime summary
4s
Runtime summary
Fit to window
Zoom out
Zoom in

Annotations

41 errors, 3 warnings, and 2 notices
Web workspace tests
Process completed with exit code 1.
tests/components/RecentProjectsStrip.test.tsx > RecentProjectsStrip > scans a shared project cover once after the same card materializes: apps/web/tests/components/RecentProjectsStrip.test.tsx#L264
AssertionError: the given combination of arguments (undefined and string) is invalid for this assertion. You can use an array, a map, an object, a set, a string, or a weakset instead of a string ❯ tests/components/RecentProjectsStrip.test.tsx:264:7
UI P0 (project-workspace)
Canceling since a higher priority waiting request for ci-6320 exists
UI P0 (project-workspace)
The operation was canceled.
[chromium] β€Ί ui/app-manual-edit.test.ts:329:1 β€Ί [P0] @critical preview toolbar keeps share: e2e/ui/app-manual-edit.test.ts#L346
4) [chromium] β€Ί ui/app-manual-edit.test.ts:329:1 β€Ί [P0] @critical preview toolbar keeps share, download, comment, and zoom actions reachable Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toContainText(expected) failed Locator: locator('.share-menu-popover[role="menu"]') Expected pattern: /Share project in workspace|Publish this file/i Received string: "ShareExportSend to..." Timeout: 10000ms Call log: - Expect "toContainText" with timeout 10000ms - waiting for locator('.share-menu-popover[role="menu"]') 24 Γ— locator resolved to <div role="menu" class="share-menu-popover chrome-unified-popover">…</div> - unexpected value "ShareExportSend to..." 344 | await expect(shareMenu).toBeVisible(); 345 | await expect(shareMenu.getByRole('tab', { name: /^Share$/ })).toHaveAttribute('aria-selected', 'true'); > 346 | await expect(shareMenu).toContainText(/Share project in workspace|Publish this file/i); | ^ 347 | await shareMenu.getByRole('tab', { name: /^Export$/ }).click(); 348 | await expect(shareMenu.getByRole('menuitem', { name: /Export as PDF/i })).toBeVisible(); 349 | await page.keyboard.press('Escape'); at /home/runner/work/open-design/open-design/e2e/ui/app-manual-edit.test.ts:346:27
[chromium] β€Ί ui/app-manual-edit.test.ts:329:1 β€Ί [P0] @critical preview toolbar keeps share: e2e/ui/app-manual-edit.test.ts#L346
4) [chromium] β€Ί ui/app-manual-edit.test.ts:329:1 β€Ί [P0] @critical preview toolbar keeps share, download, comment, and zoom actions reachable Error: expect(locator).toContainText(expected) failed Locator: locator('.share-menu-popover[role="menu"]') Expected pattern: /Share project in workspace|Publish this file/i Received string: "ShareExportSend to..." Timeout: 10000ms Call log: - Expect "toContainText" with timeout 10000ms - waiting for locator('.share-menu-popover[role="menu"]') 24 Γ— locator resolved to <div role="menu" class="share-menu-popover chrome-unified-popover">…</div> - unexpected value "ShareExportSend to..." 344 | await expect(shareMenu).toBeVisible(); 345 | await expect(shareMenu.getByRole('tab', { name: /^Share$/ })).toHaveAttribute('aria-selected', 'true'); > 346 | await expect(shareMenu).toContainText(/Share project in workspace|Publish this file/i); | ^ 347 | await shareMenu.getByRole('tab', { name: /^Export$/ }).click(); 348 | await expect(shareMenu.getByRole('menuitem', { name: /Export as PDF/i })).toBeVisible(); 349 | await page.keyboard.press('Escape'); at /home/runner/work/open-design/open-design/e2e/ui/app-manual-edit.test.ts:346:27
[chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-tab-persistence: Open file tabs survive refresh with the correct active tab: e2e/ui/app-design-files.test.ts#L919
3) [chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-tab-persistence: Open file tabs survive refresh with the correct active tab Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByRole('tab', { name: /second-tab\.png/i }) Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for getByRole('tab', { name: /second-tab\.png/i }) 917 | const secondTab = page.getByRole('tab', { name: /second-tab\.png/i }); 918 | await expect(firstTab).toBeVisible(); > 919 | await expect(secondTab).toBeVisible(); | ^ 920 | 921 | await firstTab.click(); 922 | await expect(firstTab).toHaveAttribute('aria-selected', 'true'); at runDesignFilesTabPersistenceFlow (/home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:919:27) at /home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:100:7
[chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-tab-persistence: Open file tabs survive refresh with the correct active tab: e2e/ui/app-design-files.test.ts#L909
3) [chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-tab-persistence: Open file tabs survive refresh with the correct active tab Error: expect(locator).toBeVisible() failed Locator: getByRole('tab', { name: /first-tab\.png/i }) Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for getByRole('tab', { name: /first-tab\.png/i }) 907 | buffer: pngBytes, 908 | }); > 909 | await expect(page.getByRole('tab', { name: /first-tab\.png/i })).toBeVisible(); | ^ 910 | 911 | await page.getByTestId('design-files-upload-input').setInputFiles({ 912 | name: 'second-tab.png', at runDesignFilesTabPersistenceFlow (/home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:909:68) at /home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:100:7
[chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-delete: Design Files panel deletes an uploaded file and clears its tab: e2e/ui/app-design-files.test.ts#L487
2) [chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-delete: Design Files panel deletes an uploaded file and clears its tab Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByRole('tab', { name: /keep-me\.png/i }) Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for getByRole('tab', { name: /keep-me\.png/i }) 485 | buffer: pngBytes, 486 | }); > 487 | await expect(page.getByRole('tab', { name: /keep-me\.png/i })).toBeVisible(); | ^ 488 | 489 | await page.getByTestId('design-files-upload-input').setInputFiles({ 490 | name: 'trash-me.png', at runDesignFilesDeleteFlow (/home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:487:66) at /home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:96:7
[chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-delete: Design Files panel deletes an uploaded file and clears its tab: e2e/ui/app-design-files.test.ts#L487
2) [chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-delete: Design Files panel deletes an uploaded file and clears its tab Error: expect(locator).toBeVisible() failed Locator: getByRole('tab', { name: /keep-me\.png/i }) Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for getByRole('tab', { name: /keep-me\.png/i }) 485 | buffer: pngBytes, 486 | }); > 487 | await expect(page.getByRole('tab', { name: /keep-me\.png/i })).toBeVisible(); | ^ 488 | 489 | await page.getByTestId('design-files-upload-input').setInputFiles({ 490 | name: 'trash-me.png', at runDesignFilesDeleteFlow (/home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:487:66) at /home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:96:7
[chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-upload: Design Files panel uploads an image and opens it in the workspace: e2e/ui/app-design-files.test.ts#L450
1) [chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-upload: Design Files panel uploads an image and opens it in the workspace Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByRole('tab', { name: /moodboard\.png/i }) Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for getByRole('tab', { name: /moodboard\.png/i }) 448 | }); 449 | > 450 | await expect(page.getByRole('tab', { name: /moodboard\.png/i })).toBeVisible(); | ^ 451 | await openAllProjectFiles(page); 452 | // #5517 deleted the preview pane that used to spell out kind / size / 453 | // download for the picked file. The panel's category tab bar is what states at runDesignFilesUploadFlow (/home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:450:68) at /home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:92:7
[chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-upload: Design Files panel uploads an image and opens it in the workspace: e2e/ui/app-design-files.test.ts#L450
1) [chromium] β€Ί ui/app-design-files.test.ts:84:3 β€Ί [P0] @critical design-files-upload: Design Files panel uploads an image and opens it in the workspace Error: expect(locator).toBeVisible() failed Locator: getByRole('tab', { name: /moodboard\.png/i }) Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for getByRole('tab', { name: /moodboard\.png/i }) 448 | }); 449 | > 450 | await expect(page.getByRole('tab', { name: /moodboard\.png/i })).toBeVisible(); | ^ 451 | await openAllProjectFiles(page); 452 | // #5517 deleted the preview pane that used to spell out kind / size / 453 | // download for the picked file. The panel's category tab bar is what states at runDesignFilesUploadFlow (/home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:450:68) at /home/runner/work/open-design/open-design/e2e/ui/app-design-files.test.ts:92:7
UI P0 (project-runtime)
Canceling since a higher priority waiting request for ci-6320 exists
UI P0 (project-runtime)
The operation was canceled.
[chromium] β€Ί ui/amr-run-failure-recovery.test.ts:338:1 β€Ί [P0] @critical non-AMR model failures promote Open Design AMR and auto-retry after sign-in: e2e/ui/amr-run-failure-recovery.test.ts#L430
2) [chromium] β€Ί ui/amr-run-failure-recovery.test.ts:338:1 β€Ί [P0] @critical non-AMR model failures promote Open Design AMR and auto-retry after sign-in Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.modal-settings').first() Expected: visible Timeout: 60000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 60000ms - waiting for locator('.modal-settings').first() 428 | 429 | const settings = settingsSurface(page); > 430 | await expect(settings).toBeVisible({ timeout: T.long }); | ^ 431 | await expect 432 | .poll(async () => { 433 | const raw = await page.evaluate((key) => window.localStorage.getItem(key), STORAGE_KEY); at /home/runner/work/open-design/open-design/e2e/ui/amr-run-failure-recovery.test.ts:430:26
[chromium] β€Ί ui/amr-run-failure-recovery.test.ts:338:1 β€Ί [P0] @critical non-AMR model failures promote Open Design AMR and auto-retry after sign-in: e2e/ui/amr-run-failure-recovery.test.ts#L430
2) [chromium] β€Ί ui/amr-run-failure-recovery.test.ts:338:1 β€Ί [P0] @critical non-AMR model failures promote Open Design AMR and auto-retry after sign-in Error: expect(locator).toBeVisible() failed Locator: locator('.modal-settings').first() Expected: visible Timeout: 60000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 60000ms - waiting for locator('.modal-settings').first() 428 | 429 | const settings = settingsSurface(page); > 430 | await expect(settings).toBeVisible({ timeout: T.long }); | ^ 431 | await expect 432 | .poll(async () => { 433 | const raw = await page.evaluate((key) => window.localStorage.getItem(key), STORAGE_KEY); at /home/runner/work/open-design/open-design/e2e/ui/amr-run-failure-recovery.test.ts:430:26
[chromium] β€Ί ui/amr-logout-requires-relogin.test.ts:51:1 β€Ί [P0] after local Sign out: e2e/lib/playwright/amr.ts#L307
1) [chromium] β€Ί ui/amr-logout-requires-relogin.test.ts:51:1 β€Ί [P0] after local Sign out, AMR runs require re-login and Settings keeps AMR selected Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.click: Test timeout of 120000ms exceeded. Call log: - waiting for getByTestId('inline-model-switcher-chip').first() - locator resolved to <button type="button" aria-haspopup="menu" aria-expanded="false" data-tooltip-placement="bottom" aria-label="Open Design Β· default" data-tooltip="Open Design Β· default" data-testid="inline-model-switcher-chip" class="inline-switcher__chip od-tooltip inline-switcher__chip--icon">…</button> - attempting click action 2 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 20ms 2 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 100ms 117 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 500ms at ../lib/playwright/amr.ts:307 305 | const switcherChip = page.getByTestId('inline-model-switcher-chip').first(); 306 | if (await switcherChip.isVisible({ timeout: 1_000 }).catch(() => false)) { > 307 | await switcherChip.click(); | ^ 308 | const openSettings = page.getByTestId('inline-model-switcher-open-settings').first(); 309 | if (await openSettings.isVisible({ timeout: T.short }).catch(() => false)) { 310 | await openSettings.click(); at openSettingsFromProjectSurface (/home/runner/work/open-design/open-design/e2e/lib/playwright/amr.ts:307:24) at openSettingsDialog (/home/runner/work/open-design/open-design/e2e/lib/playwright/amr.ts:342:18) at /home/runner/work/open-design/open-design/e2e/ui/amr-logout-requires-relogin.test.ts:130:28
[chromium] β€Ί ui/amr-logout-requires-relogin.test.ts:51:1 β€Ί [P0] after local Sign out: e2e/ui/amr-logout-requires-relogin.test.ts#L0
1) [chromium] β€Ί ui/amr-logout-requires-relogin.test.ts:51:1 β€Ί [P0] after local Sign out, AMR runs require re-login and Settings keeps AMR selected Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 120000ms exceeded.
[chromium] β€Ί ui/amr-logout-requires-relogin.test.ts:51:1 β€Ί [P0] after local Sign out: e2e/lib/playwright/amr.ts#L307
1) [chromium] β€Ί ui/amr-logout-requires-relogin.test.ts:51:1 β€Ί [P0] after local Sign out, AMR runs require re-login and Settings keeps AMR selected Error: locator.click: Test timeout of 120000ms exceeded. Call log: - waiting for getByTestId('inline-model-switcher-chip').first() - locator resolved to <button type="button" aria-haspopup="menu" aria-expanded="false" data-tooltip-placement="bottom" aria-label="Open Design Β· default" data-tooltip="Open Design Β· default" data-testid="inline-model-switcher-chip" class="inline-switcher__chip od-tooltip inline-switcher__chip--icon">…</button> - attempting click action 2 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 20ms 2 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 100ms 144 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 500ms - waiting for element to be visible, enabled and stable at ../lib/playwright/amr.ts:307 305 | const switcherChip = page.getByTestId('inline-model-switcher-chip').first(); 306 | if (await switcherChip.isVisible({ timeout: 1_000 }).catch(() => false)) { > 307 | await switcherChip.click(); | ^ 308 | const openSettings = page.getByTestId('inline-model-switcher-open-settings').first(); 309 | if (await openSettings.isVisible({ timeout: T.short }).catch(() => false)) { 310 | await openSettings.click(); at openSettingsFromProjectSurface (/home/runner/work/open-design/open-design/e2e/lib/playwright/amr.ts:307:24) at openSettingsDialog (/home/runner/work/open-design/open-design/e2e/lib/playwright/amr.ts:342:18) at /home/runner/work/open-design/open-design/e2e/ui/amr-logout-requires-relogin.test.ts:130:28
[chromium] β€Ί ui/amr-logout-requires-relogin.test.ts:51:1 β€Ί [P0] after local Sign out: e2e/ui/amr-logout-requires-relogin.test.ts#L0
1) [chromium] β€Ί ui/amr-logout-requires-relogin.test.ts:51:1 β€Ί [P0] after local Sign out, AMR runs require re-login and Settings keeps AMR selected Test timeout of 120000ms exceeded.
UI P0 (workspace-restoration)
Canceling since a higher priority waiting request for ci-6320 exists
UI P0 (workspace-restoration)
The operation was canceled.
[chromium] β€Ί ui/app-restoration.test.ts:822:1 β€Ί [P0] returning from workspace surfaces keeps the older conversation reachable from history: e2e/ui/app-restoration.test.ts#L853
5) [chromium] β€Ί ui/app-restoration.test.ts:822:1 β€Ί [P0] returning from workspace surfaces keeps the older conversation reachable from history Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'surface-restore.png' }) }).first() Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'surface-restore.png' }) }).first() 851 | ), 852 | }); > 853 | await expect(tabBySuffix(page, 'surface-restore.png')).toBeVisible(); | ^ 854 | 855 | await page.getByTestId('conversation-history-trigger').click(); 856 | const historyList = page.getByTestId('conversation-list'); at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:853:58
[chromium] β€Ί ui/app-restoration.test.ts:822:1 β€Ί [P0] returning from workspace surfaces keeps the older conversation reachable from history: e2e/ui/app-restoration.test.ts#L853
5) [chromium] β€Ί ui/app-restoration.test.ts:822:1 β€Ί [P0] returning from workspace surfaces keeps the older conversation reachable from history Error: expect(locator).toBeVisible() failed Locator: locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'surface-restore.png' }) }).first() Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'surface-restore.png' }) }).first() 851 | ), 852 | }); > 853 | await expect(tabBySuffix(page, 'surface-restore.png')).toBeVisible(); | ^ 854 | 855 | await page.getByTestId('conversation-history-trigger').click(); 856 | const historyList = page.getByTestId('conversation-list'); at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:853:58
[chromium] β€Ί ui/app-restoration.test.ts:389:1 β€Ί [P0] returning from an uploaded design file route to the project root keeps the uploaded file tab active: e2e/ui/app-restoration.test.ts#L409
4) [chromium] β€Ί ui/app-restoration.test.ts:389:1 β€Ί [P0] returning from an uploaded design file route to the project root keeps the uploaded file tab active Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'root-design-reference.png' }) }).first() Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'root-design-reference.png' }) }).first() 407 | await expect((await uploadResponse).ok()).toBeTruthy(); 408 | const fileTab = tabBySuffix(page, 'root-design-reference.png'); > 409 | await expect(fileTab).toBeVisible(); | ^ 410 | const uploadedName = await fileTab.getAttribute('title'); 411 | expect(uploadedName).toBeTruthy(); 412 | at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:409:25
[chromium] β€Ί ui/app-restoration.test.ts:389:1 β€Ί [P0] returning from an uploaded design file route to the project root keeps the uploaded file tab active: e2e/ui/app-restoration.test.ts#L409
4) [chromium] β€Ί ui/app-restoration.test.ts:389:1 β€Ί [P0] returning from an uploaded design file route to the project root keeps the uploaded file tab active Error: expect(locator).toBeVisible() failed Locator: locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'root-design-reference.png' }) }).first() Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'root-design-reference.png' }) }).first() 407 | await expect((await uploadResponse).ok()).toBeTruthy(); 408 | const fileTab = tabBySuffix(page, 'root-design-reference.png'); > 409 | await expect(fileTab).toBeVisible(); | ^ 410 | const uploadedName = await fileTab.getAttribute('title'); 411 | expect(uploadedName).toBeTruthy(); 412 | at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:409:25
[chromium] β€Ί ui/app-restoration.test.ts:348:1 β€Ί [P0] @critical visiting an uploaded design file route restores its tab and file workspace surface: e2e/ui/app-restoration.test.ts#L364
3) [chromium] β€Ί ui/app-restoration.test.ts:348:1 β€Ί [P0] @critical visiting an uploaded design file route restores its tab and file workspace surface Error: expect(locator).toBeVisible() failed Locator: locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'deep-linked-reference.png' }) }).first() Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'deep-linked-reference.png' }) }).first() 362 | }); 363 | const fileTab = tabBySuffix(page, 'deep-linked-reference.png'); > 364 | await expect(fileTab).toBeVisible(); | ^ 365 | const uploadedName = await fileTab.getAttribute('title'); 366 | expect(uploadedName).toBeTruthy(); 367 | at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:364:25
[chromium] β€Ί ui/app-restoration.test.ts:155:1 β€Ί [P0] @critical workspace restores the last manually selected file tab after reload instead of jumping back to the generated artifact: e2e/ui/app-restoration.test.ts#L3062
2) [chromium] β€Ί ui/app-restoration.test.ts:155:1 β€Ί [P0] @critical workspace restores the last manually selected file tab after reload instead of jumping back to the generated artifact Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(received).toBe(expected) // Object.is equality Expected: true Received: false Call Log: - Timeout 20000ms exceeded while waiting on the predicate 3060 | ); 3061 | }, { timeout: T.medium }) > 3062 | .toBe(true); | ^ 3063 | } 3064 | 3065 | async function expectProjectFilesToIncludeSuffixes( at expectPersistedArtifactMessage (/home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:3062:6) at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:200:9
[chromium] β€Ί ui/app-restoration.test.ts:155:1 β€Ί [P0] @critical workspace restores the last manually selected file tab after reload instead of jumping back to the generated artifact: e2e/ui/app-restoration.test.ts#L3062
2) [chromium] β€Ί ui/app-restoration.test.ts:155:1 β€Ί [P0] @critical workspace restores the last manually selected file tab after reload instead of jumping back to the generated artifact Error: expect(received).toBe(expected) // Object.is equality Expected: true Received: false Call Log: - Timeout 20000ms exceeded while waiting on the predicate 3060 | ); 3061 | }, { timeout: T.medium }) > 3062 | .toBe(true); | ^ 3063 | } 3064 | 3065 | async function expectProjectFilesToIncludeSuffixes( at expectPersistedArtifactMessage (/home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:3062:6) at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:200:9
[chromium] β€Ί ui/app-restoration.test.ts:257:1 β€Ί [P0] switching between projects restores each project workspace to its last active file tab: e2e/ui/app-restoration.test.ts#L2485
1) [chromium] β€Ί ui/app-restoration.test.ts:257:1 β€Ί [P0] switching between projects restores each project workspace to its last active file tab Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('[data-testid^="design-file-row-"][data-testid$="alpha-secondary.png"]').first() Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('[data-testid^="design-file-row-"][data-testid$="alpha-secondary.png"]').first() 2483 | // the row by test id β€” image cards render no filename text to match on. 2484 | const row = rowBySuffix(page, fileName); > 2485 | await expect(row).toBeVisible(); | ^ 2486 | await row.getByRole('button').first().click(); 2487 | await expect(tab).toHaveAttribute('aria-selected', 'true'); 2488 | } at openDesignFile (/home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:2485:21) at ensureFileTabOpen (/home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:2607:3) at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:294:29
[chromium] β€Ί ui/app-restoration.test.ts:257:1 β€Ί [P0] switching between projects restores each project workspace to its last active file tab: e2e/ui/app-restoration.test.ts#L317
1) [chromium] β€Ί ui/app-restoration.test.ts:257:1 β€Ί [P0] switching between projects restores each project workspace to its last active file tab Error: expect(locator).toBeVisible() failed Locator: locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'beta-primary.png' }) }).first() Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.ws-tab[role="tab"]').filter({ has: locator('.ws-tab-label').filter({ hasText: 'beta-primary.png' }) }).first() 315 | }); 316 | await expect((await betaPrimaryUpload).ok()).toBeTruthy(); > 317 | await expect(tabBySuffix(page, 'beta-primary.png')).toBeVisible(); | ^ 318 | const betaSecondaryUpload = page.waitForResponse( 319 | (resp: Response) => resp.url().includes('/upload') && resp.request().method() === 'POST', 320 | { timeout: 5000 }, at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:317:55
UI P0 (entry-settings)
Canceling since a higher priority waiting request for ci-6320 exists
UI P0 (entry-settings)
The operation was canceled.
[chromium] β€Ί ui/settings-api-protocol.test.ts:970:1 β€Ί [P0] @critical saving Local CLI updates the entry status pill with the selected agent: e2e/ui/settings-api-protocol.test.ts#L1023
2) [chromium] β€Ί ui/settings-api-protocol.test.ts:970:1 β€Ί [P0] @critical saving Local CLI updates the entry status pill with the selected agent Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toContainText(expected) failed Locator: getByTestId('inline-model-switcher-chip') Expected pattern: /Local CLI|本机 CLI|本地 CLI/i Received string: "default" Timeout: 10000ms Call log: - Expect "toContainText" with timeout 10000ms - waiting for getByTestId('inline-model-switcher-chip') 19 Γ— locator resolved to <button type="button" aria-haspopup="menu" aria-expanded="false" data-tooltip-placement="bottom" aria-label="Codex CLI Β· default" data-tooltip="Codex CLI Β· default" data-testid="inline-model-switcher-chip" class="inline-switcher__chip od-tooltip inline-switcher__chip--icon">…</button> - unexpected value "default" 1021 | 1022 | const executionPill = page.getByTestId('inline-model-switcher-chip'); > 1023 | await expect(executionPill).toContainText(LOCAL_CLI_LABEL); | ^ 1024 | await expect(executionPill).toContainText('Codex CLI'); 1025 | await expect(executionPill).toContainText('default'); 1026 | }); at /home/runner/work/open-design/open-design/e2e/ui/settings-api-protocol.test.ts:1023:31
[chromium] β€Ί ui/settings-api-protocol.test.ts:970:1 β€Ί [P0] @critical saving Local CLI updates the entry status pill with the selected agent: e2e/ui/settings-api-protocol.test.ts#L1023
2) [chromium] β€Ί ui/settings-api-protocol.test.ts:970:1 β€Ί [P0] @critical saving Local CLI updates the entry status pill with the selected agent Error: expect(locator).toContainText(expected) failed Locator: getByTestId('inline-model-switcher-chip') Expected pattern: /Local CLI|本机 CLI|本地 CLI/i Received string: "default" Timeout: 10000ms Call log: - Expect "toContainText" with timeout 10000ms - waiting for getByTestId('inline-model-switcher-chip') 18 Γ— locator resolved to <button type="button" aria-haspopup="menu" aria-expanded="false" data-tooltip-placement="bottom" aria-label="Codex CLI Β· default" data-tooltip="Codex CLI Β· default" data-testid="inline-model-switcher-chip" class="inline-switcher__chip od-tooltip inline-switcher__chip--icon">…</button> - unexpected value "default" 1021 | 1022 | const executionPill = page.getByTestId('inline-model-switcher-chip'); > 1023 | await expect(executionPill).toContainText(LOCAL_CLI_LABEL); | ^ 1024 | await expect(executionPill).toContainText('Codex CLI'); 1025 | await expect(executionPill).toContainText('default'); 1026 | }); at /home/runner/work/open-design/open-design/e2e/ui/settings-api-protocol.test.ts:1023:31
[chromium] β€Ί ui/amr-onboarding.test.ts:337:1 β€Ί [P0] onboarding AMR runtime selection carries into the first Home run request: e2e/ui/amr-onboarding.test.ts#L365
1) [chromium] β€Ί ui/amr-onboarding.test.ts:337:1 β€Ί [P0] onboarding AMR runtime selection carries into the first Home run request Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.click: Test timeout of 120000ms exceeded. Call log: - waiting for getByTestId('home-hero-submit') - locator resolved to <button title="Run" type="button" aria-label="Run" aria-busy="false" data-tooltip="Run" data-testid="home-hero-submit" class="home-hero__submit od-tooltip">…</button> - attempting click action 2 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 20ms 2 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 100ms 93 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 500ms - waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling 363 | await input.fill('Create an AMR onboarding carryover smoke artifact.'); 364 | await expect(page.getByTestId('home-hero-submit')).toBeEnabled(); > 365 | await page.getByTestId('home-hero-submit').click(); | ^ 366 | 367 | await runRequests.expectCount(1); 368 | expect(runBodies[0]).toMatchObject({ at /home/runner/work/open-design/open-design/e2e/ui/amr-onboarding.test.ts:365:46
[chromium] β€Ί ui/amr-onboarding.test.ts:337:1 β€Ί [P0] onboarding AMR runtime selection carries into the first Home run request: e2e/ui/amr-onboarding.test.ts#L0
1) [chromium] β€Ί ui/amr-onboarding.test.ts:337:1 β€Ί [P0] onboarding AMR runtime selection carries into the first Home run request Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Test timeout of 120000ms exceeded.
[chromium] β€Ί ui/amr-onboarding.test.ts:337:1 β€Ί [P0] onboarding AMR runtime selection carries into the first Home run request: e2e/ui/amr-onboarding.test.ts#L365
1) [chromium] β€Ί ui/amr-onboarding.test.ts:337:1 β€Ί [P0] onboarding AMR runtime selection carries into the first Home run request Error: locator.click: Test timeout of 120000ms exceeded. Call log: - waiting for getByTestId('home-hero-submit') - locator resolved to <button title="Run" type="button" aria-label="Run" aria-busy="false" data-tooltip="Run" data-testid="home-hero-submit" class="home-hero__submit od-tooltip">…</button> - attempting click action 2 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 20ms 2 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 100ms 109 Γ— waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <div role="presentation" class="dialog_backdrop__iQHy_ modal-backdrop WhatsNewPopup_backdrop__zf6bL">…</div> intercepts pointer events - retrying click action - waiting 500ms 363 | await input.fill('Create an AMR onboarding carryover smoke artifact.'); 364 | await expect(page.getByTestId('home-hero-submit')).toBeEnabled(); > 365 | await page.getByTestId('home-hero-submit').click(); | ^ 366 | 367 | await runRequests.expectCount(1); 368 | expect(runBodies[0]).toMatchObject({ at /home/runner/work/open-design/open-design/e2e/ui/amr-onboarding.test.ts:365:46
[chromium] β€Ί ui/amr-onboarding.test.ts:337:1 β€Ί [P0] onboarding AMR runtime selection carries into the first Home run request: e2e/ui/amr-onboarding.test.ts#L0
1) [chromium] β€Ί ui/amr-onboarding.test.ts:337:1 β€Ί [P0] onboarding AMR runtime selection carries into the first Home run request Test timeout of 120000ms exceeded.
Validate workspace
Process completed with exit code 1.
ci
Canceling since a higher priority waiting request for ci-6320 exists
Detect validation scopes
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/upload-artifact@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
E2E Vitest
merge_group changed-file resolution failed; falling back to the full plan: Error: merge_group compare result reached GitHub's 300-file ceiling
E2E Vitest
merge_group changed-file resolution failed; falling back to the full plan: Error: Command failed: /opt/hostedtoolcache/node/24.18.0/x64/bin/node /tmp/scopes-test-bB7iMF/gh-stub.mjs api repos/nexu-io/open-design/compare/1111111111111111111111111111111111111111...2222222222222222222222222222222222222222
🎭 Playwright Run Summary
3 skipped 17 passed (2.6m)
🎭 Playwright Run Summary
18 passed (4.6m)

Artifacts

Produced during runtime
Name Size Digest
handoff-report-visual-pr
438 Bytes
sha256:8be75a274e288485d64d1503fb26879e0baffcede23bc418682250753b4c7c1c
ui-p0-ci-30685844848-entry-settings
26.3 MB
sha256:9dac0de4bfaa8951a860ae74acc912b5fa98d1d888671504663458ed16240e26
ui-p0-ci-30685844848-project-runtime
38.6 MB
sha256:53c4c09ed27e3f2048a94a9711d6cda4c1bc763fe18f8e6a7868e7760bebe849
ui-p0-ci-30685844848-project-workspace
18.5 MB
sha256:1513d948142bc25604edc84b0edd0883691506e1d5210ed1bad03ea74aa29a4a
ui-p0-ci-30685844848-workspace-restoration
26.8 MB
sha256:a5bd39e5c79fd7ed2f1b65a28d933bf714b6221855ab6a6068a84890bd5d5e55
visual-pr-capture-6320-30685844848-entry-navigation
4.36 MB
sha256:d7f3636dabb8ae3d62370091992cb5ee3210e5cad1924fdca26995d76a34500b
visual-pr-capture-6320-30685844848-settings-workspace
3.19 MB
sha256:d75512b19f0fe26a988d68e37a5d4b9ca13cb36c923be3473e6e614c4956495b