Skip to content
Draft
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ This section applies to any agent (Claude, Codex, Cursor, opencode, ...) working
- Keep UI and analysis engine decoupled through shared contracts.
- Prefer minimal, test-first changes for production code.
- Prefer practical, friendly, rehearsal-first wording over academic or authority-heavy language.
- After a song is selected, customer-facing copy must enable the next rehearsal action (pick tonight's part and analyze). Do not leave a selected source on the empty-file prompt.
- Do not reduce the product to a chord analyzer when form, timing, player coordination, simplification, and setup cues are the real rehearsal blockers.
- Do not frame usability as a reason to accept weak analysis quality; BandScope should aim for both easy use and high accuracy.

Expand Down
1 change: 1 addition & 0 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Last updated: 2026-03-11

- Product identity, UX tone, copy rules, and prioritization tie-breakers live in `docs/brand-story.md`.
- Future PRDs, TRDs, onboarding copy, empty states, error messages, and marketing copy should use that document as the single brand source of truth.
- After local or YouTube source admission, the workspace first-run card names analyze as the next action and records an explicit role focus before the job starts.

## Security source

Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Added

- After a local song or admitted YouTube source is chosen, the workspace names Analyze this song as the next action and lets the player pick tonight's part before analysis starts.
- Display the analyzed song tempo (BPM) as a badge in the rehearsal workspace.
- 각 합주 역할(Role)별 개인 연습 진행도를 0~100% 범위로 기록 및 시각화할 수 있는 연습 진척도(`practiceProgress`) 트래커 기능 추가. UI 컨트롤(슬라이더 및 +/- 버튼)과 한/영 다국어 지원 포함.

Expand Down
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co

`AGENTS.md` is the canonical agent operating guide — read and follow it before making changes. It defines the security workflow (`Security Notes`), supply-chain workflow, cross-platform build rules, GitHub bootstrap rules, code style, and safety guardrails. This file complements it with commands and architecture; when in doubt, `AGENTS.md` and the docs it references win.

After a local or YouTube source is selected, the workspace must show a first-run card that starts analysis for the chosen part rather than repeating the empty-file prompt.

Agent execution and delegation rules live in `docs/agents/README.md`. PR canonicalization rules live in `docs/workflow/pr-continuity.md`.

## Common commands
Expand Down
94 changes: 94 additions & 0 deletions apps/desktop/src/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));

await waitFor(() => {

Check failure on line 405 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > selects a local audio source and starts a local-audio analysis job

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 405 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > selects a local audio source and starts a local-audio analysis job

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce
expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy();
});

Expand Down Expand Up @@ -479,7 +479,7 @@
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => {

Check failure on line 482 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > starts an analysis job and renders the returned rehearsal result

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 482 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > starts an analysis job and renders the returned rehearsal result

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce
expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy();
});

Expand Down Expand Up @@ -519,7 +519,7 @@
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => {

Check failure on line 522 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > shows the engine stage label and accessible progress value while analysis runs

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 522 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > shows the engine stage label and accessible progress value while analysis runs

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce
expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy();
});

Expand Down Expand Up @@ -553,7 +553,7 @@
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy());

Check failure on line 556 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > animates rendered progress toward the running job target

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 556 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > animates rendered progress toward the running job target

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

fireEvent.click(screen.getByRole("button", { name: /start analysis/i }));

Expand Down Expand Up @@ -586,7 +586,7 @@
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy());

Check failure on line 589 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > uses translated progress labels when status payloads omit a progress label

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 589 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > uses translated progress labels when status payloads omit a progress label

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

fireEvent.click(screen.getByRole("button", { name: /start analysis/i }));
await waitFor(() => {
Expand Down Expand Up @@ -623,7 +623,7 @@
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy());

Check failure on line 626 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > falls back to failed progress copy when a pushed status has no error details

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 626 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > falls back to failed progress copy when a pushed status has no error details

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

fireEvent.click(screen.getByRole("button", { name: /start analysis/i }));
await waitFor(() => {
Expand Down Expand Up @@ -660,7 +660,7 @@
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy());

Check failure on line 663 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > holds a terminal progress value immediately for pushed failed statuses

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 663 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > holds a terminal progress value immediately for pushed failed statuses

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

fireEvent.click(screen.getByRole("button", { name: /start analysis/i }));
await waitFor(() => {
Expand Down Expand Up @@ -715,7 +715,7 @@
const { unmount } = render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy());

Check failure on line 718 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > cleans up a late status subscription when the running view unmounts first

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 718 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > cleans up a late status subscription when the running view unmounts first

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

fireEvent.click(screen.getByRole("button", { name: /start analysis/i }));
await waitFor(() => {
Expand Down Expand Up @@ -750,7 +750,7 @@
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy());

Check failure on line 753 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > marks the active job failed when polling returns a malformed status

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 753 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > marks the active job failed when polling returns a malformed status

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

fireEvent.click(screen.getByRole("button", { name: /start analysis/i }));

Expand All @@ -775,7 +775,7 @@
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /choose local audio/i }));
await waitFor(() => expect(screen.getByText(/late-night-set\.wav/i)).toBeTruthy());

Check failure on line 778 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / release-preflight

src/App.test.tsx > App > ignores malformed poll results after a pushed update changes the active job

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

Check failure on line 778 in apps/desktop/src/App.test.tsx

View workflow job for this annotation

GitHub Actions / ci / build-and-test

src/App.test.tsx > App > ignores malformed poll results after a pushed update changes the active job

TestingLibraryElementError: Found multiple elements with the text: /late-night-set\.wav/i Here are the matching elements: Ignored nodes: comments, script, style <div class="rounded-full border border-emerald-300/20 bg-emerald-300/10 px-3 py-1 font-semibold text-emerald-200" title="late-night-set.wav" > late-night-set.wav </div> Ignored nodes: comments, script, style <span class="break-all font-bold text-slate-100" > late-night-set.wav </span> (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style <body> <div> <div class="min-h-screen overflow-x-hidden bg-[var(--bandscope-bg)] text-slate-100 selection:bg-cyan-300/30" > <div class="pointer-events-none fixed inset-0 bg-[radial-gradient(circle_at_18%_8%,rgba(15,120,255,0.22),transparent_28%),radial-gradient(circle_at_78%_0%,rgba(124,58,237,0.20),transparent_30%),linear-gradient(180deg,#07111f_0%,#020713_55%,#020611_100%)]" /> <div class="pointer-events-none fixed inset-0 opacity-[0.06] [background-image:linear-gradient(rgba(255,255,255,.8)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,.8)_1px,transparent_1px)] [background-size:46px_46px]" /> <div class="relative flex min-h-screen" > <aside class="hidden w-64 shrink-0 border-r border-[color:var(--bandscope-border)] bg-[var(--bandscope-surface-strong)] px-5 py-5 shadow-[24px_0_80px_rgba(0,0,0,0.28)] backdrop-blur-2xl lg:flex lg:flex-col" > <div aria-hidden="true" class="mb-7 flex items-center gap-2" > <span class="size-3 rounded-full bg-red-400" /> <span class="size-3 rounded-full bg-amber-300" /> <span class="size-3 rounded-full bg-emerald-400" /> </div> <div class="mb-9 flex items-center gap-3" > <span aria-label="BandScope circular equalizer mark" class="relative grid size-11 shrink-0 place-items-center rounded-full border border-cyan-200/45 bg-cyan-200/10 shadow-[0_0_28px_rgba(103,232,249,0.34)]" role="img" > <span aria-hidden="true" class="absolute inset-1 rounded-full border border-teal-200/20" /> <span aria-hidden="true" class="flex h-8 items-end gap-0.5" > <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-3" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-5" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-7" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-4" /> <span class="w-1.5 rounded-full bg-gradient-to-t from-teal-300 via-cyan-200 to-violet-300 h-6" /> </span> </span> <div> <div class="text-2xl font-black tracking-tight" > Band <span class="text-cyan-300" > Scope </span> </div> <div class="text-xs font-semibold uppercase text-slate-400" > Rehearsal cockpit </div> </div> </div> <nav aria-label="Primary rehearsal views" class="space-y-2" > <button aria-current="page" class="flex min-h-11 w-full items-ce

fireEvent.click(screen.getByRole("button", { name: /start analysis/i }));
await waitFor(() => expect(tauriInvoke).toHaveBeenCalledTimes(3));
Expand Down Expand Up @@ -1616,4 +1616,98 @@
expect(await screen.findByRole("heading", { name: /Score · Late Night Set/i })).toBeInTheDocument();
expect(screen.queryByText(/Song Timeline/i)).toBeNull();
});

it("turns a selected local song into a first-run analyze card", async () => {
tauriInvoke.mockResolvedValueOnce(bootstrapResponse());
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /^Choose local audio$/i }));

expect(await screen.findByRole("heading", { name: "Tonight's song is ready" })).toBeTruthy();
expect(screen.getByRole("button", { name: "Analyze this song" })).toBeTruthy();
expect(screen.getByRole("radio", { name: "Whole band" })).toHaveAttribute("aria-checked", "true");
expect(screen.queryByText("/Users/test/Music/late-night-set.wav")).toBeNull();
expect(screen.queryByRole("heading", { name: "Ready to Analyze" })).toBeNull();
});

it("starts analysis from the first-run card with the chosen part", async () => {
tauriInvoke
.mockResolvedValueOnce(bootstrapResponse())
.mockResolvedValueOnce(jobStatusResponse({
jobId: "job-first-run",
state: "queued",
progressLabel: "Queued for analysis"
}));
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /^Choose local audio$/i }));
expect(await screen.findByRole("heading", { name: "Tonight's song is ready" })).toBeTruthy();

fireEvent.click(screen.getByRole("radio", { name: "Lead vocal" }));
fireEvent.click(screen.getByRole("button", { name: "Analyze this song" }));

await waitFor(() => {
expect(tauriInvoke).toHaveBeenNthCalledWith(2, "start_analysis_job", {
request: {
sourceKind: "local_audio",
projectId: "project-1",
sourceLabel: "late-night-set.wav",
roleFocus: ["lead-vocal"]
}
});
});
});

it("lets the first-run card choose a different local file", async () => {
tauriInvoke
.mockResolvedValueOnce(bootstrapResponse())
.mockResolvedValueOnce(bootstrapResponse({
projectId: "project-2",
source: {
sourcePath: "/Users/test/Music/next-song.wav",
fileName: "next-song.wav",
extension: "wav",
fileSizeBytes: 2048000
}
}));
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /^Choose local audio$/i }));
expect(await screen.findByRole("heading", { name: "Tonight's song is ready" })).toBeTruthy();

fireEvent.click(screen.getByRole("button", { name: "Choose a different file" }));

await waitFor(() => {
expect(screen.getByText(/next-song\.wav/i)).toBeTruthy();
});
expect(screen.getByRole("heading", { name: "Tonight's song is ready" })).toBeTruthy();
expect(screen.queryByText("/Users/test/Music/next-song.wav")).toBeNull();
});

it("keeps header start-analysis on the whole-band role until a part is chosen", async () => {
tauriInvoke
.mockResolvedValueOnce(bootstrapResponse())
.mockResolvedValueOnce(jobStatusResponse({
jobId: "job-header-role",
state: "queued",
progressLabel: "Queued for analysis"
}));
render(<App />);

fireEvent.click(screen.getByRole("button", { name: /^Choose local audio$/i }));
expect(await screen.findByRole("heading", { name: "Tonight's song is ready" })).toBeTruthy();

fireEvent.click(screen.getByRole("button", { name: /^Start analysis$/i }));

await waitFor(() => {
expect(tauriInvoke).toHaveBeenNthCalledWith(2, "start_analysis_job", {
request: {
sourceKind: "local_audio",
projectId: "project-1",
sourceLabel: "late-night-set.wav",
roleFocus: ["bass-guitar", "keys-right", "lead-vocal"]
}
});
});
});
});
24 changes: 22 additions & 2 deletions apps/desktop/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ import {
import { createTranslator, detectPreferredLocale, type TranslationKey } from "./i18n";
import { ScoreView } from "./features/score/ScoreView";
import { Workspace } from "./features/workspace/Workspace";
import { EmptyState, ErrorState, LoadingState } from "./features/workspace/WorkspaceStates";
import { EmptyState, ErrorState, FirstRunState, LoadingState } from "./features/workspace/WorkspaceStates";
import { roleFocusForFirstRun, type FirstRunRoleId } from "./features/workspace/firstRunRoles";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Progress } from "@/components/ui/progress";
Expand Down Expand Up @@ -258,6 +259,7 @@ export function App() {
const [renderedProgressPercent, setRenderedProgressPercent] = useState<number | undefined>(undefined);
const [isStarting, setIsStarting] = useState(false);
const [selectedBootstrap, setSelectedBootstrap] = useState<ProjectBootstrapSummary | null>(null);
const [firstRunRoleId, setFirstRunRoleId] = useState<FirstRunRoleId>("whole-band");
const [activeAnalysisBootstrap, setActiveAnalysisBootstrap] = useState<ProjectBootstrapSummary | null>(null);
const [selectionError, setSelectionError] = useState<string | null>(null);
const [selectionErrorSource, setSelectionErrorSource] = useState<"local" | "youtube" | null>(null);
Expand All @@ -273,7 +275,7 @@ export function App() {
sourceKind: "local_audio",
projectId: selectedBootstrap.projectId,
sourceLabel: selectedBootstrap.source.fileName,
roleFocus: defaultRequest.roleFocus
roleFocus: roleFocusForFirstRun(firstRunRoleId)
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
}
: defaultRequest;

Expand Down Expand Up @@ -420,6 +422,7 @@ export function App() {
const selection = await selectLocalAudioSource();
if (selection.ok) {
setSelectedBootstrap(selection.bootstrap);
setFirstRunRoleId("whole-band");
return;
}

Expand Down Expand Up @@ -451,6 +454,7 @@ export function App() {
const selection = await importYoutubeUrl(normalizedUrl);
if (selection.ok) {
setSelectedBootstrap(selection.bootstrap);
setFirstRunRoleId("whole-band");
setYoutubeUrl("");
} else {
setSelectionError(safeErrorDetail(selection.error.message, t("youtubeImportFailed")));
Expand Down Expand Up @@ -514,6 +518,22 @@ export function App() {
if (jobResult) {
return <Workspace song={jobResult} sourceBootstrap={jobResultBootstrap} onSongUpdate={handleSongUpdate} />;
}
if (selectedBootstrap) {
return (
<FirstRunState
fileName={selectedBootstrap.source.fileName}
selectedRoleId={firstRunRoleId}
onSelectRole={setFirstRunRoleId}
onStartAnalysis={() => {
void handleStartAnalysis();
}}
onChooseDifferentFile={() => {
void handleChooseLocalAudio();
}}
Comment on lines +530 to +532

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Cancelling 'Choose a different file' discards the selected song

Opening the file picker from the card's "Choose a different file" button and then cancelling runs handleChooseLocalAudio, whose failure branch calls setSelectedBootstrap(null) and shows a "choose a WAV/MP3..." error. The already-selected song is dropped and the user falls back to the empty prompt, since cancellation is indistinguishable from an unsupported file.

Prompt for agents
The first-run card's "Choose a different file" button calls handleChooseLocalAudio (apps/desktop/src/App.tsx). When the user cancels the native file dialog, the Rust command select_local_audio_source returns Err("Choose a WAV, MP3, FLAC, or M4A file to start analysis.") (apps/desktop/src-tauri/src/main.rs:644), and selectLocalAudioSource in apps/desktop/src/lib/analysis.ts collapses any non-safe error into that same unsupported message, so a user cancellation cannot be distinguished from a genuinely unsupported file. As a result handleChooseLocalAudio runs its failure branch: it clears the current selection (setSelectedBootstrap(null)) and shows the unsupported-file error, dropping the user from the first-run card back to the empty prompt even though they only cancelled. Consider surfacing a distinct cancellation signal (e.g. a dedicated error code/message from the Rust command and a check like the existing isUserCancellation helper) so that cancelling the picker leaves the previously selected source and first-run card intact instead of wiping it and showing a false error.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revalidated on current live heads. This finding is still valid on #974 exact fd33104ca88030b5218e1c56a0cb683e2b50d7db, so I am leaving this thread unresolved. The cancellation protocol is already owned by canonical #976 current exact d07dc57347ce8187bc70b1d1f01b1ac5ec195887: its handleChooseLocalAudio explicitly checks isUserCancellation(...) and returns without clearing the admitted bootstrap or surfacing an unsupported-format error. #974 should inherit/restack that owner rather than duplicate a second native-cancellation authority. Acceptance for this thread is #974 on a head that contains that canonical cancellation behavior plus the first-run replacement-picker regression; predecessor/#976-only evidence is not sufficient to resolve it.

analysisDisabled={analysisInFlight || isStarting || isImporting}
/>
);
}
return <EmptyState />;
};

Expand Down
113 changes: 113 additions & 0 deletions apps/desktop/src/features/workspace/WorkspaceStates.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { fireEvent, render, screen } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
import { EmptyState, FirstRunState, LoadingState } from "./WorkspaceStates";

const originalLanguage = window.navigator.language;

function setNavigatorLanguage(language: string) {
Object.defineProperty(window.navigator, "language", {
configurable: true,
value: language
});
}

describe("WorkspaceStates first-run card", () => {
afterEach(() => {
setNavigatorLanguage(originalLanguage);
});

it("keeps the empty card text-only until a song is selected", () => {
render(<EmptyState />);
expect(screen.getByRole("heading", { name: "Ready to Analyze" })).toBeTruthy();
expect(screen.queryByRole("button", { name: "Analyze this song" })).toBeNull();
});

it("names analyze as the next action after a song is selected", () => {
const onSelectRole = vi.fn();
const onStartAnalysis = vi.fn();
const onChooseDifferentFile = vi.fn();
render(
<FirstRunState
fileName="rehearsal-take.wav"
selectedRoleId="whole-band"
onSelectRole={onSelectRole}
onStartAnalysis={onStartAnalysis}
onChooseDifferentFile={onChooseDifferentFile}
/>
);

fireEvent.click(screen.getByRole("radio", { name: "Lead vocal" }));
fireEvent.click(screen.getByRole("button", { name: "Analyze this song" }));
fireEvent.click(screen.getByRole("button", { name: "Choose a different file" }));

expect(onSelectRole).toHaveBeenCalledWith("lead-vocal");
expect(onStartAnalysis).toHaveBeenCalledTimes(1);
expect(onChooseDifferentFile).toHaveBeenCalledTimes(1);
expect(screen.queryByText("/Users/test/Music/rehearsal-take.wav")).toBeNull();
});

it("shows the selected song basename without exposing local path segments", () => {
render(
<FirstRunState
fileName="/Users/test/Music/late-night-set.wav"
selectedRoleId="bass-guitar"
onSelectRole={vi.fn()}
onStartAnalysis={vi.fn()}
onChooseDifferentFile={vi.fn()}
/>
);

expect(screen.queryByText(/\/Users\/test/)).toBeNull();
expect(screen.getByText("Selected song")).toBeTruthy();
expect(screen.getByText("late-night-set.wav")).toBeTruthy();
expect(document.querySelector('[data-selected-audio="late-night-set.wav"]')).toBeTruthy();
});

it("uses roving focus and arrow keys for the role radiogroup", () => {
const onSelectRole = vi.fn();
render(
<FirstRunState
fileName="rehearsal-take.wav"
selectedRoleId="whole-band"
onSelectRole={onSelectRole}
onStartAnalysis={vi.fn()}
onChooseDifferentFile={vi.fn()}
/>
);

const wholeBand = screen.getByRole("radio", { name: "Whole band" });
const leadVocal = screen.getByRole("radio", { name: "Lead vocal" });
expect(wholeBand).toHaveAttribute("tabindex", "0");
expect(leadVocal).toHaveAttribute("tabindex", "-1");

wholeBand.focus();
fireEvent.keyDown(wholeBand, { key: "ArrowRight" });

expect(onSelectRole).toHaveBeenCalledWith("lead-vocal");
expect(document.activeElement).toBe(leadVocal);
});

it("localizes the first-run next-action copy", () => {
setNavigatorLanguage("ko-KR");
render(
<>
<EmptyState />
<LoadingState />
<FirstRunState
fileName="rehearsal-take.wav"
selectedRoleId="whole-band"
onSelectRole={vi.fn()}
onStartAnalysis={vi.fn()}
onChooseDifferentFile={vi.fn()}
/>
</>
);

expect(screen.getByRole("heading", { name: "분석 준비 완료" })).toBeTruthy();
expect(screen.getByRole("heading", { name: "오디오 분석 중" })).toBeTruthy();
expect(screen.getByRole("heading", { name: "오늘 합주할 곡이 준비됐어요" })).toBeTruthy();
expect(screen.getByRole("button", { name: "이 곡 분석하기" })).toBeTruthy();
expect(screen.getByRole("button", { name: "다른 파일 선택" })).toBeTruthy();
expect(screen.getByRole("radio", { name: "리드 보컬" })).toBeTruthy();
});
});
Loading
Loading