Skip to content

feat(workspace): name tonight's first transposition plan on the map - #1006

Open
seonghobae wants to merge 32 commits into
developfrom
feat/workspace-first-transposition-plan
Open

feat(workspace): name tonight's first transposition plan on the map#1006
seonghobae wants to merge 32 commits into
developfrom
feat/workspace-first-transposition-plan

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

Buyer next action

The mounted rehearsal workspace names tonight's first transposition plan so the room can lock the owned part transpose before rehearsal starts.

Protected base: develop@7ad56cf0065d068ec6463d92726de4855a6e201d.
Exact current head: 54db8d4dcf6183c421713873d2c2082419d6ebc6 on feat/workspace-first-transposition-plan.

What the player sees

  • The callout names the owning part when an active graph node corroborates it, the owned transpositionPlan copy, the labeled section, and the time.
  • Open scrolls the renderer-owned song-structure section and arms the next action: lock that transpose before the room starts.
  • If no part owns transpose copy, the card stays guidance-only and keeps the user on tonight's map.
  • The complementary region keeps the stable accessible name Tonight's first transpose plan in both ready and unavailable states; the longer unavailable guidance remains visible body copy rather than replacing landmark identity.

Authority boundary

Current reliability and accessibility repairs

  • The ready and unavailable states share the concise firstTranspositionPlanLabel landmark name while keeping unavailable guidance as visible body copy.
  • Section labels and the rehearsal-priorities focus prefix are localized consistently across the timeline, roadmap, and Korean focus line.
  • Test navigation fixtures are now removed from document.body in afterEach, including decoy roots, so an early failed assertion cannot leak a renderer into later fail-closed tests.
  • The section-label regression first proves the demo section resolves before mutating the runtime label outside SectionFormLabel.
  • The resolver test helper reuses shared SectionFormLabel and RehearsalPriority types instead of redeclaring parallel unions.
  • The workspace-scope regression now reopens after section reordering and proves the moved plan scrolls renderer index 1.

Docs

AGENTS.md, CLAUDE.md, ARCHITECTURE.md, CHANGELOG.md, and docs/design-system/component-contract.md name this next action. With no mapped Figma node, this feature-local callout remains in the documented Pattern Backlog rather than pretending to be a canonical Figma component. Reduced-motion Open uses behavior: "auto".

Verification / merge gate

  • fix(security): establish canonical npm, PDF.js, Nanoid, and Undici baseline #783 is now protected shipped truth in the current develop@7ad56cf0065d068ec6463d92726de4855a6e201d; this PR does not duplicate that dependency-security authority.
  • Fresh repository workflows were dispatched for exact head 54db8d4dcf6183c421713873d2c2082419d6ebc6. At the latest refetch CI, release, build-baseline, SBOM, security-audit, aggregate Security Scan, Bandit, Semgrep, and secret-scan were queued or pending, so none is counted as current-head success yet.
  • Keep unmerged until the unchanged then-current head has every applicable repository/central CI, cross-platform build, exact owned statement+branch coverage, docstring, SAST/security/SBOM/supply-chain/package/release gate terminal-success; zero valid unresolved findings; a qualifying independent non-author last-push approval; and ordinary branch-protection acceptance.
  • Queued, pending, skipped, cancelled, failed, predecessor-head, protected-base, model-only, self/author, neutral, rate-limited, or administrative-bypass evidence is not success.
  • Never bypass protection or transfer predecessor evidence.

Open in Devin Review

Summary by CodeRabbit

  • 새 기능
    • 워크스페이스에서 오늘의 첫 조옮김 계획을 확인하고 해당 구간으로 바로 이동할 수 있습니다.
    • 첫 연주 가능 음역과 다음 악기 점검 안내를 제공합니다.
    • 지원 언어에 맞춰 섹션명과 안내 문구를 표시합니다.
  • 접근성 개선
    • 화면 읽기 지원을 강화하고, 동작 줄이기 설정에서는 즉시 이동합니다.
  • 버그 수정
    • 잘못된 섹션 정보나 유효하지 않은 조옮김 계획이 표시되지 않도록 개선했습니다.
    • 한국어 조사와 섹션 라벨 표시를 자연스럽게 수정했습니다.

Name the earliest owned transpositionPlan with the corroborated part,
labeled section, and time so Open can lock that transpose before rehearsal.
Do not invent the copy from groove, cue, simplification, overlap, range,
chords, function labels, setup notes, confirmed overrides, harmonic
explanations, or confidence notes. Distinct from the first-entrance
Tempo/Key/Transpose cockpit metrics.
@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

Next included review available in 14 minutes.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9265e176-e3f7-4557-9e89-1971b35aee99

📥 Commits

Reviewing files that changed from the base of the PR and between df905f4 and 8af2e24.

📒 Files selected for processing (6)
  • apps/desktop/src/features/workspace/FirstTranspositionPlanCallout.particle.test.tsx
  • apps/desktop/src/features/workspace/FirstTranspositionPlanCallout.reduced-motion.test.tsx
  • apps/desktop/src/features/workspace/FirstTranspositionPlanCallout.test.tsx
  • apps/desktop/src/features/workspace/FirstTranspositionPlanCallout.tsx
  • apps/desktop/src/features/workspace/FirstTranspositionPlanCallout.workspace-scope.test.tsx
  • apps/desktop/src/features/workspace/Workspace.tsx

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: 4d114bf5-efda-4287-9841-5339f2fe5b47

📥 Commits

Reviewing files that changed from the base of the PR and between c1109d9 and df905f4.

📒 Files selected for processing (1)
  • .jules/palette.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .jules/palette.md

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


📝 Walkthrough

Walkthrough

리허설 작업공간이 첫 번째 이조 계획을 안전하게 선택하고 표시합니다. 사용자는 대응하는 renderer 섹션으로 이동할 수 있습니다. 섹션 라벨과 focus 문구를 영어와 한국어로 표시합니다. 접근성 및 reduced-motion 동작을 검증합니다.

Changes

첫 번째 이조 계획 작업공간 흐름

Layer / File(s) Summary
이조 계획 데이터 계약과 입력 검증
apps/desktop/core/src/lib.rs
역할 payload에 선택적 transposition_plan을 추가합니다. 공백 또는 줄바꿈을 포함한 계획은 거부합니다.
이조 계획 해석과 선택
apps/desktop/src/features/workspace/firstTranspositionPlan.ts, apps/desktop/src/features/workspace/firstTranspositionPlan*.test.ts, apps/desktop/src/features/workspace/firstRangeSqueeze.ts, apps/desktop/src/features/workspace/firstRangeSqueeze.test.ts
소유 데이터와 활성 그래프 노드만 검사합니다. 우선순위, 시작 시간, 안정적인 ID로 첫 계획을 선택합니다. 잘못된 런타임 구조와 지원되지 않는 섹션 라벨은 null로 처리합니다.
섹션 라벨과 안내 문구 국제화
apps/desktop/src/i18n/*, apps/desktop/src/locales/*/common.json, apps/desktop/src/features/workspace/SectionRoadmap.*, apps/desktop/src/features/workspace/Workspace.tsx, apps/desktop/src/features/workspace/Workspace.*.test.tsx
섹션 형식 라벨과 rehearsal focus 문구를 로케일에 맞게 표시합니다. 첫 번째 이조 계획과 음역 안내 문구를 영어와 한국어 리소스에 추가합니다.
작업공간 안내와 섹션 탐색
apps/desktop/src/features/workspace/FirstTranspositionPlanCallout.tsx, apps/desktop/src/features/workspace/FirstTranspositionPlanCallout*.test.tsx, apps/desktop/src/features/workspace/Workspace.tsx, apps/desktop/src/features/workspace/Workspace.test.tsx
계획을 표시하고 Open 동작으로 대응하는 renderer 섹션을 탐색합니다. 계획 또는 곡이 변경되면 상태를 초기화합니다. reduced-motion 환경에서는 즉시 스크롤합니다.
기능 계약과 운영 문서
AGENTS.md, ARCHITECTURE.md, CHANGELOG.md, CLAUDE.md, docs/design-system/component-contract.md, docs/doctoring/reduced-motion-first-transposition-plan-navigation.md, .jules/palette.md
계획 문구의 허용된 데이터 출처, 섹션 연결 방식, 탐색 동작, reduced-motion 및 접근성 지침을 문서화합니다.

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

Merge Risk: 🟡 Moderate · up to df905

The PR adds a localized workspace callout and related accessibility guidance, but unresolved concerns could expose untranslated section identifiers or produce inconsistent assistive-technology behavior; merge should wait for owner resolution or explicit acceptance.

Sequence Diagram(s)

sequenceDiagram
  participant Workspace
  participant FirstTranspositionPlanCallout
  participant resolveFirstTranspositionPlan
  participant SongStructureRenderer
  participant SectionElement
  Workspace->>FirstTranspositionPlanCallout: 곡 데이터 전달
  FirstTranspositionPlanCallout->>resolveFirstTranspositionPlan: 첫 번째 이조 계획 해석
  resolveFirstTranspositionPlan-->>FirstTranspositionPlanCallout: 계획 정보 반환
  FirstTranspositionPlanCallout->>SongStructureRenderer: 대상 renderer 확인
  FirstTranspositionPlanCallout->>SectionElement: 대응 섹션 조회
  FirstTranspositionPlanCallout->>SectionElement: scrollIntoView 호출
  SectionElement-->>FirstTranspositionPlanCallout: 열린 계획 상태 갱신
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 79.55% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 44 functions across 20 files. (1 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 mounted rehearsal workspace에서 첫 transposition plan을 이름으로 표시하고 map의 해당 섹션으로 연결하는 주요 변경 사항을 정확하고 간결하게 설명합니다.
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 79.55% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 44 functions across 20 files. (1 skipped: 1 unsupported.)

✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/workspace-first-transposition-plan

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.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Continue the existing feat/workspace-first-transposition-plan branch from exact head cb2dbaa1303def6c170552d8f9de6cccc2532e12 only. Refetch head/base/blob/reviews immediately before writing; if the branch moved, inspect the intervening delta and adapt instead of overwriting it. Do not create another branch/PR.

I have already committed the regression first at cb2dbaa...: apps/desktop/src/features/workspace/Workspace.section-label-localization.test.tsx requires the Korean song-structure grid to render the canonical verse form as 벌스 and not raw verse. The current production Workspace.tsx::SongStructure still renders {section.label} raw, while FirstTranspositionPlanCallout uses translateSectionFormLabel(locale, named.section.label). This is the verified cause of current review thread PRRT_kwDORjvEXs6bkhoq and creates contradictory Korean map/callout copy.

Use TDD from the committed RED and make the narrowest production fix in Workspace.tsx: resolve detectPreferredLocale() once for the Workspace render, build createTranslator(locale) from that same locale, pass the same locale to SongStructure, and render translateSectionFormLabel(locale, section.label) instead of raw section.label. Keep renderer-owned data-section-index, section ordering, timing, groove, IDs, navigation and all unrelated Workspace behavior unchanged. Prefer ReturnType<typeof detectPreferredLocale> if a prop type is needed rather than inventing a new locale authority. Do not translate arbitrary free-form groove text.

Verification: run the new focused test plus existing Workspace/transposition/i18n tests, desktop typecheck/Vitest with configured 100% owned coverage, then current-head CI/release/build/SAST/SBOM/security gates. Resolve only PRRT_kwDORjvEXs6bkhoq after fixed-head evidence. Inherited npm HIGH failures remain canonical #783-owned; do not suppress or leaf-remediate them here.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

SongStructure localizes section form labels via translateSectionFormLabel,
but SectionRoadmap still rendered the raw label, so a Korean locale showed
벌스 in the timeline and verse on the same song's roadmap cards. Localize
the card header and chord-edit accessible name for visible/accessible-name
parity.
devin-ai-integration[bot]

This comment was marked as resolved.

…ator

Align with the memoization convention already used by Workspace and
SectionRoadmap: detectPreferredLocale and createTranslator are stable for the
component lifetime, so compute them once via useMemo instead of every render.
devin-ai-integration[bot]

This comment was marked as resolved.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @opencode-agent for PR #1006 at head 3043d4d108d22331d8de4448a6bf66e829182f1d. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

The Focus summary printed exportSummary.focusSections or the first section
label raw, so a Korean locale still showed English verse there while every
other surface was localized. Route both sources through
translateSectionFormLabel with a raw-value fallback for unknown focus text,
and pin the behavior with a ko-locale Workspace test.
devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

…hor callout doc row

- Add workspaceRehearsalPrioritiesFocusPrefix (en 'Focus:' / ko '집중:') so
  the priorities line no longer mixes a hardcoded English prefix into Korean
  copy; extend the ko Workspace test.
- Reword firstTranspositionPlanUnavailable per review suggestion to remove
  the ambiguous negation and internal jargon; update pinned assertions.
- component-contract.md: the First Transposition Plan Callout has no Figma
  node, so move it from Canonical Components to Pattern Backlog while keeping
  its full behavioral contract.
# 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

Resolved merge conflicts against origin/develop (749511c): union-merged AGENTS.md/CHANGELOG.md bullets, sentence-merged CLAUDE.md, merged Workspace.tsx imports into a single deduplicated i18n import (createTranslator, detectPreferredLocale, translateSectionFormLabel) + firstRangeSqueeze, unioned en/ko locale tails (JSON valid, en/ko symmetric). Merged legacy .Jules/palette.md into canonical .jules/palette.md, dropped alias. Duplicate-import scan clean, no conflict markers remain. Merge head: de0098b.

devin-ai-integration[bot]

This comment was marked as resolved.

The roadmap range line and the first-range callout interpolated the
raw section.label while their headers used the localized label,
producing mixed-language copy under ko (벌스 header / verse range
line). Route both through translateSectionFormLabel; en mapping is
identity so English copy and its tests are unchanged.

Evidence: SectionRoadmap + Workspace + firstRangeSqueeze suites
38/38 (ko expectation updated to 벌스).
devin-ai-integration[bot]

This comment was marked as resolved.

'first pass' literal rendered verbatim under ko when exportSummary
carried no focus sections; route through new workspaceFocusFallback
locale key (ko: 첫 마디 연습).
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Current-head owner-control repair request for exact head 31de03030efcf0cecfe9350c7f32fb6e3516db00 on feat/workspace-first-transposition-plan. Apply superpowers:using-superpowers; use receiving-code-review before acting, systematic-debugging for reproduction, TDD for behavior changes, and verification-before-completion. Re-fetch the branch immediately before writing and abort/adapt if the head moved.

Two current review findings are verified and BandScope-owned:

  1. Save/load contract is asymmetric. apps/desktop/core/src/lib.rs::project_payload_from_content now passes deserialized RehearsalSongPayload through validate_transposition_plan, rejecting blank/CR/LF transpositionPlan, but apps/desktop/src-tauri/src/main.rs::save_project still deserializes the payload directly and writes it without that validator. This can save a project that load_project subsequently refuses. First write the smallest realistic RED regression at the pure/core boundary proving a save-bound payload with blank or newline transpositionPlan is rejected. Then expose/reuse one canonical validator from core and route save_project through it before the file dialog/write. Preserve the existing load error contract and do not weaken validation.

  2. exportSummary.focusSections is treated as a label even when it is a section id. Current Workspace.tsx casts each focus entry to SectionFormLabel; current persistence/analysis fixtures use values such as verse-1 while the section display label is verse, so Korean can show 집중: verse-1.. First add a RED Workspace regression with focusSections: [section.id] under ko and require the translated matched section.label. Resolve each focus entry against song.sections by id; filter unresolved ids and use workspaceFocusFallback if none resolve. Do not treat arbitrary ids as labels or invent copy.

Keep the earlier duplicate-DOM-id repair intact: the song-structure renderer must use data-workspace-song-structure-grid, not a fixed id. Run focused tests, typecheck/Rust tests as applicable, then the branch's full deterministic suites you can execute. Push only to this existing owner branch. Do not merge, self-approve, weaken gates, or transfer predecessor evidence. Report exact new head and RED→GREEN commands/results in the PR conversation.

devin-ai-integration[bot]

This comment was marked as resolved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant