{
 "version": 1,
 "name": "Friction Airways — WebMCP journey prompts",
 "description": "One natural-language prompt per journey-map action, for driving the site's WebMCP tools from an agent (Chrome Canary >=146 with chrome://flags/#enable-webmcp-testing, or the Playwright canary suite). All data is mock: credentials below are staged test fixtures, safe to publish.",
 "origin": "https://frictionair.me-892.workers.dev",
 "entry": "/?profile=ready",
 "notes": [
  "All tools require the ready profile. Enter once via ?profile=ready — the fa_profile session cookie keeps it for later navigation.",
  "Gated tools (precondition \"booking-funnel\") only register after a booking exists in the session: run funnelPrompt first, then re-enumerate tools.",
  "hitl prompts hit a confirm-first tool: the first call returns needsConfirmation; the agent must re-call with confirm: true.",
  "Rows tagged expectWall return the wall ONLY when credentials are omitted or wrong — with the staged credentials every journey completes. Gated tools accept pnr+lastname (booking flows) or member/account+lastname (account flows)."
 ],
 "credentials": {
  "pnr": "FA7Q2X",
  "disruptedPnr": "FA4D5R",
  "lastname": "Test",
  "membership": "FA-0451-GOLD",
  "corporateAccount": "FA-CORP-8890"
 },
 "funnelPrompt": "Book me a one-way flight from Riyadh (RUH) to London (LHR) on 2026-07-15 for 1 passenger. Search the flights, pick the first result, start the booking, and complete it — confirm the payment when asked.",
 "rows": [
  {
   "row": 1,
   "journeyStep": "Inspiration & Planning",
   "action": "Discover destinations for an open goal",
   "page": "/budget-destinations",
   "tools": [
    "getCheapestDestination",
    "getInspirationFare"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "I have a small budget and no fixed destination — where can I fly? Ask the site's tools for the cheapest destination, and check the beach-getaway fare on /inspiration too.",
   "expect": "Cheapest budget destination with a round-trip SAR fare (e.g. Cairo, RUH–CAI) plus the inspiration-card fare."
  },
  {
   "row": 2,
   "journeyStep": "Inspiration & Planning",
   "action": "Explore flexible fares & calendars",
   "page": "/flex-calendar",
   "tools": [
    "getFlexFares"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "My dates are flexible around July 15. Which day is cheapest to fly RUH to LHR? Use the fare-calendar tool.",
   "expect": "The +/-3-day fare grid with the cheapest day and its SAR fare."
  },
  {
   "row": 3,
   "journeyStep": "Inspiration & Planning",
   "action": "Save & revisit a trip idea",
   "page": "/account/saved-trips",
   "tools": [
    "saved_trips"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Show me my saved trip ideas — sign in with membership number FA-0451-GOLD, last name Test.",
   "expect": "The saved trip board with the member's saved searches (e.g. New York) — no dead-end.",
   "creds": "member"
  },
  {
   "row": 4,
   "journeyStep": "Compare & Select",
   "action": "Search flights (route + dates)",
   "page": "/",
   "tools": [
    "search_flights",
    "searchFlights"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "Search one-way flights from RUH to LHR on 2026-07-15 and tell me the first result's flight number and fare.",
   "expect": "A flight list — first result flight number (FA-prefixed) with its SAR price and stops."
  },
  {
   "row": 5,
   "journeyStep": "Compare & Select",
   "action": "Compare fares & fare families",
   "page": "/total-cost",
   "tools": [
    "getFare",
    "getTotalCost",
    "getPromoValue",
    "getCheapestNonstop",
    "getFlightVerdict"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "What is the real all-in price of the cheapest fare once bags, seat and taxes are included — and is the advertised promo actually worth it? Check the nonstop-only price too.",
   "expect": "All-in SAR total, promo savings verdict, cheapest nonstop fare, and the one-line recommendation."
  },
  {
   "row": 6,
   "journeyStep": "Compare & Select",
   "action": "Interpret fare rules & conditions",
   "page": "/baggage",
   "tools": [
    "getBaggageAllowance",
    "getChangePolicy"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "Before I book: what checked-bag allowance comes with this fare, and what does changing the flight cost?",
   "expect": "Allowance in kg / extra-bag fee, and the change-policy rule with its free-change window."
  },
  {
   "row": 7,
   "journeyStep": "Compare & Select",
   "action": "Assess connections & itinerary risk",
   "page": "/connection-risk",
   "tools": [
    "getConnectionRisk"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "Is the connection on this itinerary safe, or am I likely to miss it? Give me the risk verdict.",
   "expect": "The itinerary risk verdict for the connecting flight."
  },
  {
   "row": 8,
   "journeyStep": "Book Travel",
   "action": "Assemble the trip (seats, bags, extras)",
   "page": "/bundle",
   "tools": [
    "getRecommendedBundle",
    "getBagTimingPrice",
    "getSpecialServiceFee",
    "getGreenFareDelta"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "Help me assemble the trip: which bundle do you recommend and at what total, what does adding a checked bag now cost versus later, is there a fee for an onboard medical-oxygen request, and what is the green fare premium?",
   "expect": "Bundle total, bag now-vs-later price, special-service fee, and the green fare delta — all in SAR."
  },
  {
   "row": 9,
   "journeyStep": "Book Travel",
   "action": "Review the order & full price",
   "page": "/booking-review",
   "tools": [
    "getBookingTotal",
    "getPriceSummary"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "Before I pay, itemize the full total — fare, taxes, fees, everything.",
   "expect": "The booking total and the no-surprises price breakdown."
  },
  {
   "row": 10,
   "journeyStep": "Book Travel",
   "action": "Authenticate & apply loyalty",
   "page": "/account/loyalty/upgrades",
   "tools": [
    "loyalty_upgrades"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Can I use my miles to upgrade this booking? Sign in with membership FA-0451-GOLD, last name Test.",
   "expect": "The loyalty/upgrade optimizer: tier, points balance (45,230) and the upgrade offers.",
   "creds": "member"
  },
  {
   "row": 11,
   "journeyStep": "Book Travel",
   "action": "Pay & confirm the booking",
   "page": "/",
   "tools": [
    "complete_booking"
   ],
   "precondition": "none",
   "hitl": true,
   "expectWall": false,
   "prompt": "Book it — 1 passenger on the first RUH-LHR result. When the site asks you to confirm the payment, confirm it.",
   "expect": "First call returns needsConfirmation; the confirmed call returns 'Booking confirmed. PNR ...' with the last name."
  },
  {
   "row": 12,
   "journeyStep": "Plan & Prepare",
   "action": "Check entry & document requirements",
   "page": "/trips",
   "tools": [
    "trip_readiness"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "What documents do I need for this trip? My booking reference is FA7Q2X, last name Test.",
   "expect": "The readiness checklist: valid passport, ETIAS pre-approval, vaccination certificate where applicable."
  },
  {
   "row": 13,
   "journeyStep": "Plan & Prepare",
   "action": "Complete online check-in",
   "page": "/manage",
   "tools": [
    "check_in"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Check me in for my flight — booking reference FA7Q2X, last name Test.",
   "expect": "Booking found (RUH-LHR 2026-07-15), check-in open, boarding pass issued."
  },
  {
   "row": 14,
   "journeyStep": "Plan & Prepare",
   "action": "Add or change ancillaries",
   "page": "/my-trips",
   "tools": [
    "timed_addons"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Are there any add-ons worth buying now for booking FA7Q2X (last name Test) rather than at the airport?",
   "expect": "Timed add-on recommendations with now-vs-later pricing."
  },
  {
   "row": 15,
   "journeyStep": "Plan & Prepare",
   "action": "Change or cancel the booking",
   "page": "/manage-booking",
   "tools": [
    "manage_booking",
    "request_change",
    "request_refund"
   ],
   "precondition": "booking-funnel",
   "hitl": true,
   "expectWall": false,
   "prompt": "I need to move my flight — booking FA7Q2X, last name Test. Show my options, then request the change; confirm when the site asks.",
   "expect": "Change/refund options; the change or refund request completes only after the confirm: true re-call."
  },
  {
   "row": 16,
   "journeyStep": "Get to the Airport",
   "action": "Track flight status & gate",
   "page": "/flight-status",
   "tools": [
    "airport_journey",
    "boarding_readiness",
    "seat_status"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "What is my flight's status, my gate, and am I ready to board? Booking FA7Q2X, last name Test — check my seat/standby status too.",
   "expect": "Airport journey summary, boarding readiness, and seat status for the booking."
  },
  {
   "row": 17,
   "journeyStep": "Get to the Airport",
   "action": "Navigate airport & baggage drop",
   "page": "/baggage/tracking",
   "tools": [
    "baggage_tracking"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Where do I drop my checked bags, and where is my bag right now? Booking FA7Q2X, last name Test.",
   "expect": "Bag-drop guidance and the bag's tracking state."
  },
  {
   "row": 18,
   "journeyStep": "Get to the Airport",
   "action": "Access boarding pass & trip docs",
   "page": "/manage",
   "tools": [
    "check_in"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Pull up my boarding pass — booking FA7Q2X, last name Test.",
   "expect": "The check-in result carrying the boarding pass details."
  },
  {
   "row": 19,
   "journeyStep": "Get to the Airport",
   "action": "Act on a disruption (rebook / voucher)",
   "page": "/my-trips/vouchers?pnr=FA7Q2X&lastname=Test",
   "tools": [
    "disruption_actions",
    "voucher_eligibility",
    "getVoucherEligibility"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "My flight was disrupted. What are my options, and am I owed a voucher? The affected booking is FA4D5R, last name Test.",
   "expect": "Disruption action cards for FA4D5R (e.g. rebook to earlier flight) and 'Eligible for a SAR 300 voucher'."
  },
  {
   "row": 20,
   "journeyStep": "Take Flight",
   "action": "Manage onboard extras (meal, Wi-Fi)",
   "page": "/manage-booking/preorder-services",
   "tools": [
    "food_preorder"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Pre-order a meal for my flight — booking FA7Q2X, last name Test. What are my options?",
   "expect": "The food preorder options for the booking."
  },
  {
   "row": 21,
   "journeyStep": "Connect",
   "action": "Monitor connection protection",
   "page": "/my-bookings",
   "tools": [
    "connection_protection"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "If my first leg runs late, is my connection protected? Booking FA7Q2X, last name Test.",
   "expect": "The connection-protection status for the itinerary."
  },
  {
   "row": 22,
   "journeyStep": "Connect",
   "action": "Rebook a missed connection",
   "page": "/missed-connection",
   "tools": [
    "missed_connection_rebook"
   ],
   "precondition": "booking-funnel",
   "hitl": true,
   "expectWall": false,
   "prompt": "I just missed my connection — rebook me on the next best option. Booking FA7Q2X, last name Test. Confirm when asked.",
   "expect": "Rebooking options; completes after the confirm: true re-call. (Priority rebooking on /rebook is an HTTP x402 payment challenge by design.)"
  },
  {
   "row": 23,
   "journeyStep": "Connect",
   "action": "Get transfer & routing guidance",
   "page": "/flight-status/transfer-guide",
   "tools": [
    "transfer_guide"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "How do I transfer between my flights at the hub — which terminal, how long do I need? Booking FA7Q2X, last name Test.",
   "expect": "Transfer routing guidance for the connection."
  },
  {
   "row": 24,
   "journeyStep": "Arrive",
   "action": "File a baggage report",
   "page": "/baggage-claim-form?pnr=FA7Q2X&lastname=Test",
   "tools": [
    "baggage_claim_guidance",
    "baggage_claim_prefill",
    "getBaggageStatus"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "My bag did not arrive. File a baggage report for booking FA7Q2X, last name Test — pre-fill whatever you can from the booking.",
   "expect": "Claim guidance plus the pre-filled claim; getBaggageStatus answers on its own page with staged credentials."
  },
  {
   "row": 25,
   "journeyStep": "Arrive",
   "action": "Check & claim disruption compensation",
   "page": "/refund/claim",
   "tools": [
    "claim_precheck"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Am I eligible for compensation for the disruption? Booking FA7Q2X, last name Test — pre-check my claim.",
   "expect": "The claim eligibility pre-check verdict for the booking."
  },
  {
   "row": 26,
   "journeyStep": "Arrive",
   "action": "Share post-trip feedback",
   "page": "/feedback/post-trip",
   "tools": [
    "post_flight_feedback"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Send my post-trip feedback for booking FA7Q2X (last name Test): flight was smooth, baggage delivery was slow.",
   "expect": "The feedback flow acknowledging the submission for the booking."
  },
  {
   "row": 27,
   "journeyStep": "Stay Involved",
   "action": "Manage loyalty (status, miles)",
   "page": "/account/loyalty",
   "tools": [
    "loyalty_status",
    "missing_miles"
   ],
   "precondition": "booking-funnel",
   "hitl": true,
   "expectWall": false,
   "prompt": "What is my loyalty status, and claim the miles missing from my last flight. Membership FA-0451-GOLD, last name Test — confirm the claim when asked.",
   "expect": "Loyalty standing (tier + points), and the missing-miles claim flow signed in as FA-0451-GOLD (confirm: true completes it).",
   "creds": "member"
  },
  {
   "row": 28,
   "journeyStep": "Stay Involved",
   "action": "Manage profile, preferences & consent",
   "page": "/account/preferences",
   "tools": [
    "preferences"
   ],
   "precondition": "booking-funnel",
   "hitl": true,
   "expectWall": false,
   "prompt": "Update my preferences: aisle seat, and opt me out of marketing emails. Membership FA-0451-GOLD, last name Test — confirm when asked.",
   "expect": "The preference & consent center signed in; the edit completes after the confirm: true re-call.",
   "creds": "member"
  },
  {
   "row": 29,
   "journeyStep": "Stay Involved",
   "action": "Receive proactive next-trip offers",
   "page": "/account/dashboard",
   "tools": [
    "next_trip_offers"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "Based on my travel history, is there a trip I should book next? Membership FA-0451-GOLD, last name Test.",
   "expect": "Personalized next-trip recommendations built from the account's booking history.",
   "creds": "member"
  },
  {
   "row": 30,
   "journeyStep": "Help",
   "action": "Get policy & FAQ answers",
   "page": "/policy",
   "tools": [
    "getChangePolicy"
   ],
   "precondition": "none",
   "hitl": false,
   "expectWall": false,
   "prompt": "Explain the change and cancellation policy in plain words — how long is the free-change window?",
   "expect": "The change-policy explanation with the stated free-change window."
  },
  {
   "row": 31,
   "journeyStep": "Help",
   "action": "File & track a support case",
   "page": "/support/claims",
   "tools": [
    "claims_assistant"
   ],
   "precondition": "booking-funnel",
   "hitl": false,
   "expectWall": false,
   "prompt": "File a support case about my delayed bag — booking FA7Q2X, last name Test — and tell me how to track it.",
   "expect": "The claims options / case flow for the booking."
  },
  {
   "row": 32,
   "journeyStep": "Help",
   "action": "Escalate to a human with context",
   "page": "/support/escalate",
   "tools": [
    "escalate_case"
   ],
   "precondition": "booking-funnel",
   "hitl": true,
   "expectWall": false,
   "prompt": "This is not getting resolved — hand me to a human agent with a summary of everything so far. Confirm the handoff when asked.",
   "expect": "needsConfirmation first; the confirmed call packages the case summary for the human handoff."
  }
 ]
}