{
  "generated_at": "2026-06-24T02:15:12.974Z",
  "storage": {
    "mode": "persisted",
    "snapshot_kind": "decisions",
    "generated_at": "2026-06-24T02:15:12.974Z",
    "stored_at": "2026-06-24T02:16:27.798Z",
    "fresh": false
  },
  "family": {
    "id": "route-check",
    "name": "Route check",
    "decisionType": "route_check",
    "status": "active",
    "endpoint": "/api/decisions/route-check",
    "note": "Checks high-value route templates using destination scores, transfer nodes, airport-weather context, airport-ground-access support, official airport pickup-rule context, official passenger board-surface support, airport-scale context, airport environmental-support context, rail-support context, official rail presence where the route can plausibly use it, and live pier or transfer support where coastal legs matter.",
    "output": "Route feasibility, main breaker, and pivot."
  },
  "decision_count": 5,
  "filters": {
    "destination": "all",
    "city": "all",
    "route": "all",
    "limit": "all"
  },
  "rows": [
    {
      "decision_id": "route_bangkok-ayutthaya-kanchanaburi",
      "decision_type": "route_check",
      "subject_id": "bangkok-ayutthaya-kanchanaburi",
      "subject_name": "Bangkok -> Ayutthaya -> Kanchanaburi",
      "subject_type": "route",
      "score": 67,
      "component_score": 73.5,
      "penalty_points": 6,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Bangkok -> Ayutthaya -> Kanchanaburi is a cautious route shape right now.",
      "best_for": "Easy central-Thai culture loop with lower airport dependence.",
      "avoid_if": "You only have a rushed long weekend and hate transfers.",
      "check_first": [
        "heat exposure",
        "road and rail comfort",
        "whether Kanchanaburi is actually worth the detour for this trip shape"
      ],
      "next_action": "Use Bangkok as the base and decide whether both side trips really belong in the same short window.",
      "pivot": "Drop Kanchanaburi first if the loop starts to feel too transfer-heavy.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 19,
        "available_components": 19,
        "live_components": 16,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_average",
          "label": "Destination fit average",
          "score": 62.666666666666664,
          "weight": 0.34,
          "contribution": 21.31,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Average destination strength across the route chain."
        },
        {
          "key": "weakest_destination",
          "label": "Weakest destination leg",
          "score": 59,
          "weight": 0.18,
          "contribution": 10.62,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "No weakest destination leg was available, so the route uses the average destination score.",
          "note": ""
        },
        {
          "key": "transport_average",
          "label": "Transport friction average",
          "score": 77.75,
          "weight": 0.16,
          "contribution": 12.44,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.08,
          "contribution": 7.04,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context across overland route legs, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "rain_average",
          "label": "Rain fit average",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 60,
          "weight": 0.1,
          "contribution": 6,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context on flight-dependent legs, not airline on-time performance."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 74.33333333333333,
          "weight": 0.08,
          "contribution": 5.95,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure across the route chain, not live train seat, timetable, or disruption truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 83.33333333333333,
          "weight": 0.06,
          "contribution": 5,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 84.5,
          "weight": 0.04,
          "contribution": 3.38,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support across the route chain for overland route-search confidence, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context across the route chain, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT GPS and Taxi OK regulated-taxi oversight, complaint, and station-search support across the route chain, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_motorcycle_taxi_support",
          "label": "Official motorcycle-taxi support",
          "score": 73,
          "weight": 0.03,
          "contribution": 2.19,
          "source": "signal",
          "signal_type": "official_motorcycle_taxi_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official Bangkok motorcycle-taxi stand and driver coverage from the public DLT/data.go.th dataset, useful as route-level last-mile support context rather than live availability, dispatch, or queue truth."
        },
        {
          "key": "taxi_pickup_dropoff_support",
          "label": "Taxi pickup and dropoff support",
          "score": 88.5,
          "weight": 0.03,
          "contribution": 2.65,
          "source": "signal",
          "signal_type": "taxi_pickup_dropoff_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public OTP monthly taxi GPS analytics and hotspot context across Bangkok-linked route nodes, useful as aggregate pickup/dropoff support rather than live dispatch, ETA, queue, or raw trip truth."
        },
        {
          "key": "urban_rapid_transit_support",
          "label": "Urban rapid-transit support",
          "score": 94.5,
          "weight": 0.05,
          "contribution": 4.73,
          "source": "signal",
          "signal_type": "urban_rapid_transit_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BTS and MRTA route-map and service-page support on Bangkok-linked route nodes, not live headway, crowding, or outage truth."
        },
        {
          "key": "urban_bus_operator_support",
          "label": "Urban bus-operator support",
          "score": 74,
          "weight": 0.04,
          "contribution": 2.96,
          "source": "signal",
          "signal_type": "urban_bus_operator_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public Thai Smile Group branch and depot footprint on Bangkok-linked route nodes, useful as fallback urban bus support rather than live bus operations truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context across nature-heavy route legs, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "node_confidence",
          "label": "Transfer-node confidence",
          "score": 97,
          "weight": 0.08,
          "contribution": 7.76,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "route_baseline",
          "label": "Route template baseline",
          "score": 65.47222222222221,
          "weight": 0.06,
          "contribution": 3.93,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Route templates now act as low-weight route-shape hints instead of dominating the score."
        }
      ],
      "penalty_components": [
        {
          "key": "freshness_penalty",
          "label": "Freshness penalty",
          "freshness_class": "fresh",
          "points": 0,
          "applied": false,
          "note": "Signals are fresh enough that no freshness penalty applies."
        },
        {
          "key": "coverage_penalty",
          "label": "Coverage penalty",
          "defaulted_components": 0,
          "points": 0,
          "applied": false,
          "note": "All decision components are covered by live or persisted graph values."
        },
        {
          "key": "contradiction_penalty",
          "label": "Route contradiction penalty",
          "points": 6,
          "applied": true,
          "spread": 41,
          "note": "Component scores spread by 41 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "3 destination anchors and 1 transfer nodes support this route check.",
      "main_risk": "Regional disaster context is busy",
      "weakest_leg": "Kanchanaburi",
      "path": "/routes/bangkok-ayutthaya-kanchanaburi/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:16:17.590Z"
    },
    {
      "decision_id": "route_bangkok-chiang-mai-phuket",
      "decision_type": "route_check",
      "subject_id": "bangkok-chiang-mai-phuket",
      "subject_name": "Bangkok -> Chiang Mai -> Phuket",
      "subject_type": "route",
      "score": 61,
      "component_score": 70.1,
      "penalty_points": 9,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Bangkok -> Chiang Mai -> Phuket is a cautious route shape right now.",
      "best_for": "Classic first trip with city depth, northern culture, and a beach finish.",
      "avoid_if": "Northern AQI is weak or you need a fully overland route.",
      "check_first": [
        "Chiang Mai PM2.5",
        "airport timing between long legs",
        "beach area choice in Phuket"
      ],
      "next_action": "Lock Bangkok and Phuket first, then leave the Chiang Mai segment soft until AQI feels solid.",
      "pivot": "Go Bangkok -> Phuket directly if the north weakens.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 28,
        "available_components": 28,
        "live_components": 25,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_average",
          "label": "Destination fit average",
          "score": 62.333333333333336,
          "weight": 0.34,
          "contribution": 21.19,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Average destination strength across the route chain."
        },
        {
          "key": "weakest_destination",
          "label": "Weakest destination leg",
          "score": 57,
          "weight": 0.18,
          "contribution": 10.26,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "No weakest destination leg was available, so the route uses the average destination score.",
          "note": ""
        },
        {
          "key": "transport_average",
          "label": "Transport friction average",
          "score": 70.71428571428571,
          "weight": 0.16,
          "contribution": 11.31,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.08,
          "contribution": 7.04,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context across overland route legs, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "rain_average",
          "label": "Rain fit average",
          "score": 52,
          "weight": 0.1,
          "contribution": 5.2,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "marine_warning_risk",
          "label": "Marine warning risk",
          "score": 34,
          "weight": 0.1,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "marine_warning_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is coastal sea-state caution for ferry- or island-shaped route legs."
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 82,
          "weight": 0.05,
          "contribution": 4.1,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public Marine Department berth-surface movement evidence across coastal route anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 47,
          "weight": 0.08,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public transfer support around pier and coastal route anchors, not operator schedule truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 96,
          "weight": 0.06,
          "contribution": 5.76,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support across coastal route anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 62.57142857142857,
          "weight": 0.1,
          "contribution": 6.26,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context on flight-dependent legs, not airline on-time performance."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 62.75,
          "weight": 0.08,
          "contribution": 5.02,
          "source": "signal",
          "signal_type": "airport_transfer_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public ground-access support around route airport nodes, not live check-in or queue truth."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 60,
          "weight": 0.06,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "airport_ground_service_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official airport taxi, Grab, rental, and pickup-rule context around route airport nodes, not live queue, ETA, or rental inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "airport_board_surface_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official passenger self-serve board visibility from public AOT flight-status pages, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 72,
          "weight": 0.05,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "airport_scale_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official AOT passenger and aircraft-movement scale context around route airport nodes, not live airline on-time, queue, gate, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context around route airport nodes, not live measured sound-level truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 69.5,
          "weight": 0.08,
          "contribution": 5.56,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure across the route chain, not live train seat, timetable, or disruption truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 83.33333333333333,
          "weight": 0.06,
          "contribution": 5,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 80.33333333333333,
          "weight": 0.04,
          "contribution": 3.21,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support across the route chain for overland route-search confidence, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 92.33333333333333,
          "weight": 0.04,
          "contribution": 3.69,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context across the route chain, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 93.71428571428571,
          "weight": 0.04,
          "contribution": 3.75,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT GPS and Taxi OK regulated-taxi oversight, complaint, and station-search support across the route chain, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_motorcycle_taxi_support",
          "label": "Official motorcycle-taxi support",
          "score": 56.333333333333336,
          "weight": 0.03,
          "contribution": 1.69,
          "source": "signal",
          "signal_type": "official_motorcycle_taxi_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official Bangkok motorcycle-taxi stand and driver coverage from the public DLT/data.go.th dataset, useful as route-level last-mile support context rather than live availability, dispatch, or queue truth."
        },
        {
          "key": "taxi_pickup_dropoff_support",
          "label": "Taxi pickup and dropoff support",
          "score": 81,
          "weight": 0.03,
          "contribution": 2.43,
          "source": "signal",
          "signal_type": "taxi_pickup_dropoff_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public OTP monthly taxi GPS analytics and hotspot context across Bangkok-linked route nodes, useful as aggregate pickup/dropoff support rather than live dispatch, ETA, queue, or raw trip truth."
        },
        {
          "key": "urban_rapid_transit_support",
          "label": "Urban rapid-transit support",
          "score": 98,
          "weight": 0.05,
          "contribution": 4.9,
          "source": "signal",
          "signal_type": "urban_rapid_transit_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BTS and MRTA route-map and service-page support on Bangkok-linked route nodes, not live headway, crowding, or outage truth."
        },
        {
          "key": "urban_bus_operator_support",
          "label": "Urban bus-operator support",
          "score": 88,
          "weight": 0.04,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "urban_bus_operator_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public Thai Smile Group branch and depot footprint on Bangkok-linked route nodes, useful as fallback urban bus support rather than live bus operations truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 89,
          "weight": 0.04,
          "contribution": 3.56,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context across nature-heavy route legs, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "node_confidence",
          "label": "Transfer-node confidence",
          "score": 97,
          "weight": 0.08,
          "contribution": 7.76,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "route_baseline",
          "label": "Route template baseline",
          "score": 61.68253968253968,
          "weight": 0.06,
          "contribution": 3.7,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Route templates now act as low-weight route-shape hints instead of dominating the score."
        }
      ],
      "penalty_components": [
        {
          "key": "freshness_penalty",
          "label": "Freshness penalty",
          "freshness_class": "fresh",
          "points": 0,
          "applied": false,
          "note": "Signals are fresh enough that no freshness penalty applies."
        },
        {
          "key": "coverage_penalty",
          "label": "Coverage penalty",
          "defaulted_components": 0,
          "points": 0,
          "applied": false,
          "note": "All decision components are covered by live or persisted graph values."
        },
        {
          "key": "contradiction_penalty",
          "label": "Route contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 64,
          "note": "Component scores spread by 64 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "3 destination anchors and 4 transfer nodes support this route check.",
      "main_risk": "Airport transfer support is weak",
      "weakest_leg": "Phuket",
      "path": "/routes/bangkok-chiang-mai-phuket/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:16:17.590Z"
    },
    {
      "decision_id": "route_chiang-mai-pai-chiang-rai",
      "decision_type": "route_check",
      "subject_id": "chiang-mai-pai-chiang-rai",
      "subject_name": "Chiang Mai -> Pai / Chiang Rai north loop",
      "subject_type": "route",
      "score": 60,
      "component_score": 69.4,
      "penalty_points": 9,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Chiang Mai -> Pai / Chiang Rai north loop is a cautious route shape right now.",
      "best_for": "Repeat visitors who want the north to stay the main character.",
      "avoid_if": "AQI is elevated or the group has low road tolerance.",
      "check_first": [
        "PM2.5",
        "mountain weather",
        "road tolerance",
        "whether Pai is optional or emotionally fixed"
      ],
      "next_action": "Let Chiang Mai stay strong on its own before you add the road burden.",
      "pivot": "Keep Chiang Mai only, or shift south if air quality fails.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 19,
        "available_components": 19,
        "live_components": 16,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_average",
          "label": "Destination fit average",
          "score": 60,
          "weight": 0.34,
          "contribution": 20.4,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Average destination strength across the route chain."
        },
        {
          "key": "weakest_destination",
          "label": "Weakest destination leg",
          "score": 55,
          "weight": 0.18,
          "contribution": 9.9,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "No weakest destination leg was available, so the route uses the average destination score.",
          "note": ""
        },
        {
          "key": "transport_average",
          "label": "Transport friction average",
          "score": 65.33333333333333,
          "weight": 0.16,
          "contribution": 10.45,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.08,
          "contribution": 7.04,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context across overland route legs, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "rain_average",
          "label": "Rain fit average",
          "score": 54,
          "weight": 0.1,
          "contribution": 5.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 60,
          "weight": 0.1,
          "contribution": 6,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context on flight-dependent legs, not airline on-time performance."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 59,
          "weight": 0.08,
          "contribution": 4.72,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure across the route chain, not live train seat, timetable, or disruption truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 91,
          "weight": 0.06,
          "contribution": 5.46,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 84,
          "weight": 0.04,
          "contribution": 3.36,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support across the route chain for overland route-search confidence, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context across the route chain, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT GPS and Taxi OK regulated-taxi oversight, complaint, and station-search support across the route chain, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_motorcycle_taxi_support",
          "label": "Official motorcycle-taxi support",
          "score": 58,
          "weight": 0.03,
          "contribution": 1.74,
          "source": "signal",
          "signal_type": "official_motorcycle_taxi_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official Bangkok motorcycle-taxi stand and driver coverage from the public DLT/data.go.th dataset, useful as route-level last-mile support context rather than live availability, dispatch, or queue truth."
        },
        {
          "key": "taxi_pickup_dropoff_support",
          "label": "Taxi pickup and dropoff support",
          "score": 85,
          "weight": 0.03,
          "contribution": 2.55,
          "source": "signal",
          "signal_type": "taxi_pickup_dropoff_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public OTP monthly taxi GPS analytics and hotspot context across Bangkok-linked route nodes, useful as aggregate pickup/dropoff support rather than live dispatch, ETA, queue, or raw trip truth."
        },
        {
          "key": "urban_rapid_transit_support",
          "label": "Urban rapid-transit support",
          "score": 91,
          "weight": 0.05,
          "contribution": 4.55,
          "source": "signal",
          "signal_type": "urban_rapid_transit_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BTS and MRTA route-map and service-page support on Bangkok-linked route nodes, not live headway, crowding, or outage truth."
        },
        {
          "key": "urban_bus_operator_support",
          "label": "Urban bus-operator support",
          "score": 60,
          "weight": 0.04,
          "contribution": 2.4,
          "source": "signal",
          "signal_type": "urban_bus_operator_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public Thai Smile Group branch and depot footprint on Bangkok-linked route nodes, useful as fallback urban bus support rather than live bus operations truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 91,
          "weight": 0.04,
          "contribution": 3.64,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context across nature-heavy route legs, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "node_confidence",
          "label": "Transfer-node confidence",
          "score": 97,
          "weight": 0.08,
          "contribution": 7.76,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "route_baseline",
          "label": "Route template baseline",
          "score": 59.77777777777777,
          "weight": 0.06,
          "contribution": 3.59,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Route templates now act as low-weight route-shape hints instead of dominating the score."
        }
      ],
      "penalty_components": [
        {
          "key": "freshness_penalty",
          "label": "Freshness penalty",
          "freshness_class": "fresh",
          "points": 0,
          "applied": false,
          "note": "Signals are fresh enough that no freshness penalty applies."
        },
        {
          "key": "coverage_penalty",
          "label": "Coverage penalty",
          "defaulted_components": 0,
          "points": 0,
          "applied": false,
          "note": "All decision components are covered by live or persisted graph values."
        },
        {
          "key": "contradiction_penalty",
          "label": "Route contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 43,
          "note": "Component scores spread by 43 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "2 destination anchors and 1 transfer nodes support this route check.",
      "main_risk": "Road safety burden is high",
      "weakest_leg": "Pai",
      "path": "/routes/chiang-mai-pai-chiang-rai/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:16:17.590Z"
    },
    {
      "decision_id": "route_phuket-krabi-koh-lanta",
      "decision_type": "route_check",
      "subject_id": "phuket-krabi-koh-lanta",
      "subject_name": "Phuket -> Krabi / Koh Lanta coast chain",
      "subject_type": "route",
      "score": 55,
      "component_score": 63.6,
      "penalty_points": 9,
      "confidence": "Medium",
      "label": "fragile",
      "recommendation": "Phuket -> Krabi / Koh Lanta coast chain is a cautious route shape right now.",
      "best_for": "Andaman scenery and flexible beach pacing.",
      "avoid_if": "The trip depends on tight ferries or you need maximum weather resilience.",
      "check_first": [
        "Andaman weather",
        "pier timing",
        "whether Phuket should stay the stable base"
      ],
      "next_action": "Keep at least one hotel refundable and do not make every scenic stop mandatory.",
      "pivot": "Use Phuket as the infrastructure answer if boats weaken.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 17,
        "available_components": 17,
        "live_components": 14,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_average",
          "label": "Destination fit average",
          "score": 55.5,
          "weight": 0.34,
          "contribution": 18.87,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Average destination strength across the route chain."
        },
        {
          "key": "weakest_destination",
          "label": "Weakest destination leg",
          "score": 54,
          "weight": 0.18,
          "contribution": 9.72,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "No weakest destination leg was available, so the route uses the average destination score.",
          "note": ""
        },
        {
          "key": "transport_average",
          "label": "Transport friction average",
          "score": 60.666666666666664,
          "weight": 0.16,
          "contribution": 9.71,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_average",
          "label": "Rain fit average",
          "score": 44,
          "weight": 0.1,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "marine_warning_risk",
          "label": "Marine warning risk",
          "score": 34,
          "weight": 0.1,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "marine_warning_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is coastal sea-state caution for ferry- or island-shaped route legs."
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 83.33333333333333,
          "weight": 0.05,
          "contribution": 4.17,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public Marine Department berth-surface movement evidence across coastal route anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 60,
          "weight": 0.08,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public transfer support around pier and coastal route anchors, not operator schedule truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 90.66666666666667,
          "weight": 0.06,
          "contribution": 5.44,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support across coastal route anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 69,
          "weight": 0.1,
          "contribution": 6.9,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context on flight-dependent legs, not airline on-time performance."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 73,
          "weight": 0.06,
          "contribution": 4.38,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 67.5,
          "weight": 0.04,
          "contribution": 2.7,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support across the route chain for overland route-search confidence, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 89,
          "weight": 0.04,
          "contribution": 3.56,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context across the route chain, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 84,
          "weight": 0.04,
          "contribution": 3.36,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT GPS and Taxi OK regulated-taxi oversight, complaint, and station-search support across the route chain, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 91,
          "weight": 0.04,
          "contribution": 3.64,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context across nature-heavy route legs, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "node_confidence",
          "label": "Transfer-node confidence",
          "score": 97,
          "weight": 0.08,
          "contribution": 7.76,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "route_baseline",
          "label": "Route template baseline",
          "score": 53.388888888888886,
          "weight": 0.06,
          "contribution": 3.2,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Route templates now act as low-weight route-shape hints instead of dominating the score."
        }
      ],
      "penalty_components": [
        {
          "key": "freshness_penalty",
          "label": "Freshness penalty",
          "freshness_class": "fresh",
          "points": 0,
          "applied": false,
          "note": "Signals are fresh enough that no freshness penalty applies."
        },
        {
          "key": "coverage_penalty",
          "label": "Coverage penalty",
          "defaulted_components": 0,
          "points": 0,
          "applied": false,
          "note": "All decision components are covered by live or persisted graph values."
        },
        {
          "key": "contradiction_penalty",
          "label": "Route contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 63,
          "note": "Component scores spread by 63 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "2 destination anchors and 1 transfer nodes support this route check.",
      "main_risk": "Marine warning risk is high",
      "weakest_leg": "Krabi",
      "path": "/routes/phuket-krabi-koh-lanta/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:16:17.590Z"
    },
    {
      "decision_id": "route_samui-phangan-tao",
      "decision_type": "route_check",
      "subject_id": "samui-phangan-tao",
      "subject_name": "Samui -> Phangan / Tao island chain",
      "subject_type": "route",
      "score": 54,
      "component_score": 62.7,
      "penalty_points": 9,
      "confidence": "Medium",
      "label": "fragile",
      "recommendation": "Samui -> Phangan / Tao island chain is a cautious route shape right now.",
      "best_for": "Gulf island pacing when weather and ferry timing cooperate.",
      "avoid_if": "You need a no-risk transfer chain or are forcing too many islands into a short trip.",
      "check_first": [
        "Gulf weather",
        "last boat timing",
        "mainland-to-pier burden",
        "event timing on Phangan"
      ],
      "next_action": "Keep Samui as the stable base and make extra islands earn their place.",
      "pivot": "Stay on Samui only if the chain looks brittle.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 15,
        "available_components": 15,
        "live_components": 12,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_average",
          "label": "Destination fit average",
          "score": 58.5,
          "weight": 0.34,
          "contribution": 19.89,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Average destination strength across the route chain."
        },
        {
          "key": "weakest_destination",
          "label": "Weakest destination leg",
          "score": 58,
          "weight": 0.18,
          "contribution": 10.44,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "No weakest destination leg was available, so the route uses the average destination score.",
          "note": ""
        },
        {
          "key": "transport_average",
          "label": "Transport friction average",
          "score": 58,
          "weight": 0.16,
          "contribution": 9.28,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_average",
          "label": "Rain fit average",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "marine_warning_risk",
          "label": "Marine warning risk",
          "score": 34,
          "weight": 0.1,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "marine_warning_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is coastal sea-state caution for ferry- or island-shaped route legs."
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 72,
          "weight": 0.05,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public Marine Department berth-surface movement evidence across coastal route anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 23.5,
          "weight": 0.08,
          "contribution": 1.88,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public transfer support around pier and coastal route anchors, not operator schedule truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 96,
          "weight": 0.06,
          "contribution": 5.76,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support across coastal route anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 93,
          "weight": 0.1,
          "contribution": 9.3,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context on flight-dependent legs, not airline on-time performance."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 68,
          "weight": 0.06,
          "contribution": 4.08,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 58,
          "weight": 0.04,
          "contribution": 2.32,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support across the route chain for overland backup and bus-linked resilience, not live departure or booking truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 81,
          "weight": 0.04,
          "contribution": 3.24,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context across the route chain, not local realtime service quality or dispatch truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 84,
          "weight": 0.04,
          "contribution": 3.36,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context across nature-heavy route legs, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "node_confidence",
          "label": "Transfer-node confidence",
          "score": 97,
          "weight": 0.08,
          "contribution": 7.76,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "route_baseline",
          "label": "Route template baseline",
          "score": 57.5,
          "weight": 0.06,
          "contribution": 3.45,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": "Route templates now act as low-weight route-shape hints instead of dominating the score."
        }
      ],
      "penalty_components": [
        {
          "key": "freshness_penalty",
          "label": "Freshness penalty",
          "freshness_class": "fresh",
          "points": 0,
          "applied": false,
          "note": "Signals are fresh enough that no freshness penalty applies."
        },
        {
          "key": "coverage_penalty",
          "label": "Coverage penalty",
          "defaulted_components": 0,
          "points": 0,
          "applied": false,
          "note": "All decision components are covered by live or persisted graph values."
        },
        {
          "key": "contradiction_penalty",
          "label": "Route contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 73.5,
          "note": "Component scores spread by 74 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "2 destination anchors and 2 transfer nodes support this route check.",
      "main_risk": "Pier transfer support is weak",
      "weakest_leg": "Koh Phangan",
      "path": "/routes/koh-samui-koh-phangan-koh-tao/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:16:17.590Z"
    }
  ]
}