feat(workspace): guide tonight's first labeled handoff on map and player - #937
feat(workspace): guide tonight's first labeled handoff on map and player#937seonghobae wants to merge 22 commits into
Conversation
Name the earliest labeled handoff cut so the room can catch the pass. Workspace opens that map section; the player Hear action exists only when playback supplies a seek callback. Do not invent a pass from stop, pickup, or graph edges on another form label.
|
Warning Review limit reachedNext included review available in 13 minutes. View limit detailsLimit 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. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (30)
✨ 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 |
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
failure, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
failure, so required test/docstring evidence was not proven for current head3a68b9a2915e6b96076da828eca264c27e346cad. -
Head SHA:
3a68b9a2915e6b96076da828eca264c27e346cad -
Workflow run: 32212704993
-
Workflow attempt: 1
Coverage evidence
Coverage evidence job did not run or did not publish coverage evidence.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (28 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (28 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
OpenCode Review Overview
Pull request overviewOpenCode cannot approve yet because required coverage evidence did not pass. Review outcome1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
Coverage evidenceCoverage evidence job did not run or did not publish coverage evidence. Changed-File Evidence Mapflowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (28 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (28 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
|
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
failure, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
failure, so required test/docstring evidence was not proven for current head3a68b9a2915e6b96076da828eca264c27e346cad. -
Head SHA:
3a68b9a2915e6b96076da828eca264c27e346cad -
Workflow run: 32216801298
-
Workflow attempt: 1
Coverage evidence
Coverage evidence job did not run or did not publish coverage evidence.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (28 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (28 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
|
Caution Review failedAn error occurred during the review process. Please try again later. 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 |
| if (!handoff) { | ||
| return ( | ||
| <aside | ||
| id="workspace-surface-handoff" |
There was a problem hiding this comment.
📝 Info: Fixed callout id shared by two surfaces
The callout always renders id workspace-surface-handoff (FirstHandoffCallout.tsx and :131), and both the workspace and the player mount it. Only one screen renders at a time today, so no collision occurs, but any future layout that mounts both surfaces produces a duplicate DOM id.
Was this helpful? React with 👍 or 👎 to provide feedback.
| return ( | ||
| <section style={{ padding: "24px" }}> | ||
| <h2>{title}</h2> | ||
| <FirstHandoffCallout song={song} actionMode="callback-only" onHearHandoff={onPlayFromSeconds} /> |
There was a problem hiding this comment.
🔍 Player Hear action has no production caller
PlayerFeature forwards onPlayFromSeconds to the callout, but grep shows no non-test caller renders PlayerFeature at all, let alone with that prop. The Hear action stays hidden in the running app until some parent wires a seek callback.
Was this helpful? React with 👍 or 👎 to provide feedback.
|
@opencode-agent Repair the verified current-head ownership defect on the existing |
|
Re-review request for exact head |
# 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
|
Merged current develop into this branch: resolved shared-file conflicts by including both this feature's first-handoff-cut callout and the newly landed #957 playable-range work (Workspace.tsx keeps both imports; en/ko locales unioned with symmetric keys; AGENTS/CLAUDE/CHANGELOG unioned). No behavior dropped. |
| /** Return ranked roles whose unique graph node is explicitly active. */ | ||
| function rankedActiveRoles(section: RehearsalSection): RehearsalRole[] { | ||
| if (!isDenseRuntimeArray(section.roles) || !isDenseRuntimeArray(section.partGraph)) { | ||
| return []; | ||
| } | ||
|
|
||
| const safeRoleIds = section.roles | ||
| .filter( | ||
| (role) => isRuntimeObject(role) && typeof role.id === "string" && role.id.trim().length > 0 | ||
| ) | ||
| .map((role) => role.id); | ||
| const safeGraphRoleIds = section.partGraph | ||
| .filter( | ||
| (node) => isRuntimeObject(node) && typeof node.role_id === "string" && node.role_id.trim().length > 0 | ||
| ) | ||
| .map((node) => node.role_id); | ||
| const repeatedRoleIds = repeatedIds(safeRoleIds); | ||
| const repeatedGraphRoleIds = repeatedIds(safeGraphRoleIds); | ||
| const activeIds = new Set( | ||
| section.partGraph | ||
| .filter( | ||
| (node) => | ||
| isRuntimeObject(node) && | ||
| node.is_active === true && | ||
| typeof node.role_id === "string" && | ||
| node.role_id.trim().length > 0 && | ||
| !repeatedGraphRoleIds.has(node.role_id) | ||
| ) | ||
| .map((node) => node.role_id) | ||
| ); | ||
|
|
||
| return section.roles.filter( | ||
| (role) => | ||
| isRuntimeObject(role) && | ||
| hasRankedPriority(role) && | ||
| !repeatedRoleIds.has(role.id) && | ||
| activeIds.has(role.id) | ||
| ); | ||
| } |
There was a problem hiding this comment.
📝 Info: Named holder is highest-priority active role, not the pass-giver
resolveFirstLabeledHandoff names the holder as the highest-priority active ranked role in the section and ignores handoff_to/handoff_from edges (firstLabeledHandoff.ts:127-146). When several parts are active, the label reflects ranking, not which part actually gives the pass. The PR states edges are intentionally unused, so this is a design choice worth confirming against product intent.
Was this helpful? React with 👍 or 👎 to provide feedback.
Product outcome
After analysis, the room can see tonight's first labeled handoff and take one next action: open that pass on the map, or hear it from the player when playback is available.
Cites
docs/design-system/component-contract.md(First Handoff Callout) and the existinghandoffform label in@bandscope/shared-types.This is the remaining form-label next-action after pickup (#916) and stop (#934). It is not import-handoff #740 and not Part Handoff Map #850.
Exact current identity
develop@acdbea6344fe1231c39535b575f4de35e4c607c9.3a68b9a2915e6b96076da828eca264c27e346cad.feat/workspace-first-handoff-cut.What changed
handoffsection whose runtime time window conforms to the shared integer timing contract: non-negative, strictly positive duration, and no endpoint beyondMAX_SECTION_TIME_SECONDS. Do not invent a pass fromstop,pickup, graphhandoff_to/handoff_fromedges on another form label, zero-duration ranges, fractional ranges, or overflowed timestamps.section.idis never DOM-ID authority.handoffenum.Test-first hardening
151feab1bb0fbf09b56bc7bd4d2ed13a969c626cproves sparse section, role, and part-graph collections must not authorize a handoff or named holder. GREEN658f5c0af55787882bc4899b331a586838ab52a6adds the dense-array runtime boundary.048dbfb4a80711cd5e79549fd075b7c5bdacc900reproduces Player crashes and misleading section counts for non-array, sparse, and malformed runtime section evidence. GREEN9cfb68f490df2d3a529b6fa0eac89278718a5005contains those values before rendering the section summary.fa558f287302ba3fe578ee2c974e2b9f84ef436erequires Korean copy to render핸드오프rather than the raw English enum.cda8be65e1add308128f9a7c536daaf7be876ae8adds the locale-owned form-label map andb093e9f94d5804a068f3998a0703b5d041923dd3applies it.3a68b9a2915e6b96076da828eca264c27e346cadspecifically prevents an object-valued runtime song title from reaching React text authority.Exact-current-head verification
Repository evidence for exact head
3a68b9a2915e6b96076da828eca264c27e346cadcurrently includes terminal-successrelease,sbom, Bandit, SAST Semgrep, andsecret-scan-gate;ciandbuild-baselineremain queued and are therefore non-passing.security-auditand aggregateSecurity Scanare terminal-failure on the inherited protected-base JavaScript HIGH set owned by canonical #783 (nanoid,pdfjs-dist,undici); this feature branch does not suppress or duplicate that dependency authority.Current inline review threads are empty. No queued, failed inherited-base, predecessor-head, dismissed, self/author, or model-only evidence is treated as approval or merge readiness.
Dependency routing
ContextualWisdomLab/.github@mainis currentlyf16280a0aa215563d29200c5d0bab75c48af614a..github#1136@a1c3a195d24fd52ea4df4e0fa6b5c8fdd7dddd97; do not add a BandScope-local workaround or transfer predecessor reviewer evidence. After that prerequisite integrates, require a genuinely fresh exact-head coverage/OpenCode/Noema/Strix cycle.Merge gate
Merge only after one unchanged exact head has every applicable repository and central required gate terminal-success, zero valid unresolved findings, exact required owned coverage/docstring evidence, canonical dependency prerequisites integrated/revalidated, a qualifying independent non-author last-push
APPROVE, and ordinary protected-branch acceptance. Queue/pending/skipped/cancelled/failed/rate-limited/predecessor/protected-base/dismissed/self/author evidence is not success. Never bypass branch protection.Security Notes
is_active === true, one-pass copy interpolation, locale-owned form labels, renderer-position navigation, runtime title containment, and reduced-motion presentation handling.scrollIntoView.