Persona: Show with nothing to show says why, Remove group… asks first, and an unsaved layout survives leaving the page
Maintainers usually reply within 1 day
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 25/100
Research direction
Start with the first section only: in Persona.swift, look at showOverlayChecked near line 1147 and the PersonaError cases, then run scripts/test-stage.sh --persona-one-card-only. Done when an empty library shows the new nothing-saved sentence instead of the unreadable-image text, and the existing missing-image tests still pass. The removal confirmation and the in-memory draft snapshot are separate items that depend on this one.
Written by the indexing model from the issue text.
Description
Outcome: pressing Show persona with nothing saved, or with an empty group active, says what is actually wrong. A group's saved arrangement is never deleted in one click or dropped silently by changing page.
1. Show with nothing to show
- Problem: when the candidate list is empty,
showOverlayCheckedthrowsPersonaError.unreadableImage(Persona.swift:1147-1151).reportCardFailure(:874-876) then shows "This persona image is missing or unreadable. Import the finished image again." (:70). Nothing is missing.- Toolbar and panel: Show persona (FloatingToolbar.swift:352) and the panel's Persona row (main.swift:296) open Persona on failure (StageKitController.swift:218-220). There the sentence sits under the "No saved personas yet" empty state (PersonaLibraryView.swift:268-270).
- ⌥F and ⌥R: on by default (Settings.swift:45-50), they route to
toggleQuickPersona/stepQuickPersona(AppCoordinator.swift:314-316). Nothing appears on screen, and the sentence becomes the panel's attention line (StageKitController.swift:498; WorkbenchQuickPanel.swift:141). - Empty group: reachable through
createGroup(members: [])(PersonaLibraryView.swift:320). - Already right elsewhere: the live menu tells the truth ("Prepare a persona in Workbench first.", Persona.swift:2132).
- Change: two new
PersonaErrorcases.noSavedPersona: "Nothing to show yet. Add a persona first."emptyGroup: "This group has no personas yet. Choose its members first." It never names the private group.- At :1151, throw
items.isEmpty ? .noSavedPersona : .emptyGroup. .unreadableImagestays for real image failures. Doors and routing are unchanged.
- Check:
scripts/test-stage.sh --persona-one-card-only, with two new PersonaOneCardTests registered in Tests/StageKitLegacy/TestMain.swift (the one-card-only list near :187 and the full list).- Empty library:
showOverlay,togglePersonaVisibility,toggleQuickPersonaandstepQuickPersona(1)each setnotice == cardFeedback ==the new sentence. It never contains "missing or unreadable", and nothing is written. - Empty group: the
emptyGroupsentence appears without the group's name. AfterprepareGroup(nil), Show succeeds. - Existing missing-image tests keep the unreadable text.
- Empty library:
2. Remove group… asks first
- Problem: Edit group › Remove group sits under Rename… and removes in one click (PersonaLibraryView.swift:367-371).
removeGroupcommits immediately (Persona.swift:747-754), with no undo.- The member order, saved overlay layout and public label live only on the group (Persona.swift:110-118).
- A card or prepared set shown from the group ends (Persona.swift:152-156; PersonaSession.swift:411).
- Remove saved persona asks first (PersonaLibraryView.swift:281-290), as do Remove pack and Library removal.
- Change:
- The menu item becomes
Remove group…, which sets@State removingGroup. - One
.alertbeside "Remove saved persona?", with Cancel and Remove. - Its message comes from a pure helper,
PersonaLibrary.groupRemovalMessage(_:): "Its member list[, saved layout][ and public label] will be removed. Its personas, images and scenes stay in your library." It adds "What is shown from this group ends." only when something is shown from that group. removeGroup, its notice and reconcile stay unchanged.- One sentence in docs/personas.md:17.
- The menu item becomes
- Check: PersonaTests beside :205 cover three message cases: members only, saved layout plus label, and shown versus not shown. A source check confirms the menu no longer calls
removeGroupdirectly. The existing removeGroup tests pass.
3. Arrange overlays keeps an unsaved layout across pages
- Problem: the draft is view
@Stateonly (PersonaPresentationPreparation.swift:10-20), and so ispreparingPresentation(PersonaLibraryView.swift:62-64).- The discard question exists only through
leavePreparation(:550-554, dialog :298-305). - A sidebar click or any door that changes page rebuilds the workspace (WorkbenchHome.swift:215; StageKitController.swift:385-387), and
onDisappearreports the draft as clean (PersonaPresentationPreparation.swift:118). - docs/workbench.md:207: "navigating preserves drafts".
- The discard question exists only through
- Change: a memory-only, non-
@PublishedpresentationDraftsnapshot on PersonaLibrary.- It is written on edit while the draft is dirty, and cleared in
load()and in the Discard button. - It is restored on appear in workspace mode.
restorablePresentationDraft()drops it when its group is gone.- Save still passes
expected: original, so the existing changedLayout check (Persona.swift:775-781) refuses a stale draft. - It is never written to disk.
- It is written on edit while the draft is dirty, and cleared in
- Check: PersonaSessionTests: the draft survives, is cleared after the group is deleted, and a stale save throws changedLayout. A gallery render follows once the gallery is free.
- Sequencing: after items 1-2 merge, because it changes the same files.
Native checks owed
- On a fresh profile, ⌥F shows the nothing-saved line in the panel, and the toolbar's Show persona opens Persona without "missing or unreadable".
- Edit group › Remove group… asks first. Cancel keeps the group. Remove ends a card shown from it.
- Move an overlay, click Present, return to Persona: Arrange overlays reopens with the edit.
Value before scope
- Outcome: a truthful first Show; a saved arrangement is never lost in one click or silently. Evidence: the traced paths.
- Simpler route: two error cases, the app's existing removal alert, and an in-memory snapshot instead of a new store.
- Owner: PersonaLibrary.
- Complexity: no new control, Option or entry point; one confirmation on an existing destructive action.
- Verified by: scripts/test-stage.sh.
Grammar: Quality.
Refs #134, Refs #171
Build-ready record from the overnight lead session of 15 Oct 2026 (round two), verified against main edc15df by an independent skeptic per item. Implementation follows on a claude/* branch; this issue closes only after native acceptance.
Build-ready record from the overnight lead session of 15 Oct 2026 (second discovery round), verified against main edc15df by an independent skeptic per item. This issue closes only after native acceptance.
- Dominant language
- Swift
- Stars
- 0
- Forks
- 1
- Avg merge
- 8h 5m
- Merged PRs (30d)
- 215
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Ship-Work/workbench
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Maintainers usually reply within 1 day
-
documentation good first issue help wanted
Difficulty 2/5 Half a day Newbie friendliness 74/100
Ship-Work/workbench#29 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 55/100
Maintainers usually reply within 1 day
All issues in Ship-Work/workbench
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
raullenchai/Rapid-MLX#4889 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 75/100
Maintainers usually reply within 1 day
-
iOS-2026
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
mozilla-mobile/firefox-ios#36150 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
-
HTMLFormatter applies the wrong column alignment to table cells that follow a spanned cellPossibly taken @auraseb claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
swiftlang/swift-markdown#296 ·