feat(workspace): guide tonight's first intro on map and player - #943
seonghobae wants to merge 48 commits into
Conversation
Name the labeled intro start so the room can count in together. The workspace action opens the matching map section. Player Hear exists only when the owning playback surface supplies a seek callback. Do not invent an intro from verse, chorus, pickup, stop, handoff, or the first unlabeled section.
📝 WalkthroughWalkthrough첫 번째 유효한 Changes첫 인트로 안내
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Workspace
participant FirstIntroCallout
participant SongStructure
participant PlayerFeature
participant PlaybackSurface
Workspace->>FirstIntroCallout: song 전달
FirstIntroCallout->>SongStructure: 첫 intro 위치 탐색
SongStructure-->>FirstIntroCallout: renderer 소유 대상 반환
FirstIntroCallout->>SongStructure: intro 섹션으로 스크롤
PlayerFeature->>FirstIntroCallout: onPlayFromSeconds 전달
FirstIntroCallout->>PlaybackSurface: intro 시작 시간 전달
PlaybackSurface-->>PlayerFeature: intro 재생 시작
Possibly related PRs
Merge Risk: 🟠 High · up to The change can still miss a valid first intro or fail to render Player when malformed rehearsal metadata triggers an exception, preventing users from seeing or hearing the intended count-in guidance. Required exact-head checks are not yet terminal, so the PR is not merge-ready until the runtime handling is fixed and all required gates pass. 🚥 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 |
|
@opencode-agent Review only exact current head Verify this buyer-facing first-intro slice remains distinct from neighboring first-action PRs; only an explicit bounded Submit formal APPROVE only after exact-head required evidence is terminal and no valid source finding remains; otherwise REQUEST_CHANGES with the first causal boundary and narrowest RED→GREEN correction. Do not edit, merge, weaken protection, rerun unrelated workflows, or transfer predecessor evidence. |
|
Queued @opencode-agent for PR #943 at head |
|
Already queued @opencode-agent on this exact request for PR #943 at head |
|
Already queued @opencode-agent on this exact request for PR #943 at head |
3 similar comments
|
Already queued @opencode-agent on this exact request for PR #943 at head |
|
Already queued @opencode-agent on this exact request for PR #943 at head |
|
Already queued @opencode-agent on this exact request for PR #943 at head |
|
Already queued @opencode-agent on this exact request for PR #943 at head |
1 similar comment
|
Already queued @opencode-agent on this exact request for PR #943 at head |
|
Queued @opencode-agent for PR #943 at head |
|
Queued @opencode-agent for PR #943 at head |
# Conflicts: # AGENTS.md # CLAUDE.md # apps/desktop/src/features/workspace/Workspace.tsx # apps/desktop/src/locales/en/common.json # apps/desktop/src/locales/ko/common.json
|
Merged current develop into this branch: resolved shared-file conflicts by including both this feature's first-intro count-in callout and the newly landed #957 playable-range work (Workspace.tsx keeps both imports; en/ko locales unioned with symmetric keys; AGENTS/CLAUDE unioned). No behavior dropped. |
FirstIntroCallout read runtimeSong.sections directly for indexOf, so a throwing getter or Proxy get-trap crashed the render after resolveFirstIntro had already validated via descriptor reads. Route both the identity and section-index reads through descriptor-only helpers that fail closed (-1/empty), matching the player's trust-boundary posture. Tests: FirstIntroCallout suite 13/13 (adds throwing-accessor and get-trap-Proxy cases), Workspace suite 12/12.
|
Admission-state correction for exact head Finding: live develop comparison is diverged (44 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. |
|
Fresh exact-head verification receipt for This supersedes the earlier body snapshot that described platform builds as still in progress. Four-platform build success is valid exact-head evidence, but the required aggregate contexts and CI admission are not GREEN. The cross-repository queue/admission receipt was routed to canonical owner ContextualWisdomLab/.github#712 (comment |
Product outcome
After analysis, the room can see tonight's first labeled intro and take one honest next action: open that start on the renderer-owned map, or hear it from Player only when playback authority is supplied. Copy names the holding part when an active role is corroborated, the labeled start, and the time so the room can count in together.
Exact current identity
bolt-performance-chart-export-13223013812255847379@8fe6b6d99c009527ef0bcba419e6f6debdb23c23.develop@314ddeae7b775a4957594b599358c8255617eb2e.5e357e8d4b06befe2265ac1e09e480d929a9d8d9.feat/workspace-first-intro-count-in.8fe6b6d...; 24 feature files. The restack adopts current protected workflow/security content and repair(ci): format consolidated supply-chain policy test #1176's canonicaltest_supply_chain_policy.pyformatter delta instead of copying that owner change into this lane.Product / trust boundary
introsection whose runtime window is an integer, non-negative, positive-duration interval bounded by sharedMAX_SECTION_TIME_SECONDS.verse,chorus,pickup,stop,handoff, or the first unlabeled section.Current review repair
Fresh review found that the Korean rehearsal surface mixed the canonical product term
구간with섹션:metricConfidenceSectionCountSingular/Pluralrendered{count}개 섹션while neighboring navigation, confidence, and roadmap copy used구간.39ed0bef4e67cd7abe7696ee1adbea213a79d5ff: Workspace localization now requires개 구간.7e8824087e62b6bd95cd5afd2ec4bb369f62b51e: Player localization requires2개 구간and explicitly rejects2개 섹션.066cc31c9a7c675e0f5fc8f62a8c4245faf77fd9: change only the two Korean section-count resources to{count}개 구간.5e357e8d4b06befe2265ac1e09e480d929a9d8d9: ordinary two-parent descendant of066cc31...and repair(ci): format consolidated supply-chain policy test #11768fe6b6d...; tree preserves the feature and adopts current prerequisite/protected content. No force-push or destructive rebase.The mixed-terminology review thread was replied to with this lineage and resolved after the source repair. The only remaining informational read-asymmetry thread was also revalidated on this exact head: Player intentionally probes
Reflect.getto fail closed on throwing Proxy gets, while the intro resolver consumes only an own data descriptor value. It requires no source change and is resolved as informational evidence.Exact-current-head verification
Current repository-owned generation for
5e357e8d4b06befe2265ac1e09e480d929a9d8d9exists. At the latest fresh read:build-baseline 35793171170: in progress. Hosted Windows/macOS matrix runners are assigned; macOS arm64 has passed checkout, pinned npm activation, dependency installation, Python sync, and frontend build and is in native shell build. No terminal build verdict yet.ci 35793171215: queuedSecurity Scan 35793171202: queuedSAST Semgrep 35793171228: queuedsbom 35793171197: queuedCodeQL PR 35793171306: queuedNonterminal/queued is not GREEN. No predecessor-head workflow or review evidence transfers to this head. Current formal review inventory contains COMMENTED submissions only; there is no qualifying independent non-author
APPROVEDreview for this exact head.Dependency / merge order
#1176 must first settle its own central CodeQL publication/re-entry lifecycle and independent-review gate, then become protected ancestry through normal merge. This PR must then be reconciled non-force against the resulting protected head and receive fresh exact-head checks/review. Do not duplicate #1176's formatter delta locally.
Merge gate
APPROVEDreview.Security Notes
Untrusted rehearsal metadata remains data only. Runtime roots and collections are validated before access; section time windows are bounded; section-local identities and ranked activity are corroborated; renderer positions own navigation; Player playback remains explicit callback authority; localization only maps validated shared section-form labels to trusted copy; and this change adds no filesystem, network, subprocess, WebView, model, export, persistence, dependency, or review-credential authority.