{
  "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": "ferry-check",
    "name": "Ferry check",
    "decisionType": "ferry_check",
    "status": "active",
    "endpoint": "/api/decisions/ferry-check",
    "note": "Checks pier and island-chain plans with live sea-state caution, public transfer support, ferry fragility, and honest refund logic.",
    "output": "Ferry fragility, refund logic, and backup move."
  },
  "decision_count": 3,
  "filters": {
    "destination": "all",
    "city": "all",
    "route": "all",
    "limit": "all"
  },
  "rows": [
    {
      "decision_id": "ferry_phuket-krabi-ferry",
      "decision_type": "ferry_check",
      "subject_id": "phuket-krabi-ferry",
      "subject_name": "Phuket <-> Krabi ferry check",
      "subject_type": "ferry_route",
      "score": 52,
      "component_score": 62.8,
      "penalty_points": 11,
      "confidence": "Medium",
      "label": "fragile",
      "recommendation": "Phuket <-> Krabi ferry check needs refund-friendly planning and a backup move.",
      "best_for": "Andaman travelers who want coast changes without overcommitting every day to boats.",
      "avoid_if": "Your hotel stack stops being useful when one boat slips.",
      "check_first": [
        "live weather fit and ferry fragility",
        "last boat timing",
        "pier check-in and transfer burden"
      ],
      "next_action": "Keep the first island or coast hotel refundable until weather and pier timing feel solid.",
      "pivot": "Stay on Phuket and use road/day-trip logic if boats weaken.",
      "freshness_class": "acceptable",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 10,
        "available_components": 10,
        "live_components": 9,
        "fallback_components": 1,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination chain fit",
          "score": 55.5,
          "weight": 0.22,
          "contribution": 12.21,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "pier_confidence",
          "label": "Pier confidence",
          "score": 97,
          "weight": 0.14,
          "contribution": 13.58,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 60,
          "weight": 0.14,
          "contribution": 8.4,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 90.66666666666667,
          "weight": 0.12,
          "contribution": 10.88,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 83.33333333333333,
          "weight": 0.1,
          "contribution": 8.33,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "ferry_fragility",
          "label": "Ferry fragility",
          "score": 55.666666666666664,
          "weight": 0.24,
          "contribution": 13.36,
          "source": "signal",
          "signal_type": "ferry_fragility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "marine_warning_risk",
          "label": "Marine warning risk",
          "score": 34,
          "weight": 0.14,
          "contribution": 4.76,
          "source": "signal",
          "signal_type": "marine_warning_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Weather fit",
          "score": 44,
          "weight": 0.08,
          "contribution": 3.52,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "transport_stack",
          "label": "Transfer burden",
          "score": 60.666666666666664,
          "weight": 0.1,
          "contribution": 6.07,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "weakest_ferry_leg",
          "label": "Weakest ferry leg",
          "score": 54,
          "weight": 0.08,
          "contribution": 4.32,
          "source": "signal",
          "signal_type": "ferry_fragility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        }
      ],
      "penalty_components": [
        {
          "key": "freshness_penalty",
          "label": "Freshness penalty",
          "freshness_class": "acceptable",
          "points": 2,
          "applied": true,
          "note": "Freshness class is acceptable, so the engine applies a 2-point penalty."
        },
        {
          "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": "Ferry contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 63,
          "note": "Component scores spread by 63 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "1 pier anchors and 2 island or coast anchors currently support this ferry check.",
      "main_risk": "Ferry fragility is elevated, so refund flexibility matters before you lock the island chain.",
      "path": "/ferries/phuket-krabi/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:16:17.590Z"
    },
    {
      "decision_id": "ferry_samui-phangan-chain",
      "decision_type": "ferry_check",
      "subject_id": "samui-phangan-chain",
      "subject_name": "Samui <-> Phangan ferry check",
      "subject_type": "ferry_route",
      "score": 48,
      "component_score": 58.8,
      "penalty_points": 11,
      "confidence": "Medium",
      "label": "fragile",
      "recommendation": "Samui <-> Phangan ferry check needs refund-friendly planning and a backup move.",
      "best_for": "Gulf island chains with at least one stable Samui base night.",
      "avoid_if": "You are stacking the last boat behind a long road or flight day.",
      "check_first": [
        "live weather fit and ferry fragility",
        "last boat timing",
        "pier check-in and transfer burden"
      ],
      "next_action": "Keep mainland and island hotel policies forgiving until the transfer day is clear.",
      "pivot": "Use Samui only if the chain becomes brittle.",
      "freshness_class": "acceptable",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 10,
        "available_components": 10,
        "live_components": 9,
        "fallback_components": 1,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination chain fit",
          "score": 58.5,
          "weight": 0.22,
          "contribution": 12.87,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "pier_confidence",
          "label": "Pier confidence",
          "score": 97,
          "weight": 0.14,
          "contribution": 13.58,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 23.5,
          "weight": 0.14,
          "contribution": 3.29,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 96,
          "weight": 0.12,
          "contribution": 11.52,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 72,
          "weight": 0.1,
          "contribution": 7.2,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "ferry_fragility",
          "label": "Ferry fragility",
          "score": 51.75,
          "weight": 0.24,
          "contribution": 12.42,
          "source": "signal",
          "signal_type": "ferry_fragility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "marine_warning_risk",
          "label": "Marine warning risk",
          "score": 34,
          "weight": 0.14,
          "contribution": 4.76,
          "source": "signal",
          "signal_type": "marine_warning_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Weather fit",
          "score": 56,
          "weight": 0.08,
          "contribution": 4.48,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "transport_stack",
          "label": "Transfer burden",
          "score": 58,
          "weight": 0.1,
          "contribution": 5.8,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "weakest_ferry_leg",
          "label": "Weakest ferry leg",
          "score": 51,
          "weight": 0.08,
          "contribution": 4.08,
          "source": "signal",
          "signal_type": "ferry_fragility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        }
      ],
      "penalty_components": [
        {
          "key": "freshness_penalty",
          "label": "Freshness penalty",
          "freshness_class": "acceptable",
          "points": 2,
          "applied": true,
          "note": "Freshness class is acceptable, so the engine applies a 2-point penalty."
        },
        {
          "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": "Ferry contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 73.5,
          "note": "Component scores spread by 74 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "2 pier anchors and 2 island or coast anchors currently support this ferry check.",
      "main_risk": "Ferry fragility is elevated, so refund flexibility matters before you lock the island chain.",
      "path": "/ferries/koh-samui-koh-phangan-koh-tao/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:16:17.590Z"
    },
    {
      "decision_id": "ferry_mainland-to-samui",
      "decision_type": "ferry_check",
      "subject_id": "mainland-to-samui",
      "subject_name": "Mainland -> Samui ferry stack",
      "subject_type": "ferry_route",
      "score": 48,
      "component_score": 59.2,
      "penalty_points": 11,
      "confidence": "Medium",
      "label": "fragile",
      "recommendation": "Mainland -> Samui ferry stack needs refund-friendly planning and a backup move.",
      "best_for": "Travelers who intentionally build a mainland-to-island arrival day.",
      "avoid_if": "You are pretending the road leg is a small detail.",
      "check_first": [
        "live weather fit and ferry fragility",
        "last boat timing",
        "pier check-in and transfer burden"
      ],
      "next_action": "Treat the road-to-pier leg as part of the ferry decision, not a separate problem.",
      "pivot": "Fly if the schedule is already fragile before you even reach the pier.",
      "freshness_class": "acceptable",
      "score_formula_version": "signal-first-v2",
      "signal_coverage": {
        "total_components": 10,
        "available_components": 10,
        "live_components": 9,
        "fallback_components": 1,
        "defaulted_components": 0,
        "coverage_ratio": 1
      },
      "score_components": [
        {
          "key": "destination_fit",
          "label": "Destination chain fit",
          "score": 59,
          "weight": 0.22,
          "contribution": 12.98,
          "source": "decision",
          "signal_type": null,
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "pier_confidence",
          "label": "Pier confidence",
          "score": 97,
          "weight": 0.14,
          "contribution": 13.58,
          "source": "signal",
          "signal_type": "source_confidence",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "pier_transfer_support",
          "label": "Pier transfer support",
          "score": 23,
          "weight": 0.14,
          "contribution": 3.22,
          "source": "signal",
          "signal_type": "pier_transfer_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "official_pier_support",
          "label": "Official pier support",
          "score": 96.66666666666667,
          "weight": 0.12,
          "contribution": 11.6,
          "source": "signal",
          "signal_type": "official_pier_support",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "berth_operability_context",
          "label": "Berth operability context",
          "score": 74,
          "weight": 0.1,
          "contribution": 7.4,
          "source": "signal",
          "signal_type": "berth_operability_context",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "ferry_fragility",
          "label": "Ferry fragility",
          "score": 52,
          "weight": 0.24,
          "contribution": 12.48,
          "source": "signal",
          "signal_type": "ferry_fragility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "marine_warning_risk",
          "label": "Marine warning risk",
          "score": 34,
          "weight": 0.14,
          "contribution": 4.76,
          "source": "signal",
          "signal_type": "marine_warning_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "rain_fit",
          "label": "Weather fit",
          "score": 56,
          "weight": 0.08,
          "contribution": 4.48,
          "source": "signal",
          "signal_type": "rain_risk",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "transport_stack",
          "label": "Transfer burden",
          "score": 58.333333333333336,
          "weight": 0.1,
          "contribution": 5.83,
          "source": "signal",
          "signal_type": "transport_friction",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        },
        {
          "key": "weakest_ferry_leg",
          "label": "Weakest ferry leg",
          "score": 52,
          "weight": 0.08,
          "contribution": 4.16,
          "source": "signal",
          "signal_type": "ferry_fragility",
          "entity_id": null,
          "used_default": false,
          "default_reason": "",
          "note": ""
        }
      ],
      "penalty_components": [
        {
          "key": "freshness_penalty",
          "label": "Freshness penalty",
          "freshness_class": "acceptable",
          "points": 2,
          "applied": true,
          "note": "Freshness class is acceptable, so the engine applies a 2-point penalty."
        },
        {
          "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": "Ferry contradiction penalty",
          "points": 9,
          "applied": true,
          "spread": 74,
          "note": "Component scores spread by 74 points, so the engine treats the answer as more contradictory."
        }
      ],
      "fallback_used": false,
      "fallback_components": [],
      "source_summary": "2 pier anchors and 1 island or coast anchors currently support this ferry check.",
      "main_risk": "Ferry fragility is elevated, so refund flexibility matters before you lock the island chain.",
      "path": "/ferries/thailand-island-transfers/",
      "computed_at": "2026-06-24T02:15:12.974Z",
      "expires_at": "2026-06-24T14:16:17.590Z"
    }
  ]
}