feat(workspace-team): team workspaces, shared resources, workspace-scoped billing, and the #5517 redesign #17110
ci.yml
on: pull_request
Resolve runner profiles
13s
Matrix: playwright_critical
Matrix: playwright_visual
Matrix: ui_p0
Preflight
3m 34s
Workspace unit tests
1m 48s
Windows tools-pack payload tests
2m 21s
Web workspace tests
8m 39s
E2E Vitest
6m 11s
Runtime summary
6s
Annotations
12 errors, 4 warnings, and 7 notices
|
Web workspace tests
Process completed with exit code 1.
|
|
tests/components/App.project-create-race.test.tsx > App project creation routing > does not open a project bound to another workspace through a non-hint path:
apps/web/tests/components/App.project-create-race.test.tsx#L1856
AssertionError: expected "vi.fn()" to be called with arguments: [ 'project-bound-a', …(1) ]
Received:
1st vi.fn() call:
@@ -24,8 +24,9 @@
"seatLimit": 5,
"usedSeats": 1,
},
"workspaceId": "ws-b",
"workspaceMemberId": "member-ws-b",
+ "workspaceName": "ws-b",
"workspaceType": "team",
},
]
Number of calls: 1
Ignored nodes: comments, script, style
<html
data-od-app-mounted="1"
data-theme="light"
style="--accent: #353535; --accent-strong: color-mix(in srgb, #353535 82%, var(--text-strong)); --accent-soft: color-mix(in srgb, #353535 12%, var(--bg-subtle)); --accent-tint: color-mix(in srgb, #353535 6%, var(--bg-panel)); --accent-hover: color-mix(in srgb, #353535 86%, var(--text-strong));"
>
<head />
<body>
<div>
<div
data-reduced-motion="user"
data-testid="motion-config"
>
<div
class="workspace-shell workspace-shell--web"
data-client-type="web"
>
<span
data-testid="workspace-tabs-active-project-workspace"
>
unresolved
</span>
<div
class="workspace-shell__body"
>
<main>
<div
data-testid="entry-home-surface"
/>
<div
data-testid="amr-login-status"
>
null
</div>
<button
type="button"
>
Create project
</button>
<button
type="button"
>
Create prompted project
</button>
<button
type="button"
>
Create plugin share project
</button>
<button
type="button"
>
Create project with working dir
</button>
<button
type="button"
>
Create project with context dirs
</button>
<button
type="button"
>
Host import folder
</button>
<button
type="button"
>
Refresh agents
</button>
<button
type="button"
>
Open settings from home
</button>
<button
type="button"
>
Open missing project
</button>
<button
type="button"
>
Open catalog project
</button>
<button
type="button"
>
Open updated catalog project
</button>
<button
type="button"
>
Open own unbound project
</button>
<button
type="button"
>
Open workspace A project
</button>
<button
type="button"
>
Open stale own workspace A project
</button>
<div
data-testid="entry-agent-list"
/>
<div
data-testid="entry-project-project-bound-a"
>
<span>
Workspace A local
</span>
<button
type="button"
>
Open
Workspace A local
</button>
<button
type="button"
>
Delete
Workspace A local
</button>
</div>
</main>
</div>
</div>
<div
aria-live="assertive"
class="od-toast tone-error placement-bottom"
role="alert"
>
<div
|
|
tests/components/App.project-create-race.test.tsx > App project creation routing > uses a title hint only after loading the workspace-bound local row:
apps/web/tests/components/App.project-create-race.test.tsx#L1683
AssertionError: expected "vi.fn()" to be called with arguments: [ 'project-shared', …(1) ]
Received:
1st vi.fn() call:
@@ -24,8 +24,9 @@
"seatLimit": 5,
"usedSeats": 1,
},
"workspaceId": "ws-1",
"workspaceMemberId": "wm-1",
+ "workspaceName": "ws-1",
"workspaceType": "team",
},
]
Number of calls: 1
❯ tests/components/App.project-create-race.test.tsx:1683:30
|
|
tests/components/App.project-create-race.test.tsx > App project creation routing > switches to the picked working dir before uploading staged Home attachments:
apps/web/tests/components/App.project-create-race.test.tsx#L1552
AssertionError: expected "vi.fn()" to be called with arguments: [ 'project-new', …(3) ]
Received:
1st vi.fn() call:
@@ -26,8 +26,9 @@
"seatLimit": 5,
"usedSeats": 1,
},
"workspaceId": "ws-create",
"workspaceMemberId": "wm-create",
+ "workspaceName": "ws-create",
"workspaceType": "team",
},
]
Number of calls: 1
❯ tests/components/App.project-create-race.test.tsx:1552:44
|
|
tests/useWorkspaceContext.sign-in-refresh.test.tsx > useWorkspaceContext sign-in refresh > keeps showing a resolved workspace while an identity refresh re-reads:
apps/web/tests/useWorkspaceContext.sign-in-refresh.test.tsx#L141
AssertionError: expected { workspaceType: 'team', …(12) } to deeply equal { workspaceType: 'team', …(11) }
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div />
</body>
</html>
- Expected
+ Received
@@ -22,7 +22,8 @@
"usedSeats": 2,
},
"teamName": "Acme",
"workspaceId": "ws-1",
"workspaceMemberId": "member-1",
+ "workspaceName": "Acme",
"workspaceType": "team",
}
❯ tests/useWorkspaceContext.sign-in-refresh.test.tsx:141:56
❯ runWithExpensiveErrorDiagnosticsDisabled ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/config.js:47:12
❯ checkCallback ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/wait-for.js:124:77
❯ Timeout.checkRealTimersCallback ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/wait-for.js:118:16
|
|
tests/useWorkspaceContext.sign-in-refresh.test.tsx > useWorkspaceContext sign-in refresh > stops reporting signed-out while an explicit post-sign-in re-read is in flight:
apps/web/tests/useWorkspaceContext.sign-in-refresh.test.tsx#L111
AssertionError: expected { workspaceType: 'team', …(12) } to deeply equal { workspaceType: 'team', …(11) }
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div />
</body>
</html>
- Expected
+ Received
@@ -22,7 +22,8 @@
"usedSeats": 2,
},
"teamName": "Acme",
"workspaceId": "ws-1",
"workspaceMemberId": "member-1",
+ "workspaceName": "Acme",
"workspaceType": "team",
}
❯ tests/useWorkspaceContext.sign-in-refresh.test.tsx:111:56
❯ runWithExpensiveErrorDiagnosticsDisabled ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/config.js:47:12
❯ checkCallback ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/wait-for.js:124:77
❯ Timeout.checkRealTimersCallback ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/wait-for.js:118:16
|
|
tests/use-project-collab.context-seed.test.tsx > useProjectCollab workspace-context seeding > marks a catalog-named teammate project as shared non-owner before status names them:
apps/web/tests/use-project-collab.context-seed.test.tsx#L281
AssertionError: expected false to be true // Object.is equality
- Expected
+ Received
- true
+ false
❯ tests/use-project-collab.context-seed.test.tsx:281:53
|
|
tests/use-project-collab.context-seed.test.tsx > useProjectCollab workspace-context seeding > treats catalog-named owners as effective owners while status omits ownerMemberId:
apps/web/tests/use-project-collab.context-seed.test.tsx#L235
AssertionError: expected false to be true // Object.is equality
- Expected
+ Received
- true
+ false
❯ tests/use-project-collab.context-seed.test.tsx:235:53
|
|
tests/use-project-collab.context-seed.test.tsx > useProjectCollab workspace-context seeding > does not fail closed for a shared project the viewer owns:
apps/web/tests/use-project-collab.context-seed.test.tsx#L193
AssertionError: expected true to be false // Object.is equality
- Expected
+ Received
- false
+ true
❯ tests/use-project-collab.context-seed.test.tsx:193:47
|
|
tests/use-project-collab.context-seed.test.tsx > useProjectCollab workspace-context seeding > does not fail closed for a project the hub catalog does not list:
apps/web/tests/use-project-collab.context-seed.test.tsx#L156
AssertionError: expected true to be false // Object.is equality
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div />
<div />
<div />
</body>
</html>
- Expected
+ Received
- false
+ true
❯ tests/use-project-collab.context-seed.test.tsx:156:49
❯ runWithExpensiveErrorDiagnosticsDisabled ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/config.js:47:12
❯ checkCallback ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/wait-for.js:124:77
❯ Timeout.checkRealTimersCallback ../../node_modules/.pnpm/@testing-library+dom@10.4.1/node_modules/@testing-library/dom/dist/wait-for.js:118:16
|
|
[chromium] › ui/app-restoration.test.ts:1217:1 › [P0] @critical daemon error details persist between failed sends:
e2e/lib/playwright/workspace.ts#L16
1) [chromium] › ui/app-restoration.test.ts:1217:1 › [P0] @critical daemon error details persist between failed sends
Error: expect(locator).toHaveAttribute(expected) failed
Locator: getByTestId('design-files-tab')
Expected: "true"
Received: "false"
Timeout: 10000ms
Call log:
- Expect "toHaveAttribute" with timeout 10000ms
- waiting for getByTestId('design-files-tab')
22 × locator resolved to <button role="tab" tabindex="0" type="button" title="Design Files" aria-selected="false" aria-label="Design Files" data-testid="design-files-tab" class="ws-tab design-files-tab ">…</button>
- unexpected value "false"
at ../lib/playwright/workspace.ts:16
14 |
15 | export async function expectAllProjectFilesActive(page: Page): Promise<void> {
> 16 | await expect(page.getByTestId('design-files-tab')).toHaveAttribute('aria-selected', 'true');
| ^
17 | }
18 |
19 | export async function expectAllProjectFilesInactive(page: Page): Promise<void> {
at expectAllProjectFilesActive (/home/runner/work/open-design/open-design/e2e/lib/playwright/workspace.ts:16:54)
at openAllProjectFiles (/home/runner/work/open-design/open-design/e2e/lib/playwright/workspace.ts:12:9)
at /home/runner/work/open-design/open-design/e2e/ui/app-restoration.test.ts:1250:3
|
|
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/
|
|
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-AhQnKi/gh-stub.mjs api repos/nexu-io/open-design/compare/1111111111111111111111111111111111111111...2222222222222222222222222222222222222222
|
|
Slow Test:
e2e/[chromium] › ui/amr-onboarding.test.ts#L0
e2e/[chromium] › ui/amr-onboarding.test.ts took 5.3m
|
|
🎭 Playwright Run Summary
3 skipped
17 passed (3.2m)
|
|
🎭 Playwright Run Summary
18 passed (4.3m)
|
|
🎭 Playwright Run Summary
4 passed (1.9m)
|
|
🎭 Playwright Run Summary
22 passed (5.1m)
|
|
🎭 Playwright Run Summary
1 flaky
[chromium] › ui/app-restoration.test.ts:1217:1 › [P0] @critical daemon error details persist between failed sends
28 passed (8.6m)
|
|
🎭 Playwright Run Summary
1 skipped
70 passed (10.9m)
|
|
🎭 Playwright Run Summary
37 passed (12.2m)
|
Artifacts
Produced during runtime
| Name | Size | Digest | |
|---|---|---|---|
|
handoff-report-visual-pr
|
438 Bytes |
sha256:beaab0c216723f04157109a1dd21fc5d434ed07300a77c65aabfd89229d2bb35
|
|
|
ui-p0-ci-30765155248-entry-settings
|
389 KB |
sha256:278c2deeb5c317cf04141c8be6561666da37f636fbdc7f0b4ebc01681c81405a
|
|
|
ui-p0-ci-30765155248-project-runtime
|
287 KB |
sha256:ac2dbcc54ae9bd9e21354a8177ac24fc47f8cd79001a3dcb068c1099efc0c824
|
|
|
ui-p0-ci-30765155248-project-runtime-domain
|
340 KB |
sha256:60b93ad19cfebaed38b7a0c5e26bc0336b4a0db487a180e70433b398fe2b5ee2
|
|
|
ui-p0-ci-30765155248-project-workspace
|
406 KB |
sha256:b621f5c8855d8f071c3d7728c21ade6b6c3733df750462223c61566ef1cc94fb
|
|
|
ui-p0-ci-30765155248-workspace-restoration
|
13.5 MB |
sha256:0dcfcd78809b4b3fd7baedc1adb96c098110ecf1c8c69b2e0809fc2ea2591a60
|
|
|
visual-pr-capture-6142-30765155248-entry-navigation
|
5.49 MB |
sha256:5f9228e903588ebb2595e12c778bc61518f0d90d528591b59409ba7a715ebdda
|
|
|
visual-pr-capture-6142-30765155248-settings-workspace
|
3.13 MB |
sha256:36920bdb9c40812c9afb71ed963c09a492a6e290e6a9939e518adac132af7b26
|
|