Validation: App Store rejection: fix privacy declarations (Guideline 5.1.2(i))

validation-289-2026-07-26 Doc

validation pass

Verdict: PASS

Ticket

ldraney/landscaping-assistant#289 (board item #1683) — Fixed over-declared App Store privacy categories that caused Apple rejection under Guideline 5.1.2(i). Reduced from 14 data types (some marked for tracking) to 8 data types, all declared as App Functionality only.

Environment

Production: https://landscaping-assistant.app
Woodpecker pipeline #789 (push to main, commit 34a9c38)
Merged PR: #317

Tiers Executed

Tier 1 (local code verification) + Tier 3 (production health check). No Tier 2 — no staging environment for this repo.

Checks

# Criterion How Verified Result Evidence
1 Privacy declarations updated in App Store Connect to reflect actual data collection Verified code changes deployed: <code>docs/app-store-submission.md</code> documents 8 data types with justifications; <code>app/views/pages/privacy.html.erb</code> lists 7 collected categories and 5 NOT-collected categories. Privacy page live at <code>/privacy</code>. App Store Connect declarations are manual (no API) but runbook captures correct state. PASS Pipeline #789 all 6 steps green (clone, database, bundle-install, lint, test, build-and-push). WebFetch of <code>https://landscaping-assistant.app/privacy</code> confirms correct content live in production.
2 No data categories marked as "used to track" Verified runbook states "All declared as: App Functionality, Linked to User, Not used for tracking." Privacy page states "We do not track you." Gotcha #9 added: "Do not mark any data as 'used to track.'" PASS Privacy page Tracking section: "We do not track you. Specifically, we do not link your data with data from other companies' apps or websites for advertising or measurement purposes, and we do not share your data with data brokers. The App does not use Apple's IDFA or any cross-app tracking identifiers."
3 Each collected data type has accurate purpose (App Functionality) Verified runbook table: all 8 data types (Precise Location, Physical Address, Email, Name, Phone Number, Photos/Videos, User ID, Product Interaction) declared as "App Functionality." Privacy page "How We Use Your Information" section confirms "App Functionality" as sole purpose. PASS Runbook Section 4 table with category, data types, and justification for each. Privacy page lists 5 specific app functionality purposes.

Regression Check

  • Root route (/) — loads correctly, shows login page with "Manage your crew, properties, and daily work queue"
  • Login route (/login) — functional, shows sign-in interface
  • Privacy route (/privacy) — renders complete privacy policy with correct content
  • Pipeline #789 — all test steps passed, no regressions in test suite
  • 6 subsequent commits merged after PR #317 without issues, confirming no downstream breakage

Discovered Issues

None. The fix is clean and well-documented. The runbook now includes gotcha #9 to prevent future over-declaration.