{
  "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": "food-route",
    "name": "Food route",
    "decisionType": "food_route",
    "status": "active",
    "endpoint": "/api/decisions/food-route",
    "note": "Turns destination and venue-density entity records into traveler-facing food-route picks.",
    "output": "Best food-first destination and route fit."
  },
  "decision_count": 7,
  "filters": {
    "destination": "all",
    "city": "all",
    "route": "all",
    "limit": "all"
  },
  "rows": [
    {
      "decision_id": "food_bangkok",
      "decision_type": "food_route",
      "subject_id": "bangkok",
      "subject_name": "Bangkok",
      "subject_type": "destination",
      "score": 74,
      "component_score": 79.6,
      "penalty_points": 6,
      "confidence": "Medium",
      "label": "good",
      "recommendation": "Bangkok is a good food-route pick right now.",
      "best_for": "First-trip range, Chinatown, rail-linked eating, and rainy-day fallback.",
      "avoid_if": "You want one quiet neighborhood to explain the whole city.",
      "check_first": [
        "Check Air4Thai before heavy outdoor days.",
        "Choose a BTS/MRT-linked base before paying for a hotel."
      ],
      "next_action": "Choose the neighborhood first, then the named place.",
      "pivot": "Use malls, Chinatown, or BTS-linked zones when rain and heat stack.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 6,
        "available_components": 6,
        "live_components": 3,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination fit",
          "score": 65,
          "weight": 0.26,
          "contribution": 16.9,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "Destination decision missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.16,
          "contribution": 15.52,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Food-route source confidence missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.12,
          "contribution": 11.22,
          "source": "derived",
          "signal_type": null,
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Food-route rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 86,
          "weight": 0.1,
          "contribution": 8.6,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Food-route transport fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "food_blueprint_baseline",
          "label": "Food blueprint baseline",
          "score": 90,
          "weight": 0.1,
          "contribution": 9,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "bangkok",
          "used_default": false,
          "default_reason": "Food blueprint seed missing; using destination score 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": "Food-route contradiction penalty",
          "points": 6,
          "applied": true,
          "spread": 41,
          "note": "Component scores spread by 41 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "19 joined sources support this decision.",
      "path": "/today/bangkok/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "food_chiang-mai",
      "decision_type": "food_route",
      "subject_id": "chiang-mai",
      "subject_name": "Chiang Mai",
      "subject_type": "destination",
      "score": 70,
      "component_score": 76.1,
      "penalty_points": 6,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Chiang Mai works better as a supporting food move than the main food trip answer.",
      "best_for": "Khao soi, northern flavors, markets, and cafe routing.",
      "avoid_if": "AQI is high enough to make outdoor city walking feel punishing.",
      "check_first": [
        "Treat sustained PM2.5 as the main breaker.",
        "Choose Old City or Nimman based on trip shape, not a random deal."
      ],
      "next_action": "Use khao soi as the anchor, not the entire route.",
      "pivot": "Use Nimman comfort or indoor-heavy stops if the air is only borderline.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 6,
        "available_components": 6,
        "live_components": 3,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination fit",
          "score": 65,
          "weight": 0.26,
          "contribution": 16.9,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "Destination decision missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.16,
          "contribution": 15.52,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Food-route source confidence missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.12,
          "contribution": 11.22,
          "source": "derived",
          "signal_type": null,
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Food-route rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 63,
          "weight": 0.1,
          "contribution": 6.3,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Food-route transport fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "food_blueprint_baseline",
          "label": "Food blueprint baseline",
          "score": 84,
          "weight": 0.1,
          "contribution": 8.4,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "chiang-mai",
          "used_default": false,
          "default_reason": "Food blueprint seed missing; using destination score 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": "Food-route contradiction penalty",
          "points": 6,
          "applied": true,
          "spread": 41,
          "note": "Component scores spread by 41 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "10 joined sources support this decision.",
      "path": "/where-to-go/chiang-mai/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "food_koh-samui",
      "decision_type": "food_route",
      "subject_id": "koh-samui",
      "subject_name": "Koh Samui",
      "subject_type": "destination",
      "score": 67,
      "component_score": 72.6,
      "penalty_points": 6,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Koh Samui works better as a supporting food move than the main food trip answer.",
      "best_for": "Island comfort stays that want enough dining without turning nightlife into the whole trip.",
      "avoid_if": "You are chasing a city-level food graph on a resort island.",
      "check_first": [
        "Compare Gulf weather directly with the Andaman coast.",
        "Use Samui itself as the stable base before adding Phangan or Tao."
      ],
      "next_action": "Let the hotel base and transfer burden decide how wide the food route should spread.",
      "pivot": "Use Bangkok or Chiang Mai for the food-heavy segment of a split trip.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 6,
        "available_components": 6,
        "live_components": 3,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination fit",
          "score": 59,
          "weight": 0.26,
          "contribution": 15.34,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "Destination decision missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.16,
          "contribution": 15.52,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Food-route source confidence missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.12,
          "contribution": 11.22,
          "source": "derived",
          "signal_type": null,
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 56,
          "weight": 0.1,
          "contribution": 5.6,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Food-route rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 60,
          "weight": 0.1,
          "contribution": 6,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Food-route transport fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "food_blueprint_baseline",
          "label": "Food blueprint baseline",
          "score": 73,
          "weight": 0.1,
          "contribution": 7.3,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "koh-samui",
          "used_default": false,
          "default_reason": "Food blueprint seed missing; using destination score 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": "Food-route contradiction penalty",
          "points": 6,
          "applied": true,
          "spread": 41,
          "note": "Component scores spread by 41 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "9 joined sources support this decision.",
      "path": "/where-to-go/koh-samui/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "food_isaan",
      "decision_type": "food_route",
      "subject_id": "isaan",
      "subject_name": "Isaan",
      "subject_type": "destination",
      "score": 67,
      "component_score": 72.5,
      "penalty_points": 6,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Isaan works better as a supporting food move than the main food trip answer.",
      "best_for": "Repeat visitors who want regional food identity over a polished tourist script.",
      "avoid_if": "You need one easy first-trip dining district to do all the work.",
      "check_first": [
        "Treat province choice as the real decision, not just the region label.",
        "Use Khon Kaen, Ubon, Nong Khai, or Korat as actual anchors."
      ],
      "next_action": "Pick one province cluster and let the food justify the route.",
      "pivot": "Use Bangkok or Khon Kaen as the easier bridge into the region.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 6,
        "available_components": 6,
        "live_components": 3,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination fit",
          "score": 63,
          "weight": 0.26,
          "contribution": 16.38,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "Destination decision missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_confidence",
          "label": "Local source confidence",
          "score": 91,
          "weight": 0.16,
          "contribution": 14.56,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Food-route source confidence missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 80,
          "weight": 0.12,
          "contribution": 9.6,
          "source": "derived",
          "signal_type": null,
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 64,
          "weight": 0.1,
          "contribution": 6.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Food-route rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 58,
          "weight": 0.1,
          "contribution": 5.8,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Food-route transport fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "food_blueprint_baseline",
          "label": "Food blueprint baseline",
          "score": 82,
          "weight": 0.1,
          "contribution": 8.2,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "isaan",
          "used_default": false,
          "default_reason": "Food blueprint seed missing; using destination score 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": "Food-route contradiction penalty",
          "points": 6,
          "applied": true,
          "spread": 33,
          "note": "Component scores spread by 33 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "14 joined sources support this decision.",
      "path": "/where-to-go/isaan/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "food_phuket",
      "decision_type": "food_route",
      "subject_id": "phuket",
      "subject_name": "Phuket",
      "subject_type": "destination",
      "score": 62,
      "component_score": 71,
      "penalty_points": 9,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Phuket works better as a supporting food move than the main food trip answer.",
      "best_for": "Beach-trip food routes that need Old Town and rain backup in the mix.",
      "avoid_if": "You expect one beach strip to solve every meal mood.",
      "check_first": [
        "Choose the beach area before the hotel.",
        "Check marine and weather layers before committing to boat-heavy days."
      ],
      "next_action": "Keep Old Town as the fallback even if the hotel is beach-first.",
      "pivot": "Move the eating day away from the beach when weather weakens.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 6,
        "available_components": 6,
        "live_components": 3,
        "fallback_components": 3,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination fit",
          "score": 57,
          "weight": 0.26,
          "contribution": 14.82,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "Destination decision missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.16,
          "contribution": 15.52,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Food-route source confidence missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 93.5,
          "weight": 0.12,
          "contribution": 11.22,
          "source": "derived",
          "signal_type": null,
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 44,
          "weight": 0.1,
          "contribution": 4.4,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Food-route rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 61,
          "weight": 0.1,
          "contribution": 6.1,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Food-route transport fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "food_blueprint_baseline",
          "label": "Food blueprint baseline",
          "score": 76,
          "weight": 0.1,
          "contribution": 7.6,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "phuket",
          "used_default": false,
          "default_reason": "Food blueprint seed missing; using destination score 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": "Food-route 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": "9 joined sources support this decision.",
      "path": "/where-to-go/phuket/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T18:00:00.000Z"
    },
    {
      "decision_id": "food_pattaya-chonburi",
      "decision_type": "food_route",
      "subject_id": "pattaya-chonburi",
      "subject_name": "Pattaya / Chonburi",
      "subject_type": "destination",
      "score": 58,
      "component_score": 68.9,
      "penalty_points": 11,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Pattaya / Chonburi works better as a supporting food move than the main food trip answer.",
      "best_for": "Seafood, Thai-Chinese coastal eating, short-notice Bangkok coast pivots, and nightlife-adjacent food runs.",
      "avoid_if": "You want one calm district to explain the whole destination or you dislike traffic-heavy meal routing.",
      "check_first": [
        "Treat weekend traffic as a real input, not a footnote.",
        "Pick the beach or hotel zone before the hotel brand."
      ],
      "next_action": "Pick the zone first, then the named place, and let weekend traffic change the meal plan if needed.",
      "pivot": "Use Bangkok for the deeper food segment if the coast is only a short break.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 6,
        "available_components": 5,
        "live_components": 2,
        "fallback_components": 3,
        "defaulted_components": 1,
        "coverage_ratio": 0.833
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination fit",
          "score": 51,
          "weight": 0.26,
          "contribution": 13.26,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "Destination decision missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.16,
          "contribution": 15.52,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Food-route source confidence missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 70,
          "weight": 0.12,
          "contribution": 8.4,
          "source": "derived",
          "signal_type": null,
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 68,
          "weight": 0.1,
          "contribution": 6.8,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "pattaya-chonburi",
          "used_default": true,
          "default_reason": "Food-route rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 68,
          "weight": 0.1,
          "contribution": 6.8,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Food-route transport fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "food_blueprint_baseline",
          "label": "Food blueprint baseline",
          "score": 71,
          "weight": 0.1,
          "contribution": 7.1,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "pattaya-chonburi",
          "used_default": false,
          "default_reason": "Food blueprint seed missing; using destination score 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": "Food-route contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 46,
          "note": "Component scores spread by 46 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "rain_fit"
      ],
      "source_summary": "8 joined sources support this decision.",
      "path": "/where-to-go/pattaya-chonburi/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    },
    {
      "decision_id": "food_hua-hin",
      "decision_type": "food_route",
      "subject_id": "hua-hin",
      "subject_name": "Hua Hin / Cha-am",
      "subject_type": "destination",
      "score": 58,
      "component_score": 68.9,
      "penalty_points": 11,
      "confidence": "Medium",
      "label": "mixed",
      "recommendation": "Hua Hin / Cha-am works better as a supporting food move than the main food trip answer.",
      "best_for": "Seafood, night markets, resort-town comfort food, and gentler family-paced coast eating.",
      "avoid_if": "You expect city-level restaurant density or nightlife to solve the whole evening plan.",
      "check_first": [
        "Choose the exact beach-town base before paying.",
        "Treat rail and road convenience as part of the value, not just background logistics."
      ],
      "next_action": "Choose the market or beach-town zone first, then keep one easy indoor or hotel fallback in reserve.",
      "pivot": "Use Bangkok if the trip turns food-first rather than coast-first.",
      "freshness_class": "fresh",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 6,
        "available_components": 5,
        "live_components": 2,
        "fallback_components": 3,
        "defaulted_components": 1,
        "coverage_ratio": 0.833
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination fit",
          "score": 49,
          "weight": 0.26,
          "contribution": 12.74,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "Destination decision missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_confidence",
          "label": "Local source confidence",
          "score": 97,
          "weight": 0.16,
          "contribution": 15.52,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Food-route source confidence missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "local_comfort",
          "label": "Local comfort",
          "score": 70,
          "weight": 0.12,
          "contribution": 8.4,
          "source": "derived",
          "signal_type": null,
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Rain fit",
          "score": 68,
          "weight": 0.1,
          "contribution": 6.8,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": "hua-hin",
          "used_default": true,
          "default_reason": "Food-route rain fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "transport_fit",
          "label": "Transport fit",
          "score": 70,
          "weight": 0.1,
          "contribution": 7,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Food-route transport fit missing; using conservative fallback.",
          "note": ""
        },
        {
          "key": "food_blueprint_baseline",
          "label": "Food blueprint baseline",
          "score": 74,
          "weight": 0.1,
          "contribution": 7.4,
          "source": "blueprint",
          "signal_type": null,
          "entity_id": "hua-hin",
          "used_default": false,
          "default_reason": "Food blueprint seed missing; using destination score 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": "Food-route contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 48,
          "note": "Component scores spread by 48 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": true,
      "fallback_components": [
        "rain_fit"
      ],
      "source_summary": "9 joined sources support this decision.",
      "path": "/where-to-go/hua-hin/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:15:23.481Z"
    }
  ]
}