Skip to content

fix: resolve frontend build errors, remove corrupted lockfile and fix… #855

fix: resolve frontend build errors, remove corrupted lockfile and fix…

fix: resolve frontend build errors, remove corrupted lockfile and fix… #855

Triggered via push August 7, 2026 16:55
Status Failure
Total duration 9m 46s
Artifacts 3

ci.yml

on: push
Backend Build & Test
1m 36s
Backend Build & Test
Frontend Build & Test
3m 34s
Frontend Build & Test
Frontend E2E (Playwright)
9m 36s
Frontend E2E (Playwright)
Contracts Build & Test
1m 54s
Contracts Build & Test
Fit to window
Zoom out
Zoom in

Annotations

14 errors, 4 warnings, and 1 notice
Backend Build & Test
Process completed with exit code 1.
Backend Build & Test
Process completed with exit code 2.
Frontend Build & Test
Process completed with exit code 1.
Frontend Build & Test
Process completed with exit code 1.
[chromium] › e2e/tests/auth.spec.ts:98:7 › wallet authentication journey › recovers gracefully: frontend/e2e/tests/auth.spec.ts#L0
4) [chromium] › e2e/tests/auth.spec.ts:98:7 › wallet authentication journey › recovers gracefully, without unlocking the app, when a wallet connection fails Test timeout of 60000ms exceeded.
[chromium] › e2e/tests/auth.spec.ts:126:7 › protected-route access › denies a role-gated route to an authenticated user without the required role: frontend/e2e/tests/auth.spec.ts#L131
3) [chromium] › e2e/tests/auth.spec.ts:126:7 › protected-route access › denies a role-gated route to an authenticated user without the required role Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByText(/access denied/i) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByText(/access denied/i) 129 | await loginAs(page, '/simulator', user); 130 | > 131 | await expect(page.getByText(/access denied/i)).toBeVisible(); | ^ 132 | await expect(page.getByRole('heading', { name: /Network Simulator/i })).not.toBeVisible(); 133 | }); 134 | }); at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:131:52
[chromium] › e2e/tests/auth.spec.ts:126:7 › protected-route access › denies a role-gated route to an authenticated user without the required role: frontend/e2e/tests/auth.spec.ts#L131
3) [chromium] › e2e/tests/auth.spec.ts:126:7 › protected-route access › denies a role-gated route to an authenticated user without the required role Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByText(/access denied/i) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByText(/access denied/i) 129 | await loginAs(page, '/simulator', user); 130 | > 131 | await expect(page.getByText(/access denied/i)).toBeVisible(); | ^ 132 | await expect(page.getByRole('heading', { name: /Network Simulator/i })).not.toBeVisible(); 133 | }); 134 | }); at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:131:52
[chromium] › e2e/tests/auth.spec.ts:126:7 › protected-route access › denies a role-gated route to an authenticated user without the required role: frontend/e2e/tests/auth.spec.ts#L131
3) [chromium] › e2e/tests/auth.spec.ts:126:7 › protected-route access › denies a role-gated route to an authenticated user without the required role Error: expect(locator).toBeVisible() failed Locator: getByText(/access denied/i) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByText(/access denied/i) 129 | await loginAs(page, '/simulator', user); 130 | > 131 | await expect(page.getByText(/access denied/i)).toBeVisible(); | ^ 132 | await expect(page.getByRole('heading', { name: /Network Simulator/i })).not.toBeVisible(); 133 | }); 134 | }); at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:131:52
[chromium] › e2e/tests/auth.spec.ts:116:7 › protected-route access › grants access to a role-gated route for an authenticated: frontend/e2e/tests/auth.spec.ts#L121
2) [chromium] › e2e/tests/auth.spec.ts:116:7 › protected-route access › grants access to a role-gated route for an authenticated, authorized user Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByRole('heading', { name: /Network Simulator/i }) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByRole('heading', { name: /Network Simulator/i }) 119 | await loginAs(page, '/simulator', user); 120 | > 121 | await expect(page.getByRole('heading', { name: /Network Simulator/i })).toBeVisible(); | ^ 122 | await expect(page.getByText(/access denied/i)).not.toBeVisible(); 123 | await expect(page.getByLabel(/sign out/i)).toBeVisible(); 124 | }); at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:121:77
[chromium] › e2e/tests/auth.spec.ts:116:7 › protected-route access › grants access to a role-gated route for an authenticated: frontend/e2e/tests/auth.spec.ts#L121
2) [chromium] › e2e/tests/auth.spec.ts:116:7 › protected-route access › grants access to a role-gated route for an authenticated, authorized user Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByRole('heading', { name: /Network Simulator/i }) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByRole('heading', { name: /Network Simulator/i }) 119 | await loginAs(page, '/simulator', user); 120 | > 121 | await expect(page.getByRole('heading', { name: /Network Simulator/i })).toBeVisible(); | ^ 122 | await expect(page.getByText(/access denied/i)).not.toBeVisible(); 123 | await expect(page.getByLabel(/sign out/i)).toBeVisible(); 124 | }); at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:121:77
[chromium] › e2e/tests/auth.spec.ts:116:7 › protected-route access › grants access to a role-gated route for an authenticated: frontend/e2e/tests/auth.spec.ts#L121
2) [chromium] › e2e/tests/auth.spec.ts:116:7 › protected-route access › grants access to a role-gated route for an authenticated, authorized user Error: expect(locator).toBeVisible() failed Locator: getByRole('heading', { name: /Network Simulator/i }) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByRole('heading', { name: /Network Simulator/i }) 119 | await loginAs(page, '/simulator', user); 120 | > 121 | await expect(page.getByRole('heading', { name: /Network Simulator/i })).toBeVisible(); | ^ 122 | await expect(page.getByText(/access denied/i)).not.toBeVisible(); 123 | await expect(page.getByLabel(/sign out/i)).toBeVisible(); 124 | }); at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:121:77
[chromium] › e2e/tests/auth.spec.ts:75:7 › wallet authentication journey › connecting the dev mock wallet unlocks the app behind WalletGate: frontend/e2e/tests/auth.spec.ts#L79
1) [chromium] › e2e/tests/auth.spec.ts:75:7 › wallet authentication journey › connecting the dev mock wallet unlocks the app behind WalletGate Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByRole('heading', { name: /Authentication Required/i }) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByRole('heading', { name: /Authentication Required/i }) 77 | 78 | // Every route but "/" is blocked behind WalletGate until a wallet connects. > 79 | await expect(page.getByRole('heading', { name: /Authentication Required/i })).toBeVisible(); | ^ 80 | 81 | await page.getByRole('button', { name: /Dev Mock Wallet/ }).click(); 82 | at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:79:83
[chromium] › e2e/tests/auth.spec.ts:75:7 › wallet authentication journey › connecting the dev mock wallet unlocks the app behind WalletGate: frontend/e2e/tests/auth.spec.ts#L79
1) [chromium] › e2e/tests/auth.spec.ts:75:7 › wallet authentication journey › connecting the dev mock wallet unlocks the app behind WalletGate Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: getByRole('heading', { name: /Authentication Required/i }) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByRole('heading', { name: /Authentication Required/i }) 77 | 78 | // Every route but "/" is blocked behind WalletGate until a wallet connects. > 79 | await expect(page.getByRole('heading', { name: /Authentication Required/i })).toBeVisible(); | ^ 80 | 81 | await page.getByRole('button', { name: /Dev Mock Wallet/ }).click(); 82 | at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:79:83
[chromium] › e2e/tests/auth.spec.ts:75:7 › wallet authentication journey › connecting the dev mock wallet unlocks the app behind WalletGate: frontend/e2e/tests/auth.spec.ts#L79
1) [chromium] › e2e/tests/auth.spec.ts:75:7 › wallet authentication journey › connecting the dev mock wallet unlocks the app behind WalletGate Error: expect(locator).toBeVisible() failed Locator: getByRole('heading', { name: /Authentication Required/i }) Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for getByRole('heading', { name: /Authentication Required/i }) 77 | 78 | // Every route but "/" is blocked behind WalletGate until a wallet connects. > 79 | await expect(page.getByRole('heading', { name: /Authentication Required/i })).toBeVisible(); | ^ 80 | 81 | await page.getByRole('button', { name: /Dev Mock Wallet/ }).click(); 82 | at /home/runner/work/Web3-Student-Lab/Web3-Student-Lab/frontend/e2e/tests/auth.spec.ts:79:83
Backend Build & Test
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4, actions/upload-artifact@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Contracts Build & Test
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Frontend Build & Test
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Frontend E2E (Playwright)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4, 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
17 failed [chromium] › e2e/tests/auth.spec.ts:75:7 › wallet authentication journey › connecting the dev mock wallet unlocks the app behind WalletGate [chromium] › e2e/tests/auth.spec.ts:98:7 › wallet authentication journey › recovers gracefully, without unlocking the app, when a wallet connection fails [chromium] › e2e/tests/auth.spec.ts:116:7 › protected-route access › grants access to a role-gated route for an authenticated, authorized user [chromium] › e2e/tests/auth.spec.ts:126:7 › protected-route access › denies a role-gated route to an authenticated user without the required role [chromium] › e2e/tests/auth.spec.ts:137:7 › session recovery and logout › recovers safely when the session has expired: clears storage and returns to login [chromium] › e2e/tests/auth.spec.ts:155:7 › session recovery and logout › logs out from an authenticated session and clears local state [chromium] › e2e/tests/navigation.spec.ts:4:7 › critical learning journeys › opens the simulator and playground with mocked realtime transport [chromium] › e2e/tests/offline.spec.ts:13:7 › offline experience › shows an accessible offline banner when connectivity drops, and clears it when restored [chromium] › e2e/tests/offline.spec.ts:38:7 › offline experience › does not repeat the offline notice while the connection stays down [chromium] › e2e/tests/offline.spec.ts:60:7 › offline experience › the offline recovery page stays reachable with no wallet connected, and reflects live connectivity [chromium] › e2e/tests/responsive.spec.ts:5:9 › mobile-first responsive layout › home page › renders without horizontal overflow on any viewport [chromium] › e2e/tests/responsive.spec.ts:76:9 › mobile-first responsive layout › wallet authentication prompt › connect wallet options render without overflow [chromium] › e2e/tests/responsive.spec.ts:112:9 › mobile-first responsive layout › learning dashboard with wallet › renders curriculum dashboard without overflow [chromium] › e2e/tests/responsive.spec.ts:159:9 › mobile-first responsive layout › login page wallet connection › wallet connect card renders without overflow when connected [chromium] › e2e/tests/wallet.spec.ts:4:7 › wallet onboarding › installs mocked Stellar and Ethereum wallet providers [chromium] › e2e/tests/wallet.spec.ts:28:7 › wallet onboarding › restores wallet state into the transaction state chart [chromium] › e2e/tests/wallet.spec.ts:49:7 › wallet onboarding › keeps unavailable Freighter detection controlled 6 skipped 3 passed (8.0m)

Artifacts

Produced during runtime
Name Size Digest
playwright-report
18.1 MB
sha256:8380f8596c1434d51e99d06965a3fb93e31cabdbeced907abdea6d5e0810e1bb
playwright-test-results
24.8 MB
sha256:638e0b2e1de1ad54ebde04f64ce34721eaefaf0fc841ed48d554a151c8649c97
sbom-backend
163 KB
sha256:b0d9914b35d34b183af51c799ebcf493546ccfaa5ddf788a7c20edfd02bda7fe