Skip to content

feat(workspace): guide tonight's first pre-chorus on the map - #955

Draft
seonghobae wants to merge 19 commits into
developfrom
feat/workspace-first-prechorus-lift
Draft

seonghobae wants to merge 19 commits into
developfrom
feat/workspace-first-prechorus-lift

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 20, 2026 •

Copy link
Copy Markdown
Collaborator

Workspace rehearsal decision owner

이 Draft는 분석 결과에 이미 존재하는 첫 번째 유효 pre-chorus 구간을 찾아 Workspace에서 오늘의 다음 행동으로 표시하고, 실제 렌더러-owned Song Structure 위치로 Open/scroll하는 기능만 소유합니다. Active Player seek/playback은 이 PR의 권한이 아닙니다.

Exact identity / topology

  • Protected product truth: develop@314ddeae7b775a4957594b599358c8255617eb2e
  • Branch: feat/workspace-first-prechorus-lift
  • Exact current head: 502b7c2f29036e3f1ec89dcd96ed2b2fa6285b56
  • Fresh protected compare: ahead 19 / behind 0; merge base exactly protected develop
  • Open / Draft / mergeable
  • Current protected-base delta: 13 feature-local Workspace/i18n/doctoring files. Repository-wide AGENTS.md, ARCHITECTURE.md, CHANGELOG.md, CLAUDE.md, shared design-system contract, Player source/tests are no longer owned here.

Current product contract

  • Resolve only an explicitly labeled, bounded pre-chorus; do not invent one from another form label or an unlabeled section.
  • When one corroborated active role uniquely holds the section, name that role; otherwise fall back to band-wide guidance rather than inventing role certainty.
  • Workspace exposes one buyer-visible action: Open the resolved pre-chorus on the existing Song Structure map.
  • Scroll target is the renderer-owned section position, not an untrusted analysis id.
  • Reduced-motion preference uses immediate scrolling instead of smooth animation.
  • KO copy localizes pre-chorus as 프리코러스; EN/KO contain only the Workspace keys owned by this lane.
  • No network, model, filesystem, subprocess, IPC, database, or new dependency authority is introduced.

Protected-base reconciliation and single-writer repair

The previous live head 4058e5094bff94f9ed2df0f635313ff244f225a6 was two commits behind current protected develop and the PR body still named an older base/head. GitHub's clean merge result for 4058e... + protected 314dde... had tree 43e6370b644cc8be04e5346c71842d51d4c086de.

Ordinary two-parent descendant 73410af56cdc62b53f225fb2220361ca22e9ffb1 adopted that current protected merge result without force-push or destructive rebase. 0f211b05b89c69a7ca196679c93d82fc794033ac then restored protected blobs for repository-wide agent/architecture/changelog/Claude/design-system authority, leaving this feature as a Workspace-local writer.

Valid review finding: same-song update cleared completed guidance

The callout previously keyed completion state to the song object reference. An unrelated edit such as practice-progress update can replace the runtime object while retaining the same song and pre-chorus, incorrectly clearing the already-completed guidance.

  • RED 16003ee29da0ee9cfd7e187b57453bcf750068ba: after Open, rerender a fresh song object with the same stable song id and unchanged pre-chorus; completion must survive.
  • GREEN dce5b8b8b91632e2d3192c9b857c17859cb3693f: use an own, nonblank data-property song id as stable identity. Missing/malformed/accessor-backed runtime ids fall back to object identity so replacement invalid-id songs still fail closed.

The review thread is resolved against the current descendant.

Valid review finding: Player Hear had no production wiring

The prior feature branch added a Player Hear action guarded by an onPlayFromSeconds prop, but the running product had no production caller that supplied that callback. Tests alone therefore made the branch appear to own a buyer interaction that could not be executed.

  • be7c42666d140dc6d8551eb87d5afe8431c9bd57 restores protected PlayerFeature and removes branch-only Player tests.
  • 02a1167e117d0b38cae491f87c222b6d397e4c68 removes callback-only/Hear semantics from FirstPreChorusCallout; Workspace Open-to-map is the only action retained.
  • 11c68d3093a03d2d30075d5aff15b7a40acf1c62 and current 502b7c2f29036e3f1ec89dcd96ed2b2fa6285b56 remove EN/KO keys that existed only for the unwired Player surface.

The review thread is resolved. Active Player playback remains for its canonical owner rather than being simulated here.

Evidence boundary

Every predecessor check/review receipt is non-transferable after the source movement above. Only fresh exact-head repository CI, build-baseline, Security Scan, Semgrep, SBOM, CodeQL, relevant UI/browser evidence, and qualifying independent non-author current-head review count toward merge acceptance. Queued/pending/absent is not GREEN.

UI Delivery Gate: FAIL until current-head automated checks are terminal and packaged/browser evidence covers the actual Workspace action with pointer/touch/keyboard, visible focus, screen reader semantics, reduced-motion behavior, 400% zoom/reflow, responsive widths and required locale/text-expansion acceptance.

Commercial Release Gate: FAIL. This feature is not release evidence and does not alter signing/notarization, SBOM/provenance, reproducibility or updater rollback obligations.

No self-approval, force-push, destructive rebase, source-neutral retrigger, blind rerun, synthetic status, predecessor-evidence transfer, gate weakening, Player source duplication or repository-wide authority duplication.

Name the earliest labeled pre-chorus so the room can play the lift
into the chorus. Workspace Open scrolls the matching map section;
the player Hear action exists only when playback can seek.
@coderabbitai

coderabbitai Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 671a9a92-5719-48f9-9cee-22954678161e

📥 Commits

Reviewing files that changed from the base of the PR and between 95e74ee and 1e9fcc8.

📒 Files selected for processing (13)
  • AGENTS.md
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • apps/desktop/src/features/player/index.localization.test.tsx
  • apps/desktop/src/features/player/index.tsx
  • apps/desktop/src/features/workspace/Workspace.test.tsx
  • apps/desktop/src/features/workspace/Workspace.tsx
  • apps/desktop/src/features/workspace/firstPreChorus.time-bound.test.ts
  • apps/desktop/src/features/workspace/firstPreChorus.ts
  • apps/desktop/src/i18n/index.ts
  • apps/desktop/src/locales/en/common.json
  • apps/desktop/src/locales/ko/common.json
🚧 Files skipped from review as they are similar to previous changes (6)
  • apps/desktop/src/features/workspace/firstPreChorus.ts
  • apps/desktop/src/i18n/index.ts
  • AGENTS.md
  • apps/desktop/src/locales/ko/common.json
  • apps/desktop/src/locales/en/common.json
  • CLAUDE.md

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

첫 번째 유효한 pre-chorus를 해석하는 유틸리티와 라벨 번역을 추가했습니다. Workspace에는 섹션 스크롤 안내를, Player에는 선택적 재생 콜백 안내를 연결했습니다. 런타임 검증, 완료 상태 초기화, reduced-motion 동작, 현지화 및 관련 문서를 추가했습니다.

Changes

첫 프리코러스 안내

Layer / File(s) Summary
Pre-chorus 해석 및 라벨 번역
apps/desktop/src/features/workspace/firstPreChorus.ts, apps/desktop/src/features/workspace/firstPreChorus.test.ts, apps/desktop/src/features/workspace/firstPreChorus.time-bound.test.ts, apps/desktop/src/i18n/*
유효한 pre-chorus를 시간과 ID 순서로 선택합니다. 활성 역할의 우선순위를 적용합니다. 시간 포맷과 섹션 라벨 번역을 추가했습니다.
Callout 동작 및 표시
apps/desktop/src/features/workspace/FirstPreChorusCallout.tsx, apps/desktop/src/features/workspace/FirstPreChorusCallout*.test.tsx, apps/desktop/src/locales/*/common.json, docs/design-system/*, docs/doctoring/*
FirstPreChorusCallout이 역할·구간·시간을 표시합니다. workspace-scroll과 callback-only 동작을 지원합니다. 곡 교체 시 완료 상태를 초기화하고 reduced-motion 설정을 적용합니다.
Workspace 통합
apps/desktop/src/features/workspace/Workspace.tsx, apps/desktop/src/features/workspace/Workspace.test.tsx, CLAUDE.md
Workspace에 callout을 배치하고 현재 곡을 전달합니다. 대상 타임라인으로 이동하는 동작을 검증합니다.
Player 재생 및 현지화 통합
apps/desktop/src/features/player/index.tsx, apps/desktop/src/features/player/index.test.tsx, apps/desktop/src/features/player/index.localization.test.tsx, apps/desktop/src/locales/*/common.json
Player가 섹션 요약과 오디오 안내를 로케일에 맞게 표시합니다. 재생 콜백이 있을 때만 Hear 액션을 제공합니다. 곡 없음, 빈 섹션, 잘못된 런타임 데이터를 처리합니다.
프로젝트 지침 및 변경 기록
AGENTS.md, ARCHITECTURE.md, CHANGELOG.md
첫 라벨 pre-chorus 안내, playable ranges, 아키텍처 동작, 정책 변경을 기록합니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Workspace
  participant FirstPreChorusCallout
  participant firstPreChorus
  participant SongStructureGrid
  participant PlayerFeature
  participant PlaybackSurface

  Workspace->>FirstPreChorusCallout: 현재 song 전달
  FirstPreChorusCallout->>firstPreChorus: 첫 pre-chorus 해석
  firstPreChorus-->>FirstPreChorusCallout: 구간·역할·시작 시간 반환
  FirstPreChorusCallout->>SongStructureGrid: Open 액션으로 대상 구간 스크롤
  PlayerFeature->>FirstPreChorusCallout: callback-only 모드와 seek callback 전달
  FirstPreChorusCallout->>PlaybackSurface: Hear 액션으로 시작 시간 전달
Loading

Merge Risk: 🔵 Low · up to 1e9fc

The player experience adds copy that may bypass the English and Korean localization contract, which could produce inconsistent or untranslated text for some users. The change is mergeable with explicit owner awareness and follow-up on localization compliance.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 80.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 25 functions across 11 files. (6 skipped: 6…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 workspace와 첫 번째 pre-chorus 안내 기능을 명확하게 설명하며, PR의 주요 변경 사항인 workspace map과 player 안내 기능에 부합합니다.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/workspace-first-prechorus-lift

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

coderabbitai[bot]

This comment was marked as resolved.

Copy link
Copy Markdown
Collaborator Author

Review finding verification on exact head d1975e182f529cad3acba1c6c6d7d0a74ac4e47a: the unresolved fast-check suggestion is not a current correctness defect in this PR. firstPreChorus.test.ts already directly covers bounded pre-chorus selection, earliest-start selection, stable-ID tie-breaking, and fail-closed holdingRole behavior for duplicate/invalid/inactive role/graph evidence. fast-check is declared only by @bandscope/shared-types; adding it to apps/desktop would create a new workspace dependency/root-lock delta, which belongs to canonical dependency owner #783 rather than this product slice. I am therefore not broadening #955 or regenerating the root lock here. Property-based expansion can be considered in the dependency-owning quality lane without transferring merge evidence.

devin-ai-integration[bot]

This comment was marked as resolved.

# Conflicts:
#	AGENTS.md
#	CHANGELOG.md
#	CLAUDE.md
#	apps/desktop/src/features/workspace/Workspace.tsx
#	apps/desktop/src/locales/en/common.json
#	apps/desktop/src/locales/ko/common.json
@seonghobae

Copy link
Copy Markdown
Collaborator Author

Merged current develop into this branch: resolved shared-file conflicts by including both this feature's first-pre-chorus lift callout and the newly landed #957 playable-range work (Workspace.tsx keeps both imports; en/ko locales unioned with symmetric keys; AGENTS/CLAUDE/CHANGELOG unioned). No behavior dropped.

devin-ai-integration[bot]

This comment was marked as resolved.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Devin Review found 2 new potential issues.

Devin Review

Comment thread apps/desktop/src/features/workspace/FirstPreChorusCallout.tsx Outdated
Comment thread apps/desktop/src/features/player/index.tsx Outdated

Copy link
Copy Markdown
Collaborator Author

Admission-state correction for exact head 4058e5094bff94f9ed2df0f635313ff244f225a6.

Finding: live develop comparison is diverged (11 ahead / 2 behind) and 2 review threads remain unresolved.

This PR remains Open and is moved to Draft/Proposed. Its commits, reviews, threads, and valid delta are preserved. Return it to Ready after causal repair/non-force reconciliation and fresh exact-head evidence. No bypass, synthetic status/approval, manual rerun, Force Push, review dismissal, or Close is used.

@seonghobae
seonghobae marked this pull request as draft September 19, 2026 22:01
…elop

Adopt the current protected develop merge result as ordinary two-parent ancestry so the feature is no longer two commits behind protected product truth. Preserve the existing feature history and GitHub-resolved merge tree without force-push or destructive rebase.

Signed-off-by: Seongho Bae <me@seonghobae.me>
…eature

Restore protected develop blobs for AGENTS, architecture, changelog, Claude guidance, and the shared component contract. The first-pre-chorus feature keeps only feature-local source, tests, locale changes, and focused doctoring instead of becoming a second writer for repository-wide product/design authority.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Reproduce the review finding where a fresh runtime song object with the same stable song id clears already-completed pre-chorus guidance even though the selected lift is unchanged.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Preserve completed pre-chorus guidance when an unrelated edit replaces the RehearsalSong object but retains the same valid song id. Fall back to object identity when runtime id evidence is missing or accessor-backed so malformed replacement songs still fail closed.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Restore the protected PlayerFeature and remove branch-only player tests. No production caller supplies the new seek callback, so retaining a player Hear path would claim an interaction the running product cannot execute. Keep the workspace map action as the buyer-visible owner until Active Player wiring exists in its canonical lane.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Remove dead callback-only Active Player semantics from the first-pre-chorus callout after restoring the protected player surface. The buyer-visible action now only opens the renderer-owned map section, while the stable-song completion fix and fail-closed runtime identity handling remain intact.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Drop translation keys introduced only for the unwired Player/Hear surface after that capability was removed from this Workspace-owned lane. Retain the Workspace map-action and pre-chorus guidance copy.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Drop translation keys introduced only for the unwired Player/Hear surface after that capability was removed from this Workspace-owned lane. Retain the Workspace map-action and pre-chorus guidance copy.

Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae seonghobae changed the title feat(workspace): guide tonight's first pre-chorus on map and player feat(workspace): guide tonight's first pre-chorus on the map Sep 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ui-ux Frontend, interaction, design, or user experience enhancement New feature or request priority: medium Normal-priority or P2 work status: needs-review Open pull request requiring current-head review or checks type: feature New or expanded product capability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant