Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Persona: Show with nothing to show says why, Remove group… asks first, and an unsaved layout survives leaving the page

Open
#340 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@EthDawg is already working on this.

Since Oct 14, 2026.

  • #351 by @EthDawg — open

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
25/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
macos, swift
Domain
desktop

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

bug

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, showOverlayChecked throws PersonaError.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 PersonaError cases.
    • 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.
    • .unreadableImage stays 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, toggleQuickPersona and stepQuickPersona(1) each set notice == cardFeedback == the new sentence. It never contains "missing or unreadable", and nothing is written.
    • Empty group: the emptyGroup sentence appears without the group's name. After prepareGroup(nil), Show succeeds.
    • Existing missing-image tests keep the unreadable text.
2. Remove group… asks first
  • Problem: Edit group › Remove group sits under Rename… and removes in one click (PersonaLibraryView.swift:367-371).
    • removeGroup commits 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 .alert beside "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.
  • 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 removeGroup directly. The existing removeGroup tests pass.
3. Arrange overlays keeps an unsaved layout across pages
  • Problem: the draft is view @State only (PersonaPresentationPreparation.swift:10-20), and so is preparingPresentation (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 onDisappear reports the draft as clean (PersonaPresentationPreparation.swift:118).
    • docs/workbench.md:207: "navigating preserves drafts".
  • Change: a memory-only, non-@Published presentationDraft snapshot 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.
  • 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
  1. Outcome: a truthful first Show; a saved arrangement is never lost in one click or silently. Evidence: the traced paths.
  2. Simpler route: two error cases, the app's existing removal alert, and an in-memory snapshot instead of a new store.
  3. Owner: PersonaLibrary.
  4. Complexity: no new control, Option or entry point; one confirmation on an existing destructive action.
  5. 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

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Ship-Work/workbench

All issues in Ship-Work/workbench

Similar issues

More Swift issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.