Every edition declares group.dev.rzen.indie.Kanban and homes its
app-side state there from day one (12-editions.md ruling 2026-07-29):
- AppGroup namespace: container resolution with per-edition fallback
when unprovisioned, shared UserDefaults suite, edition identity, and
a unit-test-host redirect (the test host IS the app — its launch
sweep and recents refresh must not touch the real shared container).
- BoardRecord: bookmark/isOpenNow replaced by per-edition grants and
openNow keyed by bundle id; hand-written Codable keeps legacy keys
decoding (adopted in memory as the running edition's slots, upgraded
on first save); every other field stays common.
- RecentBoard gains needsReopen: no grant of ours but somebody's —
first click runs an open panel pre-anchored at the recorded path,
prompt "Grant"; recordOpen mints this edition's slot onto the
matched shared record (path fallback only after identity fails and
only against records holding no grant of ours, so re-granting never
forks the record).
- Cross-edition freshness: stat-cheap mtime+size stamp re-reads the
registry when the sibling edition wrote it, so one edition's save
never erases the other's records wholesale.
- restorables() filters on this edition's open-now flags; the board
popover gains BoardEditionPresence ("Also open in Lanework Pro"),
pid-liveness-checked so crash residue never lies.
- Clipboard staging store moves to the group container; the sweep
claims doomed trees by atomic rename into .sweeping/ then deletes,
so the sibling's concurrent sweep is a non-event.
- Template store re-homed to the group container per the 09-templates
re-ruling; scalars (quick-style recents, window size) move to the
shared suite.
- verify-editions.sh: 30 checks (each edition carries exactly the
family group). No pathfinder 1.x migrator: 1.x predates the
registry; state starts fresh in the group container.
Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
37 lines
1.8 KiB
XML
37 lines
1.8 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<!-- Base's three, verbatim (Kanban/Kanban.entitlements) — the board experience is identical
|
|
across editions, so its sandbox posture is too. -->
|
|
<key>com.apple.security.app-sandbox</key>
|
|
<true/>
|
|
<key>com.apple.security.files.user-selected.read-write</key>
|
|
<true/>
|
|
<key>com.apple.security.files.bookmarks.app-scope</key>
|
|
<true/>
|
|
<!-- The family App Group, **verbatim** the same id base declares (12-editions.md ▸
|
|
Distribution, ruled 2026-07-29): one container, one registry, one clipboard staging store,
|
|
one defaults suite. The whole upgrade story is this key matching base's — an edition
|
|
declaring a group of its own would share nothing while looking as though it did. Teams
|
|
joins by declaring this same string. -->
|
|
<key>com.apple.security.application-groups</key>
|
|
<array>
|
|
<string>group.dev.rzen.indie.Kanban</string>
|
|
</array>
|
|
<!-- Pro only (12-editions.md ▸ Targets): remotes. Base ships without this key at all, which
|
|
is what makes "base cannot talk to a network" a checkable property of the signed binary
|
|
rather than a promise about the source (scripts/verify-editions.sh). -->
|
|
<key>com.apple.security.network.client</key>
|
|
<true/>
|
|
<!-- Pro only: remote auth credentials (07-sync-collab.md ▸ Auth — Keychain, SSH, TOFU).
|
|
A sandboxed app reaches its own keychain items without this key; the group is declared
|
|
so the credential store has one stable, named home from pro-m2 onward instead of an
|
|
implicit per-signature one that moves when the signing identity does. -->
|
|
<key>keychain-access-groups</key>
|
|
<array>
|
|
<string>$(AppIdentifierPrefix)dev.rzen.indie.KanbanPro</string>
|
|
</array>
|
|
</dict>
|
|
</plist>
|