Files
lanework/DESIGN/12-editions.md
T
rzen cacd48cb0f Ratify the edition split and the 2026-07-28 design-review resolutions
Edition split follow-through: 12-editions.md and 13-native-undo.md join the
corpus; git-era docs (06, 07) are Pro-scoped and cross-references realigned.

Resolution session rulings written in place: caret chords yield to any focused
text control (04, 11); the drop settle holds its proposal as overlay state and
02 gains the overlays family; Duplicate gets the save-panel fallback and a
cancellable copy walk (03); Finder open is a standard document open (02);
failed first opens record before loading with the folder name provisional (02);
trash pointer ranges skip by kind, full-height marquee surface, Select All by
kind, rows-only trashed universe (02, 04); Empty Trash counts entries (03);
create handoff reads as one arrival (02); range-anchor lifecycle, board-
background click grammar, jump landing cards, lane-domain shift-arrows (04);
Reduce Motion restated per voice (10).

Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
2026-07-27 20:29:32 -04:00

7.8 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 none everywhere); 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, comments/ — 01-storage-format.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).

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 (post-2.0 design pass; per the standing decision, all editions) ✓ (future) ✓ (future) ✓ (future)
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, Delete Immediately's 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.