Review: iOS distribution: Create Turbo Native shell + Fastlane pipeline

review-1530-2026-06-20 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- Standalone, follows landscaping-assistant-ios pattern
  • [x] Repo -- ldraney/palinks (issue tracker), ldraney/palinks-ios (implementation)
  • [x] User Story -- well-formed As/I want/So that
  • [x] Context -- sufficient background, references proven pattern
  • [x] File Targets -- CREATE targets for new repo, reference files listed
  • [x] Feature Flag -- None (appropriate for native packaging)
  • [x] Acceptance Criteria -- 6 criteria
  • [x] Test Expectations -- manual test steps, run command
  • [x] Constraints -- clear guardrails
  • [x] Checklist -- 4 items
  • [x] Related -- project and template references

Traceability

  • [x] story:ios-distribution label -- "Turbo Native iOS shell + Fastlane pipeline (same pattern as landscaping-assistant)"
  • [x] story note verified -- found in project-palinks user-stories section
  • [x] arch:palinks label -- palinks architecture component
  • [x] arch note verified -- arch-palinks note exists in pal-e-docs (slug: arch-palinks)
  • [x] Forgejo issue -- ldraney/palinks#56, open

File Targets

This issue creates a NEW repo (palinks-ios). No existing files to modify. Verification of reference targets:
  • [x] landscaping-assistant-ios -- EXISTS on Forgejo (https://forgejo.tail5b443a.ts.net/ldraney/landscaping-assistant-ios), non-empty repo
  • [ ] ~/landscaping-assistant-ios/ -- ISSUE: local clone does NOT exist. Issue body references this path but the agent would need to clone from Forgejo first. [BODY] Change to "clone from Forgejo: https://forgejo.tail5b443a.ts.net/ldraney/landscaping-assistant-ios"
  • [x] ~/macbook-ssh/docs/ios-pipeline.md -- verified, 12k, documents the full iOS pipeline architecture
  • [x] ~/macbook-ssh/docs/dev-build-guide.md -- verified, 7.3k, step-by-step dev build instructions
  • [x] ~/secrets/apple-developer/ -- verified, contains AuthKey_2A6BSP3H76.p8

Repo Placement

OK. Issue filed on ldraney/palinks (issue tracker), implementation creates ldraney/palinks-ios (new repo). This is explicitly documented in the ### Repo section. The palinks-ios repo does not yet exist on Forgejo -- confirmed via API. No cross-repo mismatch.

Dependencies

  • palinks.app must be live -- VERIFIED: HTTP 200 confirmed
  • landscaping-assistant-ios must exist as template -- VERIFIED: repo exists on Forgejo
  • MacBook accessible via SSH over Tailscale -- not verified (requires network test), but documented in macbook-ssh docs
  • Apple Developer credentials -- VERIFIED: ~/secrets/apple-developer/ contains key file
  • No board items blocking this ticket -- all board items are either in backlog or done
  • No dependency on auth-roles, custom-domain, or other stories

Acceptance Criteria

6 criteria. Assessment:
  • "palinks-ios repo exists on Forgejo" -- agent-verifiable via Forgejo API
  • "SceneDelegate points at https://palinks.app" -- agent-verifiable via grep
  • "xcodegen generate produces a valid .xcodeproj" -- requires MacBook SSH, agent-verifiable
  • "Dev build installs on iPhone (7-day provisioning)" -- MANUAL ONLY, requires physical device
  • "fastlane beta uploads to TestFlight successfully" -- requires MacBook SSH, agent-verifiable but slow
  • "App loads palinks.app content in WKWebView on launch" -- MANUAL ONLY, requires device
2 of 6 criteria require manual verification with a physical device. This is inherent to iOS development and acceptable. The remaining 4 are agent-verifiable.

Blast Radius

Low. This creates a standalone new repo that wraps the existing web app. No changes to palinks Rails app. No changes to infrastructure. The Turbo Native pattern means the web app is loaded in WKWebView -- zero coupling to native code beyond the URL constant. The only downstream effect is that palinks.app must remain accessible at that URL (already true).

Decomposition Assessment

8 points, 6 AC, 1 repo (new). Touches files across a single new repo. The work is heavily templated from landscaping-assistant-ios, which reduces complexity. However:
  • Requires SSH to MacBook for Xcode and Fastlane operations
  • Manual device testing required (dev build, TestFlight install)
  • Estimated agent work: 10-15 minutes (clone template, adapt files, create repo, push, SSH build)
  • Exceeds 5-minute rule due to cross-machine SSH build steps
Borderline. The pattern is proven and the scope is well-defined, but the 8-point estimate and multi-machine workflow push it past the single-agent threshold. Could be kept as-is if the operator accepts the longer agent pass, or decomposed into: (1) Create repo + project files, (2) Build + TestFlight upload.

Recommendation

  • [BODY] Fix reference path: ~/landscaping-assistant-ios/ does not exist locally. Change File Targets to instruct agent to clone from Forgejo URL (https://forgejo.tail5b443a.ts.net/ldraney/landscaping-assistant-ios) rather than referencing a local path.