{
  "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": "where-to-stay",
    "name": "Where to stay",
    "decisionType": "where_to_stay",
    "status": "active",
    "endpoint": "/api/decisions/where-to-stay",
    "note": "Ranks hotel-area entities using comfort, source confidence, parent-destination resilience, airport-ground-access support, official airport pickup-rule context, airport board-surface support, airport-scale context, airport environmental-support context, rail-support context, and official rail presence where they materially affect the stay.",
    "output": "Best current hotel bases and who they fit."
  },
  "decision_count": 17,
  "filters": {
    "destination": "all",
    "city": "all",
    "route": "all",
    "limit": "all"
  },
  "rows": [
    {
      "decision_id": "stay_silom-sathorn",
      "decision_type": "where_to_stay",
      "subject_id": "silom-sathorn",
      "subject_name": "Silom / Sathorn",
      "subject_type": "hotel_area",
      "parent_destination_id": "bangkok",
      "parent_destination_name": "Bangkok",
      "score": 72,
      "component_score": 80.7,
      "penalty_points": 9,
      "confidence": "High",
      "label": "good",
      "recommendation": "Silom / Sathorn is a good current hotel base.",
      "best_for": "Balanced city stays, dinners, queer nightlife, and rail access without full Sukhumvit intensity.",
      "avoid_if": "You want river mood or a low-rise slower city feel.",
      "check_first": [
        "Make sure the hotel is actually station-adjacent.",
        "Use this zone when you want balanced evenings rather than constant nightlife.",
        "Treat Silom and Sathorn as different micro-feels, not one flat blob."
      ],
      "next_action": "Verify the exact BTS or MRT walking distance before paying.",
      "pivot": "Use Riverside / Old Town for culture-first days.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 27,
        "available_components": 27,
        "live_components": 24,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 50,
          "weight": 0.12,
          "contribution": 6,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "civic_friction",
          "label": "Civic friction",
          "score": 60,
          "weight": 0.08,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "civic_friction",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "No local or parent civic-friction signal; using conservative fallback.",
          "note": "Civic friction is only weighted where Bangkok district complaint statistics can inform hotel-area fit."
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 85,
          "weight": 0.14,
          "contribution": 11.9,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.05,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context behind the local base, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 90,
          "weight": 0.04,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 96,
          "weight": 0.06,
          "contribution": 5.76,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the local base or parent destination, not live train seat or delay truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 92,
          "weight": 0.04,
          "contribution": 3.68,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_motorcycle_taxi_support",
          "label": "Official motorcycle-taxi support",
          "score": 64,
          "weight": 0.05,
          "contribution": 3.2,
          "source": "signal",
          "signal_type": "official_motorcycle_taxi_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Bangkok motorcycle-taxi stand and driver coverage from the public DLT/data.go.th dataset around the stay zone or its parent destination, 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": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "taxi_pickup_dropoff_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public OTP monthly taxi GPS analytics and hotspot context around the stay zone or its parent destination, useful as aggregate pickup/dropoff support rather than live dispatch, ETA, queue, or raw trip truth."
        },
        {
          "key": "urban_rapid_transit_support",
          "label": "Urban rapid-transit support",
          "score": 98,
          "weight": 0.1,
          "contribution": 9.8,
          "source": "signal",
          "signal_type": "urban_rapid_transit_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BTS and MRTA route-map and service-page support around the local base, not live train headway, crowding, or outage truth."
        },
        {
          "key": "urban_bus_operator_support",
          "label": "Urban bus-operator support",
          "score": 62,
          "weight": 0.06,
          "contribution": 3.72,
          "source": "signal",
          "signal_type": "urban_bus_operator_support",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Thai Smile Group branch and depot footprint around Bangkok hotel-base entities, useful as a fallback and last-mile layer rather than live bus operations truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 82,
          "weight": 0.06,
          "contribution": 4.92,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 44,
          "weight": 0.08,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 65,
          "weight": 0.16,
          "contribution": 10.4,
          "source": "decision",
          "signal_type": null,
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 84,
          "weight": 0.04,
          "contribution": 3.36,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "silom-sathorn",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 54,
          "note": "Component scores spread by 54 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "41 joined sources support this decision.",
      "path": "/entities/silom-sathorn/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "stay_ari",
      "decision_type": "where_to_stay",
      "subject_id": "ari",
      "subject_name": "Ari",
      "subject_type": "hotel_area",
      "parent_destination_id": "bangkok",
      "parent_destination_name": "Bangkok",
      "score": 72,
      "component_score": 80.7,
      "penalty_points": 9,
      "confidence": "High",
      "label": "good",
      "recommendation": "Ari is a good current hotel base.",
      "best_for": "Repeat visitors, calmer mornings, cafes, and BTS-linked Bangkok without peak nightlife pressure.",
      "avoid_if": "You want the fastest first-timer checklist base or temple-heavy days every morning.",
      "check_first": [
        "Use Ari when the trip wants calmer mornings and fewer nightlife penalties.",
        "Keep temple-heavy or river-heavy days separate instead of forcing cross-city hops.",
        "Choose a truly BTS-linked hotel rather than a loose district label."
      ],
      "next_action": "Choose a truly BTS-linked hotel and keep the trip in a smaller Bangkok orbit.",
      "pivot": "Use Sukhumvit or Silom / Sathorn if the trip becomes more transit-heavy or nightlife-heavy.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 27,
        "available_components": 27,
        "live_components": 24,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 50,
          "weight": 0.12,
          "contribution": 6,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "civic_friction",
          "label": "Civic friction",
          "score": 45,
          "weight": 0.08,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "civic_friction",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "No local or parent civic-friction signal; using conservative fallback.",
          "note": "Civic friction is only weighted where Bangkok district complaint statistics can inform hotel-area fit."
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 86,
          "weight": 0.14,
          "contribution": 12.04,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.05,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context behind the local base, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 96,
          "weight": 0.06,
          "contribution": 5.76,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the local base or parent destination, not live train seat or delay truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 92,
          "weight": 0.04,
          "contribution": 3.68,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_motorcycle_taxi_support",
          "label": "Official motorcycle-taxi support",
          "score": 55,
          "weight": 0.05,
          "contribution": 2.75,
          "source": "signal",
          "signal_type": "official_motorcycle_taxi_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Bangkok motorcycle-taxi stand and driver coverage from the public DLT/data.go.th dataset around the stay zone or its parent destination, 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": 87,
          "weight": 0.05,
          "contribution": 4.35,
          "source": "signal",
          "signal_type": "taxi_pickup_dropoff_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is public OTP monthly taxi GPS analytics and hotspot context around the stay zone or its parent destination, useful as aggregate pickup/dropoff support rather than live dispatch, ETA, queue, or raw trip truth."
        },
        {
          "key": "urban_rapid_transit_support",
          "label": "Urban rapid-transit support",
          "score": 97,
          "weight": 0.1,
          "contribution": 9.7,
          "source": "signal",
          "signal_type": "urban_rapid_transit_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BTS and MRTA route-map and service-page support around the local base, not live train headway, crowding, or outage truth."
        },
        {
          "key": "urban_bus_operator_support",
          "label": "Urban bus-operator support",
          "score": 88,
          "weight": 0.06,
          "contribution": 5.28,
          "source": "signal",
          "signal_type": "urban_bus_operator_support",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Thai Smile Group branch and depot footprint around Bangkok hotel-base entities, useful as a fallback and last-mile layer rather than live bus operations truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 82,
          "weight": 0.06,
          "contribution": 4.92,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 44,
          "weight": 0.08,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 65,
          "weight": 0.16,
          "contribution": 10.4,
          "source": "decision",
          "signal_type": null,
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 79,
          "weight": 0.04,
          "contribution": 3.16,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "ari",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 53,
          "note": "Component scores spread by 53 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "41 joined sources support this decision.",
      "path": "/entities/ari/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:00:00.000Z"
    },
    {
      "decision_id": "stay_sukhumvit",
      "decision_type": "where_to_stay",
      "subject_id": "sukhumvit",
      "subject_name": "Sukhumvit",
      "subject_type": "hotel_area",
      "parent_destination_id": "bangkok",
      "parent_destination_name": "Bangkok",
      "score": 71,
      "component_score": 80.4,
      "penalty_points": 9,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Sukhumvit is a good current hotel base.",
      "best_for": "First-timers, late dinners, malls, rail access, and flexible city days.",
      "avoid_if": "You are sleep-sensitive or want temple-first city texture.",
      "check_first": [
        "Choose a station-linked hotel, not just a Sukhumvit address.",
        "Accept the noise tradeoff if nightlife is the point.",
        "Do not use Sukhumvit if the trip is really a temple-first Old Town visit."
      ],
      "next_action": "Choose a station-adjacent hotel, not just a Sukhumvit address.",
      "pivot": "Move to Silom / Sathorn for a calmer balanced base.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 27,
        "available_components": 27,
        "live_components": 24,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 50,
          "weight": 0.12,
          "contribution": 6,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "civic_friction",
          "label": "Civic friction",
          "score": 51,
          "weight": 0.08,
          "contribution": 4.08,
          "source": "signal",
          "signal_type": "civic_friction",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "No local or parent civic-friction signal; using conservative fallback.",
          "note": "Civic friction is only weighted where Bangkok district complaint statistics can inform hotel-area fit."
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 86,
          "weight": 0.14,
          "contribution": 12.04,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.05,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context behind the local base, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 92,
          "weight": 0.04,
          "contribution": 3.68,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 96,
          "weight": 0.06,
          "contribution": 5.76,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the local base or parent destination, not live train seat or delay truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 88,
          "weight": 0.04,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_motorcycle_taxi_support",
          "label": "Official motorcycle-taxi support",
          "score": 75,
          "weight": 0.05,
          "contribution": 3.75,
          "source": "signal",
          "signal_type": "official_motorcycle_taxi_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Bangkok motorcycle-taxi stand and driver coverage from the public DLT/data.go.th dataset around the stay zone or its parent destination, 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": 74,
          "weight": 0.05,
          "contribution": 3.7,
          "source": "signal",
          "signal_type": "taxi_pickup_dropoff_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is public OTP monthly taxi GPS analytics and hotspot context around the stay zone or its parent destination, useful as aggregate pickup/dropoff support rather than live dispatch, ETA, queue, or raw trip truth."
        },
        {
          "key": "urban_rapid_transit_support",
          "label": "Urban rapid-transit support",
          "score": 98,
          "weight": 0.1,
          "contribution": 9.8,
          "source": "signal",
          "signal_type": "urban_rapid_transit_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BTS and MRTA route-map and service-page support around the local base, not live train headway, crowding, or outage truth."
        },
        {
          "key": "urban_bus_operator_support",
          "label": "Urban bus-operator support",
          "score": 62,
          "weight": 0.06,
          "contribution": 3.72,
          "source": "signal",
          "signal_type": "urban_bus_operator_support",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Thai Smile Group branch and depot footprint around Bangkok hotel-base entities, useful as a fallback and last-mile layer rather than live bus operations truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 82,
          "weight": 0.06,
          "contribution": 4.92,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 44,
          "weight": 0.08,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 65,
          "weight": 0.16,
          "contribution": 10.4,
          "source": "decision",
          "signal_type": null,
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 85,
          "weight": 0.04,
          "contribution": 3.4,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "sukhumvit",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 54,
          "note": "Component scores spread by 54 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "41 joined sources support this decision.",
      "path": "/entities/sukhumvit/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "stay_riverside-old-town",
      "decision_type": "where_to_stay",
      "subject_id": "riverside-old-town",
      "subject_name": "Riverside / Old Town",
      "subject_type": "hotel_area",
      "parent_destination_id": "bangkok",
      "parent_destination_name": "Bangkok",
      "score": 71,
      "component_score": 80.1,
      "penalty_points": 9,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Riverside / Old Town is a good current hotel base.",
      "best_for": "Temple, ferry, and old-city texture with slower evenings.",
      "avoid_if": "You expect the easiest rail movement in the city.",
      "check_first": [
        "Use riverside when the trip is truly temple and river-first.",
        "Accept slightly weaker rail logic.",
        "Do not combine this base with nonstop cross-city nightlife plans."
      ],
      "next_action": "Use this base only if temples and the river are truly the point.",
      "pivot": "Switch to Sukhumvit or Silom if the plan turns transit-heavy.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 27,
        "available_components": 27,
        "live_components": 24,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 50,
          "weight": 0.12,
          "contribution": 6,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "civic_friction",
          "label": "Civic friction",
          "score": 60,
          "weight": 0.08,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "civic_friction",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "No local or parent civic-friction signal; using conservative fallback.",
          "note": "Civic friction is only weighted where Bangkok district complaint statistics can inform hotel-area fit."
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 82,
          "weight": 0.14,
          "contribution": 11.48,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.05,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context behind the local base, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 96,
          "weight": 0.06,
          "contribution": 5.76,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the local base or parent destination, not live train seat or delay truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 92,
          "weight": 0.04,
          "contribution": 3.68,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_motorcycle_taxi_support",
          "label": "Official motorcycle-taxi support",
          "score": 61,
          "weight": 0.05,
          "contribution": 3.05,
          "source": "signal",
          "signal_type": "official_motorcycle_taxi_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Bangkok motorcycle-taxi stand and driver coverage from the public DLT/data.go.th dataset around the stay zone or its parent destination, 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": 89,
          "weight": 0.05,
          "contribution": 4.45,
          "source": "signal",
          "signal_type": "taxi_pickup_dropoff_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public OTP monthly taxi GPS analytics and hotspot context around the stay zone or its parent destination, useful as aggregate pickup/dropoff support rather than live dispatch, ETA, queue, or raw trip truth."
        },
        {
          "key": "urban_rapid_transit_support",
          "label": "Urban rapid-transit support",
          "score": 85,
          "weight": 0.1,
          "contribution": 8.5,
          "source": "signal",
          "signal_type": "urban_rapid_transit_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BTS and MRTA route-map and service-page support around the local base, not live train headway, crowding, or outage truth."
        },
        {
          "key": "urban_bus_operator_support",
          "label": "Urban bus-operator support",
          "score": 70,
          "weight": 0.06,
          "contribution": 4.2,
          "source": "signal",
          "signal_type": "urban_bus_operator_support",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public Thai Smile Group branch and depot footprint around Bangkok hotel-base entities, useful as a fallback and last-mile layer rather than live bus operations truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 82,
          "weight": 0.06,
          "contribution": 4.92,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 96,
          "weight": 0.04,
          "contribution": 3.84,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 44,
          "weight": 0.08,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 65,
          "weight": 0.16,
          "contribution": 10.4,
          "source": "decision",
          "signal_type": null,
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 77,
          "weight": 0.04,
          "contribution": 3.08,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "riverside-old-town",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 53,
          "note": "Component scores spread by 53 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "42 joined sources support this decision.",
      "path": "/entities/riverside-old-town/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "stay_nimman",
      "decision_type": "where_to_stay",
      "subject_id": "nimman",
      "subject_name": "Nimman",
      "subject_type": "hotel_area",
      "parent_destination_id": "chiang-mai",
      "parent_destination_name": "Chiang Mai",
      "score": 68,
      "component_score": 76.9,
      "penalty_points": 9,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Nimman needs a more intentional fit before you book it.",
      "best_for": "Longer Chiang Mai stays, cafes, comfort, and coworking rhythm.",
      "avoid_if": "You want temple density right outside the hotel or AQI is bad enough to sink the city.",
      "check_first": [
        "Choose Nimman when comfort and cafes matter more than temple density.",
        "Keep Old City as the culture pivot.",
        "Let AQI outrank the hotel pool."
      ],
      "next_action": "Let PM2.5 outrank the hotel pool before you commit.",
      "pivot": "Use Old City for a shorter temple-first stay.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 21,
        "available_components": 21,
        "live_components": 18,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 88,
          "weight": 0.12,
          "contribution": 10.56,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 63,
          "weight": 0.14,
          "contribution": 8.82,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 82,
          "weight": 0.04,
          "contribution": 3.28,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 37,
          "weight": 0.06,
          "contribution": 2.22,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the local base or parent destination, not live train seat or delay truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 72,
          "weight": 0.04,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 92,
          "weight": 0.05,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 41,
          "weight": 0.06,
          "contribution": 2.46,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 42,
          "weight": 0.05,
          "contribution": 2.1,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 50,
          "weight": 0.04,
          "contribution": 2,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 65,
          "weight": 0.16,
          "contribution": 10.4,
          "source": "decision",
          "signal_type": null,
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 80,
          "weight": 0.04,
          "contribution": 3.2,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "nimman",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 60,
          "note": "Component scores spread by 60 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "25 joined sources support this decision.",
      "path": "/entities/nimman/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:00:00.000Z"
    },
    {
      "decision_id": "stay_old-city-chiang-mai",
      "decision_type": "where_to_stay",
      "subject_id": "old-city-chiang-mai",
      "subject_name": "Old City Chiang Mai",
      "subject_type": "hotel_area",
      "parent_destination_id": "chiang-mai",
      "parent_destination_name": "Chiang Mai",
      "score": 68,
      "component_score": 77,
      "penalty_points": 9,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Old City Chiang Mai needs a more intentional fit before you book it.",
      "best_for": "First Chiang Mai stays, temples, markets, and compact food walks when AQI is acceptable.",
      "avoid_if": "PM2.5 is high or you want coworking and comfort more than heritage mood.",
      "check_first": [
        "Use Old City when temple density and walkable food matter more than coworking comfort.",
        "Let PM2.5 outrank the charm of a heritage hotel.",
        "Switch to Nimman when comfort and indoor backup become the real need."
      ],
      "next_action": "Let AQI outrank the hotel charm, then choose a walkable lane inside or just outside the old walls.",
      "pivot": "Use Nimman if comfort and indoor backup become more important than temple density.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 21,
        "available_components": 21,
        "live_components": 18,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 88,
          "weight": 0.12,
          "contribution": 10.56,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 64,
          "weight": 0.14,
          "contribution": 8.96,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 84,
          "weight": 0.04,
          "contribution": 3.36,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 43,
          "weight": 0.06,
          "contribution": 2.58,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the local base or parent destination, not live train seat or delay truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 80,
          "weight": 0.05,
          "contribution": 4,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 68,
          "weight": 0.04,
          "contribution": 2.72,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 91,
          "weight": 0.05,
          "contribution": 4.55,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 41,
          "weight": 0.06,
          "contribution": 2.46,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 42,
          "weight": 0.05,
          "contribution": 2.1,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 50,
          "weight": 0.04,
          "contribution": 2,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 65,
          "weight": 0.16,
          "contribution": 10.4,
          "source": "decision",
          "signal_type": null,
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 82,
          "weight": 0.04,
          "contribution": 3.28,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "old-city-chiang-mai",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 56,
          "note": "Component scores spread by 56 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "25 joined sources support this decision.",
      "path": "/entities/old-city-chiang-mai/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "stay_bophut-fishermans-village",
      "decision_type": "where_to_stay",
      "subject_id": "bophut-fishermans-village",
      "subject_name": "Bophut / Fisherman's Village",
      "subject_type": "hotel_area",
      "parent_destination_id": "koh-samui",
      "parent_destination_name": "Koh Samui",
      "score": 64,
      "component_score": 74.8,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Bophut / Fisherman's Village needs a more intentional fit before you book it.",
      "best_for": "Balanced Samui comfort, families, and evening walks without maximum party energy.",
      "avoid_if": "You need Samui only as a launchpad for a fragile island chain.",
      "check_first": [
        "Use Bophut when you want Samui to be the stable base.",
        "Keep Chaweng only for bigger nightlife needs.",
        "Do not chain extra boats without checking the weather stack."
      ],
      "next_action": "Keep Samui itself as the stable base before adding extra ferries.",
      "pivot": "Use Bangkok if the transfer stack becomes the whole problem.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 16,
        "available_components": 15,
        "live_components": 12,
        "fallback_components": 4,
        "defaulted_components": 1,
        "coverage_ratio": 0.938
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 66,
          "weight": 0.12,
          "contribution": 7.92,
          "source": "derived",
          "signal_type": "noise_risk",
          "entity_id": "bophut-fishermans-village",
          "used_default": true,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 61,
          "weight": 0.14,
          "contribution": 8.54,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 84,
          "weight": 0.04,
          "contribution": 3.36,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 84,
          "weight": 0.05,
          "contribution": 4.2,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 68,
          "weight": 0.05,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 58,
          "weight": 0.04,
          "contribution": 2.32,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 77,
          "weight": 0.04,
          "contribution": 3.08,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 22,
          "weight": 0.04,
          "contribution": 0.88,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 90,
          "weight": 0.05,
          "contribution": 4.5,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 59,
          "weight": 0.16,
          "contribution": 9.44,
          "source": "decision",
          "signal_type": null,
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 80,
          "weight": 0.04,
          "contribution": 3.2,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "bophut-fishermans-village",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 75,
          "note": "Component scores spread by 75 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort"
      ],
      "source_summary": "17 joined sources support this decision.",
      "path": "/entities/bophut-fishermans-village/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "stay_chaweng",
      "decision_type": "where_to_stay",
      "subject_id": "chaweng",
      "subject_name": "Chaweng",
      "subject_type": "hotel_area",
      "parent_destination_id": "koh-samui",
      "parent_destination_name": "Koh Samui",
      "score": 64,
      "component_score": 74.6,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Chaweng needs a more intentional fit before you book it.",
      "best_for": "Short Samui stays, nightlife, hotel choice, and airport convenience.",
      "avoid_if": "Quiet sleep matters more than service density.",
      "check_first": [
        "Choose Chaweng when service density and evening energy matter more than quiet sleep.",
        "Do not overpay for Chaweng if the trip is really a calm beach reset.",
        "Keep Bophut or Lamai visible as the softer pivot."
      ],
      "next_action": "Choose Chaweng only when the trip really wants energy and easy services close by.",
      "pivot": "Use Bophut or Lamai when Samui needs a softer base.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 16,
        "available_components": 15,
        "live_components": 12,
        "fallback_components": 4,
        "defaulted_components": 1,
        "coverage_ratio": 0.938
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 66,
          "weight": 0.12,
          "contribution": 7.92,
          "source": "derived",
          "signal_type": "noise_risk",
          "entity_id": "chaweng",
          "used_default": true,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 62,
          "weight": 0.14,
          "contribution": 8.68,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 82,
          "weight": 0.04,
          "contribution": 3.28,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 84,
          "weight": 0.05,
          "contribution": 4.2,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 62,
          "weight": 0.05,
          "contribution": 3.1,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 54,
          "weight": 0.04,
          "contribution": 2.16,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 77,
          "weight": 0.04,
          "contribution": 3.08,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 25,
          "weight": 0.04,
          "contribution": 1,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 90,
          "weight": 0.05,
          "contribution": 4.5,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 59,
          "weight": 0.16,
          "contribution": 9.44,
          "source": "decision",
          "signal_type": null,
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 78,
          "weight": 0.04,
          "contribution": 3.12,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "chaweng",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 72,
          "note": "Component scores spread by 72 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort"
      ],
      "source_summary": "17 joined sources support this decision.",
      "path": "/entities/chaweng/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "stay_lamai",
      "decision_type": "where_to_stay",
      "subject_id": "lamai",
      "subject_name": "Lamai",
      "subject_type": "hotel_area",
      "parent_destination_id": "koh-samui",
      "parent_destination_name": "Koh Samui",
      "score": 64,
      "component_score": 74.5,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Lamai needs a more intentional fit before you book it.",
      "best_for": "Middle-ground Samui beach stays with softer pacing than Chaweng.",
      "avoid_if": "You want the widest service density or the quietest north-coast retreat.",
      "check_first": [
        "Use Lamai when the trip wants a calmer beach base without losing all convenience.",
        "Do not assume Lamai solves island-wide transfer friction by itself.",
        "Keep Bophut visible when evening walks and food matter more than beach time."
      ],
      "next_action": "Use Lamai when beach comfort and readable evenings matter more than maximum nightlife.",
      "pivot": "Use Bophut for a more balanced food-and-family base.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 16,
        "available_components": 15,
        "live_components": 12,
        "fallback_components": 4,
        "defaulted_components": 1,
        "coverage_ratio": 0.938
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 66,
          "weight": 0.12,
          "contribution": 7.92,
          "source": "derived",
          "signal_type": "noise_risk",
          "entity_id": "lamai",
          "used_default": true,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 62,
          "weight": 0.14,
          "contribution": 8.68,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 80,
          "weight": 0.04,
          "contribution": 3.2,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 84,
          "weight": 0.05,
          "contribution": 4.2,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 62,
          "weight": 0.05,
          "contribution": 3.1,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 54,
          "weight": 0.04,
          "contribution": 2.16,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 77,
          "weight": 0.04,
          "contribution": 3.08,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 25,
          "weight": 0.04,
          "contribution": 1,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 90,
          "weight": 0.05,
          "contribution": 4.5,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 86,
          "weight": 0.08,
          "contribution": 6.88,
          "source": "signal",
          "signal_type": "flood_water_risk",
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 59,
          "weight": 0.16,
          "contribution": 9.44,
          "source": "decision",
          "signal_type": null,
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 79,
          "weight": 0.04,
          "contribution": 3.16,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "lamai",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 72,
          "note": "Component scores spread by 72 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort"
      ],
      "source_summary": "17 joined sources support this decision.",
      "path": "/entities/lamai/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "stay_kata-karon",
      "decision_type": "where_to_stay",
      "subject_id": "kata-karon",
      "subject_name": "Kata / Karon",
      "subject_type": "hotel_area",
      "parent_destination_id": "phuket",
      "parent_destination_name": "Phuket",
      "score": 63,
      "component_score": 73.7,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Kata / Karon needs a more intentional fit before you book it.",
      "best_for": "Balanced Phuket beach stays, families, and manageable services.",
      "avoid_if": "You want nightlife density or the freedom to ignore coast conditions.",
      "check_first": [
        "Use Kata / Karon when first-beach simplicity matters.",
        "Do not assume all Phuket beaches behave the same.",
        "Use Old Town as the rain and food fallback."
      ],
      "next_action": "Use Old Town as the rain and food fallback before locking the beach.",
      "pivot": "Switch to Phuket Old Town or a different coast if beach conditions weaken.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 22,
        "available_components": 21,
        "live_components": 18,
        "fallback_components": 4,
        "defaulted_components": 1,
        "coverage_ratio": 0.955
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 74,
          "weight": 0.12,
          "contribution": 8.88,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.1,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 60,
          "weight": 0.14,
          "contribution": 8.4,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 80,
          "weight": 0.04,
          "contribution": 3.2,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 78,
          "weight": 0.05,
          "contribution": 3.9,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 77,
          "weight": 0.04,
          "contribution": 3.08,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 85,
          "weight": 0.04,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 48,
          "weight": 0.04,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 92,
          "weight": 0.05,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 32,
          "weight": 0.06,
          "contribution": 1.92,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 42,
          "weight": 0.05,
          "contribution": 2.1,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 63,
          "weight": 0.04,
          "contribution": 2.52,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "derived",
          "signal_type": "flood_water_risk",
          "entity_id": "kata-karon",
          "used_default": true,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 57,
          "weight": 0.16,
          "contribution": 9.12,
          "source": "decision",
          "signal_type": null,
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 81,
          "weight": 0.04,
          "contribution": 3.24,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "kata-karon",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 65,
          "note": "Component scores spread by 65 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "water_fit"
      ],
      "source_summary": "23 joined sources support this decision.",
      "path": "/entities/kata-karon/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "stay_patong",
      "decision_type": "where_to_stay",
      "subject_id": "patong",
      "subject_name": "Patong",
      "subject_type": "hotel_area",
      "parent_destination_id": "phuket",
      "parent_destination_name": "Phuket",
      "score": 63,
      "component_score": 73.5,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Patong needs a more intentional fit before you book it.",
      "best_for": "Nightlife, service density, short stays, and beach trips where convenience matters more than quiet.",
      "avoid_if": "You are noise-sensitive or want a calmer family beach base.",
      "check_first": [
        "Choose Patong only when nightlife, services, or short-stay convenience are really the point.",
        "Do not pay Patong prices for a quiet family beach trip.",
        "Keep Old Town or Kata / Karon visible as the calmer pivot."
      ],
      "next_action": "Use Patong only when the energy and late return convenience are worth the tradeoff.",
      "pivot": "Use Kata / Karon or Phuket Old Town if sleep, food, or rain-backup logic becomes more important.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 22,
        "available_components": 21,
        "live_components": 18,
        "fallback_components": 4,
        "defaulted_components": 1,
        "coverage_ratio": 0.955
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 74,
          "weight": 0.12,
          "contribution": 8.88,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.1,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 62,
          "weight": 0.14,
          "contribution": 8.68,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 78,
          "weight": 0.04,
          "contribution": 3.12,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 72,
          "weight": 0.05,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 73,
          "weight": 0.04,
          "contribution": 2.92,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 85,
          "weight": 0.04,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 48,
          "weight": 0.04,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 92,
          "weight": 0.05,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 32,
          "weight": 0.06,
          "contribution": 1.92,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 42,
          "weight": 0.05,
          "contribution": 2.1,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 63,
          "weight": 0.04,
          "contribution": 2.52,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "derived",
          "signal_type": "flood_water_risk",
          "entity_id": "patong",
          "used_default": true,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 57,
          "weight": 0.16,
          "contribution": 9.12,
          "source": "decision",
          "signal_type": null,
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 78,
          "weight": 0.04,
          "contribution": 3.12,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "patong",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 65,
          "note": "Component scores spread by 65 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "water_fit"
      ],
      "source_summary": "23 joined sources support this decision.",
      "path": "/entities/patong/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "stay_phuket-old-town",
      "decision_type": "where_to_stay",
      "subject_id": "phuket-old-town",
      "subject_name": "Phuket Old Town",
      "subject_type": "hotel_area",
      "parent_destination_id": "phuket",
      "parent_destination_name": "Phuket",
      "score": 63,
      "component_score": 73.8,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Phuket Old Town needs a more intentional fit before you book it.",
      "best_for": "Food-first Phuket, rain backup, cafes, architecture, and town-based slower stays.",
      "avoid_if": "You expect a beach outside the room every morning.",
      "check_first": [
        "Use Old Town when weather, food, or architecture outranks waking up by the beach.",
        "Do not confuse a stylish town hotel with a beach holiday base.",
        "Keep Patong or Kata / Karon visible when the trip is still beach-first."
      ],
      "next_action": "Treat Old Town as a weather and food base, not a hidden beach hack.",
      "pivot": "Use Kata / Karon or Patong if the trip stays beach-first.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 22,
        "available_components": 21,
        "live_components": 18,
        "fallback_components": 4,
        "defaulted_components": 1,
        "coverage_ratio": 0.955
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 74,
          "weight": 0.12,
          "contribution": 8.88,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.1,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 62,
          "weight": 0.14,
          "contribution": 8.68,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 82,
          "weight": 0.04,
          "contribution": 3.28,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 72,
          "weight": 0.05,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 73,
          "weight": 0.04,
          "contribution": 2.92,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 85,
          "weight": 0.04,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 48,
          "weight": 0.04,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 32,
          "weight": 0.06,
          "contribution": 1.92,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 42,
          "weight": 0.05,
          "contribution": 2.1,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 63,
          "weight": 0.04,
          "contribution": 2.52,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "derived",
          "signal_type": "flood_water_risk",
          "entity_id": "phuket-old-town",
          "used_default": true,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 57,
          "weight": 0.16,
          "contribution": 9.12,
          "source": "decision",
          "signal_type": null,
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 79,
          "weight": 0.04,
          "contribution": 3.16,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "phuket-old-town",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 65,
          "note": "Component scores spread by 65 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "water_fit"
      ],
      "source_summary": "23 joined sources support this decision.",
      "path": "/entities/phuket-old-town/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "stay_rawai-nai-harn",
      "decision_type": "where_to_stay",
      "subject_id": "rawai-nai-harn",
      "subject_name": "Rawai / Nai Harn",
      "subject_type": "hotel_area",
      "parent_destination_id": "phuket",
      "parent_destination_name": "Phuket",
      "score": 62,
      "component_score": 73.5,
      "penalty_points": 11,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Rawai / Nai Harn needs a more intentional fit before you book it.",
      "best_for": "Longer Phuket stays, villas, south-coast pacing, and quieter beach routines.",
      "avoid_if": "You need low-friction movement around the whole island.",
      "check_first": [
        "Use Rawai / Nai Harn when longer, slower south-coast days are the real goal.",
        "Do not assume a cheaper villa beats a better-located first-timer base.",
        "Keep Phuket Old Town or Kata / Karon as the lower-friction fallback."
      ],
      "next_action": "Accept the transfer burden before paying for a bigger room or villa.",
      "pivot": "Use Kata / Karon for a cleaner first-timer base or Old Town when weather weakens.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 22,
        "available_components": 21,
        "live_components": 18,
        "fallback_components": 4,
        "defaulted_components": 1,
        "coverage_ratio": 0.955
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 74,
          "weight": 0.12,
          "contribution": 8.88,
          "source": "signal",
          "signal_type": "noise_risk",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.1,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 62,
          "weight": 0.14,
          "contribution": 8.68,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 78,
          "weight": 0.04,
          "contribution": 3.12,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 96,
          "weight": 0.05,
          "contribution": 4.8,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 72,
          "weight": 0.05,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 73,
          "weight": 0.04,
          "contribution": 2.92,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 85,
          "weight": 0.04,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 48,
          "weight": 0.04,
          "contribution": 1.92,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 92,
          "weight": 0.05,
          "contribution": 4.6,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 32,
          "weight": 0.06,
          "contribution": 1.92,
          "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 behind this stay decision."
        },
        {
          "key": "airport_ground_service_support",
          "label": "Airport ground-service support",
          "score": 42,
          "weight": 0.05,
          "contribution": 2.1,
          "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 behind the stay decision, not live queue, ETA, or inventory truth."
        },
        {
          "key": "airport_board_surface_support",
          "label": "Airport board-surface support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "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, not direct live airline row truth."
        },
        {
          "key": "airport_scale_context",
          "label": "Airport scale context",
          "score": 63,
          "weight": 0.04,
          "contribution": 2.52,
          "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, queue, or inventory truth."
        },
        {
          "key": "airport_environmental_support",
          "label": "Airport environmental support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "airport_environmental_support",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": "This is SET-hosted AOT annual-report disclosure context behind the stay decision, not live measured sound-level truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "derived",
          "signal_type": "flood_water_risk",
          "entity_id": "rawai-nai-harn",
          "used_default": true,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 57,
          "weight": 0.16,
          "contribution": 9.12,
          "source": "decision",
          "signal_type": null,
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 76,
          "weight": 0.04,
          "contribution": 3.04,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "rawai-nai-harn",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 65,
          "note": "Component scores spread by 65 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "water_fit"
      ],
      "source_summary": "23 joined sources support this decision.",
      "path": "/entities/rawai-nai-harn/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "stay_ao-nang",
      "decision_type": "where_to_stay",
      "subject_id": "ao-nang",
      "subject_name": "Ao Nang",
      "subject_type": "hotel_area",
      "parent_destination_id": "krabi",
      "parent_destination_name": "Krabi",
      "score": 59,
      "component_score": 72.3,
      "penalty_points": 13,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Ao Nang needs a more intentional fit before you book it.",
      "best_for": "First-time Krabi stays, tour logistics, and coast trips that need a practical backup plan.",
      "avoid_if": "You only want scenery payoff and hate any resort-strip convenience.",
      "check_first": [
        "Choose Ao Nang when practical coast access matters more than perfect scenery mood.",
        "Keep one non-boat day available.",
        "Do not confuse a scenic promo photo with a resilient base."
      ],
      "next_action": "Use Ao Nang when the coast needs to stay usable even if one boat day weakens.",
      "pivot": "Use Railay only when the scenery premium is worth the fragility.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 18,
        "available_components": 16,
        "live_components": 13,
        "fallback_components": 5,
        "defaulted_components": 2,
        "coverage_ratio": 0.889
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 66,
          "weight": 0.12,
          "contribution": 7.92,
          "source": "derived",
          "signal_type": "noise_risk",
          "entity_id": "ao-nang",
          "used_default": true,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.1,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 59,
          "weight": 0.14,
          "contribution": 8.26,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 78,
          "weight": 0.04,
          "contribution": 3.12,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 62,
          "weight": 0.05,
          "contribution": 3.1,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 54,
          "weight": 0.04,
          "contribution": 2.16,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 85,
          "weight": 0.04,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 75,
          "weight": 0.04,
          "contribution": 3,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 76,
          "weight": 0.05,
          "contribution": 3.8,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 47,
          "weight": 0.06,
          "contribution": 2.82,
          "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 behind this stay decision."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "derived",
          "signal_type": "flood_water_risk",
          "entity_id": "ao-nang",
          "used_default": true,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 54,
          "weight": 0.16,
          "contribution": 8.64,
          "source": "decision",
          "signal_type": null,
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 80,
          "weight": 0.04,
          "contribution": 3.2,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "ao-nang",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 53,
          "note": "Component scores spread by 53 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort",
        "water_fit"
      ],
      "source_summary": "16 joined sources support this decision.",
      "path": "/entities/ao-nang/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "stay_railay",
      "decision_type": "where_to_stay",
      "subject_id": "railay",
      "subject_name": "Railay",
      "subject_type": "hotel_area",
      "parent_destination_id": "krabi",
      "parent_destination_name": "Krabi",
      "score": 59,
      "component_score": 71.7,
      "penalty_points": 13,
      "confidence": "High",
      "label": "mixed",
      "recommendation": "Railay needs a more intentional fit before you book it.",
      "best_for": "High-payoff Krabi scenery when transfer fragility is acceptable.",
      "avoid_if": "Arrival timing is tight or weather tolerance is low.",
      "check_first": [
        "Use Railay only when the scenery payoff is worth a more fragile arrival and exit stack.",
        "Do not force Railay on a tight arrival day.",
        "Keep Ao Nang visible as the practical fallback."
      ],
      "next_action": "Treat Railay as the reward move, not the safest default.",
      "pivot": "Use Ao Nang if the practical transfer story starts to dominate.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 18,
        "available_components": 16,
        "live_components": 13,
        "fallback_components": 5,
        "defaulted_components": 2,
        "coverage_ratio": 0.889
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.18,
          "contribution": 16.83,
          "source": "derived",
          "signal_type": null,
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 66,
          "weight": 0.12,
          "contribution": 7.92,
          "source": "derived",
          "signal_type": "noise_risk",
          "entity_id": "railay",
          "used_default": true,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.1,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 58,
          "weight": 0.14,
          "contribution": 8.12,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 76,
          "weight": 0.04,
          "contribution": 3.04,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 86,
          "weight": 0.05,
          "contribution": 4.3,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 62,
          "weight": 0.05,
          "contribution": 3.1,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 54,
          "weight": 0.04,
          "contribution": 2.16,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 85,
          "weight": 0.04,
          "contribution": 3.4,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 65,
          "weight": 0.04,
          "contribution": 2.6,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is public pier and transfer structure around the stay zone, linked pier anchor, or parent destination, not operator schedule or queue-length truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 76,
          "weight": 0.05,
          "contribution": 3.8,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 47,
          "weight": 0.06,
          "contribution": 2.82,
          "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 behind this stay decision."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "derived",
          "signal_type": "flood_water_risk",
          "entity_id": "railay",
          "used_default": true,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 54,
          "weight": 0.16,
          "contribution": 8.64,
          "source": "decision",
          "signal_type": null,
          "entity_id": "krabi",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 73,
          "weight": 0.04,
          "contribution": 2.92,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "railay",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 53,
          "note": "Component scores spread by 53 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort",
        "water_fit"
      ],
      "source_summary": "16 joined sources support this decision.",
      "path": "/entities/railay/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "stay_central-pattaya-jomtien",
      "decision_type": "where_to_stay",
      "subject_id": "central-pattaya-jomtien",
      "subject_name": "Central Pattaya / Jomtien",
      "subject_type": "hotel_area",
      "parent_destination_id": "pattaya-chonburi",
      "parent_destination_name": "Pattaya / Chonburi",
      "score": 57,
      "component_score": 71.9,
      "penalty_points": 15,
      "confidence": "High",
      "label": "fragile",
      "recommendation": "Central Pattaya / Jomtien needs a more intentional fit before you book it.",
      "best_for": "Short coast breaks, hotel convenience, beach access, and nightlife flexibility with a practical Bangkok escape shape.",
      "avoid_if": "You are sleep-sensitive, crowd-averse, or want all beach time without traffic tradeoffs.",
      "check_first": [
        "Choose the exact zone before the hotel.",
        "Use Jomtien when sleep and softer pacing matter more than nightlife.",
        "Do not assume all Pattaya-area hotels have the same return-route convenience."
      ],
      "next_action": "Decide whether nightlife or sleep matters more before choosing Central Pattaya versus Jomtien.",
      "pivot": "Use Hua Hin / Cha-am for a calmer hotel rhythm.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 18,
        "available_components": 15,
        "live_components": 12,
        "fallback_components": 6,
        "defaulted_components": 3,
        "coverage_ratio": 0.833
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 68,
          "weight": 0.18,
          "contribution": 12.24,
          "source": "derived",
          "signal_type": null,
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 66,
          "weight": 0.12,
          "contribution": 7.92,
          "source": "derived",
          "signal_type": "noise_risk",
          "entity_id": "central-pattaya-jomtien",
          "used_default": true,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 68,
          "weight": 0.1,
          "contribution": 6.8,
          "source": "derived",
          "signal_type": "rain_risk",
          "entity_id": "central-pattaya-jomtien",
          "used_default": true,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 56,
          "weight": 0.14,
          "contribution": 7.84,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.05,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context behind the local base, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 80,
          "weight": 0.04,
          "contribution": 3.2,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 94,
          "weight": 0.05,
          "contribution": 4.7,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 72,
          "weight": 0.05,
          "contribution": 3.6,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 86,
          "weight": 0.04,
          "contribution": 3.44,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 96,
          "weight": 0.03,
          "contribution": 2.88,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 80,
          "weight": 0.05,
          "contribution": 4,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "airport_transfer_support",
          "label": "Airport transfer support",
          "score": 32,
          "weight": 0.06,
          "contribution": 1.92,
          "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 behind this stay decision."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "derived",
          "signal_type": "flood_water_risk",
          "entity_id": "central-pattaya-jomtien",
          "used_default": true,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 51,
          "weight": 0.16,
          "contribution": 8.16,
          "source": "decision",
          "signal_type": null,
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 77,
          "weight": 0.04,
          "contribution": 3.08,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "central-pattaya-jomtien",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": 3,
          "points": 6,
          "applied": true,
          "note": "3 component(s) used fallback defaults, so the engine applies a 6-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Stay contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 65,
          "note": "Component scores spread by 65 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "noise_comfort",
        "rain_fit",
        "water_fit"
      ],
      "source_summary": "17 joined sources support this decision.",
      "path": "/entities/central-pattaya-jomtien/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "stay_central-hua-hin-khao-takiab",
      "decision_type": "where_to_stay",
      "subject_id": "central-hua-hin-khao-takiab",
      "subject_name": "Central Hua Hin / Khao Takiab",
      "subject_type": "hotel_area",
      "parent_destination_id": "hua-hin",
      "parent_destination_name": "Hua Hin / Cha-am",
      "score": 55,
      "component_score": 69.8,
      "penalty_points": 15,
      "confidence": "High",
      "label": "fragile",
      "recommendation": "Central Hua Hin / Khao Takiab needs a more intentional fit before you book it.",
      "best_for": "Families, calmer beach-town pacing, seafood, and hotel stays that value rail or road simplicity over nightlife.",
      "avoid_if": "You need nightlife density or a highly compact walk-everywhere beach strip.",
      "check_first": [
        "Use this base when calm beach-town logic matters more than nightlife.",
        "Check station or road transfer time before paying if arrival day is tight.",
        "Treat Cha-am as a separate feel, not the same strip."
      ],
      "next_action": "Choose the exact part of Hua Hin or Khao Takiab before paying, especially on holiday weekends.",
      "pivot": "Use Pattaya / Chonburi if the trip needs a shorter coast hop and more late-night energy.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 18,
        "available_components": 15,
        "live_components": 12,
        "fallback_components": 6,
        "defaulted_components": 3,
        "coverage_ratio": 0.833
      },
      "score_components": [
        {
          "key": "local_source_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.18,
          "contribution": 17.46,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "No local source-confidence signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 68,
          "weight": 0.18,
          "contribution": 12.24,
          "source": "derived",
          "signal_type": null,
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "Blends local AQI and outdoor comfort, with parent-destination fallback when hotel-area signals are sparse."
        },
        {
          "key": "noise_comfort",
          "label": "Noise comfort",
          "score": 66,
          "weight": 0.12,
          "contribution": 7.92,
          "source": "derived",
          "signal_type": "noise_risk",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": true,
          "default_reason": "No local or parent noise signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 68,
          "weight": 0.1,
          "contribution": 6.8,
          "source": "derived",
          "signal_type": "rain_risk",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": true,
          "default_reason": "No local or parent rain signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 58,
          "weight": 0.14,
          "contribution": 8.12,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "No local or parent transport signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "highway_transfer_friction",
          "label": "Highway transfer friction",
          "score": 88,
          "weight": 0.05,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "highway_transfer_friction",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DOH and EXAT road-support context behind the local base, not live speed, queue, lane, or incident truth."
        },
        {
          "key": "spa_license_support",
          "label": "Spa license support",
          "score": 78,
          "weight": 0.04,
          "contribution": 3.12,
          "source": "signal",
          "signal_type": "spa_license_support",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is public HSS wellness-license lookup support around the local base or parent destination, not live booking, treatment quality, or venue popularity truth."
        },
        {
          "key": "medical_fallback_support",
          "label": "Medical fallback support",
          "score": 82,
          "weight": 0.05,
          "contribution": 4.1,
          "source": "signal",
          "signal_type": "medical_fallback_support",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is public MOPH facility-support context around the local base or parent destination, not live bed, wait-time, dispatch, or specialist-availability truth."
        },
        {
          "key": "rail_feasibility",
          "label": "Rail feasibility",
          "score": 39,
          "weight": 0.06,
          "contribution": 2.34,
          "source": "signal",
          "signal_type": "rail_feasibility",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is public rail-support structure around the local base or parent destination, not live train seat or delay truth."
        },
        {
          "key": "official_bus_terminal_support",
          "label": "Official bus-terminal support",
          "score": 62,
          "weight": 0.05,
          "contribution": 3.1,
          "source": "signal",
          "signal_type": "official_bus_terminal_support",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is official MOT terminal-master support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_support",
          "label": "Official intercity-bus support",
          "score": 54,
          "weight": 0.04,
          "contribution": 2.16,
          "source": "signal",
          "signal_type": "official_intercity_bus_support",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS station and ticket-point support around the stay zone or its parent destination, useful for overland flexibility but not a live departure or booking feed."
        },
        {
          "key": "official_intercity_bus_search_support",
          "label": "Official intercity-bus search support",
          "score": 95,
          "weight": 0.03,
          "contribution": 2.85,
          "source": "signal",
          "signal_type": "official_intercity_bus_search_support",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is official BKS booking/search-surface support around the stay zone or its parent destination, useful for overland flexibility but not live departures, seats, or booking inventory truth."
        },
        {
          "key": "official_transport_complaint_support",
          "label": "Official transport complaint support",
          "score": 94,
          "weight": 0.04,
          "contribution": 3.76,
          "source": "signal",
          "signal_type": "official_transport_complaint_support",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is official DLT 1584 complaint recourse and transport-burden context around the stay zone or its parent destination, not local realtime service quality or dispatch truth."
        },
        {
          "key": "official_taxi_oversight_support",
          "label": "Official taxi-oversight support",
          "score": 83,
          "weight": 0.05,
          "contribution": 4.15,
          "source": "signal",
          "signal_type": "official_taxi_oversight_support",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is public DLT GPS and Taxi OK / VIP oversight, complaint, and station-search context around the stay zone or its parent destination, not live vehicle location, dispatch, ETA, or raw taxi GPS truth."
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 58,
          "weight": 0.05,
          "contribution": 2.9,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "",
          "note": "This is official Marine Department passenger-berth support around the stay zone or its parent destination, not live ferry schedule, closure, queue, or seat truth."
        },
        {
          "key": "water_fit",
          "label": "Water and flood fit",
          "score": 68,
          "weight": 0.08,
          "contribution": 5.44,
          "source": "derived",
          "signal_type": "flood_water_risk",
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": true,
          "default_reason": "No local or parent water-risk signal; using conservative fallback.",
          "note": ""
        },
        {
          "key": "parent_destination_fit",
          "label": "Parent destination fit",
          "score": 49,
          "weight": 0.16,
          "contribution": 7.84,
          "source": "decision",
          "signal_type": null,
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Parent destination decision missing; using blueprint fallback.",
          "note": ""
        },
        {
          "key": "blueprint_baseline",
          "label": "Blueprint baseline",
          "score": 79,
          "weight": 0.04,
          "contribution": 3.16,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "central-hua-hin-khao-takiab",
          "used_default": false,
          "default_reason": "Blueprint seed missing; using parent score as fallback.",
          "note": ""
        }
      ],
      "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": 3,
          "points": 6,
          "applied": true,
          "note": "3 component(s) used fallback defaults, so the engine applies a 6-point coverage penalty."
        },
        {
          "key": "contradiction_penalty",
          "label": "Stay contradiction 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": [
        "noise_comfort",
        "rain_fit",
        "water_fit"
      ],
      "source_summary": "17 joined sources support this decision.",
      "path": "/entities/central-hua-hin-khao-takiab/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    }
  ]
}