Skip to content

feat: Add 5 new instruments + fix silent failure bugs #246

feat: Add 5 new instruments + fix silent failure bugs

feat: Add 5 new instruments + fix silent failure bugs #246

Triggered via pull request January 14, 2026 13:30
Status Success
Total duration 14m 40s
Artifacts

ci.yml

on: pull_request
Fit to window
Zoom out
Zoom in

Annotations

10 errors, 5 warnings, and 1 notice
[chromium] › e2e/scrollbar.spec.ts:100:3 › Scrollbar behavior › all tracks should scroll together horizontally when scrolling the panel: app/e2e/scrollbar.spec.ts#L62
4) [chromium] › e2e/scrollbar.spec.ts:100:3 › Scrollbar behavior › all tracks should scroll together horizontally when scrolling the panel Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 60 | await expect(page.locator('[data-testid="grid"]')).toBeVisible({ timeout: 10000 }); 61 | // Wait for WebSocket connection to ensure state is fully synced > 62 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 63 | await expect(page.locator('.track-row').first()).toBeVisible({ timeout: 5000 }); 64 | }); 65 | at /home/runner/work/keyboardia/keyboardia/app/e2e/scrollbar.spec.ts:62:65
[chromium] › e2e/scrollbar.spec.ts:66:3 › Scrollbar behavior › should have a single scrollbar for the entire tracks panel: app/e2e/scrollbar.spec.ts#L62
3) [chromium] › e2e/scrollbar.spec.ts:66:3 › Scrollbar behavior › should have a single scrollbar for the entire tracks panel, not per track Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 60 | await expect(page.locator('[data-testid="grid"]')).toBeVisible({ timeout: 10000 }); 61 | // Wait for WebSocket connection to ensure state is fully synced > 62 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 63 | await expect(page.locator('.track-row').first()).toBeVisible({ timeout: 5000 }); 64 | }); 65 | at /home/runner/work/keyboardia/keyboardia/app/e2e/scrollbar.spec.ts:62:65
[chromium] › e2e/scrollbar.spec.ts:66:3 › Scrollbar behavior › should have a single scrollbar for the entire tracks panel: app/e2e/scrollbar.spec.ts#L62
3) [chromium] › e2e/scrollbar.spec.ts:66:3 › Scrollbar behavior › should have a single scrollbar for the entire tracks panel, not per track Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 60 | await expect(page.locator('[data-testid="grid"]')).toBeVisible({ timeout: 10000 }); 61 | // Wait for WebSocket connection to ensure state is fully synced > 62 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 63 | await expect(page.locator('.track-row').first()).toBeVisible({ timeout: 5000 }); 64 | }); 65 | at /home/runner/work/keyboardia/keyboardia/app/e2e/scrollbar.spec.ts:62:65
[chromium] › e2e/scrollbar.spec.ts:66:3 › Scrollbar behavior › should have a single scrollbar for the entire tracks panel: app/e2e/scrollbar.spec.ts#L62
3) [chromium] › e2e/scrollbar.spec.ts:66:3 › Scrollbar behavior › should have a single scrollbar for the entire tracks panel, not per track Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 60 | await expect(page.locator('[data-testid="grid"]')).toBeVisible({ timeout: 10000 }); 61 | // Wait for WebSocket connection to ensure state is fully synced > 62 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 63 | await expect(page.locator('.track-row').first()).toBeVisible({ timeout: 5000 }); 64 | }); 65 | at /home/runner/work/keyboardia/keyboardia/app/e2e/scrollbar.spec.ts:62:65
[chromium] › e2e/pitch-contour-alignment.spec.ts:99:3 › PitchContour alignment › SVG contour dots align with step cells for session with pitch variation: app/e2e/pitch-contour-alignment.spec.ts#L150
2) [chromium] › e2e/pitch-contour-alignment.spec.ts:99:3 › PitchContour alignment › SVG contour dots align with step cells for session with pitch variation Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 148 | 149 | // Wait for WebSocket connection to ensure state is fully synced > 150 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 151 | 152 | // Wait for track row to appear 153 | await expect(page.locator('.track-row')).toBeVisible({ timeout: 10000 }); at /home/runner/work/keyboardia/keyboardia/app/e2e/pitch-contour-alignment.spec.ts:150:65
[chromium] › e2e/pitch-contour-alignment.spec.ts:99:3 › PitchContour alignment › SVG contour dots align with step cells for session with pitch variation: app/e2e/pitch-contour-alignment.spec.ts#L150
2) [chromium] › e2e/pitch-contour-alignment.spec.ts:99:3 › PitchContour alignment › SVG contour dots align with step cells for session with pitch variation Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 148 | 149 | // Wait for WebSocket connection to ensure state is fully synced > 150 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 151 | 152 | // Wait for track row to appear 153 | await expect(page.locator('.track-row')).toBeVisible({ timeout: 10000 }); at /home/runner/work/keyboardia/keyboardia/app/e2e/pitch-contour-alignment.spec.ts:150:65
[chromium] › e2e/pitch-contour-alignment.spec.ts:99:3 › PitchContour alignment › SVG contour dots align with step cells for session with pitch variation: app/e2e/pitch-contour-alignment.spec.ts#L150
2) [chromium] › e2e/pitch-contour-alignment.spec.ts:99:3 › PitchContour alignment › SVG contour dots align with step cells for session with pitch variation Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 148 | 149 | // Wait for WebSocket connection to ensure state is fully synced > 150 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 151 | 152 | // Wait for track row to appear 153 | await expect(page.locator('.track-row')).toBeVisible({ timeout: 10000 }); at /home/runner/work/keyboardia/keyboardia/app/e2e/pitch-contour-alignment.spec.ts:150:65
[chromium] › e2e/pitch-contour-alignment.spec.ts:34:3 › PitchContour alignment › CSS dimensions match JavaScript constants (CRITICAL regression test): app/e2e/pitch-contour-alignment.spec.ts#L51
1) [chromium] › e2e/pitch-contour-alignment.spec.ts:34:3 › PitchContour alignment › CSS dimensions match JavaScript constants (CRITICAL regression test) Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 49 | 50 | // Wait for WebSocket connection before adding tracks > 51 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 52 | 53 | // Add a track to get step cells (button has star prefix like "★ 808 Kick") 54 | const addTrackButton = page.getByRole('button', { name: /808 Kick/i }); at /home/runner/work/keyboardia/keyboardia/app/e2e/pitch-contour-alignment.spec.ts:51:65
[chromium] › e2e/pitch-contour-alignment.spec.ts:34:3 › PitchContour alignment › CSS dimensions match JavaScript constants (CRITICAL regression test): app/e2e/pitch-contour-alignment.spec.ts#L51
1) [chromium] › e2e/pitch-contour-alignment.spec.ts:34:3 › PitchContour alignment › CSS dimensions match JavaScript constants (CRITICAL regression test) Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 49 | 50 | // Wait for WebSocket connection before adding tracks > 51 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 52 | 53 | // Add a track to get step cells (button has star prefix like "★ 808 Kick") 54 | const addTrackButton = page.getByRole('button', { name: /808 Kick/i }); at /home/runner/work/keyboardia/keyboardia/app/e2e/pitch-contour-alignment.spec.ts:51:65
[chromium] › e2e/pitch-contour-alignment.spec.ts:34:3 › PitchContour alignment › CSS dimensions match JavaScript constants (CRITICAL regression test): app/e2e/pitch-contour-alignment.spec.ts#L51
1) [chromium] › e2e/pitch-contour-alignment.spec.ts:34:3 › PitchContour alignment › CSS dimensions match JavaScript constants (CRITICAL regression test) Error: expect(locator).toBeVisible() failed Locator: locator('.connection-status--connected') Expected: visible Timeout: 10000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 10000ms - waiting for locator('.connection-status--connected') 49 | 50 | // Wait for WebSocket connection before adding tracks > 51 | await expect(page.locator('.connection-status--connected')).toBeVisible({ timeout: 10000 }); | ^ 52 | 53 | // Add a track to get step cells (button has star prefix like "★ 808 Kick") 54 | const addTrackButton = page.getByRole('button', { name: /808 Kick/i }); at /home/runner/work/keyboardia/keyboardia/app/e2e/pitch-contour-alignment.spec.ts:51:65
Lint: app/src/state/grid.tsx#L36
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Lint: app/src/state/grid.tsx#L13
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Lint: app/src/state/grid.tsx#L8
Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components
Lint: app/src/components/ScaleSidebar.tsx#L37
The 'noteNames' array makes the dependencies of useMemo Hook (at line 95) change on every render. To fix this, wrap the initialization of 'noteNames' in its own useMemo() Hook
Lint: app/src/components/ScaleSidebar.tsx#L37
The 'noteNames' array makes the dependencies of useMemo Hook (at line 66) change on every render. To fix this, wrap the initialization of 'noteNames' in its own useMemo() Hook
🎭 Playwright Run Summary
75 failed [chromium] › e2e/pitch-contour-alignment.spec.ts:34:3 › PitchContour alignment › CSS dimensions match JavaScript constants (CRITICAL regression test) [chromium] › e2e/pitch-contour-alignment.spec.ts:99:3 › PitchContour alignment › SVG contour dots align with step cells for session with pitch variation [chromium] › e2e/scrollbar.spec.ts:66:3 › Scrollbar behavior › should have a single scrollbar for the entire tracks panel, not per track [chromium] › e2e/scrollbar.spec.ts:100:3 › Scrollbar behavior › all tracks should scroll together horizontally when scrolling the panel [chromium] › e2e/scrollbar.spec.ts:181:3 › Scrollbar behavior › step columns should align vertically across all tracks [chromium] › e2e/track-reorder-bug-fixes.spec.ts:97:5 › Track Reorder Bug Fix Verification › BUG 1: Double handleDragEnd Prevention › should only reorder once per drag operation [chromium] › e2e/track-reorder-comprehensive.spec.ts:105:5 › Track Reorder - Comprehensive Edge Cases › Basic Reorder Operations › should reorder first track to last position [chromium] › e2e/track-reorder-comprehensive.spec.ts:120:5 › Track Reorder - Comprehensive Edge Cases › Basic Reorder Operations › should reorder last track to first position [chromium] › e2e/track-reorder-comprehensive.spec.ts:134:5 › Track Reorder - Comprehensive Edge Cases › Basic Reorder Operations › should reorder middle track up [chromium] › e2e/track-reorder-comprehensive.spec.ts:146:5 › Track Reorder - Comprehensive Edge Cases › Basic Reorder Operations › should reorder middle track down [chromium] › e2e/track-reorder-comprehensive.spec.ts:158:5 › Track Reorder - Comprehensive Edge Cases › Basic Reorder Operations › should swap adjacent tracks (down) [chromium] › e2e/track-reorder-comprehensive.spec.ts:171:5 › Track Reorder - Comprehensive Edge Cases › Basic Reorder Operations › should swap adjacent tracks (up) [chromium] › e2e/track-reorder-comprehensive.spec.ts:190:5 › Track Reorder - Comprehensive Edge Cases › Same Position Edge Cases › should NOT reorder when dragging to same position [chromium] › e2e/track-reorder-comprehensive.spec.ts:202:5 › Track Reorder - Comprehensive Edge Cases › Same Position Edge Cases › should NOT reorder when drag is released on same track [chromium] › e2e/track-reorder-comprehensive.spec.ts:229:5 › Track Reorder - Comprehensive Edge Cases › Rapid Consecutive Drags › should handle two quick consecutive reorders correctly [chromium] › e2e/track-reorder-comprehensive.spec.ts:245:5 › Track Reorder - Comprehensive Edge Cases › Rapid Consecutive Drags › should handle three rapid reorders without losing state [chromium] › e2e/track-reorder-comprehensive.spec.ts:265:5 › Track Reorder - Comprehensive Edge Cases › Rapid Consecutive Drags › should maintain track count after many rapid operations [chromium] › e2e/track-reorder-comprehensive.spec.ts:279:5 › Track Reorder - Comprehensive Edge Cases › Rapid Consecutive Drags › should not duplicate tracks during rapid back-and-forth drags [chromium] › e2e/track-reorder-comprehensive.spec.ts:300:5 › Track Reorder - Comprehensive Edge Cases › Cancel Drag Operations › should NOT reorder when drag is canceled by moving cursor away [chromium] › e2e/track-reorder-comprehensive.spec.ts:329:5 › Track Reorder - Comprehensive Edge Cases › Cancel Drag Operations › should NOT reorder when mouse is released without proper drop [chromium] › e2e/track-reorder-comprehensive.spec.ts:348:5 › Track Reorder - Comprehensive Edge Cases › Cancel Drag Operations › should clear drag state after cancel [chromium] › e2e/track-reorder-comprehensive.spec.ts:377:5 › Track Reorder - Comprehensive Edge Cases › State Consistency › should persist track order after multiple operations [chromium] › e2e/track-reorder-comprehensive.spec.ts:399:5 › Track Reorder - Co