Manual Validation Checklist
This checklist is the practical step-by-step guide for the next manual testing pass.
Use it in order unless a specific environment constraint forces a different sequence.
Working Protocol
Use this checklist as a living Milestone 0 runbook, not as a one-time note dump.
For each slice:
- run one feature end to end
- record either
passedor the exact failing step - fix UI or integration issues before moving on
- update this checklist if the real flow, labels, or prerequisites changed
- commit only after that slice is fully re-verified
When a slice says to stay signed in, do not do extra cleanup at the end. Preserving state between adjacent slices keeps QA realistic and prevents repeated setup churn.
Preflight
Before starting any validation slice:
- Decide whether the slice is a hosted-device slice or a local-backend slice and use the matching environment.
- If the slice depends on live domain behavior, prefer a physical iPhone over the simulator.
- If the slice depends on local-only behavior, start the backend with
docker compose up --build -d. - Confirm the backend is reachable for the chosen environment before opening the app.
- If prior state is confusing the flow, reset only the minimum necessary app, account, or simulator state rather than wiping everything immediately.
- Record any UI tweaks or copy changes you make during the slice so they can be committed with the validated flow.
- If the latest fix changed
Info.plist, entitlements, or build-time host configuration, clean, rebuild, and reinstall before retrying the slice.
1. Hosted Auth On Device
Goal:
- validate the first real-device, real-domain auth path end to end using
app.bagels.topandapi.bagels.top - cover account creation, session restore, password sign-in, magic-link email delivery, password-reset email delivery, universal-link handoff, and biometric re-entry
Suggested environment:
- ASPECTAVY_API_BASE_URL = https://api.bagels.top - ASPECTAVY_UNIVERSAL_LINK_HOST = app.bagels.top
- physical iPhone
AspectAvy Devbuild configured with:- Apple Mail signed into the inbox used for testing
Status:
- Passed on
2026-04-07against the hostedbagels.topstaging environment
Before you start:
- delete any existing
AspectAvyorAspectAvy-devbuild from the phone - in Xcode, clean the
AspectAvy Devbuild folder - rebuild and reinstall to the physical device so the current associated-domain entitlement is refreshed
- pick a real inbox you can read on the phone
- use a fresh email alias for deterministic registration if your provider supports plus-addressing
Steps:
- Launch the app on the phone and confirm the login screen appears.
- Confirm the version label at the bottom starts with
2.0.0. - Switch
ModetoCreate Account. - Enter a fresh test email, a display name, and a password.
- Submit the account-creation form and confirm there is no stuck spinner or inline error.
- Confirm the next screen title is
Quick Return Sign-In. - Tap
Enable Face IDand approve the biometric prompt. - Confirm the
Location Accessonboarding screen appears before the map shell. - Tap
Allow Locationand approve the system prompt. - Confirm the signed-in app shell loads, the account screen shows the expected email, and the map recenters toward the current device location.
- Confirm the first map state is usable and not blank: forecast content should render when your location lands in coverage, and when it does not, the map should still remain interactive so you can pan or search into a forecast zone.
- Force-quit and relaunch the app.
- Confirm cold-launch session restore works without returning to the login screen.
- Sign out.
- Sign back in with the same email and password.
- Confirm the app signs in cleanly and returns directly to the authenticated shell without replaying onboarding surfaces for the same account on the same device.
- Sign out again.
- Request an email sign-in link from the
Email Sign-In Linksection. - Wait for the real email on the phone and open the link directly from the email client.
- If Safari opens a hosted page first, use the hosted continue action.
- Confirm the app opens from the hosted link and completes sign-in successfully.
- Sign out again.
- Request a password-reset link from the
Password Resetsection. - Wait for the real reset email and open the link directly from the email client.
- Confirm the app opens to the
Password Resetscreen. - Set a new password, submit it, and confirm the app signs in on success.
- Sign out again.
- Use
Quick Sign-Inwith Face ID and confirm biometric re-entry succeeds without typing the password. - Stop while still signed in so the next slice can reuse authenticated state.
Watch for:
- email links opening in Safari but failing to return to the app
- hosted auth pages loading but missing their primary continue action
- password-reset links opening to the wrong app screen or failing to carry the token
- biometric quick sign-in surviving registration but failing after password reset
- location permission appearing only after the map shell loads instead of during onboarding
- location being granted in onboarding but the first signed-in map never recenters on the device
- the map centering correctly on the device location but still falling into a silent blank or blocked state instead of staying usable
- device builds still pointing at
127.0.0.1 - unexpected bundle or entitlement drift causing universal links to open only in the browser
Success result:
- the same hosted backend and domain work for account creation, email/password sign-in, magic-link sign-in, password reset, biometric sign-in, and cold-launch session restore on a physical device
2. Pinned Zones And Quick Brief
Goal:
- verify that forecast-zone details now support quick briefing plus pinned-zone preference flows
Suggested environment:
- physical iPhone or simulator using the current authenticated staging environment
Status:
- Passed on
2026-04-08against the hostedbagels.topstaging environment
Steps:
- Launch the app and wait for forecast zones to finish loading.
- Tap a forecast zone to open forecast-zone details.
- Confirm the details sheet renders without error.
- Find the quick briefing section.
- Verify the quick briefing content is present and readable.
- Tap
Pin Zone. - Confirm the action succeeds without dismissing the sheet unexpectedly.
- Verify the pinned-zone state updates in place.
- Tap
Make Primary. - Confirm the action succeeds and the UI now reflects the zone as primary.
- Close the sheet and reopen the same zone.
- Confirm the zone still appears pinned and primary.
- Open a second zone and pin it.
- Reopen the first zone and confirm it remains pinned.
- Unpin the second zone.
- Confirm only the second zone changes state.
Watch for:
- stale pinned state after reopen
- duplicate primary state across multiple zones
- quick briefing missing while the rest of the screen loads
- forecast narrative sections rendering duplicate text instead of collapsing repeated content
- actions that require leaving the details flow to take effect
Success result:
- pin, unpin, and make-primary all persist correctly
- quick briefing loads as a stable enhancement rather than a blocking dependency
3. Route Plan Trip Safety Workspace
Goal:
- verify the new pushed route-plan setup flow and saved-plan trip safety workspace end to end
Suggested environment:
- physical iPhone or simulator using the current authenticated staging environment
- ensure at least one saved route already exists so a plan can choose a primary route
Steps:
- Open
Library. - If no saved route plan exists yet, tap
New Plan. - Confirm a brand-new plan starts directly on
Plan Basics, not on a reused draft or a duplicated planner root. - Enter a plan name, notes, and at least one goal.
- Continue to
Teamand confirm the flow pushes forward instead of replacing the whole surface. - Continue to
Routes, select a primary route, and continue again. - On
Review, save the plan and confirm a share link becomes available after save. - Open the saved plan again from
Libraryif needed. - Confirm the saved plan root shows the plan overview plus a
Plan Workspaceentry. - Open
Plan Workspace. - Confirm the workspace loads normally.
- Scroll to the
Route Briefsection. - Verify a route briefing appears for the saved plan.
- Scroll to the
Trip Safetysection. - If the plan has no active latest trip, confirm the start controls are visible.
- Set an expected return time a short interval in the future.
- Tap
Start Safety Share. - Confirm the trip enters an active state without leaving the workspace.
- Verify the status card appears with trip status and expected return.
- Tap
Share Live Status Page. - Confirm the share sheet opens and only shares the bare hosted URL.
- Copy or open the generated URL.
- Verify the hosted
/trip-status/:tokenpage renders meaningful trip status content in Safari. - Return to the app.
- In the
Decision Logsection, enter a short decision note and save it. - Confirm the new note appears in the timeline list.
- In the
Field Observationssection, enter a short observation and save it. - Confirm the observation appears in the observations list.
- Tap
Finish Trip Safety Session. - Confirm the trip status exits the active state cleanly.
- Scroll to the
Debriefsection and confirm the debrief/history surface now loads. - Close the plan workspace and the plan root.
- Reopen the same saved plan from
Library. - Confirm the latest decision notes, observations, debrief/history, plan title, notes, goals, and primary route still load from the backend.
Watch for:
- pushed setup destinations dropping data when moving from one step to the next
- the saved plan reopening with blank title, notes, goals, or primary route
- start or finish actions leaving the UI in a disabled state
- share page opening with empty or stale content
- decision/observation saves succeeding but not refreshing locally
- reopened plan losing the latest-trip timeline
Success result:
- the pushed setup flow preserves plan data across steps, and the full saved-plan workspace works without custom debugging or app restarts
4. Forecast Override And Tools Stack
Goal:
- validate
Update Forecast,Pro Tools, shared checklist tools, and the inclinometer from the live map
Suggested environment:
- iOS simulator with local backend
- use a zone with a current forecast revision and a signed-in account
Steps:
- Launch the app and wait for forecast zones to load.
- Confirm the top-right action stack appears under search/account with
Update Forecast,Pro Tools, andTools. - Confirm
Update ForecastandPro Toolsare disabled if the map does not yet have a current forecast zone under the crosshair. - Move the map until a forecast zone is under the crosshair and confirm the two forecast actions become enabled.
- Tap
Update Forecast. - Confirm the warning screen appears and explains that only AspectAvy’s local effective level changes.
- Continue to the checklist.
- Select at least one field-observation reason and confirm the CTA enables.
- Apply the override and confirm the sheet dismisses with the active zone changed to
Considerable. - Verify the active zone now shows an override badge and an official-to-effective summary.
- Open forecast-zone details for the same zone and confirm the same override state appears there.
- Use the reset action to clear the override.
- Confirm the effective level returns to the official level on both map and details surfaces.
- Reopen the override flow and select
None. - Confirm the flow dismisses without applying an override.
- Tap
Pro Tools. - If the signed-in account is not entitled, confirm the paywall path still appears.
- In a debug build, use the paywall’s developer-tools shortcut to open membership testing and locally unlock Pro if needed.
- Return to the map and confirm Pro Tools is now testable without weakening production gating.
- If the account is entitled, continue past the warning screen.
- Confirm the flow uses pushed navigation instead of one expanding screen.
- Select one or more defensible reasons and continue to level selection.
- Pick a target level and apply the override.
- Confirm the selected level becomes the effective level and the zone displays override messaging.
- Reopen
Pro Tools, selectNo reason, and confirm the flow exits without applying a change. - Open
Toolsand launchTrailhead Checklist. - Confirm the checklist renders with full-row tap targets and selections can be toggled reliably.
- Dismiss it and repeat with
Drop-In Checklist. - Launch
Inclinometer. - Confirm the angle display updates, zeroing works, reset works, and the forecast-band guidance appears when an active forecast zone is available.
Watch for:
- map action buttons enabling for the wrong crosshair zone context
- paywall test-unlock path bypassing the normal Pro gating outside debug
- override apply succeeding but not updating map/details state locally
- clear/reset leaving stale effective-level UI behind
NoneorNo reasonstill creating an override- checklist rows only responding when the text/icon itself is tapped
- inclinometer motion staying stuck at zero or not recovering after zero/reset
Success result:
- forecast override flows, checklist tools, and inclinometer all work end to end from the live map shell
5. Settings Persistence And Layer Preferences
Goal:
- validate the dedicated settings surface plus backend-backed map and layer preferences
Suggested environment:
- iOS simulator with local backend
Steps:
- Open the map and tap the dedicated settings button.
- Confirm the settings surface is distinct from Account.
- Change the forecast polygon opacity preset.
- Open layer settings from the settings surface.
- Toggle at least two layer families away from their defaults.
- Change default camera mode and map style if available.
- Save settings and dismiss the sheet.
- Confirm the live map immediately reflects the new opacity preset and layer visibility.
- Close and relaunch the app.
- Confirm the same map style, camera mode, polygon opacity preset, and layer visibility choices restore from the backend-backed settings domain.
- Reopen Account and confirm legal/privacy and delete-account controls are no longer crowded into the account identity surface.
- Return to Settings and verify delete-account is present in the danger-zone area.
Watch for:
- layer settings saving locally but not surviving relaunch
- settings writes overwriting unrelated server-backed preferences
- map rendering ignoring the saved opacity preset
- a mismatch between settings defaults and the live layer-management UI
Success result:
- settings persist across relaunch and are respected by both layer management and live map rendering
6. True Offline Usage Without Network
Goal:
- validate that a downloaded region is actually usable after network loss
Suggested environment:
- simulator with network disabled if practical
- or a device with a reachable backend during download, then full offline mode after download
Steps:
- Launch the app with network available.
- Download an offline region that includes forecast, routes, incidents, and base map coverage.
- Confirm the download finishes completely.
- Navigate into the downloaded region while still online and verify the map content is present.
- Disable all network access.
- Force close the app.
- Reopen the app fully offline.
- Wait through startup and bootstrap attempts.
- Confirm the base map still renders inside the downloaded region.
- Confirm forecast and overlay content remain visible inside the region.
- Pan around within the downloaded boundary.
- Confirm the app remains stable and does not collapse into a hard loading failure.
- Open Offline Maps and confirm the downloaded region still appears.
- Expand the downloaded region and tap
View on Map. - Confirm the sheet dismisses, the map fits back to the saved region, and the offline coverage outline appears even if the offline layer was hidden.
- Confirm
View on Mapdoes not leave the region in a sticky selected/highlighted state after the sheet dismisses. - Tap the offline region outline or label on the map and confirm
Offline Mapsreopens with that region detail already pushed. - Tap back to return to the main Offline Maps list, then dismiss the sheet.
- Confirm the region highlight clears after the detail or sheet is dismissed.
- Open Layer Settings and verify
Offline Coverageis available as a normal map layer toggle. - Turn
Offline Coverageoff if needed, tapView on Mapagain, and confirm the region can still be temporarily revealed and focused. - If possible, open a saved route or route plan inside the region and verify its geometry still renders.
Watch for:
- startup failing hard because bootstrap/config requests cannot complete
- blank map tiles inside a region that was previously downloaded
- overlays disappearing even though the region claims to include them
View on Mapfailing to relocate the camera or temporarily reveal the saved region- offline-region taps failing to reopen Offline Maps with the tapped region detail already pushed
- region highlight lingering after backing out of Offline Maps
Offline Coveragevisibility getting stuck on or off after usingView on Map
Success result:
- downloaded map content remains meaningfully usable with no network
7. Purchase Sandbox / TestFlight
Goal:
- validate real purchase, restore, and entitlement reconciliation
Suggested environment:
- signed build with App Store sandbox or TestFlight
Steps:
- Sign in with a clean test account.
- Open the paywall from a gated surface.
- Complete a purchase.
- Confirm the purchase flow closes cleanly.
- Open Account and confirm membership state updates.
- Revisit a previously gated feature and confirm it is now unlocked.
- Trigger
Restore Purchases. - Confirm restore completes without duplicating entitlements.
- If web checkout is available in the current storefront, validate that
/membershiphandoff returns to the app and refreshes entitlements.
Watch for:
- purchase success without backend entitlement change
- restore succeeding in StoreKit but not changing app state
- paywalled surfaces still using stale free-tier limits
Success result:
- purchase, restore, and entitlement reconciliation all agree
Reference:
- purchase-sandbox-validation-playbook.md
7. Push Notifications
Goal:
- validate permission, registration, delivery, and open behavior
Suggested environment:
- physical device preferred
Steps:
- Install and open the app on device.
- Trigger the push permission prompt.
- Grant permission.
- Confirm the device registers successfully with the backend.
- Send a test notification through the supported environment.
- Confirm the notification is delivered.
- Open the notification.
- Verify the app opens into a sensible route or target screen.
Watch for:
- permission accepted but no backend registration
- delivered notification opening to a dead end
Success result:
- push permission, registration, delivery, and open routing all work
7. Universal Links And Safari/Web Handoff
Goal:
- validate the hosted domain, AASA behavior, and Safari handoff
Suggested environment:
- physical device with a signed build and hosted domain configured
Steps:
- Create or obtain a hosted route, route-plan, or invite URL.
- Open the link in Safari.
- Confirm the hosted page renders correctly.
- Confirm Safari offers or performs app handoff.
- Open the link into the app.
- Verify the app lands on the expected route, plan, or invite surface.
- Repeat once from a cold launch.
- Repeat once with the app already running.
Watch for:
- hosted page rendering but no associated-domain handoff
- app opening but failing to route to the correct content
Success result:
- the hosted page and app handoff both work reliably
8. On-Device Track Recording
Goal:
- validate real movement, pause/resume, save, and finalization on device
Suggested environment:
- physical device during real movement
Steps:
- Start a new track recording on device.
- Move enough to generate a visible track.
- Confirm point count and geometry continue to grow.
- Pause the recording.
- Wait briefly, then resume.
- Confirm the resumed track continues cleanly.
- Finish and save the track.
- Open the saved track from Library.
- Confirm geometry, duration, and any elevation-derived values look reasonable.
Watch for:
- no new points despite movement
- broken geometry after resume
- save succeeding but reopened track missing data
Success result:
- device recording behaves predictably enough for product confidence
Recording Results
For each slice, capture:
- pass or fail
- device or simulator used
- exact failure symptoms
- whether the issue is reproducible
- screenshots if the UI is involved
Update development/manual-validation-remaining.md after each validation slice so the remaining list stays current.