feat(workspace): count in tonight's first click before the range - #1070
feat(workspace): count in tonight's first click before the range#1070seonghobae wants to merge 8 commits into
Conversation
Play a local four-beat click from a trusted 20–400 BPM so the ready map names a next action a player can take before checking tonight's first range. Missing tempo or AudioContext fails closed to an ear count. This is not song playback, stem isolation, or a parallel MIR product.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (8)
🚧 Files skipped from review as they are similar to previous changes (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughBandScope 데스크톱 워크스페이스에 신뢰된 곡 템포 기반의 4비트 로컬 카운트인 클릭 기능이 추가되었습니다. Web Audio 재생 엔진, 상태별 UI, 입력 검증, 번역, 테스트와 문서가 포함됩니다. Changes첫 카운트인 클릭 기능
Estimated code review effort: 4 (Complex) | ~45 minutes Merge Risk: 🟡 Moderate · up to The PR adds a short local four-beat count-in before the first rehearsal range without expanding data or system access. No material runtime or security risk remains, but the current head should not merge until required checks and approvals reach terminal success; the architecture document also retains a 2026-08-30 update date, which needs explicit correction or acceptance relative to August 29, 2026. Sequence Diagram(s)sequenceDiagram
participant 연주자
participant Workspace
participant CountInClick
participant CountInClickEngine
participant WebAudio
연주자->>Workspace: 워크스페이스 열기
Workspace->>CountInClick: 곡 기반 카운트인 계획 전달
연주자->>CountInClick: 카운트인 재생 선택
CountInClick->>CountInClickEngine: 계획으로 play 호출
CountInClickEngine->>WebAudio: 박별 oscillator와 gain node 예약
WebAudio-->>CountInClickEngine: 클릭 재생 완료
CountInClickEngine-->>CountInClick: 완료 반환
CountInClick-->>연주자: 첫 구간 확인 안내 표시
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
Pin the current review findings before changing production behavior: a stop during suspended AudioContext resume must prevent oscillator creation, completed nodes must disconnect, plan replacement/unmount must invalidate stale completion, and finite onset multiplication must fail closed on overflow.
Invalidate plays that are stopped while AudioContext resume is pending, settle pending completion waits, disconnect oscillator and gain nodes after completion, reset component state across plan/engine changes and unmount, and fail closed if onset multiplication overflows. Add required JSDoc on the touched local handlers.
Pin the current-head review finding: recreating an equivalent count-in plan must not stop active playback or clear completion state when timing and section authority are unchanged.
Key the lifecycle reset to the count-in plan's semantic timing and section fields instead of object identity so unrelated song updates cannot stop a still-valid click or clear its completion guidance.
|
@opencode-agent Please perform the required independent formal review on exact current head |
|
Queued @opencode-agent for PR #1070 at head |
|
Succession control (fresh 2026-09-02 comparison): #971 is the canonical #961 Active Player owner. Its current |
|
Succession update: the canonical #971 branch now carries source-order RED |
There was a problem hiding this comment.
Pull request overview
OpenCode reviewed the current-head product diff. Coverage is a separate gate.
Changed files
AGENTS.md— repository behaviorARCHITECTURE.md— repository behaviorCHANGELOG.md— repository behaviorCLAUDE.md— repository behaviorapps/desktop/src/features/workspace/CountInClick.semantic-plan.test.tsx— TypeScript or JavaScript runtimeapps/desktop/src/features/workspace/CountInClick.test.tsx— TypeScript or JavaScript runtimeapps/desktop/src/features/workspace/CountInClick.tsx— TypeScript or JavaScript runtimeapps/desktop/src/features/workspace/Workspace.test.tsx— TypeScript or JavaScript runtimeapps/desktop/src/features/workspace/Workspace.tsx— TypeScript or JavaScript runtimeapps/desktop/src/features/workspace/countInClickEngine.test.ts— TypeScript or JavaScript runtimeapps/desktop/src/features/workspace/countInClickEngine.ts— TypeScript or JavaScript runtimeapps/desktop/src/features/workspace/firstCountIn.test.ts— TypeScript or JavaScript runtimeapps/desktop/src/features/workspace/firstCountIn.ts— TypeScript or JavaScript runtimeapps/desktop/src/locales/en/common.json— repository behaviorapps/desktop/src/locales/ko/common.json— repository behaviorapps/desktop/vite.config.ts— TypeScript or JavaScript runtimedocs/doctoring/workspace-first-count-in-click.md— operator or user guidance
Changed behavior
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Repository file: AGENTS.md"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Repository file: AGENTS.md"]
R1 --> V1["required checks"]
Evidence --> S2["Repository file: ARCHITECTURE.md"]
S2 --> I2["repository behavior"]
I2 --> R2["Review risk: Repository file: ARCHITECTURE.md"]
R2 --> V2["required checks"]
Evidence --> S3["Repository file: CHANGELOG.md"]
S3 --> I3["repository behavior"]
I3 --> R3["Review risk: Repository file: CHANGELOG.md"]
R3 --> V3["required checks"]
Evidence --> S4["Repository file: CLAUDE.md"]
S4 --> I4["repository behavior"]
I4 --> R4["Review risk: Repository file: CLAUDE.md"]
R4 --> V4["required checks"]
Evidence --> S5["TypeScript/JavaScript: CountInClick.semantic-plan.test.tsx (10 files)"]
S5 --> I5["TypeScript or JavaScript runtime"]
I5 --> R5["Review risk: TypeScript/JavaScript: CountInClick.semantic-plan.test.tsx (10 files)"]
R5 --> V5["package test plus coverage"]
Evidence --> S6["Repository file: common.json"]
S6 --> I6["repository behavior"]
I6 --> R6["Review risk: Repository file: common.json"]
R6 --> V6["required checks"]
Evidence --> S7["Repository file: common.json"]
S7 --> I7["repository behavior"]
I7 --> R7["Review risk: Repository file: common.json"]
R7 --> V7["required checks"]
Evidence --> S8["Docs: workspace-first-count-in-click.md"]
S8 --> I8["operator or user guidance"]
I8 --> R8["Review risk: Docs: workspace-first-count-in-click.md"]
R8 --> V8["docs review"]
Findings
No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.
- Head SHA:
92d8ffe3df69f33f43367e610cc2ffa08105e768 - Workflow run: 33745987705
- Workflow attempt: 1
- Coverage gate:
failure
Review outcome
Coverage is a gate, not the review. This body reviews the changed product files.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Repository file: AGENTS.md"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Repository file: AGENTS.md"]
R1 --> V1["required checks"]
Evidence --> S2["Repository file: ARCHITECTURE.md"]
S2 --> I2["repository behavior"]
I2 --> R2["Review risk: Repository file: ARCHITECTURE.md"]
R2 --> V2["required checks"]
Evidence --> S3["Repository file: CHANGELOG.md"]
S3 --> I3["repository behavior"]
I3 --> R3["Review risk: Repository file: CHANGELOG.md"]
R3 --> V3["required checks"]
Evidence --> S4["Repository file: CLAUDE.md"]
S4 --> I4["repository behavior"]
I4 --> R4["Review risk: Repository file: CLAUDE.md"]
R4 --> V4["required checks"]
Evidence --> S5["TypeScript/JavaScript: CountInClick.semantic-plan.test.tsx (10 files)"]
S5 --> I5["TypeScript or JavaScript runtime"]
I5 --> R5["Review risk: TypeScript/JavaScript: CountInClick.semantic-plan.test.tsx (10 files)"]
R5 --> V5["package test plus coverage"]
Evidence --> S6["Repository file: common.json"]
S6 --> I6["repository behavior"]
I6 --> R6["Review risk: Repository file: common.json"]
R6 --> V6["required checks"]
Evidence --> S7["Repository file: common.json"]
S7 --> I7["repository behavior"]
I7 --> R7["Review risk: Repository file: common.json"]
R7 --> V7["required checks"]
Evidence --> S8["Docs: workspace-first-count-in-click.md"]
S8 --> I8["operator or user guidance"]
I8 --> R8["Review risk: Docs: workspace-first-count-in-click.md"]
R8 --> V8["docs review"]
OpenCode Review Overview
Coverage evidence did not pass, so approval is blocked. The formal pull-request review is the source-backed diff review, not this status comment. |
|
Current-authority repair finding: protected |
Adopt current protected workflow/security and lockfile truth while preserving the canonical first-count-in product/test/doc delta. Reconcile CHANGELOG so protected #1165 entries remain intact. Signed-off-by: Seongho Bae <me@seonghobae.me> Commit-Message-Assisted-by: ChatGPT (OpenAI)
Buyer-visible gap
The ready rehearsal map already names tonight's first playable range, but it did not give the player a count-in they can take before checking that span. Seeing 120 BPM is not the same as counting in four and then checking the part.
This remains a local rehearsal aid, not a song-wide beat tracker, stem player, or MIR tempo estimator.
#828continues to own#770; trusted click authority is the already-ownedsong.tempofield, admitted only when finite and within 20–400 BPM.Exact current identity
develop@314ddeae7b775a4957594b599358c8255617eb2e.feat/workspace-first-count-in.a2cc3f859822615c66fd102839046637a41f371c.develop:behind_by=0; exactly 17 intended count-in product/test/docs/locales/config files remain.Non-force protected-base repair
The previous exact head
92d8ffe3df69f33f43367e610cc2ffa08105e768was based ondevelop@749511c3...while protecteddevelophad advanced through current workflow/security control and Cargo lock truth. The repair used an ordinary two-parent descendant of92d8ffe3...and protected314ddeae...; no force-push or destructive rebase was used.The intervening protected delta overlapped this lane only in
CHANGELOG.md. The repaired tree starts from current protected develop, overlays this PR's sixteen non-Changelog semantic blobs, and reconciles the changelog so #1165's security-backstop consolidation and the count-in product note both remain. Protected workflow/security/Cargo.lock files are not copied into this product owner.Product outcome and current contract
When analysis is ready, the map can name tonight's first count-in and the next action:
The Count in control synthesizes a four-beat click locally through Web Audio, then returns the player to the named rehearsal action. English and Korean copy remain aligned in this slice.
Repair history retained
The current product/test tree preserves the earlier test-first repairs rather than replacing them with prose:
35bde907fa9b5bdb9d84b42e80c8c0e9746bef6badded regressions for stop-during-AudioContext.resume, completed node cleanup, plan-change/unmount invalidation and onset overflow before the corresponding production repair;ceaff8aae22681c7fe3a4134901a08043ab9c1ccinvalidated stale playback before scheduling, settled pending completion, released oscillator/gain nodes and rejected non-finite onsets;fbdd543908c8137d320cce7dceef82a9a2cb6387corrected the primary W3C Web Audio citation in the owning doctoring record;79a863b3fa0dd4ece183f0254276bf83bfc8af76added the equivalent-plan regression;92d8ffe3...keyed lifecycle cleanup to semantic timing/guidance rather than object identity.Historical predecessor check results remain historical after this restack and do not transfer to
a2cc3f85....Security Notes
song.tempoand section labels.AudioContextoscillator graph.Verification boundary
The protected-base restack changed the exact head. Every check, review and approval attached to
92d8ffe3...or earlier is predecessor evidence only. Re-evaluate repository/central CI, Windows/macOS build, security/SAST/dependency/SBOM/coverage/review and live protection on unchangeda2cc3f859822615c66fd102839046637a41f371conly.UI Delivery Gate
FAIL until this exact head has terminal-success applicable checks, zero valid actionable findings, qualifying independent non-author last-push approval, and current-head keyboard/pointer/accessibility evidence. Source behavior is preserved, but it is not shipped UI truth yet.
Merge gate
Keep Draft and unmerged until one unchanged exact head satisfies every applicable repository and central gate, exact required owned coverage/docstring evidence, zero valid unresolved findings, a qualifying independent non-author approval and ordinary protected-branch acceptance without bypass. Queued, pending, skipped-required, cancelled, failed, stale, predecessor/base, model-only, self/author or administrative-bypass evidence is non-passing.