Add iOS pipeline and custom domain docs #250
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "docs/ios-pipeline-and-dns"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
docs/ios-pipeline.md— iOS build pipeline for the Turbo Native shelldocs/networking.md— custom domain routing chain and config locationsdocs/pipeline.md— reconciled Fastlane references with actual xcodebuild workflowChanges
docs/ios-pipeline.md— Turbo Native architecture, build steps (SSH + tmux keychain workaround), App Store Connect, TestFlight setup, when-to-rebuild matrix, Why Not Fastlane section, future CI notesdocs/networking.md— three-hop routing chain (GoDaddy DNS → Caddy on Hetzner → Tailscale Funnel → k3s), URL matrix, config locations across pal-e-platform/services/deployments, Keycloak client config, troubleshootingdocs/pipeline.md— replaced stale Fastlane references with actual xcodebuild workflowTest Plan
Review Checklist
Related Notes
project-landscaping-assistantPR #250 Review
DOMAIN REVIEW
Tech stack: Markdown documentation only (no code changes). Review focuses on documentation accuracy, internal consistency, cross-reference correctness, and secrets exposure.
Two files changed:
docs/ios-pipeline.md(new, 153 lines) -- iOS build pipeline documentationdocs/networking.md(appended, 57 lines) -- Custom domain routing chainBLOCKERS
1. Incorrect issue cross-reference -- #249 mismatch
The PR body states "Closes #249" and the Review Checklist says "Known issue #249 documented in troubleshooting section." However, issue #249 is titled "Test user login fails: keycloak-test-users.env has wrong usernames" -- a test-user login bug. The troubleshooting section in
networking.mdreferences #249 in the context of a Keycloakroot_urlmisconfiguration ("Back to Application" link pointing to the wrong URL). These are completely different issues.Additionally, a docs-only PR cannot close a bug about wrong usernames in an env file. Either the "Closes #249" is wrong and should reference a different issue, or issue #249 was repurposed/mislabeled. This must be corrected before merge -- an incorrect
Closesdirective will auto-close the wrong issue.2. Contradictory build tooling across docs
The new
ios-pipeline.mddocuments rawxcodebuildcommands with XcodeGen and manualtmux send-keysfor archive/export/upload. Meanwhile, the existing docs describe a different workflow:pipeline.md(lines 115-117):ssh macbook "cd ~/landscaping-assistant-ios && fastlane beta"/fastlane releaseios-dev-builds.md(lines 97-145): Full FastlaneFastfilewithbetaandreleaselanes,build_app,upload_to_testflight,upload_to_app_storeThese are mutually exclusive approaches. If the project migrated from Fastlane to raw xcodebuild+XcodeGen, the existing docs need updating. If both approaches are valid, the new doc should explain when to use which. As-is, a reader following
pipeline.mdwill runfastlane betawhile a reader followingios-pipeline.mdwill run rawxcodebuild-- contradictory instructions for the same operation.3. Apple API credentials exposed in documentation
ios-pipeline.mdincludes specific Apple API credential identifiers in the build commands:authenticationKeyID 2A6BSP3H76authenticationKeyIssuerID e5ecbb14-2397-43f2-83fa-915967608055While the private key file itself (
.p8) is not included, the Key ID and Issuer ID are sensitive identifiers that should not be in a public-facing or version-controlled document. These should be replaced with placeholder values (e.g.,YOUR_KEY_ID,YOUR_ISSUER_ID) or referenced via environment variables, with actual values stored in the secrets path only.NITS
4. CLAUDE.md docs table not updated
The Documentation table in
CLAUDE.mddoes not include an entry for the newdocs/ios-pipeline.md. All other docs are listed there. Add a row like:5. Production URL not reflected in CLAUDE.md URLs table
The networking doc now documents
https://landscaping-assistant.appas the primary public URL. The CLAUDE.md URLs table still shows only the Tailscale hostname for Production. Consider adding the public URL:6. Hetzner VPS IP address in docs
networking.mdincludes the literal IP178.156.129.142for the Hetzner edge VPS. This is a minor operational exposure concern. It is less sensitive than API keys but does provide targeting information. Consider whether this level of detail is needed in application docs vs. infrastructure docs.7. Mermaid diagram in ios-pipeline.md
The Mermaid
graph LRdiagram uses escaped quotes in node labels (\"). This renders correctly in most Mermaid renderers but may break in some. Verify it renders properly in Forgejo's markdown preview.8. "Related" section link format
In
ios-pipeline.md, the "Source" line at the bottom readsforgejo/ldraney/landscaping-assistant-iosas plain text rather than a clickable link. Consider making it a proper link:SOP COMPLIANCE
.envfiles or credential files committedPROCESS OBSERVATIONS
VERDICT: NOT APPROVED
Three blockers must be resolved:
PR #250 Review (Re-review)
PREVIOUS BLOCKERS -- STATUS
Three blockers were identified in the initial review. Verifying each:
Wrong
Closes #249reference -- FIXED. PR body now reads "References #249 (documents the Keycloak root_url issue; does not fix it)". Issue #249 remains open, which is correct since this PR only documents the known issue.Contradictory Fastlane vs xcodebuild docs -- FIXED.
docs/pipeline.mddiff replacesFastlanewithxcodebuildin the Mermaid diagram (node renamed fromFLtoXCB), updates the TestFlight section to referencexcodebuilddirectly, and links to the newdocs/ios-pipeline.mdfor full build commands. The newios-pipeline.mdincludes a "Why Not Fastlane?" section that cleanly explains the boundary: Fastlane for local dev tasks,xcodebuildfor production archive/export/upload due to API key auth limitations over SSH. Note:docs/ios-dev-builds.mdstill documents Fastlane lanes -- this is correct and consistent with the stated division of responsibility.API credentials in docs -- FIXED. Apple API Key ID and Issuer ID are replaced with
$APPLE_KEY_IDand$APPLE_ISSUER_IDenvironment variable placeholders throughoutdocs/ios-pipeline.md. The doc explicitly directs readers to~/secrets/apple-developer/.envon the MacBook for actual values. Remaining identifiers (Team IDHAY64YD5PX, App ID6780226794, Bundle IDcom.palenterprises.landscaping) are public Apple identifiers discoverable from any signed binary or App Store listing -- not credentials.DOMAIN REVIEW
Docs-only PR (Markdown). No code changes. Domain checks applied: documentation accuracy, cross-reference integrity, information architecture.
Cross-references verified:
docs/ios-pipeline.mdlinks topipeline.md,ios-dev-builds.md,app-architecture.md-- all existdocs/pipeline.mdupdated link:[iOS Pipeline](ios-pipeline.md)-- target exists in this PRdocs/networking.mdreferences issue #249 -- confirmed opendocs/networking.mdreferences PR #230 incident -- confirmed exists (closed)pal-e-platform,pal-e-services,pal-e-deploymentsrepos -- consistent with existing pipeline.md documentation of the three-repo modelFactual consistency:
config/environments/production.rbwhich lists bothlandscaping-assistant.appandlandscaping-assistant.tail5b443a.ts.netinconfig.hosts178.156.129.142IP is a public-facing VPS IP, discoverable via DNS -- not a secretauth.palinks.appand realmlandscapingare consistent with existing docsInformation architecture:
ios-pipeline.md(production builds),ios-dev-builds.md(dev/testing),pipeline.md(overview of all flows). Each doc links to the others. No orphaned docs.BLOCKERS
None. All three previous blockers are resolved.
NITS
CLAUDE.md docs table not updated. The docs table in
CLAUDE.md(line ~33) lists[iOS Dev Builds](docs/ios-dev-builds.md)but does not include the newdocs/ios-pipeline.md. Consider adding a row:| [iOS Pipeline](docs/ios-pipeline.md) | Turbo Native build process, App Store Connect, xcodebuild workflow |. This is non-blocking since CLAUDE.md is a convenience index, not a functional dependency.CLAUDE.md URL table omits public domain. The URLs table in
CLAUDE.mdlists only the Tailscale production URL. The networking doc now documentshttps://landscaping-assistant.appas the primary public URL. Consider adding it to the CLAUDE.md URL table for discoverability. Non-blocking.docs/ios-dev-builds.mdstill says "See also Pipeline for the full build-to-deploy lifecycle" on line 3. Now thatios-pipeline.mdexists, this could also link to it since the pipeline doc itself now defers iOS production details toios-pipeline.md. Minor cross-reference gap, non-blocking.SOP COMPLIANCE
PROCESS OBSERVATIONS
VERDICT: APPROVED
PR #250 Review
DOMAIN REVIEW
Tech stack: Documentation (Markdown, Mermaid diagrams). No application code changes.
Files reviewed (4 changed, +268/-42):
README.md-- rewritten as categorized table of contents with subsections (App, Infrastructure & Deploy, Development, User Stories)docs/ios-pipeline.md-- new, 161 lines documenting Turbo Native build pipelinedocs/networking.md-- 54 lines added for custom domain routing chaindocs/pipeline.md-- Fastlane references replaced with xcodebuild workflowCLAUDE.md symlink: PR #221 (already merged) established CLAUDE.md as a symlink to README.md. The README.md changes in this PR propagate through the symlink automatically, so no separate CLAUDE.md diff entry is needed. Correct behavior.
Content quality observations:
docs/ios-pipeline.mdis thorough and well-structured. The keychain constraint workaround (tmux send-keys) is documented with both the failing pattern and the working pattern -- good operational documentation. The "When to Rebuild iOS" matrix is a useful quick-reference. The "Why Not Fastlane?" section explains the decision clearly.docs/networking.mdcustom domain section correctly documents the three-hop routing chain (GoDaddy DNS -> Caddy on Hetzner -> Tailscale Funnel -> k3s). The Config Locations table maps each layer to its source-of-truth file across three repos -- high-value for cross-repo orientation. Known issue #249 is properly called out with a concrete fix action.docs/pipeline.mdchanges are consistent: every Fastlane reference is replaced with the xcodebuild equivalent, Mermaid diagram node labels updated, cross-reference to the newios-pipeline.mdadded. The sequence diagram at the bottom also updated.README.mdreorganization: all 19 previously-listed docs are preserved. Two new entries added:iOS Pipeline(new in this PR) andSecurity(existing doc, previously unlisted in README). Categorization into App / Infrastructure & Deploy / Development / User Stories subsections is logical. Production URL updated from Tailscale hostname tolandscaping-assistant.app. Quick Start section promoted above Documentation for better onboarding.Cross-reference validation: All 21 doc links in the new README resolve to existing files on disk. Internal cross-references within the new/changed docs (
pipeline.md->ios-pipeline.md,ios-pipeline.md->pipeline.md,ios-pipeline.md->ios-dev-builds.md,ios-pipeline.md->app-architecture.md) are all valid.Secrets check: Actual API key values use
$APPLE_KEY_IDand$APPLE_ISSUER_IDplaceholders throughout. The key file path references~/secrets/apple-developer/(documenting where secrets live, not exposing them). Apple Team ID (HAY64YD5PX) and App ID (6780226794) are public identifiers from App Store Connect, not secrets. Hetzner VPS IP (178.156.129.142) is a public-facing infrastructure address, appropriately documented.BLOCKERS
None.
NITS
Networking description mismatch in README vs old CLAUDE.md context: The in-repo CLAUDE.md (symlink to README) will get the updated Networking description ("Custom domain routing, Tailscale Funnel, DNS, Keycloak URLs"), but the embedded copy in the user's global
~/.claude/CLAUDE.mdstill says "Tailscale Funnel ingress, cluster routing, URL setup". Not a PR issue -- just a note that the external copy will drift.iOS Dev Builds description still says "Fastlane setup": The README entry for iOS Dev Builds reads "TestFlight, wireless install, Fastlane setup" -- but
docs/pipeline.mdnow says Fastlane is not used for the production pipeline. The ios-dev-builds.md doc does still cover Fastlane for local dev tasks, so the description is technically accurate, but it could confuse someone who just read the "Why Not Fastlane?" section. Consider updating to "TestFlight, wireless install, local dev tools" or similar. Non-blocking.Pipeline description shortened: The README changes Pipeline's description from "Full lifecycle: local dev, prod deploy, iOS dev builds, App Store" to "Full lifecycle: local dev, prod deploy, iOS builds, App Store". Dropping "dev" from "iOS dev builds" is appropriate since the new iOS Pipeline doc covers production builds. No action needed, just noting it was intentional.
SOP COMPLIANCE
PROCESS OBSERVATIONS
Clean docs-only PR. The README reorganization into categorized subsections improves discoverability as the doc count grows (now 21 entries). The iOS pipeline documentation captures operational knowledge (keychain constraint, tmux workaround) that would otherwise be tribal knowledge. The networking custom domain section correctly cross-references configs across three repos (pal-e-platform, pal-e-services, pal-e-deployments), which is high-value for incident response.
VERDICT: APPROVED