# Distribution and release

## The channel decision (recorded 2026-07-29)

**Lanework ships on the Mac App Store**, as version 2.0 of the existing `dev.rzen.indie.Kanban` App Store record — the 1.x app already listed there under the name Lanework. This was not an open question by the time this document was written; three prior rulings settle it:

- The 2026-07-27 edition split (DESIGN/12-editions.md) defines the editions as **separate App Store targets** and gave base Lanework the existing `dev.rzen.indie.Kanban` bundle id precisely so it ships as the update to the existing record; Lanework Pro (`dev.rzen.indie.KanbanPro`) becomes its own record when it ships after pro-m1/pro-m2.
- The marketing version has been 2.0 since m3 — the successor numbering of the shipped 1.x.
- The portfolio's whole release tooling (appstore-publish skill, `asc-*.swift` scripts, the account's API key) is App-Store-shaped, and the 1.x pipeline for this very record already exists and works.

Notarized direct distribution is deliberately **not** pursued for 2.0: a second channel means a second update path and a second set of listing assets for no current audience, and nothing in the app requires escaping the App Store's sandbox rules (the app is already sandboxed with user-selected file access; base has no network entitlement at all). Revisit only if App Review rejects something architectural.

## The pipeline

Carried over from the 1.x release (same record, same scheme names — the pathfinder repo's pipeline, now living here):

- `scripts/release.sh` — XcodeGen regenerate, `xcodebuild archive` (Release, generic/platform=macOS), `-exportArchive` with `scripts/ExportOptions-macOS.plist` (`destination=upload` — straight to App Store Connect). Build number = git commit count, stamped by the existing post-build phase.
- `.env.release` (gitignored; `.env.release.example` committed) — account-level App Store Connect API credentials.
- `scripts/metadata/` — the listing source of truth (name, subtitle, description, keywords, what's-new, URLs, categories, pricing, availability, review notes). Pushed with the canonical scripts, **always with `--platform macos`**:

```sh
set -a; source .env.release; set +a; swift ../indie-skills/skills/appstore-publish/scripts/asc-metadata.swift --bundle dev.rzen.indie.Kanban --version 2.0 --platform macos --dry-run
```

- Screenshots: `scripts/metadata/screenshots/en-US/APP_DESKTOP/` — needs fresh 2.0 captures (see checklist).

## First-release (2.0) checklist

Run top to bottom; nothing below "PUSH POINT" may run without a deliberate decision — every step after it writes to the live App Store record of a shipping 1.x app.

1. [ ] All milestone work committed and pushed (build number = commit count).
2. [ ] Both unit suites green: `xcodebuild test … -scheme Kanban` and `… -scheme LaneworkPro` (`-only-testing:KanbanTests` / `KanbanProTests`).
3. [ ] `scripts/verify-editions.sh` — 26/26.
4. [ ] UI test pass on a real display (KanbanUITests: accessibility audits + end-to-end golden flows), plus the manual checklists (`KanbanUITests/AccessibilityVerification.md`, toolbar/undo/trash/drag-preview lists).
5. [ ] CHANGELOG.md current (it is the in-app release notes) — What's New (`scripts/metadata/version/en-US/whats_new.txt`) tells the same story.
6. [ ] Screenshots: capture the 2.0 board on a real display (APP_DESKTOP sizes come straight from screenshots of the running app; numeric filename prefixes set the store order).
7. [ ] Archive dry run: `scripts/release.sh` at least through the archive step completes locally.
8. **— PUSH POINT (everything below touches the live record) —**
9. [ ] `scripts/release.sh` — archive + upload the build.
10. [ ] Metadata dry run, then push (`asc-metadata.swift --platform macos`, commands above).
11. [ ] Verify pricing (currently free, carried from 1.x) and availability (ALL territories) still match intent — Pro will be the paid tier later.
12. [ ] Stage: `asc-submit.swift --bundle dev.rzen.indie.Kanban --version 2.0 --platform macos` (waits for build processing, attaches, stages the review submission — does not submit).
13. [ ] Review the staged listing at appstoreconnect.apple.com (age rating, privacy labels, and content rights carry over from 1.x — the stage step's errors will name anything missing).
14. [ ] Submit: the same command with `--submit`.

## Lanework Pro (later)

Pro ships after pro-m1 (git history) and pro-m2 (remote sync) as a **new** App Store record: bundle id `dev.rzen.indie.KanbanPro`, its own metadata folder and pricing (paid), created by hand in App Store Connect first (the API cannot create app records). The `scripts/release.sh` config block parameterizes to the `LaneworkPro` scheme at that point; everything else in the pipeline is shared.
