{ "output": "Found 3 matches for pattern \"S19: Read-Only|Tap the Settings icon\" in the workspace directory (filter: \"**/*plan-smoke-tests.md\"):\n---\nFile: docs/plan-smoke-tests.md\nL197- 4. Verify the photo appears as a thumbnail in the Attachments section\nL198- 5. Tap \"Save\"\nL199- \nL200- **Verifies:** Camera intent launches correctly with the pre-generated output URI (`FileProviderHelper`), captured photo is resolved and stored in the vault, attachment metadata is persisted.\nL201- \nL202- **Note:** Camera simulation on GMD emulators can be configured via `hw.camera.back = emulated` in the AVD config. If camera interaction is unreliable, verify the intent fires and test attachment persistence via file picker (S07) instead.\nL203- \nL204- ---\nL205- \nL206- ### S11: Navigate to Settings\nL207- \nL208- **Precondition:** App is on any screen with access to Settings (typically VehicleListScreen via a menu or top-bar icon).\nL209- \nL210- **Flow:**\nL211- 1. Navigate back to `VehicleListScreen` (if not already there)\nL212: 2. Tap the Settings icon / menu entry\nL213- 3. `SettingsScreen` is displayed\nL214- 4. Verify \"Settings\" title is shown\nL215- 5. Verify the odometer unit setting is visible (km/miles)\nL216- 6. Verify the currency setting is visible\nL217- 7. Verify the data folder / vault location is displayed\nL218- \nL219- **Verifies:** Navigation to Settings, settings screen renders with persisted preferences, vault URI is displayed correctly.\nL220- \nL221- ---\nL222- \nL223- ### S12: Navigate to Categories\nL224- \nL225- **Precondition:** App is on `SettingsScreen`.\nL226- \nL227- **Flow:**\nL306- \nL307- **Precondition:** Vault configured; 1 vehicle present; `setBillingOverride(FORCE_FREE)`.\nL308- \nL309- **Flow:**\nL310- 1. Launch on `VehicleListScreen`.\nL311- 2. Tap the \"Add Vehicle\" FAB.\nL312- 3. Verify the upgrade info sheet is displayed (assert by `testTag = \"paywall-info-sheet\"`).\nL313- 4. Verify \"Upgrade to Premium\" and \"Maybe later\" buttons are present.\nL314- 5. Tap \"Maybe later\".\nL315- 6. Verify the sheet dismisses and `VehicleListScreen` is still showing 1 vehicle.\nL316- \nL317- **Verifies:** Free-tier gate triggers at `vehicleCount >= 1 && !isPremium`; `PaywallInfoSheet` renders on the real Compose pipeline; dismiss restores screen state.\nL318- \nL319- ---\nL320- \nL321: ### S19: Read-Only Status Card Across Paywalled Screens (Paywall)\nL322- \nL323- **Precondition:** Vault configured; 2 vehicles (\"Car A\", \"Car B\") pre-populated via test helper; `setBillingOverride(FORCE_FREE)`.\nL324- \nL325- **Flow:**\nL326- 1. Launch on `VehicleListScreen`.\nL327- 2. Verify the read-only status card is displayed (`testTag = \"paywall-status-card\"`); verify the \"Learn more\" action is present in the card.\nL328- 3. Attempt swipe-to-dismiss on a vehicle row; verify the vehicle is still present (swipe-delete disabled in read-only).\nL329- 4. Tap \"Car A\" → `VehicleDetailScreen`. Verify the \"Add Record\" FAB is hidden.\nL330: 5. Tap the Settings icon → `SettingsScreen`. Verify the \"Premium\" section shows the \"Upgrade to Premium\" entry.\nL331- \nL332- **Verifies:** `PaywallStatusCard` correctly signals read-only state on `VehicleListScreen`; `AppGate` propagates `isReadOnly` through all paywalled ViewModels; write-action UI is suppressed end-to-end.\nL333- \nL334- ---\nL335- \nL336- ### S20: Read-Only Lifts on Premium Activation (Paywall)\nL337- \nL338- **Precondition:** Vault configured; 2 vehicles present; `setBillingOverride(FORCE_FREE)`.\nL339- \nL340- **Flow:**\nL341- 1. Launch on `VehicleListScreen`. Verify the read-only status card is displayed.\nL342- 2. From the test process, call `setBillingOverride(FORCE_PREMIUM)`.\nL343- 3. `waitUntil` the status card is no longer displayed (timeout 5s — involves DataStore write + Flow combine + recomposition).\nL344- 4. Tap the \"Add Vehicle\" FAB and verify it navigates to `AddEditVehicleScreen` (no upgrade sheet).\nL345- 5. Press back; tap \"Car A\" → `VehicleDetailScreen`. Verify the banner is absent and the \"Add Record\" FAB is visible.\n---" }