Skip to content

feat(workspace): name tonight's first count-out on the map - #1095

Open
seonghobae wants to merge 2 commits into
developfrom
feat/workspace-first-count-out
Open

feat(workspace): name tonight's first count-out on the map#1095
seonghobae wants to merge 2 commits into
developfrom
feat/workspace-first-count-out

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

Product outcome

The ready rehearsal map names tonight's first count-out from existing timeRange.end evidence so the band can leave the section together. Sit-out parts stay off this cue. This is not a count-in, click, chart bar, Fine, or a new MIR product.

Exact current identity

  • Protected target: develop@749511c3ad4000090048718f685c6bee6b3d2c25.
  • Exact current head: c708b0b9600844f8d0304cb9a55f458a8b3b27f3.
  • Branch: feat/workspace-first-count-out.

Current exact scope

  • firstCountOut admits own-property finite non-negative section ends at or after the matching start and formats them as m:ss.
  • Blank labels, inverted spans, inherited time fields, and malformed roots fail closed.
  • When a role is selected, only an own-property active partGraph node (or a named role when no graph node exists) owns the count-out.
  • Ready workspace copy names the next action: count out that last bar before leaving the section, or confirm the end when it is missing.
  • AGENTS / CLAUDE / ARCHITECTURE / CHANGELOG and the component contract stay current.
  • Doctoring: docs/doctoring/first-count-out.md.

Merge gate


Devin Review

Name the first named section end so the band can count out the last bar
before leaving together. Sit-out parts stay off this cue.
@coderabbitai

coderabbitai Bot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 43 minutes.

View limit details

Limit 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.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c1d0292b-f031-48c2-a4cc-b31de2a7125a

📥 Commits

Reviewing files that changed from the base of the PR and between 749511c and 9869e67.

📒 Files selected for processing (13)
  • AGENTS.md
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • apps/desktop/src/features/workspace/Workspace.test.tsx
  • apps/desktop/src/features/workspace/Workspace.tsx
  • apps/desktop/src/features/workspace/firstCountOut.test.ts
  • apps/desktop/src/features/workspace/firstCountOut.ts
  • apps/desktop/src/i18n/index.test.ts
  • apps/desktop/src/locales/en/common.json
  • apps/desktop/src/locales/ko/common.json
  • docs/design-system/component-contract.md
  • docs/doctoring/first-count-out.md

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae seonghobae added area: ui-ux Frontend, interaction, design, or user experience priority: medium Normal-priority or P2 work type: feature New or expanded product capability scope: product-gap Customer-visible product gap labels Aug 30, 2026 — with Grok (by xAI)

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

Devin Review

Comment on lines +129 to +133
const endTime = formatCountOutTime(end);
if (!endTime || typeof end !== "number" || end < start) {
continue;
}
return { sectionLabel, endTime };

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Legacy projects show invented count-outs

After legacySectionTimeRange creates a placeholder, firstCountOut treats it as analyzed timing. The map reports a false 0:01 ending.

Prompt for agents
Prevent migrated legacy section-time placeholders from becoming count-out authority. parseRehearsalSong currently inserts index/index+1 ranges in packages/shared-types/src/index.ts via legacySectionTimeRange, after which firstCountOut in apps/desktop/src/features/workspace/firstCountOut.ts cannot distinguish those synthetic values from analyzed timing. Preserve timing provenance or an explicit unknown state through migration, and make the workspace show the missing count-out copy for synthetic legacy ranges. Add a load/migration test for a legacy song without timeRange.
Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Repair the existing feat/workspace-first-count-out owner branch only from exact current head 9869e671195a53d4fcf94552e830a9e5ecb5d4f1 over protected develop@749511c3ad4000090048718f685c6bee6b3d2c25. Refetch head/base/target blobs immediately before each write and adapt if the lane moves.

Apply receiving-code-review, systematic debugging, and TDD. The current Devin finding is valid on this head: packages/shared-types/src/index.ts::migrateLegacySectionTimeRanges still fabricates {start:index,end:index+1} through legacySectionTimeRange, while firstCountOut treats every bounded own timeRange as analyzed timing, so an old project with no timing authority can show an invented 0:01 count-out.

First add a realistic RED load/migration regression that parses a legacy song without timeRange and proves the workspace returns no count-out authority. Then make the narrowest durable provenance repair: preserve an explicit migration/unknown-timing signal through the shared validated contract and persistence path, without invalidating ordinary analyzed or already-authoritative historical ranges; firstCountOut must fail closed for the synthetic legacy placeholder. Do not use magic numerical sentinel values that can be mistaken for real timing, and do not simply delete migration compatibility. Update strict validators/types and any Rust/Python/desktop boundary that actually consumes the added field only where required. Obtain focused migration + firstCountOut RED→GREEN, full shared-types/desktop typecheck/tests, then exact-head quickcheck/coverage/security evidence. Resolve only the addressed thread. No competing PR, self-approval, force-push, gate weakening, or central .github mutation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ui-ux Frontend, interaction, design, or user experience priority: medium Normal-priority or P2 work scope: product-gap Customer-visible product gap type: feature New or expanded product capability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant