{"generated_at":"2026-08-22T17:51:47.142Z","storage":{"mode":"versioned-snapshot","snapshot_generated_at":"2026-08-22T17:51:47.142Z"},"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":"","route":"","limit":50},"rows":[{"decision_id":"food_bangkok","decision_type":"food_route","subject_id":"bangkok","subject_name":"Bangkok","subject_type":"destination","score":69,"component_score":78.1,"penalty_points":9,"confidence":"Medium","label":"mixed","recommendation":"Bangkok works better as a supporting food move than the main food trip answer.","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":"expired","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":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":50,"weight":0.1,"contribution":5,"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":85,"weight":0.1,"contribution":8.5,"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":9,"applied":true,"spread":47,"note":"Component scores spread by 47 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-08-22T17:51:47.142Z","expires_at":"2026-08-23T05:51:47.642Z","freshness":"expired","data_current":false,"expired":true},{"decision_id":"food_chiang-mai","decision_type":"food_route","subject_id":"chiang-mai","subject_name":"Chiang Mai","subject_type":"destination","score":67,"component_score":75.9,"penalty_points":9,"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":"expired","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":54,"weight":0.1,"contribution":5.4,"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":9,"applied":true,"spread":43,"note":"Component scores spread by 43 points, so the engine treats the answer as more contradictory."}],"fallback_used":false,"fallback_components":[],"source_summary":"10 joined sources support this decision.","path":"/where-to-go/chiang-mai/","computed_at":"2026-08-22T17:51:47.142Z","expires_at":"2026-08-23T05:51:47.642Z","freshness":"expired","data_current":false,"expired":true},{"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":69.2,"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":"expired","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":50,"weight":0.26,"contribution":13,"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":47,"note":"Component scores spread by 47 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-08-22T17:51:47.142Z","expires_at":"2026-08-23T05:51:47.642Z","freshness":"expired","data_current":false,"expired":true},{"decision_id":"food_isaan","decision_type":"food_route","subject_id":"isaan","subject_name":"Isaan","subject_type":"destination","score":67,"component_score":73,"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":"expired","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":62,"weight":0.26,"contribution":16.12,"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":93.5,"weight":0.12,"contribution":11.22,"source":"derived","signal_type":null,"entity_id":"isaan","used_default":false,"default_reason":"","note":""},{"key":"rain_fit","label":"Rain fit","score":54,"weight":0.1,"contribution":5.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":39.5,"note":"Component scores spread by 40 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-08-22T17:51:47.142Z","expires_at":"2026-08-23T05:51:47.642Z","freshness":"expired","data_current":false,"expired":true},{"decision_id":"food_koh-samui","decision_type":"food_route","subject_id":"koh-samui","subject_name":"Koh Samui","subject_type":"destination","score":66,"component_score":72.1,"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":"expired","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":"koh-samui","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":"koh-samui","used_default":false,"default_reason":"","note":""},{"key":"rain_fit","label":"Rain fit","score":72,"weight":0.1,"contribution":7.2,"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":61,"weight":0.1,"contribution":6.1,"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":40,"note":"Component scores spread by 40 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-08-22T17:51:47.142Z","expires_at":"2026-08-23T05:51:47.642Z","freshness":"expired","data_current":false,"expired":true},{"decision_id":"food_pattaya-chonburi","decision_type":"food_route","subject_id":"pattaya-chonburi","subject_name":"Pattaya / Chonburi","subject_type":"destination","score":58,"component_score":69.2,"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":"expired","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":52,"weight":0.26,"contribution":13.52,"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":45,"note":"Component scores spread by 45 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-08-22T17:51:47.142Z","expires_at":"2026-08-23T05:51:47.642Z","freshness":"expired","data_current":false,"expired":true},{"decision_id":"food_phuket","decision_type":"food_route","subject_id":"phuket","subject_name":"Phuket","subject_type":"destination","score":61,"component_score":70,"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":"expired","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":56,"weight":0.26,"contribution":14.56,"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":80,"weight":0.12,"contribution":9.6,"source":"derived","signal_type":null,"entity_id":"phuket","used_default":false,"default_reason":"","note":""},{"key":"rain_fit","label":"Rain fit","score":54,"weight":0.1,"contribution":5.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":43,"note":"Component scores spread by 43 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-08-22T17:51:47.142Z","expires_at":"2026-08-23T05:51:47.642Z","freshness":"expired","data_current":false,"expired":true}],"data_status":{"generated_at":"2026-08-22T17:51:47.142Z","freshness":"expired","is_current":false,"row_count":7,"current_row_count":0,"expired_row_count":7,"row_freshness_counts":{"fresh":0,"aging":0,"stale":0,"expired":7,"unknown":0}}}