{
  "schema": "https://parkmagiclive.com/schemas/agent-sitemap.v1.json",
  "version": "2026-06-19",
  "site": {
    "name": "Park Magic Live",
    "description": "Live Disney parks planning app with wait intelligence, park planning, trip intelligence, preference questions, news, photos, support, and account tools.",
    "productionOrigin": "https://parkmagiclive.com",
    "testOrigin": "https://test.parkmagiclive.com",
    "canonicalAgentGuide": "/llms.txt",
    "uppercaseAgentGuideAlias": "/LLMs.txt",
    "xmlSitemap": "/sitemap.xml"
  },
  "routing": {
    "type": "hash",
    "rule": "Use the URL fragment after #/ for app pages. Do not rewrite hash routes as server paths unless listed as an alias.",
    "home": "/#/",
    "navigationEvent": "hashchange"
  },
  "agentPolicies": [
    "Safe read-only navigation is allowed for public pages and public API view models.",
    "Use same-origin Hono API endpoints for public data and Brain interactions.",
    "Do not call direct Convex endpoints from customer-facing automation.",
    "Do not bypass authentication on account, trip, admin, support history, payment, or private location surfaces.",
    "Only submit answers, support messages, photos, account changes, trip data, location data, or payment actions when the user explicitly requests that action.",
    "Do not perform refunds or payment adjustments autonomously."
  ],
  "routes": [
    {
      "id": "home",
      "label": "Today",
      "url": "https://parkmagiclive.com/#/",
      "testUrl": "https://test.parkmagiclive.com/#/",
      "hash": "#/",
      "auth": "public",
      "dataMode": "home",
      "preferredApi": "GET /api/mobile/home",
      "purpose": "Daily overview, live highlights, quick picks, news, and planning entry points.",
      "safeAgentActions": ["read visible overview", "open linked public sections", "read public home view model"],
      "writeActions": []
    },
    {
      "id": "wait-board",
      "label": "Waits",
      "url": "https://parkmagiclive.com/#/wait-board",
      "testUrl": "https://test.parkmagiclive.com/#/wait-board",
      "hash": "#/wait-board",
      "auth": "public",
      "dataMode": "wait-board",
      "preferredApi": "GET /api/mobile/waits",
      "purpose": "Wait Intelligence Board with current waits, historical context, projections, and park pulse map.",
      "safeAgentActions": ["read current waits", "compare public ride signals", "read public waits view model"],
      "writeActions": ["Brain sprinkle answers only after user selection"]
    },
    {
      "id": "park-planner",
      "label": "Planner",
      "url": "https://parkmagiclive.com/#/park-planner",
      "testUrl": "https://test.parkmagiclive.com/#/park-planner",
      "hash": "#/park-planner",
      "auth": "public",
      "dataMode": "planner",
      "preferredApi": "GET /api/mobile/planner",
      "purpose": "Crowd calendar, park projections, and planning surfaces.",
      "safeAgentActions": ["read calendar projections", "read public planner view model"],
      "writeActions": ["Brain sprinkle answers only after user selection"]
    },
    {
      "id": "brain",
      "label": "Perfect Park Week",
      "url": "https://parkmagiclive.com/#/brain",
      "testUrl": "https://test.parkmagiclive.com/#/brain",
      "hash": "#/brain",
      "auth": "public with guest key",
      "dataMode": "planner",
      "preferredApi": "POST /api/brain/game",
      "purpose": "Preference-based itinerary and weekly plan recommendations.",
      "safeAgentActions": ["read recommendations", "fetch Brain snapshot with a guest key"],
      "writeActions": ["POST /api/brain/answer after user chooses", "POST /api/brain/draft after user asks to save"]
    },
    {
      "id": "brain-picks",
      "label": "Tune Picks",
      "url": "https://parkmagiclive.com/#/brain/picks",
      "testUrl": "https://test.parkmagiclive.com/#/brain/picks",
      "hash": "#/brain/picks",
      "auth": "public with guest key",
      "dataMode": "brain",
      "preferredApi": "POST /api/brain/game",
      "purpose": "Reusable question cards for preference and ride-wait signal collection.",
      "safeAgentActions": ["read question cards", "fetch question snapshot with a guest key"],
      "writeActions": ["POST /api/brain/answer after user chooses"]
    },
    {
      "id": "trip-tracker",
      "label": "Trip Intelligence",
      "url": "https://parkmagiclive.com/#/trip-tracker",
      "testUrl": "https://test.parkmagiclive.com/#/trip-tracker",
      "hash": "#/trip-tracker",
      "auth": "public overview plus authenticated trip tools",
      "dataMode": "trip",
      "preferredApi": "GET /api/mobile/trip",
      "purpose": "Trip route, spending, location-aware planning, and account-linked trip tools.",
      "safeAgentActions": ["read public trip overview", "report login-required states"],
      "writeActions": ["authenticated trip, spending, and location changes only after explicit user request"]
    },
    {
      "id": "photos",
      "label": "Park Moments",
      "url": "https://parkmagiclive.com/#/photos",
      "testUrl": "https://test.parkmagiclive.com/#/photos",
      "hash": "#/photos",
      "auth": "public browsing plus authenticated uploads",
      "dataMode": "photos",
      "preferredApi": null,
      "purpose": "Guest photo moments and park media surface.",
      "safeAgentActions": ["read public visible photo surface"],
      "writeActions": ["photo uploads only after explicit user request"]
    },
    {
      "id": "news",
      "label": "News",
      "url": "https://parkmagiclive.com/#/news",
      "testUrl": "https://test.parkmagiclive.com/#/news",
      "hash": "#/news",
      "auth": "public",
      "dataMode": "news",
      "preferredApi": "GET /api/mobile/news",
      "purpose": "Park news archive and summaries.",
      "safeAgentActions": ["read article summaries", "open public article links", "read public news view model"],
      "writeActions": []
    },
    {
      "id": "support",
      "label": "Help",
      "url": "https://parkmagiclive.com/#/support",
      "testUrl": "https://test.parkmagiclive.com/#/support",
      "hash": "#/support",
      "auth": "public entry plus authenticated ticket history",
      "dataMode": "support",
      "preferredApi": null,
      "purpose": "Customer support chat, ticket history, and help entry point.",
      "safeAgentActions": ["read support options", "report login-required history states"],
      "writeActions": ["send support messages or create tickets only after explicit user request"]
    },
    {
      "id": "login",
      "label": "Sign In",
      "url": "https://parkmagiclive.com/#/login",
      "testUrl": "https://test.parkmagiclive.com/#/login",
      "hash": "#/login",
      "auth": "public form",
      "dataMode": "account",
      "preferredApi": null,
      "purpose": "Account login.",
      "safeAgentActions": ["report sign-in requirement"],
      "writeActions": ["enter credentials only when explicitly provided by the user for this site"]
    },
    {
      "id": "create-account",
      "label": "Create Account",
      "url": "https://parkmagiclive.com/#/create-account",
      "testUrl": "https://test.parkmagiclive.com/#/create-account",
      "hash": "#/create-account",
      "auth": "public form",
      "dataMode": "account",
      "preferredApi": null,
      "purpose": "Account creation.",
      "safeAgentActions": ["read account creation fields"],
      "writeActions": ["submit account creation only after explicit user request"]
    },
    {
      "id": "account-settings",
      "label": "Account Settings",
      "url": "https://parkmagiclive.com/#/account/settings",
      "testUrl": "https://test.parkmagiclive.com/#/account/settings",
      "hash": "#/account/settings",
      "auth": "authenticated",
      "dataMode": "account",
      "preferredApi": null,
      "purpose": "Authenticated account settings.",
      "safeAgentActions": ["report login-required states"],
      "writeActions": ["account changes only after explicit user request"]
    },
    {
      "id": "account-plus",
      "label": "Plus",
      "url": "https://parkmagiclive.com/#/account/plus",
      "testUrl": "https://test.parkmagiclive.com/#/account/plus",
      "hash": "#/account/plus",
      "auth": "authenticated",
      "dataMode": "plus",
      "preferredApi": null,
      "purpose": "Plus and Family plan surface.",
      "safeAgentActions": ["read public plan presentation", "report login-required states"],
      "writeActions": ["subscription or payment changes only after explicit user request"]
    },
    {
      "id": "admin",
      "label": "Admin",
      "url": "https://parkmagiclive.com/#/admin",
      "testUrl": "https://test.parkmagiclive.com/#/admin",
      "hash": "#/admin",
      "auth": "restricted admin",
      "dataMode": "admin",
      "preferredApi": "POST /api/admin/operations",
      "purpose": "Restricted operator/admin console.",
      "safeAgentActions": ["report login-required states"],
      "writeActions": ["none without an authenticated admin session and explicit operator request"]
    },
    {
      "id": "trivia",
      "label": "Trivia",
      "url": "https://parkmagiclive.com/#/trivia",
      "testUrl": "https://test.parkmagiclive.com/#/trivia",
      "hash": "#/trivia",
      "auth": "public",
      "dataMode": "trivia",
      "preferredApi": null,
      "purpose": "Trivia screen experience.",
      "safeAgentActions": ["read trivia screen"],
      "writeActions": []
    },
    {
      "id": "trivia-play",
      "label": "Trivia Play",
      "url": "https://parkmagiclive.com/#/trivia/play",
      "testUrl": "https://test.parkmagiclive.com/#/trivia/play",
      "hash": "#/trivia/play",
      "auth": "public",
      "dataMode": "trivia",
      "preferredApi": null,
      "purpose": "Interactive trivia play.",
      "safeAgentActions": ["read trivia question UI"],
      "writeActions": ["answer trivia only after user selection"]
    }
  ],
  "aliases": [
    { "from": "#/wait-intelligence", "to": "#/wait-board" },
    { "from": "#/desktop-wait-intelligence", "to": "#/wait-board" },
    { "from": "#/v2/waits", "to": "#/wait-board" },
    { "from": "#/planning", "to": "#/park-planner" },
    { "from": "#/planning-calendar", "to": "#/park-planner" },
    { "from": "#/help", "to": "#/support" },
    { "from": "#/customer-support", "to": "#/support" },
    { "from": "#/trip-intelligence", "to": "#/trip-tracker" },
    { "from": "#/trip-finance", "to": "#/trip-tracker" },
    { "from": "#/spending", "to": "#/trip-tracker" },
    { "from": "#/guide", "to": "#/trip-tracker" },
    { "from": "#/sign-in", "to": "#/login" },
    { "from": "#/signup", "to": "#/create-account" },
    { "from": "#/plus", "to": "#/account/plus" },
    { "from": "#/fan-brain", "to": "#/brain" },
    { "from": "#/fan-brain/picks", "to": "#/brain/picks" },
    { "from": "#/photo-feed", "to": "#/photos" },
    { "from": "#/moments", "to": "#/photos" },
    { "from": "#/blog", "to": "#/news" }
  ],
  "api": [
    {
      "method": "GET",
      "path": "/api/ready",
      "auth": "public",
      "purpose": "Readiness smoke check."
    },
    {
      "method": "GET",
      "path": "/api/health",
      "auth": "public",
      "purpose": "API health metadata."
    },
    {
      "method": "GET",
      "path": "/api/mobile/home",
      "auth": "public",
      "purpose": "Public Today/home view model."
    },
    {
      "method": "GET",
      "path": "/api/mobile/waits",
      "auth": "public",
      "purpose": "Public waits view model."
    },
    {
      "method": "GET",
      "path": "/api/mobile/planner",
      "auth": "public",
      "purpose": "Public planner view model."
    },
    {
      "method": "GET",
      "path": "/api/mobile/trip",
      "auth": "public",
      "purpose": "Public trip view model."
    },
    {
      "method": "GET",
      "path": "/api/mobile/news",
      "auth": "public",
      "purpose": "Public news view model."
    },
    {
      "method": "POST",
      "path": "/api/brain/game",
      "auth": "public guestKey",
      "purpose": "Fetch Brain game/question snapshot."
    },
    {
      "method": "POST",
      "path": "/api/brain/answer",
      "auth": "public guestKey",
      "purpose": "Save Brain answer after user selection."
    },
    {
      "method": "POST",
      "path": "/api/brain/draft",
      "auth": "public guestKey",
      "purpose": "Save Brain draft after user request."
    },
    {
      "method": "POST",
      "path": "/api/admin/operations",
      "auth": "admin session",
      "purpose": "Admin operations snapshot. Restricted."
    }
  ]
}
