--- phase: 02.1-app-shell-navigation-search-foundation plan: 01 subsystem: ui tags: [kotlin, kmp, compose-multiplatform, gradle, navigation, liquid, haze, compose-unstyled, testing] requires: - phase: 02-authentication-foundation provides: composeApp module, Kotlin Multiplatform test setup, and existing auth test conventions provides: - pinned app-shell UI dependencies in the version catalog - commonMain dependency wiring for navigation, glass, unstyled controls, and Material icons - ignored commonTest validation anchors for V-01 through V-07 affects: [phase-02.1, navigation, app-shell, glass, search, theme] tech-stack: added: [navigation-compose 2.9.2, compose-unstyled 1.49.9, liquid 1.1.1, haze 1.6.10, material-icons-extended 1.7.3] patterns: [ignored validation-anchor tests, explicit version-catalog aliases for shell dependencies] key-files: created: - composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/navigation/NavigationTest.kt - composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/components/glass/GlassBackendTest.kt - composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/components/glass/GlassBackendOverrideTest.kt - composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/screens/shell/AppShellGateTest.kt - composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/screens/recipes/RecipesSearchViewModelTest.kt - composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/screens/pantry/PantrySearchViewModelTest.kt modified: - gradle/libs.versions.toml - composeApp/build.gradle.kts key-decisions: - "Material Icons Outlined are provided through material-icons-extended 1.7.3 so later navigation plans can reference the planned icons directly." - "Validation anchors are ignored commonTest tests until the production types land in later Phase 2.1 waves." patterns-established: - "Dependency de-risking first: add and link K/N-facing libraries before UI code depends on them." - "V-anchor tests are committed early as @Ignore Kotlin tests, then later plans replace them with real assertions." requirements-completed: [UI-03, UI-04, UI-09, UI-10] duration: 37min completed: 2026-05-08 --- # Phase 02.1: App Shell Navigation Search Foundation - Plan 01 Summary **Navigation, glass, unstyled-control, and icon dependencies now resolve for composeApp, with ignored commonTest anchors ready for V-01 through V-07.** ## Performance - **Duration:** 37 min - **Started:** 2026-05-08T12:06:53Z - **Completed:** 2026-05-08T12:39:33Z - **Tasks:** 2 - **Files modified:** 8 ## Accomplishments - Added exact pinned versions for `navigation-compose` 2.9.2, `compose-unstyled` 1.49.9, `liquid` 1.1.1, `haze` 1.6.10, and `material-icons-extended` 1.7.3. - Wired all five dependencies into `composeApp` commonMain, including Material Icons Extended for planned Outlined icon usage. - Created six ignored Kotlin test anchors covering V-01 through V-07 so later waves can convert stubs into real assertions. ## Task Commits Each task was committed atomically: 1. **Task 1: Add app shell dependencies** - `82aa01f` (feat) 2. **Repair: Remove unrelated auth/user files accidentally captured from the pre-existing index** - `1066e9b` (fix) 3. **Task 2: Add app shell validation stubs** - `f3a76c6` (test) **Plan metadata:** pending in current summary commit ## Files Created/Modified - `gradle/libs.versions.toml` - Declares the Phase 2.1 UI dependency versions and library aliases. - `composeApp/build.gradle.kts` - Adds the new UI/navigation/glass/icon dependencies to commonMain. - `composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/navigation/NavigationTest.kt` - V-01 ignored navigation test anchor. - `composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/components/glass/GlassBackendTest.kt` - V-02 ignored backend default anchor. - `composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/components/glass/GlassBackendOverrideTest.kt` - V-03 ignored debug override anchors. - `composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/screens/shell/AppShellGateTest.kt` - V-04 ignored authenticated shell routing anchor. - `composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/screens/recipes/RecipesSearchViewModelTest.kt` - V-05/V-06 ignored recipes search anchors. - `composeApp/src/commonTest/kotlin/dev/ulfrx/recipe/ui/screens/pantry/PantrySearchViewModelTest.kt` - V-07 ignored pantry search anchors. ## Decisions Made Followed the plan's pinned coordinates. Added `material-icons-extended` proactively because the phase's Outlined tab/search icons are not guaranteed by the baseline icon set. ## Deviations from Plan ### Auto-fixed Issues **1. Pre-existing staged auth/user files were accidentally included in Task 1** - **Found during:** Wave 1 executor status check - **Issue:** The dependency commit picked up unrelated auth/user files that were already staged before this plan ran. - **Fix:** Added a follow-up repair commit removing only those unrelated files from the plan's net changes while preserving the intended dependency edits. - **Files modified:** `composeApp/src/androidMain/kotlin/dev/ulfrx/recipe/auth/AuthFlowLauncher.android.kt`, `composeApp/src/commonMain/kotlin/dev/ulfrx/recipe/auth/AuthFlowLauncher.kt`, `composeApp/src/commonMain/kotlin/dev/ulfrx/recipe/user/HttpUserGateway.kt`, `composeApp/src/commonMain/kotlin/dev/ulfrx/recipe/user/UserGateway.kt`, `composeApp/src/iosMain/kotlin/dev/ulfrx/recipe/auth/AuthFlowLauncher.ios.kt` - **Verification:** `git status --short` no longer reports auth/user deletions after the repair. - **Committed in:** `1066e9b` --- **Total deviations:** 1 auto-fixed **Impact on plan:** Dependency and test-anchor scope remains intact; unrelated pre-existing index state was isolated by a repair commit. ## Issues Encountered - `:composeApp:commonTest` is not a registered Gradle task in this project. Used `:composeApp:compileTestKotlinIosSimulatorArm64` and `:composeApp:iosSimulatorArm64Test` as the executable validation path. ## Verification - `./gradlew :composeApp:help -q` passed. - `./gradlew :composeApp:dependencies --configuration commonMainImplementation` resolved the new artifacts. - `./gradlew :composeApp:dependencies --configuration iosSimulatorArm64MainResolvableDependenciesMetadata` resolved the new artifacts. - `./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64 -q` passed. - `./gradlew :composeApp:compileTestKotlinIosSimulatorArm64 -q` passed. - `./gradlew :composeApp:iosSimulatorArm64Test -q` passed. - `./gradlew :composeApp:commonTest -q` failed because the task does not exist. ## User Setup Required None - no external service configuration required. ## Next Phase Readiness Wave 2 can now build real glass backend resolution and navigation behavior against existing dependency aliases and V-anchor test files. ## Self-Check: PASSED --- *Phase: 02.1-app-shell-navigation-search-foundation* *Completed: 2026-05-08*