Remove the App Group wholesale — one sandbox, one bookmark, one flag
Phase 2 of the one-app pivot (DESIGN 12 ▸ App-side state, re-ruled
2026-07-30; reworks 566deab). AppGroup retires; what remains is
AppStateHome — ordinary sandbox Application Support as the one home for
the registry, clipboard staging and template stores, keeping the
unit-test-host redirect (the test host is the app and would sweep real
state). Scalar defaults return to UserDefaults.standard.
BoardRecord's per-edition grant slots and openNow flags collapse to one
bookmark + one isOpenNow; the legacy-key decode and adopt-in-memory
paths go (nothing shipped with group-era records), while the founding
four-keys-required / defaults-for-everything-since decode policy stays —
a bookmarkless record decodes as the born-orphan row rather than
quarantining the list. needsReopen and the pre-anchored re-grant panel
are removed whole: the only state that flow served — a record granted by
a sibling sandbox — is unrepresentable now, and a dead bookmark of our
own was already the orphan case by explicit comment. The
indexOfRecord path fallback dies with it; path is never a key again.
The cross-process freshness stamp (mtime+size re-read) and
BoardEditionPresence with its popover "Also open in…" line retire; the
clipboard prune keeps its atomic .sweeping/ claim-then-delete, reframed
for crash residue and open -n copies rather than sibling editions. The
application-groups entitlement key is gone.
1880 tests in 317 suites green (13 cross-edition tests retired with
their subject).
Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -75,8 +75,8 @@ struct RestoreBootstrapView: View {
|
||||
case .restoreBoards, .welcome:
|
||||
// `.welcome` arrives here by design — this window presents at every launch, because it is
|
||||
// the app's one reliable presenter (see `KanbanApp`'s bootstrap scene) — and the pass is
|
||||
// its answer: nothing is flagged for this edition, so it shows welcome, which is what
|
||||
// `.welcome` asked for.
|
||||
// its answer: nothing is flagged, so it shows welcome, which is what `.welcome` asked
|
||||
// for.
|
||||
restoreFlaggedBoards(openedAlready: replayedOpens)
|
||||
}
|
||||
|
||||
@@ -96,17 +96,6 @@ struct RestoreBootstrapView: View {
|
||||
path: record.lastKnownPath,
|
||||
message: "This board is unavailable. Its volume may be offline, or it may have been moved or deleted."
|
||||
)
|
||||
case .needsReopen:
|
||||
// Effectively unreachable — this edition can only have flagged a board open by having
|
||||
// opened it, which needed a grant — and deliberately quiet if it ever happens.
|
||||
//
|
||||
// **No launch failure and no panel.** A modal grant panel at launch is exactly the
|
||||
// "launch-time modal chain" 02 § Launch and window lifecycle rules out, and a failure
|
||||
// row would put fail-fast's warning tone over a board that is *fine*: welcome appears
|
||||
// (nothing restored), and this board's own row already carries the re-grant caption
|
||||
// and the one click that resolves it (12-editions.md ▸ Distribution). That row is the
|
||||
// surface, so nothing is silently dropped.
|
||||
Self.logger.error("a flagged board is awaiting this edition's grant; left for its welcome row")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user