TLDR: 12 checks across the whole Jumpseat Flight Finder area — the search form (typeahead, guard rails, advanced options), live flight results with expandable detail cards, sort & filter, the jump into an airline's jumpseat policy and back, the Airline Policies directory, and the recent/saved lists. Searches hit the real flight-search service, so results are live flights — expect timings and statuses to differ from the screenshots. Requires a member login. Most checks (all but 1) have automated UI-test coverage — see "What's already covered by automated tests" below.
Steps: On the Page Readiness screen, tap Flight Finder Search.
What you should see: The Jumpseat screen on its FLIGHT FINDER tab: trip-type pills (NONSTOP / ONE STOP / MULTILEG, Nonstop pre-selected), FROM and TO fields with the dashed flight-path rail and plane graphic to their right, a DEPART date & time field (defaults to the current date and time; tapping it opens the platform's own picker — on iOS a combined date-and-time popover, on Android a date dialog followed by a time dialog), an ADVANCED SEARCH expander, and the SEARCH FLIGHTS button with its pointed end.
Steps: Type atl (lowercase is fine) into FROM. Tap a suggestion. Do the same in
TO with another city. Tap the plane on the rail — it swaps FROM and TO. Then tap somewhere outside a field while suggestions are
open.
What you should see: A suggestion list appears under the field as you type (code + airport name); tapping one fills the field and closes the list. Tapping the rail plane exchanges FROM and TO. Tapping outside a field closes its suggestions on their own after a beat.
Steps: Clear the FROM field — look at SEARCH FLIGHTS. Set FROM and TO to the same airport — look again. (And if you're logged out: run any valid search.)
What you should see: SEARCH FLIGHTS dims and refuses taps whenever FROM or TO is empty, or both point at the same place. Logged out, a search lands on a clear "Sign in to search flights" message instead of fake results.
Steps: Tap ADVANCED SEARCH to expand it.
What you should see: Avoid Connection and Connect Via airport fields, the Min Connection Time and Length of Travel sliders (values update as you drag), the three checkboxes (Search by Arrival Date, Include Cargo Carriers, Show Codeshare), and Save Search to Favorites. Tapping ADVANCED SEARCH again collapses it.
Steps: NONSTOP pill, ATL → TPA (or any busy pair), SEARCH FLIGHTS. Wait out the Searching flights… line.
What you should see: A results list of flight cards — airport codes and times on a dotted line with a plane, the date and total duration/trip type, the flight number, and a VIEW DETAILS bar spanning the card. The nav row above the list is a back chevron, your search read back ("ATL to TPA · Nonstop · …") centered between it and the sort & filter icon (a count badge appears on the icon when a sort or filters are applied) — no separate "Jumpseat" title bar above it (Figma 4713:25180).
Steps: Tap VIEW DETAILS on any card.
What you should see: The card expands in place (no page change): Departure and Arrival blocks with live status chips ("On time", "Delayed 34m", "Early 7m"), airport + time, gate (NA when the airport hasn't posted one yet), the aircraft type, a JUMPSEAT POLICY link (and KCM when the airport is a KCM checkpoint), and italic "Updated …" lines. CLOSE DETAILS at either end collapses it. Several cards can be open at once.
Steps: You need a flight alert whose flight is on this device. The quickest setup: Dev Dashboard → FF Test Scenarios → Seed Saved Flights, then Dev Dashboard → Push / Deep-link Test Scenarios → "Real push tap → post a local notification". Leave the app (Home button), wait for the banner, and tap it in the notification drawer.
What you should see: The app opens Flight Details — a single flight card, already expanded, with no chevron at either end (this screen is the detail, so there is nothing to collapse). Above the card, a line saying when the status was last updated. Tapping back returns to the notifications list on the Flight Finder tab with that alert focused — not to the home screen, even if the app was closed when the notification arrived.
To reach the same screen without a push: FF Test Scenarios → "Flight Detail from an alert (schedule key)", which addresses a seeded flight exactly the way a real alert does.
Steps: On the Flight Details screen, pull down from the top of the card to refresh. Then turn the device's network off and pull again.
What you should see: Pulling shows a small arrow that flips when you have pulled far enough; release and the line above the card reads "Refreshing status…", then settles back to "Updated <time>". With the network off it reads "You're offline — showing the status received <time>". It should never claim a refresh succeeded when it did not, and never show a time the service did not report. A flight that has already landed says "This flight has arrived" rather than reporting a failure. Backgrounding the app on this screen and returning to it a minute later re-checks the status on its own.
Steps: Tap the sort & filter icon, switch to the Filter tab, open Airline, check one carrier — watch the list behind the panel. Tap Apply. Reopen, check something else, then dismiss with ✕. Switch to the Sort tab → Total Trip Time → Apply. Finally use clear followed by Apply.
What you should see: Nothing changes behind the panel until you hit Apply — checkboxes and the sort radio are staged. Apply commits (list updates, the Sort/Filter buttons pick up their active state/badge). ✕ throws staged changes away. clear empties the panel but only takes effect when you Apply it.
Steps: With a filter applied, a sort set, a card expanded, and the list scrolled somewhere, tap the expanded card's JUMPSEAT POLICY link. Read the policy, then use the ‹ back chevron.
What you should see: The airline's policy page (Check 10 covers its content). Coming back, the results are exactly as you left them — instantly, with no fresh "Searching flights…": same flights, same filter badge and sort, your card still expanded, the list still scrolled where it was.
Steps: Search ATL → SEA with the ONE STOP pill; expand a result. Then repeat with MULTILEG.
What you should see (One Stop): Cards with two flight numbers and durations like "8h 19m One Stop"; expanded, two full legs separated by a gray layover band ("DEN Layover 1h 30m"), each leg with its own statuses, gates and per-leg totals.
What you should see (Multileg, for now): After a long wait, the "No flights found… service may be briefly unavailable" message.
Steps: From the search screen's tab strip, tap AIRLINE POLICIES. Scroll the list, then
tap the magnifier in the title bar and type united into the search field that
replaces it. Tap the ✕ to clear and close the search. Open an airline, then come back with ‹.

Alphabetical directory — name + » per row (Figma-aligned 2026-08-12)

Search replaces the title bar; matches names and codes
What you should see: An alphabetical directory (21 Air, ABX Air, Air Canada…), each row just the airline name with a » chevron — no badges on rows; carrier types now appear only on the airline's own page ("ALPA Carrier CASS Carrier" under its name). Tapping the magnifier swaps the whole title bar for a white search field (magnifier · text · ✕) and the keyboard gets focus; rows drop their chevrons while searching. Search narrows by name or IATA/ICAO code ("united" → United Airlines and UPS). The ✕ clears the filter and restores the title bar — the full list comes back. An airline's page shows its name and carrier types, the shaded … JUMPSEAT DETAILS box (your MEC's listing when there is one — GENERAL otherwise — with any contact links), a thin rule under the title bar, and the policy body: Airline Summary, Reciprocal Agreement, Dress Code, and the rest — section titles in regular weight with no underline — ending in the JumpseatFeedback@alpa.org line. Links open outside the app (or dial, for phone numbers).
Steps: From the bottom of the search screen tap RECENT SEARCHES, SAVED SEARCHES, and SAVED FLIGHTS in turn.

Recent — flick a row left to reveal Save

Saved — flick a row left to reveal Remove

Saved flights — full flight cards

FF Test Scenarios — seed or clear Saved Flights without a login
What you should see (resting state): Recent Searches and Saved Searches rows show large bold
airport codes (Futura Bold, 24px) connected by the same dotted line + plane icon every flight-result
card in this app uses — not a small chevron. No action icon is visible until you swipe — all
three lists hide their actions behind a swipe tray now (a Figma-alignment pass, 2026-08-11, matching
nodes 4713:25252/4713:25302); an inline always-visible heart/clock icon, or
a plain "›" between the codes, would mean you're looking at a stale build.
Steps (swipe tray): On any row in any of the three lists, flick it left.

Recent Searches — blue, bookmark icon

Saved Searches — red, trash icon

Saved Flights — blue bell + red trash
What you should see (swiped open): The row slides left to reveal one or two action zones.
Zone color follows what the action does, not which list it's on: an informational action (Save,
Subscribe to alerts) is always blue (Interactive/Blue-lt, #007bc2); a destructive
action (Remove, Delete) is always red (Red/500, #c02126). Recent Searches' save
action uses a bookmark icon (matching Figma node 4713:25252), not a heart. The clock
icon mentioned in earlier versions of this doc doesn't exist on these rows — tapping a row's body
re-runs its search directly.
alpa-swipe--open CSS
class directly rather than a physical flick gesture — same DOM/CSS a real swipe produces
(SwipeRevealRow.razor), so the screenshots are representative. The gesture itself
(touchstart/touchend flick detection) is what
FlightFinder_SavedFlights_SwipeTray_RevealAndDelete exercises, below.Steps: On the search screen, tap each tab in the strip: FLIGHT FINDER, AIRLINE POLICIES, ETIQUETTE, MISSION.

ETIQUETTE — real content, not highlight-only

MISSION — same
What you should see: All four tabs navigate to a real page — AIRLINE POLICIES to the directory (Check 10), ETIQUETTE and MISSION to their own static-content pages.
/jumpseat/etiquette, /jumpseat/mission). That claim was stale by
the time this pass found it; if you're reading this walkthrough much later, verify it's still current.The complete Blazor Flight Finder surface on live production data: the search form and its guard rails, the flight-card results experience (inline expand, per-leg live statuses, layovers), staged sort/filter, the policy-detail round trip with full state restoration, the Airline Policies directory, and the shape of the recent/saved lists.
These run with the UI suite (BlazorWalkthroughTests), so a regression should be caught
before it reaches you. Run the checks by hand anyway — the automation checks the behavior is
present, not that it reads well. The live-search tests self-skip with a clear reason when the
suite runs logged out:
FlightFinder_SearchForm_GuardRails)FlightFinder_AdvancedSearch_FieldsBindAndCriteriaFlow)FlightFinder_NonstopSearch_RendersLiveResults)FlightFinder_Card_ExpandCollapse_Inline)FlightFinder_FilterSort_StagedUntilApply)FlightFinder_PolicyRoundTrip_RestoresStateWithoutResearch)FlightFinder_MultilegSearch_DegradesGracefully)FlightFinder_PoliciesDirectory_SearchAndDetail)FlightFinder_SavedLists_Render), a recent search
re-run opens results (FlightFinder_RecentSearches_ReRunOpensResults), the Saved Flights
swipe tray reveals and deletes (FlightFinder_SavedFlights_SwipeTray_RevealAndDelete), and FF
Test Scenarios' seed drives the real results UI
(FlightFinder_TestScenarios_SeedDrivesResultsUi)FlightFinder_SubNavAndSwap)FlightFinder_SearchForm_GuardRails's replay — that test is Check 3's, not Check 1's; the video
was misattached. Corrected by removing it rather than re-attaching the wrong clip.fs- hub tags the legacy
XAML bell uses, persists across restarts, auto-saves on subscribe, and unsubscribes on
delete/un-save. What's not walked yet is a real flight-status push arriving for a subscribed
flight — that needs a live hub send.