{
  "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": "today",
    "name": "Where to go today",
    "decisionType": "where_to_go_today",
    "status": "active",
    "endpoint": "/api/decisions/today",
    "note": "Ranks destination entities using live AQI and comfort signals plus source confidence, regional context, and airport-scale, airport-access, airport board-surface, or airport environmental-support context where it materially changes the trip shape.",
    "output": "Best and weakest destination picks today."
  },
  "decision_count": 12,
  "filters": {
    "destination": "all",
    "city": "all",
    "route": "all",
    "limit": "all"
  },
  "rows": [
    {
      "decision_id": "today_bangkok",
      "decision_type": "where_to_go_today",
      "subject_id": "bangkok",
      "subject_name": "Bangkok",
      "subject_type": "destination",
      "score": 65,
      "component_score": 74.2,
      "penalty_points": 9,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Bangkok is a cautious today pick.",
      "best_for": "First trips, rainy-day resilience, food density, hospitals, and rail-linked city movement.",
      "avoid_if": "You want a quiet, taxi-heavy, or outdoor-only city break.",
      "check_first": [
        "Check Air4Thai before heavy outdoor days.",
        "Choose a BTS/MRT-linked base before paying for a hotel.",
        "Treat cross-city taxi-heavy days as a risk, not a default."
      ],
      "next_action": "Pick a BTS/MRT-linked base first, then shape temple, food, and river days around nearby zones.",
      "pivot": "Use Ayutthaya or Kanchanaburi as the easier side-trip move, or shift to a coast if city noise is the real problem.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 31,
        "available_components": 31,
        "live_components": 30,
        "fallback_components": 1,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 92,
          "weight": 0.16,
          "contribution": 14.72,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 95,
          "weight": 0.12,
          "contribution": 11.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.22,
          "contribution": 12.32,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 60,
          "weight": 0.08,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context, not airline on-time performance."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 82,
          "weight": 0.012,
          "contribution": 0.98,
          "source": "signal",
          "signal_type": "airport_transfer_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is ground-access support around the main airport anchor linked to the destination, not a live airline board."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_ground_service_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official airport taxi, Grab, rental, and pickup-rule context around the main airport anchor, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_board_surface_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official passenger self-serve board visibility from public AOT flight-status pages. The board rows themselves use a browser turnstile token, so this is not direct live airline status truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_scale_context",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official AOT passenger and aircraft-movement scale context behind the main airport anchor, not live delay, gate, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context around the main airport anchor, not live measured sound-level truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the destination, not live seat, delay, or operator-disruption truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 86,
          "weight": 0.012,
          "contribution": 1.03,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 92,
          "weight": 0.012,
          "contribution": 1.1,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_motorcycle_taxi_support",
          "label": "Official motorcycle-taxi support",
          "score": 88,
          "weight": 0.012,
          "contribution": 1.06,
          "source": "signal",
          "signal_type": "official_motorcycle_taxi_support",
          "entity_id": "bangkok",
          "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 last-mile support context rather than live availability, dispatch, or queue truth."
        },
        {
          "key": "taxi_pickup_dropoff_support",
          "label": "Taxi pickup and dropoff support",
          "score": 92,
          "weight": 0.012,
          "contribution": 1.1,
          "source": "signal",
          "signal_type": "taxi_pickup_dropoff_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is public OTP monthly taxi GPS analytics and hotspot coverage around Bangkok traveler entities, useful as aggregate demand and pickup/dropoff context rather than live dispatch, ETA, queue, or raw trip truth."
        },
        {
          "key": "urban_rapid_transit_support",
          "label": "Urban rapid-transit support",
          "score": 98,
          "weight": 0.012,
          "contribution": 1.18,
          "source": "signal",
          "signal_type": "urban_rapid_transit_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BTS and MRTA route-map and service-page support, not live headway, crowding, or outage truth."
        },
        {
          "key": "urban_bus_operator_support",
          "label": "Urban bus-operator support",
          "score": 88,
          "weight": 0.012,
          "contribution": 1.06,
          "source": "signal",
          "signal_type": "urban_bus_operator_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Thai Smile Group branch and depot footprint around Bangkok traveler entities, not realtime vehicle, ETA, crowding, or outage truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 44,
          "weight": 0.08,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.04,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 50,
          "weight": 0.05,
          "contribution": 2.5,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "civic_friction",
          "label": "Civic friction",
          "score": 63,
          "weight": 0.012,
          "contribution": 0.76,
          "source": "signal",
          "signal_type": "civic_friction",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Civic-friction signal missing for this Bangkok layer; using conservative fallback.",
          "note": "Civic friction is only weighted where Bangkok civic complaint statistics are available."
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 90,
          "weight": 0.05,
          "contribution": 4.5,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 88,
          "weight": 0.015,
          "contribution": 1.32,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 51,
          "note": "Component scores spread by 51 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "47 joined sources support this decision.",
      "weakest_signal": {
        "type": "flood_water_risk",
        "label": "Water and flood-adjacent risk is elevated",
        "reason": "Thaiwater status proxy scores 33 with dissolved oxygen 0 mg/L. This is a river and canal caution layer, not a full flood-stage model."
      },
      "related_pages": [
        {
          "path": "/today/bangkok/",
          "label": "Bangkok Today"
        },
        {
          "path": "/where-to-go/bangkok/",
          "label": "Bangkok destination guide"
        },
        {
          "path": "/accommodation/bangkok/",
          "label": "Where to stay in Bangkok"
        },
        {
          "path": "/venues/restaurants/bangkok/",
          "label": "Bangkok restaurants"
        },
        {
          "path": "/food/bangkok-food-guide/",
          "label": "Bangkok food guide"
        },
        {
          "path": "/temples/bangkok/",
          "label": "Bangkok temple route"
        },
        {
          "path": "/research/temples/bangkok/",
          "label": "Bangkok temple research"
        }
      ],
      "path": "/entities/bangkok/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T08:15:23.481Z"
    },
    {
      "decision_id": "today_chiang-mai",
      "decision_type": "where_to_go_today",
      "subject_id": "chiang-mai",
      "subject_name": "Chiang Mai",
      "subject_type": "destination",
      "score": 65,
      "component_score": 74.2,
      "penalty_points": 9,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Chiang Mai is a cautious today pick.",
      "best_for": "Culture, cafes, temples, northern food, and slower city pacing.",
      "avoid_if": "PM2.5 stays high or the trip depends on mountain views being crisp.",
      "check_first": [
        "Treat sustained PM2.5 as the main breaker.",
        "Choose Old City or Nimman based on trip shape, not a random deal.",
        "Keep Bangkok or the coast as a real pivot if smoke stays high."
      ],
      "next_action": "Check PM2.5 first, then choose Old City or Nimman before paying for side trips.",
      "pivot": "Pivot to Bangkok or the coast if smoke remains stubborn.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 26,
        "available_components": 26,
        "live_components": 25,
        "fallback_components": 1,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 92,
          "weight": 0.16,
          "contribution": 14.72,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 95,
          "weight": 0.12,
          "contribution": 11.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.22,
          "contribution": 12.32,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 60,
          "weight": 0.08,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context, not airline on-time performance."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 41,
          "weight": 0.012,
          "contribution": 0.49,
          "source": "signal",
          "signal_type": "airport_transfer_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is ground-access support around the main airport anchor linked to the destination, not a live airline board."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 42,
          "weight": 0.012,
          "contribution": 0.5,
          "source": "signal",
          "signal_type": "airport_ground_service_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official airport taxi, Grab, rental, and pickup-rule context around the main airport anchor, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_board_surface_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official passenger self-serve board visibility from public AOT flight-status pages. The board rows themselves use a browser turnstile token, so this is not direct live airline status truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 50,
          "weight": 0.012,
          "contribution": 0.6,
          "source": "signal",
          "signal_type": "airport_scale_context",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official AOT passenger and aircraft-movement scale context behind the main airport anchor, not live delay, gate, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context around the main airport anchor, not live measured sound-level truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 43,
          "weight": 0.012,
          "contribution": 0.52,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the destination, not live seat, delay, or operator-disruption truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 86,
          "weight": 0.012,
          "contribution": 1.03,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 72,
          "weight": 0.012,
          "contribution": 0.86,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 92,
          "weight": 0.012,
          "contribution": 1.1,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 84,
          "weight": 0.012,
          "contribution": 1.01,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 90,
          "weight": 0.012,
          "contribution": 1.08,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 88,
          "weight": 0.05,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 88,
          "weight": 0.05,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 63,
          "weight": 0.05,
          "contribution": 3.15,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 78,
          "weight": 0.015,
          "contribution": 1.17,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 49,
          "note": "Component scores spread by 49 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "30 joined sources support this decision.",
      "weakest_signal": {
        "type": "airport_transfer_support",
        "label": "Airport transfer support is weak",
        "reason": "Public transport structure around this airport shows 1 mapped stop(s), 1 mode group(s), 1 rail-linked stop(s), 0 airport-link stop(s), and 0 bus-linked stop(s). This is airport-ground-access support, not live airline board or queue truth."
      },
      "related_pages": [
        {
          "path": "/where-to-go/chiang-mai/",
          "label": "Chiang Mai destination guide"
        },
        {
          "path": "/accommodation/chiang-mai/",
          "label": "Where to stay in Chiang Mai"
        },
        {
          "path": "/food/chiang-mai-khao-soi/",
          "label": "Chiang Mai khao soi route"
        },
        {
          "path": "/today/north/",
          "label": "Northern Thailand Today"
        },
        {
          "path": "/food/chiang-mai-food-guide/",
          "label": "Chiang Mai food guide"
        },
        {
          "path": "/temples/chiang-mai/",
          "label": "Chiang Mai temple route"
        },
        {
          "path": "/research/temples/chiang-mai/",
          "label": "Chiang Mai temple research"
        }
      ],
      "path": "/entities/chiang-mai/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T08:15:23.481Z"
    },
    {
      "decision_id": "today_ayutthaya",
      "decision_type": "where_to_go_today",
      "subject_id": "ayutthaya",
      "subject_name": "Ayutthaya",
      "subject_type": "destination",
      "score": 64,
      "component_score": 75.3,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Ayutthaya is a cautious today pick.",
      "best_for": "Easy history from Bangkok with low commitment.",
      "avoid_if": "You hate heat exposure or want a slow overnight small-town mood instead.",
      "check_first": [
        "Start early in hot months.",
        "Use train or simple road logic rather than over-designing the transfer.",
        "Treat Bangkok as the hotel base unless the trip specifically wants slower nights."
      ],
      "next_action": "Go early, travel light, and keep the day tight enough to avoid a punishing noon slog.",
      "pivot": "Return to Bangkok early if heat becomes the real story.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 22,
        "available_components": 21,
        "live_components": 20,
        "fallback_components": 1,
        "defaulted_components": 1,
        "coverage_ratio": 0.955
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 92,
          "weight": 0.16,
          "contribution": 14.72,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 95,
          "weight": 0.12,
          "contribution": 11.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.22,
          "contribution": 12.32,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 82,
          "weight": 0.012,
          "contribution": 0.98,
          "source": "signal",
          "signal_type": "airport_transfer_support",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is ground-access support around the main airport anchor linked to the destination, not a live airline board."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_ground_service_support",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is official airport taxi, Grab, rental, and pickup-rule context around the main airport anchor, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_board_surface_support",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is official passenger self-serve board visibility from public AOT flight-status pages. The board rows themselves use a browser turnstile token, so this is not direct live airline status truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_scale_context",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is official AOT passenger and aircraft-movement scale context behind the main airport anchor, not live delay, gate, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context around the main airport anchor, not live measured sound-level truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 52,
          "weight": 0.012,
          "contribution": 0.62,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the destination, not live seat, delay, or operator-disruption truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 92,
          "weight": 0.012,
          "contribution": 1.1,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 76,
          "weight": 0.08,
          "contribution": 6.08,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.04,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 82,
          "weight": 0.012,
          "contribution": 0.98,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "ayutthaya",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 77,
          "weight": 0.05,
          "contribution": 3.85,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 75,
          "weight": 0.05,
          "contribution": 3.75,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 79,
          "weight": 0.015,
          "contribution": 1.19,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "ayutthaya",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 1,
          "points": 2,
          "applied": true,
          "note": "1 component(s) used fallback defaults, so the engine applies a 2-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 49,
          "note": "Component scores spread by 49 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort"
      ],
      "source_summary": "23 joined sources support this decision.",
      "weakest_signal": {
        "type": "regional_disaster_context",
        "label": "Regional disaster context is busy",
        "reason": "GDACS currently shows 4 active hazard groups across 32 tracked events. This is a route-confidence layer, not a local place safety verdict."
      },
      "related_pages": [
        {
          "path": "/where-to-go/ayutthaya/",
          "label": "Ayutthaya destination guide"
        },
        {
          "path": "/rail/bangkok-ayutthaya-train/",
          "label": "Bangkok to Ayutthaya train"
        },
        {
          "path": "/accommodation/ayutthaya/",
          "label": "Ayutthaya stay guide"
        },
        {
          "path": "/food/ayutthaya-food-route/",
          "label": "Ayutthaya food guide"
        },
        {
          "path": "/temples/ayutthaya/",
          "label": "Ayutthaya temple route"
        },
        {
          "path": "/research/temples/ayutthaya/",
          "label": "Ayutthaya temple research"
        }
      ],
      "path": "/entities/ayutthaya/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T08:00:00.000Z"
    },
    {
      "decision_id": "today_isaan",
      "decision_type": "where_to_go_today",
      "subject_id": "isaan",
      "subject_name": "Isaan",
      "subject_type": "destination",
      "score": 63,
      "component_score": 71.1,
      "penalty_points": 8,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Isaan is a cautious today pick.",
      "best_for": "Repeat visitors, regional food, and deeper province-level travel.",
      "avoid_if": "You want one obvious first-trip infrastructure answer.",
      "check_first": [
        "Treat province choice as the real decision, not just the region label.",
        "Use Khon Kaen, Ubon, Nong Khai, or Korat as actual anchors.",
        "Do not expect first-trip infrastructure everywhere."
      ],
      "next_action": "Choose one actual province cluster instead of treating the whole region as a single stop.",
      "pivot": "Use Bangkok as the setup base, then move east only when the trip length justifies it.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 17,
        "available_components": 16,
        "live_components": 15,
        "fallback_components": 1,
        "defaulted_components": 1,
        "coverage_ratio": 0.941
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 82,
          "weight": 0.16,
          "contribution": 13.12,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 78,
          "weight": 0.12,
          "contribution": 9.36,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 64,
          "weight": 0.22,
          "contribution": 14.08,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 92,
          "weight": 0.012,
          "contribution": 1.1,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 92,
          "weight": 0.012,
          "contribution": 1.1,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 76,
          "weight": 0.08,
          "contribution": 6.08,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 78,
          "weight": 0.012,
          "contribution": 0.94,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 84,
          "weight": 0.012,
          "contribution": 1.01,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "isaan",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 76,
          "weight": 0.05,
          "contribution": 3.8,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 58,
          "weight": 0.05,
          "contribution": 2.9,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 91,
          "weight": 0.03,
          "contribution": 2.73,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 71,
          "weight": 0.015,
          "contribution": 1.06,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 1,
          "points": 2,
          "applied": true,
          "note": "1 component(s) used fallback defaults, so the engine applies a 2-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 6,
          "applied": true,
          "spread": 36,
          "note": "Component scores spread by 36 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort"
      ],
      "source_summary": "23 joined sources support this decision.",
      "weakest_signal": {
        "type": "regional_disaster_context",
        "label": "Regional disaster context is busy",
        "reason": "GDACS currently shows 4 active hazard groups across 32 tracked events. This is a route-confidence layer, not a local place safety verdict."
      },
      "related_pages": [
        {
          "path": "/where-to-go/isaan/",
          "label": "Isaan destination guide"
        },
        {
          "path": "/food/isaan-food-for-first-timers/",
          "label": "Isaan food guide"
        },
        {
          "path": "/food/isaan-food-guide/",
          "label": "Isaan food guide"
        }
      ],
      "path": "/entities/isaan/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T08:15:23.481Z"
    },
    {
      "decision_id": "today_koh-samui",
      "decision_type": "where_to_go_today",
      "subject_id": "koh-samui",
      "subject_name": "Koh Samui",
      "subject_type": "destination",
      "score": 59,
      "component_score": 69.9,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Koh Samui is a cautious today pick.",
      "best_for": "Comfort-first island stays with airport access and a softer Gulf pivot.",
      "avoid_if": "You need a no-transfer beach answer or want to chain too many boats tightly.",
      "check_first": [
        "Compare Gulf weather directly with the Andaman coast.",
        "Use Samui itself as the stable base before adding Phangan or Tao.",
        "Check airport-plus-ferry stacks before paying for tight itineraries."
      ],
      "next_action": "Compare Gulf weather directly with Phuket and Krabi before locking the coast.",
      "pivot": "Use Bangkok or Phuket if flights and ferries stack badly.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 22,
        "available_components": 21,
        "live_components": 20,
        "fallback_components": 1,
        "defaulted_components": 1,
        "coverage_ratio": 0.955
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 92,
          "weight": 0.16,
          "contribution": 14.72,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 95,
          "weight": 0.12,
          "contribution": 11.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.22,
          "contribution": 12.32,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "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": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is coastal sea-state caution for ferry and beach-dependent destinations."
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 66,
          "weight": 0.04,
          "contribution": 2.64,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Marine Department berth-surface movement evidence around a linked coastal anchor, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 25,
          "weight": 0.05,
          "contribution": 1.25,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure support around coastal anchors, not operator seat or queue truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 94,
          "weight": 0.02,
          "contribution": 1.88,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around coastal anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 93,
          "weight": 0.08,
          "contribution": 7.44,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context, not airline on-time performance."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 68,
          "weight": 0.012,
          "contribution": 0.82,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 58,
          "weight": 0.012,
          "contribution": 0.7,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 81,
          "weight": 0.012,
          "contribution": 0.97,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 86,
          "weight": 0.012,
          "contribution": 1.03,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 84,
          "weight": 0.012,
          "contribution": 1.01,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 86,
          "weight": 0.012,
          "contribution": 1.03,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "koh-samui",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 81,
          "weight": 0.05,
          "contribution": 4.05,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 60,
          "weight": 0.05,
          "contribution": 3,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 77,
          "weight": 0.015,
          "contribution": 1.16,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 1,
          "points": 2,
          "applied": true,
          "note": "1 component(s) used fallback defaults, so the engine applies a 2-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 70,
          "note": "Component scores spread by 70 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort"
      ],
      "source_summary": "21 joined sources support this decision.",
      "weakest_signal": {
        "type": "pier_transfer_support",
        "label": "Pier transfer support is weak",
        "reason": "Public transport structure around this coastal anchor shows 2 mapped stop(s), 1 mode group(s), 0 boat-linked stop(s), and 2 bus-linked stop(s). This is public transfer support, not operator schedule or queue-length truth."
      },
      "related_pages": [
        {
          "path": "/where-to-go/koh-samui/",
          "label": "Koh Samui destination guide"
        },
        {
          "path": "/accommodation/koh-samui/",
          "label": "Where to stay in Koh Samui"
        },
        {
          "path": "/ferries/koh-samui-koh-phangan-koh-tao/",
          "label": "Samui / Phangan / Tao ferries"
        }
      ],
      "path": "/entities/koh-samui/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T12:00:00.000Z"
    },
    {
      "decision_id": "today_kanchanaburi",
      "decision_type": "where_to_go_today",
      "subject_id": "kanchanaburi",
      "subject_name": "Kanchanaburi",
      "subject_type": "destination",
      "score": 59,
      "component_score": 70.4,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Kanchanaburi is a cautious today pick.",
      "best_for": "River, rail-history, and light nature detours from Bangkok.",
      "avoid_if": "The trip window is too short to absorb transfers and outdoor time.",
      "check_first": [
        "Check waterfall and outdoor-weather logic before paying for remote stays.",
        "Treat the road burden honestly.",
        "Use Bangkok or Hua Hin as lower-friction pivots."
      ],
      "next_action": "Pick one river/history thread and keep waterfalls optional if rain weakens the day.",
      "pivot": "Stay in Bangkok if road or weather comfort slips.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 18,
        "available_components": 17,
        "live_components": 16,
        "fallback_components": 1,
        "defaulted_components": 1,
        "coverage_ratio": 0.944
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 82,
          "weight": 0.16,
          "contribution": 13.12,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 78,
          "weight": 0.12,
          "contribution": 9.36,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.22,
          "contribution": 12.32,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 68,
          "weight": 0.012,
          "contribution": 0.82,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 58,
          "weight": 0.012,
          "contribution": 0.7,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.04,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 76,
          "weight": 0.012,
          "contribution": 0.91,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "kanchanaburi",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 64,
          "weight": 0.05,
          "contribution": 3.2,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 75,
          "weight": 0.015,
          "contribution": 1.13,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "kanchanaburi",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 1,
          "points": 2,
          "applied": true,
          "note": "1 component(s) used fallback defaults, so the engine applies a 2-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 42,
          "note": "Component scores spread by 42 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort"
      ],
      "source_summary": "18 joined sources support this decision.",
      "weakest_signal": {
        "type": "regional_disaster_context",
        "label": "Regional disaster context is busy",
        "reason": "GDACS currently shows 4 active hazard groups across 32 tracked events. This is a route-confidence layer, not a local place safety verdict."
      },
      "related_pages": [
        {
          "path": "/where-to-go/kanchanaburi/",
          "label": "Kanchanaburi destination guide"
        },
        {
          "path": "/rail/bangkok-kanchanaburi-train/",
          "label": "Bangkok to Kanchanaburi train"
        },
        {
          "path": "/accommodation/kanchanaburi/",
          "label": "Kanchanaburi stay guide"
        },
        {
          "path": "/temples/kanchanaburi/",
          "label": "Kanchanaburi temple route"
        },
        {
          "path": "/research/temples/kanchanaburi/",
          "label": "Kanchanaburi temple research"
        }
      ],
      "path": "/entities/kanchanaburi/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T08:15:23.481Z"
    },
    {
      "decision_id": "today_koh-phangan",
      "decision_type": "where_to_go_today",
      "subject_id": "koh-phangan",
      "subject_name": "Koh Phangan",
      "subject_type": "destination",
      "score": 58,
      "component_score": 69.3,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Koh Phangan is a cautious today pick.",
      "best_for": "Longer Gulf stays, wellness pockets, and travelers who can tolerate ferry dependence.",
      "avoid_if": "You have low weather tolerance or Full Moon timing is the wrong fit.",
      "check_first": [
        "Treat Full Moon timing as a routing signal, not a footnote.",
        "Do not force Phangan behind a weak ferry day.",
        "Use Samui as the softer pivot if the chain looks brittle."
      ],
      "next_action": "Keep Samui as the stable fallback and avoid tight same-day transfers.",
      "pivot": "Sleep on Samui and use Phangan as the optional second move.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 19,
        "available_components": 18,
        "live_components": 17,
        "fallback_components": 1,
        "defaulted_components": 1,
        "coverage_ratio": 0.947
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 92,
          "weight": 0.16,
          "contribution": 14.72,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 95,
          "weight": 0.12,
          "contribution": 11.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.22,
          "contribution": 12.32,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "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": "koh-phangan",
          "used_default": false,
          "default_reason": "",
          "note": "This is coastal sea-state caution for ferry and beach-dependent destinations."
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 66,
          "weight": 0.04,
          "contribution": 2.64,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Marine Department berth-surface movement evidence around a linked coastal anchor, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 25,
          "weight": 0.05,
          "contribution": 1.25,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure support around coastal anchors, not operator seat or queue truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 94,
          "weight": 0.02,
          "contribution": 1.88,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around coastal anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 93,
          "weight": 0.08,
          "contribution": 7.44,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context, not airline on-time performance."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 81,
          "weight": 0.012,
          "contribution": 0.97,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 70,
          "weight": 0.012,
          "contribution": 0.84,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 82,
          "weight": 0.012,
          "contribution": 0.98,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "koh-phangan",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 81,
          "weight": 0.05,
          "contribution": 4.05,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 57,
          "weight": 0.05,
          "contribution": 2.85,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 90,
          "weight": 0.03,
          "contribution": 2.7,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 69,
          "weight": 0.015,
          "contribution": 1.03,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "koh-phangan",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 1,
          "points": 2,
          "applied": true,
          "note": "1 component(s) used fallback defaults, so the engine applies a 2-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 70,
          "note": "Component scores spread by 70 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort"
      ],
      "source_summary": "15 joined sources support this decision.",
      "weakest_signal": {
        "type": "pier_transfer_support",
        "label": "Pier transfer support is weak",
        "reason": "Public transport structure around this coastal anchor shows 2 mapped stop(s), 1 mode group(s), 0 boat-linked stop(s), and 2 bus-linked stop(s). This is public transfer support, not operator schedule or queue-length truth."
      },
      "related_pages": [
        {
          "path": "/where-to-go/koh-phangan/",
          "label": "Koh Phangan destination guide"
        },
        {
          "path": "/ferries/koh-samui-koh-phangan-koh-tao/",
          "label": "Samui / Phangan / Tao ferries"
        }
      ],
      "path": "/entities/koh-phangan/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T12:00:00.000Z"
    },
    {
      "decision_id": "today_phuket",
      "decision_type": "where_to_go_today",
      "subject_id": "phuket",
      "subject_name": "Phuket",
      "subject_type": "destination",
      "score": 57,
      "component_score": 67.8,
      "penalty_points": 11,
      "confidence": "High",
      "label": "fragile",
      "recommendation": "Phuket is a cautious today pick.",
      "best_for": "Infrastructure-first beach trips, flights, and weather backup.",
      "avoid_if": "You want a fragile island mood more than an easy base.",
      "check_first": [
        "Choose the beach area before the hotel.",
        "Check marine and weather layers before committing to boat-heavy days.",
        "Use Old Town as the indoor and food pivot when beach weather weakens."
      ],
      "next_action": "Choose the beach area before the hotel, then decide which boat days can stay optional.",
      "pivot": "Use Old Town as the indoor-food fallback or Samui if Gulf weather wins.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 29,
        "available_components": 28,
        "live_components": 27,
        "fallback_components": 1,
        "defaulted_components": 1,
        "coverage_ratio": 0.966
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 92,
          "weight": 0.16,
          "contribution": 14.72,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 95,
          "weight": 0.12,
          "contribution": 11.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.22,
          "contribution": 9.68,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "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": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is coastal sea-state caution for ferry and beach-dependent destinations."
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 82,
          "weight": 0.04,
          "contribution": 3.28,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Marine Department berth-surface movement evidence around a linked coastal anchor, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 47,
          "weight": 0.05,
          "contribution": 2.35,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure support around coastal anchors, not operator seat or queue truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 96,
          "weight": 0.02,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around coastal anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 69,
          "weight": 0.08,
          "contribution": 5.52,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context, not airline on-time performance."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 32,
          "weight": 0.012,
          "contribution": 0.38,
          "source": "signal",
          "signal_type": "airport_transfer_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is ground-access support around the main airport anchor linked to the destination, not a live airline board."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 42,
          "weight": 0.012,
          "contribution": 0.5,
          "source": "signal",
          "signal_type": "airport_ground_service_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is official airport taxi, Grab, rental, and pickup-rule context around the main airport anchor, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_board_surface_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is official passenger self-serve board visibility from public AOT flight-status pages. The board rows themselves use a browser turnstile token, so this is not direct live airline status truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 63,
          "weight": 0.012,
          "contribution": 0.76,
          "source": "signal",
          "signal_type": "airport_scale_context",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is official AOT passenger and aircraft-movement scale context behind the main airport anchor, not live delay, gate, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context around the main airport anchor, not live measured sound-level truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 78,
          "weight": 0.012,
          "contribution": 0.94,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 77,
          "weight": 0.012,
          "contribution": 0.92,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 89,
          "weight": 0.012,
          "contribution": 1.07,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 84,
          "weight": 0.012,
          "contribution": 1.01,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "phuket",
          "used_default": true,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 82,
          "weight": 0.012,
          "contribution": 0.98,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 88,
          "weight": 0.012,
          "contribution": 1.06,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 74,
          "weight": 0.05,
          "contribution": 3.7,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 61,
          "weight": 0.05,
          "contribution": 3.05,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 82,
          "weight": 0.015,
          "contribution": 1.23,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 1,
          "points": 2,
          "applied": true,
          "note": "1 component(s) used fallback defaults, so the engine applies a 2-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 61,
          "note": "Component scores spread by 61 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "water_risk"
      ],
      "source_summary": "28 joined sources support this decision.",
      "weakest_signal": {
        "type": "airport_transfer_support",
        "label": "Airport transfer support is weak",
        "reason": "Public transport structure around this airport shows 1 mapped stop(s), 1 mode group(s), 0 rail-linked stop(s), 0 airport-link stop(s), and 1 bus-linked stop(s). This is airport-ground-access support, not live airline board or queue truth."
      },
      "related_pages": [
        {
          "path": "/where-to-go/phuket/",
          "label": "Phuket destination guide"
        },
        {
          "path": "/accommodation/phuket/",
          "label": "Where to stay in Phuket"
        },
        {
          "path": "/venues/restaurants/phuket/",
          "label": "Phuket restaurants"
        },
        {
          "path": "/ferries/phuket-krabi/",
          "label": "Phuket to Krabi ferries"
        },
        {
          "path": "/food/phuket-food-route/",
          "label": "Phuket food guide"
        },
        {
          "path": "/temples/phuket/",
          "label": "Phuket temple route"
        },
        {
          "path": "/research/temples/phuket/",
          "label": "Phuket temple research"
        }
      ],
      "path": "/entities/phuket/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T12:00:00.000Z"
    },
    {
      "decision_id": "today_pai",
      "decision_type": "where_to_go_today",
      "subject_id": "pai",
      "subject_name": "Pai",
      "subject_type": "destination",
      "score": 55,
      "component_score": 67.6,
      "penalty_points": 13,
      "confidence": "High",
      "label": "fragile",
      "recommendation": "Pai is a cautious today pick.",
      "best_for": "Mountain slow travel when the north is clean and the group accepts road burden.",
      "avoid_if": "PM2.5 is high, rain is heavy, or carsickness tolerance is low.",
      "check_first": [
        "Treat Pai as optional, not mandatory.",
        "Use Chiang Mai AQI as the minimum smoke reality check.",
        "Avoid forcing Pai into a rushed route."
      ],
      "next_action": "Treat Pai as optional and do not buy it emotionally before checking the air.",
      "pivot": "Keep Chiang Mai itself as the stable plan.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 13,
        "available_components": 11,
        "live_components": 10,
        "fallback_components": 1,
        "defaulted_components": 2,
        "coverage_ratio": 0.846
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 92,
          "weight": 0.16,
          "contribution": 14.72,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 95,
          "weight": 0.12,
          "contribution": 11.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 52,
          "weight": 0.22,
          "contribution": 11.44,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "pai",
          "used_default": true,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 64,
          "weight": 0.012,
          "contribution": 0.77,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 92,
          "weight": 0.012,
          "contribution": 1.1,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "pai",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 37,
          "weight": 0.05,
          "contribution": 1.85,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 51,
          "weight": 0.05,
          "contribution": 2.55,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 90,
          "weight": 0.03,
          "contribution": 2.7,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 63,
          "weight": 0.015,
          "contribution": 0.94,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "pai",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 2,
          "points": 4,
          "applied": true,
          "note": "2 component(s) used fallback defaults, so the engine applies a 4-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 58,
          "note": "Component scores spread by 58 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "water_risk",
        "noise_comfort"
      ],
      "source_summary": "10 joined sources support this decision.",
      "weakest_signal": {
        "type": "road_safety_risk",
        "label": "Road safety burden is high",
        "reason": "28 deaths and 990 injuries are attached to this province proxy year to date. Province burden percentile 92"
      },
      "related_pages": [
        {
          "path": "/where-to-go/pai/",
          "label": "Pai destination guide"
        },
        {
          "path": "/routes/chiang-mai-pai-chiang-rai/",
          "label": "Chiang Mai / Pai / Chiang Rai route"
        },
        {
          "path": "/accommodation/pai/",
          "label": "Pai stay guide"
        },
        {
          "path": "/food/chiang-mai-food-guide/",
          "label": "Pai food guide"
        },
        {
          "path": "/temples/pai/",
          "label": "Pai temple route"
        },
        {
          "path": "/research/temples/pai/",
          "label": "Pai temple research"
        }
      ],
      "path": "/entities/pai/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T08:00:00.000Z"
    },
    {
      "decision_id": "today_krabi",
      "decision_type": "where_to_go_today",
      "subject_id": "krabi",
      "subject_name": "Krabi",
      "subject_type": "destination",
      "score": 54,
      "component_score": 66.5,
      "penalty_points": 13,
      "confidence": "High",
      "label": "fragile",
      "recommendation": "Krabi is a cautious today pick.",
      "best_for": "Scenery-heavy beach trips when boats are a bonus instead of a requirement.",
      "avoid_if": "You are forcing every day through a pier.",
      "check_first": [
        "Do not treat every day as a boat day.",
        "Pick Ao Nang for logistics unless scenery alone justifies a more fragile base.",
        "Keep Phuket as the infrastructure pivot if weather worsens."
      ],
      "next_action": "Choose Ao Nang for logistics and keep one non-boat day in reserve.",
      "pivot": "Use Phuket if the coast weakens but you still want the Andaman.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 25,
        "available_components": 23,
        "live_components": 22,
        "fallback_components": 1,
        "defaulted_components": 2,
        "coverage_ratio": 0.92
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 92,
          "weight": 0.16,
          "contribution": 14.72,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 95,
          "weight": 0.12,
          "contribution": 11.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.22,
          "contribution": 9.68,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "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": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is coastal sea-state caution for ferry and beach-dependent destinations."
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 82,
          "weight": 0.04,
          "contribution": 3.28,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Marine Department berth-surface movement evidence around a linked coastal anchor, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 78,
          "weight": 0.05,
          "contribution": 3.9,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure support around coastal anchors, not operator seat or queue truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 78,
          "weight": 0.02,
          "contribution": 1.56,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around coastal anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 69,
          "weight": 0.08,
          "contribution": 5.52,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context, not airline on-time performance."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 47,
          "weight": 0.012,
          "contribution": 0.56,
          "source": "signal",
          "signal_type": "airport_transfer_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is ground-access support around the main airport anchor linked to the destination, not a live airline board."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 68,
          "weight": 0.012,
          "contribution": 0.82,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 58,
          "weight": 0.012,
          "contribution": 0.7,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 89,
          "weight": 0.012,
          "contribution": 1.07,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 84,
          "weight": 0.012,
          "contribution": 1.01,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "krabi",
          "used_default": true,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 76,
          "weight": 0.012,
          "contribution": 0.91,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 86,
          "weight": 0.012,
          "contribution": 1.03,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "krabi",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 48,
          "weight": 0.05,
          "contribution": 2.4,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 60,
          "weight": 0.05,
          "contribution": 3,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 76,
          "weight": 0.015,
          "contribution": 1.14,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 2,
          "points": 4,
          "applied": true,
          "note": "2 component(s) used fallback defaults, so the engine applies a 4-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 61,
          "note": "Component scores spread by 61 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "water_risk",
        "noise_comfort"
      ],
      "source_summary": "22 joined sources support this decision.",
      "weakest_signal": {
        "type": "marine_warning_risk",
        "label": "Marine warning risk is high",
        "reason": "Regional marine context shows wave height 1.5 m, thunderstorm wave height 2.0 m, and wind around 27.5 km/h, with thunderstorm wording present. This is sea-state caution, not live operator closure truth."
      },
      "related_pages": [
        {
          "path": "/where-to-go/krabi/",
          "label": "Krabi destination guide"
        },
        {
          "path": "/accommodation/krabi/",
          "label": "Where to stay in Krabi"
        },
        {
          "path": "/ferries/krabi-koh-lanta/",
          "label": "Krabi to Koh Lanta ferries"
        },
        {
          "path": "/food/southern-thai-food-for-beach-trips/",
          "label": "Krabi food guide"
        },
        {
          "path": "/temples/krabi/",
          "label": "Krabi temple route"
        },
        {
          "path": "/research/temples/krabi/",
          "label": "Krabi temple research"
        }
      ],
      "path": "/entities/krabi/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T12:00:00.000Z"
    },
    {
      "decision_id": "today_pattaya-chonburi",
      "decision_type": "where_to_go_today",
      "subject_id": "pattaya-chonburi",
      "subject_name": "Pattaya / Chonburi",
      "subject_type": "destination",
      "score": 51,
      "component_score": 70.3,
      "penalty_points": 19,
      "confidence": "High",
      "label": "fragile",
      "recommendation": "Pattaya / Chonburi is a cautious today pick.",
      "best_for": "Quick coast pivots from Bangkok, nightlife, seafood, and short beach breaks with strong fallback infrastructure.",
      "avoid_if": "You want remote island mood, low traffic, or a quiet hotel-first coast stay.",
      "check_first": [
        "Treat weekend traffic as a real input, not a footnote.",
        "Pick the beach or hotel zone before the hotel brand.",
        "Use Pattaya / Chonburi when you want coast access without island-transfer fragility."
      ],
      "next_action": "Choose the hotel zone before the brand, and let weekend traffic shape the real coast call.",
      "pivot": "Use Hua Hin / Cha-am for a calmer coast, or stay in Bangkok if the sea-air mood is not worth the road burden.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 23,
        "available_components": 17,
        "live_components": 16,
        "fallback_components": 1,
        "defaulted_components": 6,
        "coverage_ratio": 0.739
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 66,
          "weight": 0.16,
          "contribution": 10.56,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "pattaya-chonburi",
          "used_default": true,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 70,
          "weight": 0.12,
          "contribution": 8.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "pattaya-chonburi",
          "used_default": true,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 68,
          "weight": 0.22,
          "contribution": 14.96,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "pattaya-chonburi",
          "used_default": true,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 66,
          "weight": 0.04,
          "contribution": 2.64,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Marine Department berth-surface movement evidence around a linked coastal anchor, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 82,
          "weight": 0.02,
          "contribution": 1.64,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around coastal anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_weather_operability",
          "label": "Airport weather operability",
          "score": 93,
          "weight": 0.08,
          "contribution": 7.44,
          "source": "signal",
          "signal_type": "flight_delay_risk",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is airport weather and forecast disruption context, not airline on-time performance."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 32,
          "weight": 0.012,
          "contribution": 0.38,
          "source": "signal",
          "signal_type": "airport_transfer_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is ground-access support around the main airport anchor linked to the destination, not a live airline board."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 78,
          "weight": 0.012,
          "contribution": 0.94,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 90,
          "weight": 0.012,
          "contribution": 1.08,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.012,
          "contribution": 1.15,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 84,
          "weight": 0.012,
          "contribution": 1.01,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "pattaya-chonburi",
          "used_default": true,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.04,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 80,
          "weight": 0.012,
          "contribution": 0.96,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "pattaya-chonburi",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 66,
          "weight": 0.05,
          "contribution": 3.3,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "pattaya-chonburi",
          "used_default": true,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 74,
          "weight": 0.015,
          "contribution": 1.11,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 6,
          "points": 10,
          "applied": true,
          "note": "6 component(s) used fallback defaults, so the engine applies a 10-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 47,
          "note": "Component scores spread by 47 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "aqi_fit",
        "outdoor_comfort",
        "rain_risk",
        "water_risk",
        "noise_comfort",
        "road_safety"
      ],
      "source_summary": "22 joined sources support this decision.",
      "weakest_signal": {
        "type": "airport_transfer_support",
        "label": "Airport transfer support is weak",
        "reason": "Public transport structure around this airport shows 1 mapped stop(s), 1 mode group(s), 0 rail-linked stop(s), 0 airport-link stop(s), and 1 bus-linked stop(s). This is airport-ground-access support, not live airline board or queue truth."
      },
      "related_pages": [
        {
          "path": "/where-to-go/pattaya-chonburi/",
          "label": "Pattaya / Chonburi destination guide"
        },
        {
          "path": "/venues/nightlife/",
          "label": "Thailand nightlife venue layer"
        },
        {
          "path": "/venues/restaurants/",
          "label": "Thailand restaurant venue layer"
        },
        {
          "path": "/accommodation/pattaya/",
          "label": "Pattaya / Chonburi stay guide"
        },
        {
          "path": "/food/pattaya-food-route/",
          "label": "Pattaya / Chonburi food guide"
        },
        {
          "path": "/temples/pattaya/",
          "label": "Pattaya / Chonburi temple route"
        },
        {
          "path": "/research/temples/pattaya/",
          "label": "Pattaya / Chonburi temple research"
        }
      ],
      "path": "/entities/pattaya-chonburi/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T08:15:23.481Z"
    },
    {
      "decision_id": "today_hua-hin",
      "decision_type": "where_to_go_today",
      "subject_id": "hua-hin",
      "subject_name": "Hua Hin / Cha-am",
      "subject_type": "destination",
      "score": 49,
      "component_score": 68.1,
      "penalty_points": 19,
      "confidence": "High",
      "label": "fragile",
      "recommendation": "Hua Hin / Cha-am is a cautious today pick.",
      "best_for": "Families, gentle beach days, seafood, markets, golf, and lower-friction coast access from Bangkok.",
      "avoid_if": "You want dramatic island scenery or nightlife-heavy beach energy.",
      "check_first": [
        "Choose the exact beach-town base before paying.",
        "Treat rail and road convenience as part of the value, not just background logistics.",
        "Use Hua Hin / Cha-am when you want a calmer coast than Pattaya without island transfer risk."
      ],
      "next_action": "Pick the exact beach-town base first and let rail or road convenience help decide the stay.",
      "pivot": "Use Pattaya / Chonburi for a shorter faster coast move, or Bangkok if the weather weakens and you need city backup.",
      "freshness_class": "fresh",
      "score_formula_version": "same-day-signal-v3",
      "signal_coverage": {
        "total_components": 22,
        "available_components": 16,
        "live_components": 15,
        "fallback_components": 1,
        "defaulted_components": 6,
        "coverage_ratio": 0.727
      },
      "score_components": [
        {
          "key": "aqi_fit",
          "label": "AQI fit",
          "score": 66,
          "weight": 0.16,
          "contribution": 10.56,
          "source": "signal",
          "signal_type": "aqi_risk",
          "entity_id": "hua-hin",
          "used_default": true,
          "default_reason": "AQI risk missing; using conservative destination fallback.",
          "note": ""
        },
        {
          "key": "outdoor_comfort",
          "label": "Outdoor comfort",
          "score": 70,
          "weight": 0.12,
          "contribution": 8.4,
          "source": "signal",
          "signal_type": "outdoor_comfort",
          "entity_id": "hua-hin",
          "used_default": true,
          "default_reason": "Outdoor comfort missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_risk",
          "label": "Rain fit",
          "score": 68,
          "weight": 0.22,
          "contribution": 14.96,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "hua-hin",
          "used_default": true,
          "default_reason": "Rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 60,
          "weight": 0.02,
          "contribution": 1.2,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around coastal anchors, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 46,
          "weight": 0.012,
          "contribution": 0.55,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the destination, not live seat, delay, or operator-disruption truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 68,
          "weight": 0.012,
          "contribution": 0.82,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support for overland bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 58,
          "weight": 0.012,
          "contribution": 0.7,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support for intercity-bus planning, not live departure, seat, or booking truth."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 95,
          "weight": 0.012,
          "contribution": 1.14,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support for intercity-bus planning, not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.012,
          "contribution": 1.13,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context, not local realtime service quality, dispatch, or incident truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 84,
          "weight": 0.012,
          "contribution": 1.01,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "water_risk",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "hua-hin",
          "used_default": true,
          "default_reason": "Water-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.04,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 78,
          "weight": 0.012,
          "contribution": 0.94,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 82,
          "weight": 0.012,
          "contribution": 0.98,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "park_access_context",
          "label": "Park access context",
          "score": 80,
          "weight": 0.012,
          "contribution": 0.96,
          "source": "signal",
          "signal_type": "park_access_context",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DNP protected-area planning context, not live closure, ranger, capacity, or ticket truth."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "hua-hin",
          "used_default": true,
          "default_reason": "Noise-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "road_safety",
          "label": "Road safety",
          "score": 66,
          "weight": 0.05,
          "contribution": 3.3,
          "source": "signal",
          "signal_type": "road_safety_risk",
          "entity_id": "hua-hin",
          "used_default": true,
          "default_reason": "Road-risk signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_friction",
          "label": "Transport friction",
          "score": 70,
          "weight": 0.05,
          "contribution": 3.5,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Transport-friction signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "source_confidence",
          "label": "Source confidence",
          "score": 97,
          "weight": 0.03,
          "contribution": 2.91,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Source-confidence signal missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "disaster_context",
          "label": "Disaster context",
          "score": 46,
          "weight": 0.1,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "regional_disaster_context",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Disaster context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "earthquake_context",
          "label": "Earthquake context",
          "score": 64,
          "weight": 0.03,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "regional_earthquake_context",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Earthquake context missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 75,
          "weight": 0.015,
          "contribution": 1.13,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Blueprint seed score missing; using live average as the fallback baseline.",
          "note": "Blueprint baseline is now a light fallback and copy anchor, not the primary scoring driver."
        }
      ],
      "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": 6,
          "points": 10,
          "applied": true,
          "note": "6 component(s) used fallback defaults, so the engine applies a 10-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Same-day signal spread penalty",
          "points": 9,
          "applied": true,
          "spread": 42,
          "note": "Component scores spread by 42 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "aqi_fit",
        "outdoor_comfort",
        "rain_risk",
        "water_risk",
        "noise_comfort",
        "road_safety"
      ],
      "source_summary": "22 joined sources support this decision.",
      "weakest_signal": {
        "type": "rail_feasibility",
        "label": "Rail feasibility is thin",
        "reason": "Public transport structure around this destination shows 3 mapped stop(s), 1 rail-linked stop(s), 0 airport-link stop(s), and 2 bus-linked stop(s). This is rail-support context, not live seat, delay, or operator-disruption truth."
      },
      "related_pages": [
        {
          "path": "/where-to-go/hua-hin/",
          "label": "Hua Hin / Cha-am destination guide"
        },
        {
          "path": "/venues/restaurants/",
          "label": "Thailand restaurant venue layer"
        },
        {
          "path": "/rail/",
          "label": "Thailand rail layer"
        },
        {
          "path": "/accommodation/hua-hin/",
          "label": "Hua Hin / Cha-am stay guide"
        },
        {
          "path": "/temples/hua-hin-cha-am/",
          "label": "Hua Hin / Cha-am temple route"
        },
        {
          "path": "/research/temples/hua-hin-cha-am/",
          "label": "Hua Hin / Cha-am temple research"
        }
      ],
      "path": "/entities/hua-hin/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T08:15:23.481Z"
    }
  ]
}