2026-07-30 findings-resolution ruling (Redesign card d40bfac1): Finder's ⌥⌘⌫ answered disk-space pressure boards don't have, and it was the one gesture reaching unrecoverable straight from the board. The delete vocabulary is now purely staged: board → trash, trash → permanent (confirmed on no-git boards), Empty Trash for bulk. Docs drop the File menu row, both ⌥-alternate context rows, and the VO custom action; code removal rides the session's realign card. Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
11 KiB
Editions
Lanework ships as three editions built from one codebase and one on-disk format. This doc owns the edition axis: what each edition is, how the split is engineered (targets, the provider seam), and which features land where. Individual docs stay edition-agnostic where they can — they conditionalize on board mode (none / git / git+remote — 07-sync-collab.md), and this doc defines which modes each edition ships.
The three editions
- Lanework (base) — no git integration. Boards are plain folders (mode
noneeverywhere); undo/redo is macOS-native (13-native-undo.md). The full board experience: lanes, cards, styling, trash, attachments, card window, templates, agents, accessibility. - Lanework Pro — git integration as designed in 06-history-undo.md and 07-sync-collab.md: opt-in init, adoption, git-backed undo/history, branches, remotes, pull/push, auth. Plus Pro-only differentiators (matrix below).
- Lanework Teams — Pro plus tracker integration over the reserved enhanced schema (
remote/remote-state, and tracker-synced comment threads — comments themselves ship in every edition, 01-storage-format.md / 05-card-window.md). Deferred — months out, no design pass yet; this doc only keeps the seam honest.
Why a real split and not feature flags: the editions differ at the binary level — base ships without libgit2 and without the network-client entitlement; Pro links git machinery and talks to remotes. And the strategic reason (settled): Teams' card sync must be backend-agnostic — it has to work over git and over a range of trackers — so history and sync must sit behind a genuine provider seam. Base's native undo is the first proof the seam is real: two working history providers before a third arrives.
Distribution (settled)
Separate Mac App Store apps — real Xcode targets, not an IAP unlock. Both editions declare the same .kanban package UTI (dev.rzen.indie.kanban-board) verbatim, so any board opens in either app; the format is one format, owned by 01-storage-format.md, with no edition-specific keys. Upgrade path is buying the other app; boards need no migration whatsoever (files are the interchange). App-side state crosses the boundary through a shared App Group (ruled 2026-07-29): every edition declares the family group — group.dev.rzen.indie.Kanban — and the board registry with its Application Support peers (02-architecture.md ▸ Per-board app state) homes in the group container from day one, so there is no migration and no ordering dependency; the entitlement must be in base's entitlements before base 2.0 ships, since base ships first. A paying upgrader launches Pro onto their full recents, frames, and settings — never an empty home screen. The honest caveat, stated: security-scoped bookmarks never cross apps (minted per sandbox, App Group or not), so the list transfers while access re-grants per board — a record another edition minted resolves unavailable-until-reopened, and the first click runs an open panel pre-anchored at the recorded path: one click + Grant per board, once per edition. Teams joins the same group when it arrives — the container is team-scoped, and a future edition's bundle id declares the same group id with zero further ceremony. Secrets stay Keychain-only as ever (07-sync-collab.md — the keychain access group is its own, existing mechanism); the clipboard's staging store joins the group container too (Both editions installed below).
Both editions installed (ruled 2026-07-29) — a supported steady state, not a transition to hurry past:
- Pro claims the
.kanbandefault on first launch, once. The purchase is the consent —.kanbanis the family's own exported UTI, not a shared public type, so the premium edition claiming its own documents is legitimate, and never asking would make the upgrade feel broken (boards keep opening in base). The claim is one-time: a user who later reassigns the default back to base in Finder is respected — Pro never re-asserts. Base never claims and never asks; until Pro's claim, LaunchServices' own resolution stands. - The same board open in both apps at once is fine — it is the designed foreign-writer story, not a new hazard. Base has no git (the inert-
.gitposture above): it never commits and never touches the repo, so there is no committer contention — base writing into a Pro-open board is exactly an agent writing from a terminal, which Pro's machinery (index.lock retry, flush-before-overwrite, abort-own-leftovers, "both versions exist as commits" — 06/07) was designed for; base sees Pro's writes as ordinary foreign reloads. No board-level lock — 02's files-first rule is absolute (no sidecar files), and no gate: "Open with…" into the second edition just works. Two conveniences ride the shared registry: open-now flags are per-edition (like the grant slots — an edition restores only the boards it had open), and the board popover carries a contextual awareness line ("Also open in Lanework Pro") read from the other edition's flag, pid-liveness-checked so crash residue never lies — a line, never a gate. - The clipboard staging store homes in the group container beside the registry, so ⌘C in one edition pastes full-fidelity in the other — snapshot, attachments and all (04-interactions.md's staging lifecycle unchanged; both editions' launch/copy sweeps compute the same answer from the same pasteboard). A genuinely missing snapshot refuses the paste loudly (04-interactions.md's refuse-don't-degrade ruling, 2026-07-29) — with the shared store, no longer a structural cross-edition outcome.
The provider seam
History (and later sync) is a provider behind one protocol boundary, chosen per edition at the composition root:
- HistoryProviding — the undo/redo substrate. Base binds the native undo stack (13-native-undo.md: NSUndoManager over inverse
WriteOperations). Pro binds the git provider (06-history-undo.md: undo as forward restore commits over HEAD's first-parent ancestry). Teams inherits Pro's. - Sync/tracker providers — deferred with Teams; the reserved schema keys and the one-way file flow (02-architecture.md) are the format-level seam already in place.
What is shared across providers (settled): 06's Undo routing is edition-independent — focus decides text-undo vs board-undo; only the substrate behind board-undo differs. The command surface is identical (⌘Z/⇧⌘Z, dynamically retitled menu items — both providers use NSUndoManager's title rewriting); menu titles draw on the same semantic vocabulary (06 ▸ Commit messages). A user moving between editions relearns nothing.
Base and .git — the inert posture (settled)
Base Lanework generalizes the repo-nested stance to every .git it meets: any .git is inert. Opening a board that has one (a Pro user's board, a repo-nested board) works normally — files read and write as on any board, native undo runs, the trash works — but the app never reads history, never commits, never touches .git in any way. To base, .git at the board root is a stray like any other, preserved verbatim. Pro's external-writer machinery (06 ▸ Interaction with external writers) already reconciles the uncommitted drift a base session leaves behind — a base edit is just a foreign change to Pro. The watcher's .git event filtering stays in base (it exists to ignore git churn, which mixed households will produce).
Base's popover git slot (03-board-ui.md ▸ Board popover) does not offer add-git. Its posture is contextual (settled — ruled 2026-07-27): on ordinary boards the section is simply absent — the popover is rename + style, complete in itself. Only when the board carries an inert .git does a calm info line appear: "This board has a git history. Lanework Pro works with it." — an honest explanation of what the folder is, surfacing exactly where the question arises, never a standing ad. The card window's absent History section follows the same pattern: absent, no placeholder.
Edition matrix
The feature sort. Everything not listed rides with "board experience" and is identical everywhere.
| Feature | Lanework | Pro | Teams |
|---|---|---|---|
| Board experience: lanes, cards, drag & drop, keyboard map, clipboard, search, styling, trash, attachments, card window, templates, welcome screen | ✓ | ✓ | ✓ |
Agent integration: agent guide, modified-by attribution, tolerance rules |
✓ | ✓ | ✓ |
| Accessibility (10-accessibility.md, all of it) | ✓ | ✓ | ✓ |
| Comments (designed 2026-07-29 — 01 ▸ Enhanced schema + 05 ▸ The comments column; ships post-2.0) | ✓ | ✓ | ✓ + tracker-synced threads |
| Undo/redo | native (13) | git (06) | git (06) |
| Undo of foreign/agent edits | — (honest gap, 13) | ✓ (stack absorbs foreign commits) | ✓ |
| Overwrite protection (flush-before-overwrite, both-versions-as-commits) | — (07's accepted caveat is permanent here; trash + native undo are the safety story) | ✓ | ✓ |
| History surfaces: card History sidebar (05), View ▸ History (11) | — | ✓ | ✓ |
| Git: init/adoption, branches, commit identity, repository hygiene | — | ✓ | ✓ |
| Remotes: pull/push, push-on-commit, auth (Keychain, SSH, TOFU) | — | ✓ | ✓ |
| "While you were away" digest (WISHLIST item 1, requires git) | — | ✓ (future) | ✓ (future) |
Tracker integration (remote/remote-state sync, tracker-backed boards) |
— | — | ✓ (future) |
Docs 06 and 07 are Pro-edition docs; every other doc applies to all editions, with mode-conditioned passages (undo availability, popover git surface, the permanent-delete confirmation branch) resolving per the modes the edition ships. Base ships exactly one mode: none (with the inert-.git posture above); Pro ships the full state machine.
Targets (settled shape; details at implementation)
Three app targets sharing sources: Lanework (base — excludes Pro-only source dirs, no libgit2, current minimal entitlements), LaneworkPro (adds git sources, libgit2 dependency, network-client entitlement, Keychain access), Teams deferred. Bundle ids (settled — ruled 2026-07-27): base keeps dev.rzen.indie.Kanban — it is the current app and ships first, so nothing re-wires; Pro mints dev.rzen.indie.KanbanPro with matching test-target ids; Teams reserves nothing yet. Shared UTI declaration in both Info.plists (base remains the exporter); distinct icon assets; parallel test targets and schemes. Milestones: the current plan's m7-git-undo and m8-remote-sync become Pro milestones, built as the git HistoryProvider behind the seam after base ships; a new native-undo milestone takes their place for base.
Edition naming in base (settled — ruled 2026-07-27)
Quiet signposts. Base presents as a complete app, not a demo: Pro is named in exactly two places — one line in the About box, and the contextual popover line on .git boards (above). Nothing on the welcome screen, nothing in banners. The iCloud/network-volume warning (07-sync-collab.md) is rewritten for base without the git recommendation — it warns on its own merits (eviction, silent forks) and recommends a local folder; there is no git to recommend and no Pro pitch in a warning (a warning that sells reads as manufactured).
Open questions
None currently — bundle ids, the popover slot posture, and edition naming were ruled 2026-07-27 and are settled above.