feat(workspace): tap a session tempo when the song has none - #1072
feat(workspace): tap a session tempo when the song has none#1072seonghobae wants to merge 16 commits into
Conversation
Measure tonight's count-in BPM from at least four player taps when song.tempo is missing or untrusted, then count in at that tempo and check the first range. Session-only; this is not MIR and does not write the song contract.
📝 WalkthroughWalkthrough신뢰할 수 있는 BPM이 없는 곡에 세션 탭 템포 기능이 추가되었습니다. 최소 4회의 탭으로 안정적인 BPM을 계산하고, 곡 교체와 편집에 따라 세션 상태를 관리합니다. Workspace UI, 번역, 테스트와 문서도 갱신되었습니다. Changes세션 탭 템포 기능
Estimated code review effort: 3 (Moderate) | ~25 minutes Merge Risk: 🔴 Critical · up to This change adds temporary tap-based tempo guidance for songs without a trusted stored tempo, but the current revision is not merge-ready: required validation and approval conditions are incomplete, the recorded commit identity is inconsistent, and the UI still has bounded correctness issues around unstable taps and invalid tempo display. Sequence Diagram(s)sequenceDiagram
participant Player
participant Workspace
participant TapTempo
participant tapTempo
Player->>TapTempo: 탭 버튼 입력
TapTempo->>tapTempo: recordTap(nowMs)
tapTempo-->>TapTempo: TapTempoState 반환
TapTempo->>tapTempo: tapTempoReading(state)
tapTempo-->>TapTempo: BPM과 탭 수 반환
TapTempo-->>Workspace: 안내 문구와 탭 램프 갱신
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 87.50% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 16 functions across 8 files. (7 skipped: 7 unsupported.)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
📝 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 finding before changing production behavior: a different tempo-less song must start with an empty tap window even when analysis reuses the same song id, while a same-song practice-progress update must preserve the active session taps.
Reset the session-only tap window when a different song or project owns the workspace, even when analysis reuses a constant song id. Preserve taps across same-song practice-progress and collaboration updates by keying only stable project and musical structure identity.
|
Exact-head recheck for The three non-passing required provider lanes are external/current-head evidence, not source findings: OpenCode fail-closed because no authenticated verdict is bound to this SHA; Noema and Strix sidecars reached health/provider preflight but both ended with gateway preflight HTTP 502 (the sidecar log also records a 413 request-too-large event). I am rerunning only those failed jobs; the PR remains unmerged until the provider gates and protected approval are terminal on this unchanged head. |
|
Provider rerun result on unchanged head |
Product outcome
When tonight's song has no stored tempo, the player can tap a steady groove at least four times. BandScope measures a session-only count-in tempo, then tells the room to count in at that BPM and check the first range. This does not write
song.tempo, invent MIR tempo detection, play song audio, or change stem/model authority.Complementary to #1070 (trusted stored-tempo click). Does not close #961 or #770.
Exact current identity
develop@749511c3ad4000090048718f685c6bee6b3d2c25.feat/workspace-tap-tempo.759d571af92ddc6b13045e4f3ddc800cc44fcedd.Current behavior
RehearsalSong.tempofollows the shared contract instead: every finite positive stored BPM suppresses session tapping, including values outside the narrower tap-derived 33–300 range.WeakMap; it is not persisted, exported, logged, or sent over IPC/network.TapTempoPanel.tsx; this avoids a case-only module collision with the lower-casetapTempo.tslogic module on case-insensitive filesystems.TDD / review repairs
d6ad7840ed12c3b51e19229edcce2bea5c379d45; initial projection repair10af39ee5e816ea9f477948b5b23195f508e5027; final ownership model is the loaded-instance repair below.39c1b53351f765ae6d6ffc8153a747c8c52ca573; FIXc03c87d65c7f82c80b8fa3227b63c4a26520ab8b.7dc56fd566d955ef8e32994918bfe402ad18741a; FIX571698b44cb2929b94b407e4abbffafcccefdda9(per-loaded-object WeakMap identity) +f475cc95077da8816cce37b5820db0e79200d82b(inherit identity only through Workspace-owned immutable edits).31d854162004b76ad6749607f9ae811668d82ae1renames the rendered module toTapTempoPanel.tsxand updates production/test imports.Fresh inline review-thread inventory on
759d571a…has zero unresolved threads. The latest Devin review on this head contains informational confirmations rather than a new defect finding.Exact-head verification state
Fresh current-head repository evidence on
759d571af92ddc6b13045e4f3ddc800cc44fceddis terminal-success for deterministic CI/build/Rust, Windows/macOS, coverage, dependency-review, security-audit, SBOM, release-preflight, OSV, Scorecard, Trivy FS, Semgrep, CodeQL, secret-scan, Bandit, and supply-chain inventory. Skipped jobs are not success.The required provider lanes remain non-passing and block merge: OpenCode has no authenticated verdict bound to this HEAD; Noema and Strix reach health/provider preflight but their shared gateway preflight returns HTTP 502, with the sidecar logs also recording
request_failed status=413 code=request_too_large. The latest rerun details are recorded in the current-head PR comment.CodeRabbit rate limiting and provider failures are not approvals or source-quality evidence. A qualifying independent approval must also bind to this exact HEAD under the active ruleset before merge.
Security / privacy boundary
Merge gate
Keep unmerged until one unchanged exact head has every applicable repository and central CI/build/release/security/SAST/SBOM/supply-chain/coverage/review gate terminal-success, zero valid unresolved findings, exact required coverage/docstring evidence, and a qualifying independent non-author last-push approval under live protection.
Queued, pending, skipped-required, cancelled, absent, neutral, failed, stale, predecessor-head, protected-base, model-only, self/author, status-only, rate-limited, or administrative-bypass evidence is not success. Never weaken protection or transfer predecessor evidence.
Do not mix with #811, #828, or #897. Do not invent a parallel MIR product.
Summary by CodeRabbit
새로운 기능
문서
테스트