Skip to content

feat(workspace): name the next action after project load or save fails - #984

Open
seonghobae wants to merge 7 commits into
developfrom
feat/project-save-load-failure-next-action
Open

feat(workspace): name the next action after project load or save fails#984
seonghobae wants to merge 7 commits into
developfrom
feat/project-save-load-failure-next-action

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

Product outcome

When a project file cannot open, the workspace names Choose another project as the next rehearsal action. When tonight's rehearsal map cannot be saved, it names Try saving again and keeps the open song visible. BandScope does not reuse the analysis error card for these persistence failures and does not invent a demo or retry analysis.

This is the remaining project-file failure path after analysis recovery (#976), local-file recovery (#981), and YouTube recovery (#982). Canonical MIR/known-stem work stays on #828 / #770. Canonical crash-safe save publication stays on #970 / #962. Canonical handoff import stays on #740 / #739.

open or save a project file
→ load fails  → Choose another project
→ save fails  → keep the rehearsal map + Try saving again

Exact current identity

  • Protected target: develop@acdbea6344fe1231c39535b575f4de35e4c607c9.
  • Branch: feat/project-save-load-failure-next-action.
  • Exact head: 1f6c68d44389c049c7edb6dc1d08730117414709.

Buyer-visible contract

  • Load title: That project file can't open tonight / 그 프로젝트 파일로는 오늘 합주를 열 수 없습니다.
  • Load action: Choose another project / 다른 프로젝트 선택하기 reuses the existing project picker.
  • Save title: Tonight's rehearsal map couldn't be saved / 오늘 합주 지도를 저장하지 못했습니다.
  • Save action: Try saving again / 다시 저장하기 reuses the existing save picker.
  • A failed save or a failed follow-up load does not hide an already-open rehearsal map.
  • Cancelling the replacement picker is silent: the recovery action stays available.
  • Choosing a local song, importing YouTube, starting analysis, or a successful load/save dismisses the persistence card.
  • Secret-shaped, URL, and local-path diagnostics stay redacted and never appear in the recovery title or action.

Security Notes

  • Untrusted input: project file picker results and native load_project / save_project error copy, including path- and URL-shaped diagnostics.
  • Trust boundary: Tauri project load/save → safeErrorDetail → persistence recovery card → existing picker.
  • Safe failure: recovery only re-invokes the existing load or save command. It does not follow links, open a generic filesystem API, start analysis, or replace an open rehearsal map with the analysis error card.
  • Privacy: URL, path, and secret-shaped diagnostics are redacted before buyer copy. Tests assert secret-token never appears in the recovery heading or action.

Verification

Desktop Vitest on this head, with 100% gated coverage on App.tsx, export.ts, i18n, and Score*:

  • src/App.test.tsx (73)
  • src/i18n/index.test.ts (9)
  • src/lib/export.test.ts (17)
  • Score view/storage (32)

apps/desktop tsc --noEmit passed.

Dependency / merge gate


Open in Devin Review

Keep an open rehearsal map visible when save fails, and name
Choose another project / Try saving again instead of the analysis error card.

Security Notes:
- Untrusted input is project file picker results and native load/save errors.
- Trust boundary: Tauri load_project/save_project -> redacted error copy -> recovery action.
- Recovery reuses the existing load/save pickers; it does not follow paths or start analysis.
- Privacy: paths, URLs, and secret-shaped diagnostics stay redacted.
@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 40 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: 9dd99772-1452-48e1-970c-98511e0ba3bd

📥 Commits

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

📒 Files selected for processing (12)
  • AGENTS.md
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • apps/desktop/src/App.project-persistence.test.tsx
  • apps/desktop/src/App.test.tsx
  • apps/desktop/src/App.tsx
  • apps/desktop/src/features/workspace/WorkspaceStates.tsx
  • apps/desktop/src/locales/en/common.json
  • apps/desktop/src/locales/ko/common.json
  • docs/design-system/component-contract.md
  • docs/design-system/product-design-handoff.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 status: needs-review Open pull request requiring current-head review or checks type: feature New or expanded product capability scope: product-gap Customer-visible product gap labels Aug 22, 2026 — with Grok (by xAI)
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

…order

The recovery card added a projectError load branch before EmptyState and a
save-failure banner above Workspace, but the component contract still listed
only the original four routing states. Update the routing-order rule so the
documented contract matches App.tsx.
The Save Project control stays reachable while the Score view is active,
but renderWorkspaceState is bypassed there, so a failed save set
projectError with no visible feedback. Hoist the shared recovery banner so
it renders above ScoreView as well, and pin the behavior with a test.
@seonghobae

Copy link
Copy Markdown
Collaborator Author

Merged current develop into this branch: resolved the shared-file conflict by including both this feature's project save/load failure next actions and the newly landed #957 playable-range work (CLAUDE.md keeps both sentences). No behavior dropped.

@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 new potential issue.

Open in Devin Review

Comment thread apps/desktop/src/App.tsx
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 status: needs-review Open pull request requiring current-head review or checks type: feature New or expanded product capability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant