feat(workspace): name tonight's first part handoff on the map - #1094
feat(workspace): name tonight's first part handoff on the map#1094seonghobae wants to merge 14 commits into
Conversation
Surface the first active part-to-part pass from existing partGraph handoff_to evidence so the ready rehearsal map names who gives and who receives before the next section. Fail closed on inherited, inactive, blank, self, or unknown receivers.
📝 WalkthroughWalkthrough준비 작업공간이 Changes첫 파트 핸드오프
Estimated code review effort: 3 (Moderate) | ~25 minutes Merge Risk: 🟡 Moderate · up to The new guidance can name the wrong section for a part handoff, which may cause players to prepare and lock the pass at the wrong point in the song. Merge should wait until the destination section is used correctly. Sequence Diagram(s)sequenceDiagram
participant Workspace
participant firstHandoff
participant Localization
Workspace->>firstHandoff: 현재 곡과 activeRole 조회
firstHandoff-->>Workspace: FirstHandoff 또는 null 반환
Workspace->>Localization: 핸드오프 데이터로 문구 생성
Localization-->>Workspace: 현지화된 안내 문구 반환
```}
</details>
<!-- walkthrough_end -->
<!-- pre_merge_checks_walkthrough_start -->
<details>
<summary>🚥 Pre-merge checks | ✅ 5</summary>
<details>
<summary>✅ Passed checks (5 passed)</summary>
| Check name | Status | Explanation |
| :------------------------: | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Docstring Coverage | ✅ Passed | Docstring coverage is 83.33% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 5 files. (8 skipped: 8 u… |
| 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 | 제목은 기존 partGraph 데이터에서 오늘 밤의 첫 파트 간 핸드오프를 준비 작업공간 지도에 표시하는 주요 변경 사항을 정확하고 간결하게 설명합니다. |
</details>
<details>
<summary>Full details: Docstring Coverage</summary>
**Explanation**
Docstring coverage is 83.33% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 5 files. (8 skipped: 8 unsupported.)
</details>
</details>
<!-- pre_merge_checks_walkthrough_end -->
<!-- finishing_touch_checkbox_start -->
<details>
<summary>✨ Finishing Touches</summary>
<details>
<summary>📝 Generate docstrings</summary>
- [ ] <!-- {"checkboxId":"7962f53c-55bc-4827-bfbf-6a18da830691"} --> Create stacked PR
- [ ] <!-- {"checkboxId":"3e1879ae-f29b-4d0d-8e06-d12b7ba33d98"} --> Commit on current branch
</details>
<details>
<summary>🧪 Generate unit tests (beta)</summary>
- [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Create PR with unit tests
- [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Commit unit tests in branch `feat/workspace-first-handoff`
</details>
</details>
<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->
---
Thanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=ContextualWisdomLab/bandscope&utm_content=1094)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
<details>
<summary>❤️ Share</summary>
- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)
</details>
<sub>Comment `@coderabbitai help` to get the list of available commands.</sub>
<!-- tips_end -->
|
|
Canonicalization update: fresh comparison against #1007 exact current head |
|
Writer note: this dispatch is superseded. The BandScope maintainer claimed the unchanged lane before any agent acknowledgement and applied the TDD repair directly. Do not start a second writer from this comment. The successor branch head and its exact-head checks are the only current evidence. |
|
Supersession evidence (fresh 2026-09-01 comparison): canonical #1007 remains open at exact head |
Buyer-visible gap
The ready rehearsal map named tonight's first playable range, but a player could not reliably tell which following section a real part-to-part pass prepared. The UI must use transition evidence, not a same-section role lookup or a heuristic/demo-shaped relation.
Product outcome
partGraph.handoff_toand names the immediately following destination section: Bass Guitar hands off to Lead Vocal in chorus. Lock that pass before the chorus.handoff_to/handoff_fromempty. It no longer fabricates Bass Guitar → Lead Vocal transition authority when no signal-derived activity transition exists.Cites Figma 19-239 and
docs/design-system/component-contract.md.Protected base:
develop@749511c3ad4000090048718f685c6bee6b3d2c25.Exact current head:
c0837562f246ab83176646447f3788ca6b392e93.Root-cause repairs
The first defect was renderer-side: the destination-label repair still looked up both role names from the source section. Real
compute_handoffstopology writes a deactivating source role'shandoff_totoward a role that becomes active in the next section, so the receiver can legitimately be absent from source active roles. The branch now resolves the receiver from the destination role collection and requires a valid following destination.Fresh current-code inspection then found a deeper analysis-engine consistency defect. Heuristic
_build_topology()hard-codedbass-guitar -> lead-vocalin the first fallback section even though both roles were active there and Lead Vocal became inactive in the following fallback section. That relation contradicted the productioncompute_handoffs()transition meaning and could become buyer-visible synthetic transition evidence.TDD repair sequence for that owning-layer defect:
460ac8887a2fe7cdf334fe5b01fe52e1586e5f8cchanges the fallback regression to reject invented Bass Guitar → Lead Vocal handoff authority.d89f92e1b5d75473e9588179fe7268f7aafdc17calso requires truthful fallback provenance:Extracted roles using heuristic fallback; handoffs unavailable.99e2d2dc09f16a0b7d7e9f0970fe35882bae9c79removes the hard-coded heuristic handoff and changes only fallback provenance/docstring semantics; real activity topology andcompute_handoffs()are unchanged.9086344323bb00d1af5b5ff7a0aec09650c36976restores canonical source formatting/newline only.c0837562f246ab83176646447f3788ca6b392e93makes doctoring explicit that heuristic fallback has no transition authority.Predecessor checks/reviews do not transfer to this successor head.
Security / scientific-integrity boundary
RehearsalSongJSON, source/destination labels, role ids/names,partGraphnodes, activity flags and handoff ids.developdependency-security truth.Verification
compute_handoffs()semantics are intentionally unchanged and remain the transition authority.c0837562…before merge. Queued/pending/skipped-required/cancelled/neutral/failed/predecessor evidence is non-passing.Merge gate
develop.