Replace brittle localized-string selectors and broken wait helpers with a
robust, identifier-first UI test infrastructure. All 41 UI tests pass on
iOS 26.2 simulator (iPhone 17).
Foundation:
- BaseUITestCase with deterministic launch helpers (launchClean, launchOffline)
- WaitHelpers (waitUntilHittable, waitUntilGone, tapWhenReady) replacing sleep()
- UITestID enum mirroring AccessibilityIdentifiers from the app target
- Screen objects: TabBarScreen, CameraScreen, CollectionScreen, TodayScreen,
SettingsScreen, PlantDetailScreen
Key fixes:
- Tab navigation uses waitForExistence+tap instead of isHittable (unreliable
in iOS 26 simulator)
- Tests handle real app state (empty collection, no camera permission)
- Increased timeouts for parallel clone execution
- Added NetworkMonitorProtocol and protocol-typed DI for testability
- Fixed actor-isolation issues in unit test mocks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Make all Core Data attributes CloudKit-compatible (optional or with defaults)
- Fix CoreDataStack to wait for persistent store loading before operations
- Add AccentColor to asset catalog (green theme color)
- Remove Browse tab from navigation (keep underlying code)
- Update CLAUDE.md with current features, architecture, and tab structure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds competitive analysis document comparing PlantGuide against major
plant identification apps (PlantIn, PictureThis, Planta, etc.) and
CLAUDE.md to help future Claude Code instances navigate the codebase.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>