feat(workspace): name the parts to lock in first - #874
Conversation
Replace the stub rehearsal-priorities card with role-and-section pairs so a player can see what to lock in before the room starts. Prefer high priority, then medium, then focus sections, and never turn blank or none sentinels into instructions. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Repeated verse labels no longer consume the third rehearsal-priority slot, and empty copy now points at the section roadmap instead of a no-op role click. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
There was a problem hiding this comment.
Stale comment
Review at
5cd1afd6The lock-in-first card names concrete parts on the Late Night Set path, skips blank/
none, and case-dedupes focus-section fallback labels. No XSS or new IPC surface. This head is not the landing vehicle.Blocking for this head
- Repeated verse labels can consume the third slot. Dedup is by
role.id:section.idonly. A secondversesection with the same high-priority Bass Guitar rendersBass Guitar · versetwice and hidesLead Vocal · chorus.- Empty copy is false.
Open a role on the roadmap.../로드맵에서 역할을 열면...does not change this card.collectLockInFirstItemsignoresactiveRole.- Tests never exercise a multi-section song. The demo seed is one verse, so the display-pair bug above was untested.
Landing vehicle
Prefer #877 (
df023052oncursor/bc-f1adf73f-c43e-452d-858e-24d7596dc0bd-c561). That head adds display-pair uniqueness, honest empty copy, a verse/verse/chorus fixture, Storybook inventory, anddocs/plans/2026-08-16-workspace-lock-in-first.md.Do not merge this Draft. Do not treat queued checks on
5cd1afd6as success. Next buyer slice after #877: clicking a named pair should select that role and section on the roadmap.Sent by Cursor Automation: Fix Issues
Clicking a named role-and-section pair selects that role and focuses the matching section so players can jump from the priority card into the part they need to lock. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Fallback focus labels now jump to the first matching section so players can still act when analysis only names a section, not a role pair. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Omit focus labels that do not match a roadmap card so a missing bridge cannot clear verse focus. Scroll the named section into view when a lock-in pair or fallback label is opened. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
There was a problem hiding this comment.
Review at c646037d
#874 still names concrete lock-in pairs and keeps honest empty copy. Two Important residuals remain on this head. Do not merge #874.
Landing vehicle is #882 43cb9438 vs develop@acdbea63. Prefer #882 over #874 and over #880 (same residual slice, but #880 targets main).
Residuals still present here
- Unmatched focus labels stay action buttons.
handleFocusSectionActivatewritesfindSectionIdForFocusLabel(...), which isnullforbridge. That can clear an existing verse focus. The no-match test only starts fromnull, so it does not prove a no-op. - Lock-in/focus activation sets role and
data-focused-sectionbut never scrolls the named card into the horizontal roadmap. On the verse/verse/chorus Late Night Set fixture, Show Lead Vocal in chorus still leaves verse first in view, so the role filter can show the wrong section first.
Strengths that stay
Display-unique pairs, none/blank sentinels, Late Night Set / repeated-verse coverage, and ko+en chrome are sound. No new trust boundary.
Next action
Review and land #882. It omits unmatched focus labels, walks past none first-section sentinels, and scrolls the named roadmap card into view. Do not mix stem-lane work onto this slice. Do not self-approve.
Sent by Cursor Automation: Fix Issues
Show when each lock-in part starts, mark the activated pair as current, keep aria-label tokens from rewriting each other, and skip smooth roadmap scrolling when the player prefers reduced motion. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
There was a problem hiding this comment.
Review at 43cb9438
Previous residuals on this head are fixed: unmatched bridge is omitted, activation never writes null, and the named roadmap card scrolls into view. #880 and #882 are closed. This Draft is no longer the landing vehicle.
Landing vehicle is #888 db2edf00 vs develop@acdbea63. It names the first entrance time on each lock-in pair and focus label, marks the activated pair with aria-current, interpolates aria-labels in one pass, and uses instant scroll when the player prefers reduced motion.
Do not merge #874
Keep this Draft open only as the predecessor record. Merge #888 after exact-head CI and a qualifying independent non-author last-push approval. Do not self-approve. Do not mix Stem Lab (#884) or NIM (#879/#881) onto that slice.
Strengths that stay on this head
Display-unique pairs, none/blank sentinels, Late Night Set / repeated-verse coverage, honest empty copy, and ko+en chrome remain sound. No new trust boundary.
Sent by Cursor Automation: Fix Issues
A lock-in click now marks the same section on the song-structure timeline so players can see the entrance on both the form strip and the roadmap. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>


Canonical buyer-visible workspace slice
The Workspace Rehearsal Priorities card now names up to three concrete role-and-section lock-in actions from existing analysis evidence, makes role pairs and fallback focus labels actionable on the roadmap, and shows the first entrance time so players know both what and when to lock in.
Exact current head:
05935e02f29366b2bd240d6fb4d1bae784cb992b.Protected base:
develop@acdbea6344fe1231c39535b575f4de35e4c607c9.Current behavior:
highrehearsal-priority roles, thenmediumonly when no high-priority role exists;exportSummary.focusSections, then the first section label;noneand unmatched focus labels so missing evidence never becomes a false instruction;aria-current="true";{sectionLabel}cannot rewrite later tokens;prefers-reduced-motion: reducewith non-smooth roadmap movement;This remains distinct from #776 selected-role setup/simplification/transposition/overlap guidance and from #884 Stem Lab.
Test-first / canonicalization history
The original branch fixed duplicate
focusSections. Successor #877 was a direct descendant and repaired display-pair uniqueness, honest empty copy, Storybook state, and actionable fallback focus labels; #874 was previously fast-forwarded non-forced to that work.A later same-scope successor #888 started from this exact #874 head
43cb9438d6338890a218f2d3b7c4ba74199adb00. Exact compare immediately before consolidation reportedstatus=ahead,ahead_by=2,behind_by=0, and merge-base exactly43cb9438.... Its two child commits add entrance-time display/current-state accessibility and the one-pass aria-label/reduced-motion corrections. The canonical #874 branch was therefore fast-forwarded non-forced to #888 exact head05935e02f29366b2bd240d6fb4d1bae784cb992b; both PRs now reference the same code identity, so #888 is superseded without losing unique work.Predecessor/successor PR checks, reviews, or approvals do not transfer. Fresh #874 evidence must bind to
05935e02....Verification boundary
Successor-local focused evidence recorded 46 Workspace Vitest tests plus desktop typecheck/lint. That is implementation evidence, not merge evidence for this canonical PR. Revalidate exact-current-head repository and central CI, desktop statement/branch/function/line coverage, typecheck/lint/build/Storybook as applicable, SAST/security/SBOM/supply-chain/package/release, and current-head reviews on #874 itself.
Any failure must be inspected at its exact job/check-run/log boundary before editing or rerunning. Queued, skipped, predecessor-PR/head, protected-base, model-only, self/author, or bypass evidence is not success.
Security / dependency boundary
This is presentation-only use of already-validated
RehearsalSongrole names, section labels, focus strings, and section start times. Visible values remain React text/control labels. No file, URL, subprocess, IPC, WebView, model, database, dependency, lockfile, persistence, or new authority boundary is introduced.#783 remains the canonical protected JavaScript dependency-security owner. #861 remains the Python branch-coverage baseline. Central required-workflow repairs are read-only dependencies and must be inherited from protected central
mainbefore leaf evidence is regenerated; this branch does not suppress or duplicate those gates.Merge gate
Keep Draft and unmerged until the unchanged exact head has all applicable repository/central required workflows terminal-success, exact owned statement/branch coverage and other exposed metrics, zero valid unresolved findings, a qualifying independent non-author last-push approval, and ordinary protected-branch acceptance. Never bypass protection or transfer predecessor evidence.