Team collaboration (3/3): web β team workspace surfaces #14557
ci.yml
on: pull_request
Resolve runner profiles
9s
Matrix: playwright_critical
Matrix: playwright_visual
Matrix: ui_p0
Validate Nix flake
Preflight
3m 3s
Workspace unit tests
1m 10s
Windows tools-pack payload tests
Web workspace tests
3m 29s
E2E Vitest
2m 51s
UI P0 smoke
1m 55s
Docker image build
Runtime summary
6s
Annotations
27 errors, 1 warning, and 7 notices
|
Static gate
Process completed with exit code 1.
|
|
Web workspace tests
Process completed with exit code 1.
|
|
tests/components/EntryShell.onboarding.test.tsx > EntryShell new project rail > opens the new project modal from the Projects tab button:
apps/web/tests/components/EntryShell.onboarding.test.tsx#L479
TestingLibraryElementError: Unable to find an element by: [data-testid="entry-nav-projects"]
Ignored nodes: comments, script, style
<body
style=""
>
<div>
<div
class="entry-shell entry-shell--no-header"
>
<div
class="entry entry--rail-open"
style="--entry-rail-width: 236px;"
>
<nav
aria-label="Primary"
class="entry-nav-rail is-open"
>
<div
class="entry-nav-rail__group"
>
<div
class="entry-nav-rail__brand"
>
<button
aria-label="Open Design"
class="entry-nav-rail__logo"
data-testid="entry-nav-logo"
type="button"
>
<img
alt=""
class="entry-nav-rail__logo-img"
draggable="false"
src="/app-icon.svg"
/>
</button>
<button
aria-label="Collapse sidebar"
class="entry-nav-rail__collapse"
data-testid="entry-nav-collapse"
title="Collapse sidebar"
type="button"
>
<svg
aria-hidden="true"
fill="none"
focusable="false"
height="20"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.6"
viewBox="0 0 24 24"
width="20"
>
<rect
height="18"
rx="2"
width="18"
x="3"
y="3"
/>
<line
x1="9"
x2="9"
y1="3"
y2="21"
/>
</svg>
</button>
</div>
<div
aria-hidden="true"
class="entry-nav-rail__logo-divider"
role="separator"
/>
<div
aria-hidden="true"
class="_search_02e606"
>
<svg
aria-hidden="true"
fill="none"
focusable="false"
height="14"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.6"
viewBox="0 0 24 24"
width="14"
>
<circle
cx="11"
cy="11"
r="7"
/>
<path
d="m21 21-4.3-4.3"
/>
</svg>
<input
placeholder="Search"
readonly=""
tabindex="-1"
type="text"
/>
</div>
<button
aria-label="New project"
class="entry-nav-rail__btn"
data-testid="entry-nav-new-project"
data-tooltip="New project"
type="button"
>
<span
aria-hidden="true"
class="entry-nav-rail__btn-icon"
>
<svg
aria-hidden="true"
fill="none"
focusable="false"
height="18"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.6"
viewBox="0 0 24 24"
width="18"
>
<path
d="M12 5v14"
/>
<path
d="M5 12h14"
/>
</svg>
</span>
<span
class="entry-nav-rail__btn-label"
>
|
|
Playwright visual (entry-navigation)
Process completed with exit code 1.
|
|
ui/visual-navigation.test.ts:117:1 βΊ [P2] captures the integrations MCP surface:
e2e/ui/visual-navigation.test.ts#L122
5) ui/visual-navigation.test.ts:117:1 βΊ [P2] captures the integrations MCP surface βββββββββββββββ
Error: locator.click: Test timeout of 60000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-integrations')
120 |
121 | await ensureRailOpen(page);
> 122 | await page.getByTestId('entry-nav-integrations').click();
| ^
123 | await page.getByTestId('integrations-tab-mcp').click();
124 | await expect(page.getByTestId('integrations-tab-mcp')).toHaveAttribute('aria-selected', 'true');
125 | await expect(page.getByText(/MCP/i).first()).toBeVisible();
at /home/runner/_work/open-design/open-design/e2e/ui/visual-navigation.test.ts:122:52
|
|
ui/visual-navigation.test.ts:117:1 βΊ [P2] captures the integrations MCP surface:
e2e/ui/visual-navigation.test.ts#L0
5) ui/visual-navigation.test.ts:117:1 βΊ [P2] captures the integrations MCP surface βββββββββββββββ
Test timeout of 60000ms exceeded.
|
|
ui/visual-navigation.test.ts:103:1 βΊ [P2] captures the integrations use everywhere surface:
e2e/ui/visual-navigation.test.ts#L108
4) ui/visual-navigation.test.ts:103:1 βΊ [P2] captures the integrations use everywhere surface ββββ
Error: locator.click: Test timeout of 60000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-integrations')
106 |
107 | await ensureRailOpen(page);
> 108 | await page.getByTestId('entry-nav-integrations').click();
| ^
109 | await page.getByTestId('integrations-tab-use-everywhere').click();
110 | await expect(page.getByTestId('integrations-tab-use-everywhere')).toHaveAttribute('aria-selected', 'true');
111 | await expect(page.getByText('CLI, HTTP, MCP').first()).toBeVisible();
at /home/runner/_work/open-design/open-design/e2e/ui/visual-navigation.test.ts:108:52
|
|
ui/visual-navigation.test.ts:103:1 βΊ [P2] captures the integrations use everywhere surface:
e2e/ui/visual-navigation.test.ts#L0
4) ui/visual-navigation.test.ts:103:1 βΊ [P2] captures the integrations use everywhere surface ββββ
Test timeout of 60000ms exceeded.
|
|
ui/visual-navigation.test.ts:89:1 βΊ [P2] captures the integrations page surface:
e2e/ui/visual-navigation.test.ts#L94
3) ui/visual-navigation.test.ts:89:1 βΊ [P2] captures the integrations page surface βββββββββββββββ
Error: locator.click: Test timeout of 60000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-integrations')
92 |
93 | await ensureRailOpen(page);
> 94 | await page.getByTestId('entry-nav-integrations').click();
| ^
95 | await expect(page).toHaveURL(/\/integrations$/);
96 | await expect(page.getByRole('heading', { name: 'Integrations' })).toBeVisible();
97 | await expect(page.getByTestId('integrations-tab-connectors')).toBeVisible();
at /home/runner/_work/open-design/open-design/e2e/ui/visual-navigation.test.ts:94:52
|
|
ui/visual-navigation.test.ts:89:1 βΊ [P2] captures the integrations page surface:
e2e/ui/visual-navigation.test.ts#L0
3) ui/visual-navigation.test.ts:89:1 βΊ [P2] captures the integrations page surface βββββββββββββββ
Test timeout of 60000ms exceeded.
|
|
ui/visual-navigation.test.ts:25:1 βΊ [P2] captures the projects kanban surface:
e2e/ui/visual-navigation.test.ts#L30
2) ui/visual-navigation.test.ts:25:1 βΊ [P2] captures the projects kanban surface βββββββββββββββββ
Error: locator.click: Test timeout of 60000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-projects')
28 |
29 | await ensureRailOpen(page);
> 30 | await page.getByTestId('entry-nav-projects').click();
| ^
31 | const projects = page.getByTestId('entry-view-projects');
32 | await projects.getByTestId('designs-view-kanban').click();
33 | await expect(projects.getByTestId('designs-view-kanban')).toHaveAttribute('aria-pressed', 'true');
at /home/runner/_work/open-design/open-design/e2e/ui/visual-navigation.test.ts:30:48
|
|
ui/visual-navigation.test.ts:25:1 βΊ [P2] captures the projects kanban surface:
e2e/ui/visual-navigation.test.ts#L0
2) ui/visual-navigation.test.ts:25:1 βΊ [P2] captures the projects kanban surface βββββββββββββββββ
Test timeout of 60000ms exceeded.
|
|
ui/visual-navigation.test.ts:10:1 βΊ [P2] captures the projects page surface:
e2e/ui/visual-navigation.test.ts#L15
1) ui/visual-navigation.test.ts:10:1 βΊ [P2] captures the projects page surface βββββββββββββββββββ
Error: locator.click: Test timeout of 60000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-projects')
13 |
14 | await ensureRailOpen(page);
> 15 | await page.getByTestId('entry-nav-projects').click();
| ^
16 | await expect(page).toHaveURL(/\/projects$/);
17 | const projects = page.getByTestId('entry-view-projects');
18 | await expect(projects.getByRole('heading', { name: 'Projects' })).toBeVisible();
at /home/runner/_work/open-design/open-design/e2e/ui/visual-navigation.test.ts:15:48
|
|
ui/visual-navigation.test.ts:10:1 βΊ [P2] captures the projects page surface:
e2e/ui/visual-navigation.test.ts#L0
1) ui/visual-navigation.test.ts:10:1 βΊ [P2] captures the projects page surface βββββββββββββββββββ
Test timeout of 60000ms exceeded.
|
|
UI P0 (workspace-restoration)
Process completed with exit code 1.
|
|
[chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab:
e2e/ui/app-restoration.test.ts#L4026
1) [chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Error: locator.click: Test timeout of 90000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-projects')
4024 | if (!(await page.locator('.tab-panel-toolbar').isVisible().catch(() => false))) {
4025 | await ensureRailOpen(page);
> 4026 | await page.getByTestId('entry-nav-projects').click();
| ^
4027 | }
4028 | await expect(page.locator('.tab-panel-toolbar')).toBeVisible();
4029 | }
at expectProjectsView (/home/runner/_work/open-design/open-design/e2e/ui/app-restoration.test.ts:4026:50)
at /home/runner/_work/open-design/open-design/e2e/ui/app-restoration.test.ts:229:3
|
|
[chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab:
e2e/ui/app-restoration.test.ts#L0
1) [chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Test timeout of 90000ms exceeded.
|
|
[chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab:
e2e/ui/app-restoration.test.ts#L4026
1) [chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab
Error: locator.click: Test timeout of 90000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-projects')
4024 | if (!(await page.locator('.tab-panel-toolbar').isVisible().catch(() => false))) {
4025 | await ensureRailOpen(page);
> 4026 | await page.getByTestId('entry-nav-projects').click();
| ^
4027 | }
4028 | await expect(page.locator('.tab-panel-toolbar')).toBeVisible();
4029 | }
at expectProjectsView (/home/runner/_work/open-design/open-design/e2e/ui/app-restoration.test.ts:4026:50)
at /home/runner/_work/open-design/open-design/e2e/ui/app-restoration.test.ts:229:3
|
|
[chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab:
e2e/ui/app-restoration.test.ts#L0
1) [chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab
Test timeout of 90000ms exceeded.
|
|
UI P0 (entry-settings)
Process completed with exit code 1.
|
|
[chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately:
e2e/ui/entry-configuration-flows.test.ts#L374
2) [chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Error: locator.click: Test timeout of 120000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-integrations')
372 | async function openIntegrationsConnectors(page: Page): Promise<Locator> {
373 | await ensureRailOpen(page);
> 374 | await page.getByTestId('entry-nav-integrations').click();
| ^
375 | await expect(page).toHaveURL(/\/integrations$/);
376 | await expect(page.getByRole('heading', { name: 'Integrations' })).toBeVisible();
377 | await page.getByTestId('integrations-tab-connectors').click();
at openIntegrationsConnectors (/home/runner/_work/open-design/open-design/e2e/ui/entry-configuration-flows.test.ts:374:52)
at /home/runner/_work/open-design/open-design/e2e/ui/entry-configuration-flows.test.ts:258:26
|
|
[chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately:
e2e/ui/entry-configuration-flows.test.ts#L0
2) [chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Test timeout of 120000ms exceeded.
|
|
[chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately:
e2e/ui/entry-configuration-flows.test.ts#L374
2) [chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately
Error: locator.click: Test timeout of 120000ms exceeded.
Call log:
- waiting for getByTestId('entry-nav-integrations')
372 | async function openIntegrationsConnectors(page: Page): Promise<Locator> {
373 | await ensureRailOpen(page);
> 374 | await page.getByTestId('entry-nav-integrations').click();
| ^
375 | await expect(page).toHaveURL(/\/integrations$/);
376 | await expect(page.getByRole('heading', { name: 'Integrations' })).toBeVisible();
377 | await page.getByTestId('integrations-tab-connectors').click();
at openIntegrationsConnectors (/home/runner/_work/open-design/open-design/e2e/ui/entry-configuration-flows.test.ts:374:52)
at /home/runner/_work/open-design/open-design/e2e/ui/entry-configuration-flows.test.ts:258:26
|
|
[chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately:
e2e/ui/entry-configuration-flows.test.ts#L0
2) [chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately
Test timeout of 120000ms exceeded.
|
|
[chromium] βΊ ui/entry-chrome-flows.test.ts:217:1 βΊ [P0] @critical recent projects strip opens a project card and view all routes to the projects index:
e2e/ui/entry-chrome-flows.test.ts#L229
1) [chromium] βΊ ui/entry-chrome-flows.test.ts:217:1 βΊ [P0] @critical recent projects strip opens a project card and view all routes to the projects index
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Error: expect(locator).toHaveAttribute(expected) failed
Locator: getByTestId('entry-nav-projects')
Expected: "page"
Timeout: 10000ms
Error: element(s) not found
Call log:
- Expect "toHaveAttribute" with timeout 10000ms
- waiting for getByTestId('entry-nav-projects')
227 | await page.getByTestId('recent-projects-view-all').click();
228 | await expect(page).toHaveURL(/\/projects$/);
> 229 | await expect(page.getByTestId('entry-nav-projects')).toHaveAttribute('aria-current', 'page');
| ^
230 | });
231 |
232 | test('[P1] design systems page is reachable from entry nav and supports search, preview, and default selection', async ({ page }) => {
at /home/runner/_work/open-design/open-design/e2e/ui/entry-chrome-flows.test.ts:229:56
|
|
[chromium] βΊ ui/entry-chrome-flows.test.ts:217:1 βΊ [P0] @critical recent projects strip opens a project card and view all routes to the projects index:
e2e/ui/entry-chrome-flows.test.ts#L229
1) [chromium] βΊ ui/entry-chrome-flows.test.ts:217:1 βΊ [P0] @critical recent projects strip opens a project card and view all routes to the projects index
Error: expect(locator).toHaveAttribute(expected) failed
Locator: getByTestId('entry-nav-projects')
Expected: "page"
Timeout: 10000ms
Error: element(s) not found
Call log:
- Expect "toHaveAttribute" with timeout 10000ms
- waiting for getByTestId('entry-nav-projects')
227 | await page.getByTestId('recent-projects-view-all').click();
228 | await expect(page).toHaveURL(/\/projects$/);
> 229 | await expect(page.getByTestId('entry-nav-projects')).toHaveAttribute('aria-current', 'page');
| ^
230 | });
231 |
232 | test('[P1] design systems page is reachable from entry nav and supports search, preview, and default selection', async ({ page }) => {
at /home/runner/_work/open-design/open-design/e2e/ui/entry-chrome-flows.test.ts:229:56
|
|
Validate workspace
Process completed with exit code 1.
|
|
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/
|
|
π Playwright Run Summary
3 passed (46.0s)
|
|
π Playwright Run Summary
19 passed (2.4m)
|
|
π Playwright Run Summary
21 passed (3.0m)
|
|
π Playwright Run Summary
37 passed (3.4m)
|
|
π Playwright Run Summary
6 failed
ui/visual-navigation.test.ts:10:1 βΊ [P2] captures the projects page surface ββββββββββββββββββββ
ui/visual-navigation.test.ts:25:1 βΊ [P2] captures the projects kanban surface ββββββββββββββββββ
ui/visual-navigation.test.ts:89:1 βΊ [P2] captures the integrations page surface ββββββββββββββββ
ui/visual-navigation.test.ts:103:1 βΊ [P2] captures the integrations use everywhere surface βββββ
ui/visual-navigation.test.ts:117:1 βΊ [P2] captures the integrations MCP surface ββββββββββββββββ
ui/visual-navigation.test.ts:131:1 βΊ [P2] captures the tasks page surface ββββββββββββββββββββββ
14 passed (5.9m)
|
|
π Playwright Run Summary
1 failed
[chromium] βΊ ui/app-restoration.test.ts:170:1 βΊ [P0] switching between projects restores each project workspace to its last active file tab
25 passed (6.9m)
|
|
π Playwright Run Summary
2 failed
[chromium] βΊ ui/entry-chrome-flows.test.ts:217:1 βΊ [P0] @critical recent projects strip opens a project card and view all routes to the projects index
[chromium] βΊ ui/entry-configuration-flows.test.ts:229:1 βΊ [P0] saving a Composio key from Integrations unlocks the connectors gate immediately
59 passed (7.6m)
|
Artifacts
Produced during runtime
| Name | Size | Digest | |
|---|---|---|---|
|
handoff-report-visual-pr
Expired
|
437 Bytes |
sha256:2a31c281f6726145dfaca3233c1a2e7345b90f545ec82177fb653e240c65bebb
|
|
|
ui-p0-ci-28990954096-entry-settings
Expired
|
50.9 MB |
sha256:5c5812d90a133bd94a7f83d5e6abf609d99a00cce19d507aa0d138c107a32c4d
|
|
|
ui-p0-ci-28990954096-project-runtime
Expired
|
348 KB |
sha256:f95c899e5552112045af1d3d4766b2c7646c2c01a72b61257ca19a05dd85bf0b
|
|
|
ui-p0-ci-28990954096-project-workspace
Expired
|
364 KB |
sha256:a06a0eaf774e4140e1ed6361b974a3f515c820b913f09f70ccf5bc7c70b409d4
|
|
|
ui-p0-ci-28990954096-smoke
Expired
|
276 KB |
sha256:f593d5c981858f72d7f6d0f000df42da988517243e00433269922568e43cdb7e
|
|
|
ui-p0-ci-28990954096-workspace-restoration
Expired
|
21.4 MB |
sha256:b1581aafe74187e07d20955404580f27bfb010b9000f8c1aaa93616da3d7c5e4
|
|
|
visual-pr-capture-5284-28990954096-entry-navigation
Expired
|
1.37 MB |
sha256:193154236818bb51ad9d3e6720f663eaa1b93d5dc7d03b322539ccc381a2e72d
|
|
|
visual-pr-capture-5284-28990954096-settings-workspace
Expired
|
2.85 MB |
sha256:5257ff814616ec457b9b34273d8dfb4fcdcda250df01b4b65fc9c0bc90acd6fc
|
|