Review: Build and upload first TestFlight beta

review-1809-2026-07-05 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- Standalone, next step after #56
  • [x] Repo -- ldraney/palinks-ios
  • [x] User Story -- present
  • [x] Context -- present
  • [x] File Targets -- 2 files in palinks-ios
  • [x] Feature Flag -- none (appropriate for iOS build task)
  • [x] Acceptance Criteria -- 6 items
  • [x] Test Expectations -- manual (honest about non-automatable workflow)
  • [x] Constraints -- present (MacBook requirement, Apple team, icon source)
  • [x] Checklist -- present
  • [x] Related -- project-palinks

Traceability

  • [x] story:ios-distribution label -- Turbo Native iOS shell + TestFlight + App Store
  • [x] story note verified -- found in project-palinks user-stories section (status: in progress)
  • [x] arch:palinks label -- palinks component
  • [ ] arch note MISSING -- [SCOPE] Create architecture note arch-palinks for component palinks
  • [x] Forgejo issue -- ldraney/palinks#59, open

File Targets

  • [?] palinks-ios/PalinksApp/Assets.xcassets/AppIcon.appiconset/AppIcon.png -- cannot verify (palinks-ios not cloned to this machine; repo exists on Forgejo)
  • [?] palinks-ios/PalinksApp/Assets.xcassets/AppIcon.appiconset/Contents.json -- cannot verify (same reason)
  • [x] app-icon.png (source, palinks repo root) -- verified: 46KB file exists
Note: The issue correctly states "No files in the palinks Rails repo are modified."

Repo Placement

MISMATCH: The Forgejo issue is filed on ldraney/palinks but ### Repo says ldraney/palinks-ios. The palinks-ios repo exists on Forgejo (confirmed via API). All five ios-distribution issues (#56, #57, #59, #60, #61) follow this pattern of centralized tracking on the main palinks repo. If this is intentional, consider documenting the convention. Otherwise, refile on palinks-ios.

Dependencies

  • #56 (iOS distribution: Create Turbo Native shell + Fastlane pipeline) -- CLOSED on Forgejo but in validation column on board. This is the direct predecessor per the Lineage section. Should complete validation before #59 moves to todo.
  • #57 (Update stale docs, add CLAUDE.md, iOS docs, and app icon) -- sibling in backlog, not a blocker but related (docs/ios.md already partially covers the workflow)
  • #60 (Mobile CSS polish for iOS WKWebView) -- sibling in backlog, can proceed in parallel
  • #61 (App Store metadata and privacy policy page) -- downstream, depends on this ticket completing

Acceptance Criteria

6 criteria, all manual MacBook + device work. An agent cannot fully verify these remotely. The ticket honestly acknowledges this with "Run command: n/a" in Test Expectations. The criteria are clear and sequentially ordered. Minor note: docs/ios.md references ./build-testflight.sh as a wrapper script, while the AC uses raw fastlane beta -- either approach works but the wrapper handles keychain issues automatically.

Blast Radius

Limited. The work is confined to the palinks-ios repo (icon copy only). The palinks Rails app is unchanged. docs/ios.md already documents the full build/deploy workflow. No downstream consumers are affected by the initial TestFlight upload. The same Apple Developer team (HAY64YD5PX) is shared with landscaping-assistant-ios -- no conflict expected since they use different bundle IDs.

Decomposition Assessment

2 file targets in 1 repo. 6 acceptance criteria (slightly over 5 threshold but tightly coupled as a single build-upload workflow). Estimated time: 15-30 minutes of manual MacBook work. No decomposition needed -- the task is a coherent manual workflow that cannot be meaningfully split.

Recommendations

  • [SCOPE] Create architecture note arch-palinks for the palinks component. This is a systemic gap affecting all palinks board items, not just this ticket.
  • [BODY] Repo placement: Issue is filed on ldraney/palinks but work is in ldraney/palinks-ios. Either refile on palinks-ios or add a note in Lineage explaining the centralized-tracking convention.
  • [BODY] Consider referencing ./build-testflight.sh wrapper from docs/ios.md in the AC, since it handles keychain unlock automatically.