The subscription machinery leaves the code — Kanban/Tier excised, StoreKit wiring unwound

The 2026-08-08 one-version ruling (12-editions.md ▸ PIVOT 2026-08-08) carried out: Kanban/Tier/
deleted wholesale (Tier, ProEntitlement, ProProducts, ProStorefront, the never-rendered
ProSettingsSection) with TierTests and Configuration.storekit, whose project.yml resource entry
and scheme storeKitConfiguration go with it. AppModel loses the entitlement, the currentTier
seam, BoardSession.tier, and the purchase flow's reopenOpenBoards (its only caller was the
storefront); AppDelegate's launch keeps only the appearance application. The three tests
pinning the recorded tier and the reopen are deleted with their subject. The network-client
entitlement stays — the sync capability to come needs it regardless — and the HistoryProviding
seam stands untouched. 2,686 unit tests green (2,707 minus the 21 that tested what left).

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-08 13:18:54 -04:00
parent 871083e5ca
commit e1f89d9cf9
15 changed files with 48 additions and 1465 deletions
+12 -31
View File
@@ -35,10 +35,11 @@ settings:
ENABLE_USER_SCRIPT_SANDBOXING: NO
# **One app target** (12-editions.md ▸ The target, re-ruled 2026-07-30). Lanework ships as a single
# Mac App Store app, `dev.rzen.indie.Kanban`; **Lanework Pro is a subscription inside it**, not a
# second binary. The 2026-07-27 two-target split — a `KanbanPro` application target, its scheme, its
# bundle id, the `-module-alias Kanban=KanbanPro` test bundle and the twin source files that existed
# only because two bundles claimed different UTI ownership — retired wholesale with the collapse.
# Mac App Store app, `dev.rzen.indie.Kanban` **one version, everything in it** (12-editions.md ▸
# PIVOT 2026-08-08): there is no edition axis for this file to express. The 2026-07-27 two-target
# split — a `KanbanPro` application target, its scheme, its bundle id, the `-module-alias
# Kanban=KanbanPro` test bundle and the twin source files that existed only because two bundles
# claimed different UTI ownership — retired wholesale with the collapse.
#
# What that buys this file: no anchors, no per-target exclusion lists, no second copy of the
# resources. There is one product, one Info.plist, one entitlements file, one Swift module, and one
@@ -67,18 +68,6 @@ targets:
- path: CHANGELOG.md
type: file
buildPhase: resources
# The local StoreKit configuration (12-editions.md ▸ Distribution) — the subscription group
# "Lanework Pro" and its monthly product, mirroring what App Store Connect declares, so the
# Settings Pro section's subscribe/manage/restore flow is exercisable in Xcode without an ASC
# product existing yet. Attached to the scheme's run action below.
#
# **`buildPhase: none`, deliberately.** It is development configuration, not app content: the
# scheme reads it, the shipped bundle must never carry it. Listed in the project anyway, for
# the same reason `KanbanUITests`' verification documents are — visible where it belongs,
# built into nothing.
- path: Configuration.storekit
type: file
buildPhase: none
dependencies:
- package: Yams
- package: swift-markdown
@@ -100,11 +89,12 @@ targets:
MARKETING_VERSION: "2.0"
INFOPLIST_FILE: Kanban/Info.plist
# `Kanban/Kanban.entitlements` — sandbox, user-selected files, app-scope bookmarks, and
# `com.apple.security.network.client`, which is **declared now and dormant until Pro
# ships**: the one binary carries the key, and nothing exercises it until the git
# provider's remotes do under an active subscription (12 ▸ The target). No App Group and
# no keychain access group — groups exist to share *between* apps, and there is one app,
# so app-side state homes in the ordinary sandbox container (`AppStateHome`).
# `com.apple.security.network.client`, **declared now and exercised by nothing**: the key
# stays because the sync capability to come needs it regardless (12-editions.md ▸ PIVOT
# 2026-08-08), and a key added later is a new provisioning profile and a new review
# surface. No App Group and no keychain access group — groups exist to share *between*
# apps, and there is one app, so app-side state homes in the ordinary sandbox container
# (`AppStateHome`).
CODE_SIGN_ENTITLEMENTS: Kanban/Kanban.entitlements
GENERATE_INFOPLIST_FILE: false
SWIFT_STRICT_CONCURRENCY: complete
@@ -121,7 +111,7 @@ targets:
#
# What it deliberately does NOT compile: LiveStore (FSEvents — macOS-only machinery; the phone's
# change signal is NSMetadataQuery over the ubiquity container), Git/History (no git support in
# the mobile MVP), Tier, and all of `Kanban/UI`. The mobile app's own sources live under
# the mobile MVP), and all of `Kanban/UI`. The mobile app's own sources live under
# `KanbanMobile/`.
#
# Boards live in the iCloud Drive container `iCloud.dev.rzen.indie.Kanban` — named after the
@@ -281,15 +271,6 @@ schemes:
Kanban: all
run:
config: Debug
# StoreKit Testing in Xcode (12-editions.md ▸ Distribution): a ⌘R run resolves
# `dev.rzen.indie.kanban.pro.monthly` against the local `Configuration.storekit` instead of
# against the App Store, so the Settings Pro section shows a price and its purchase flow
# completes on a machine with no App Store Connect product and no sandbox account.
#
# It changes nothing about a build or an archive — it is a *run action* setting, so `xcodebuild
# build`, `xcodebuild test` and `scripts/release.sh` are untouched, and a shipped app resolves
# the real product or reports that it cannot reach the App Store.
storeKitConfiguration: Configuration.storekit
test:
config: Debug
gatherCoverageData: false