{
  "generated_at": "2026-05-15T11:12:09.863Z",
  "last_updated": "2026-05-13",
  "purpose": "Gate catalog and support sources before they become traveler-facing widgets.",
  "gates": [
    {
      "id": "traveler_decision",
      "label": "Changes a traveler decision",
      "requiredForWidget": true,
      "question": "Could this source change where someone goes, stays, routes, ferries, eats, shops, or seeks help?"
    },
    {
      "id": "access_clear",
      "label": "Access and automation are clear",
      "requiredForWidget": true,
      "question": "Is access public or permissioned in a way we can honestly automate and label?"
    },
    {
      "id": "timestamped_observation",
      "label": "Can produce timestamped observations",
      "requiredForWidget": true,
      "question": "Can we store an observed_at or published_at value that is separate from fetch time?"
    },
    {
      "id": "signal_mapping",
      "label": "Maps to an existing signal",
      "requiredForWidget": true,
      "question": "Does it map to a known signal such as AQI, ferry fragility, route friction, stay fit, food-route confidence, or gold context?"
    },
    {
      "id": "decision_family",
      "label": "Owned by a decision family",
      "requiredForWidget": true,
      "question": "Does a named decision family own the source output?"
    },
    {
      "id": "page_explanation",
      "label": "Explainable in one sentence",
      "requiredForWidget": true,
      "question": "Can the page say what this source proves and what it does not prove?"
    },
    {
      "id": "privacy_bounds",
      "label": "Privacy and safety boundaries are explicit",
      "requiredForWidget": true,
      "question": "Does the source avoid private, dispatch, patient, case-level, or personally sensitive data?"
    }
  ],
  "statuses": [
    {
      "id": "promoted_decision_driving",
      "label": "Promoted: decision-driving",
      "meaning": "The source is wired through observations, signals, and at least one traveler decision family."
    },
    {
      "id": "health_checked_support",
      "label": "Health-checked support",
      "meaning": "The source can be probed or monitored, but it should not change public recommendations until observation and signal mapping is finished."
    },
    {
      "id": "keep_catalog_only",
      "label": "Keep catalog-only",
      "meaning": "The source is useful context or future evidence, but it is not ready for traveler widgets."
    },
    {
      "id": "reference_only",
      "label": "Reference only",
      "meaning": "The source explains units, legal rules, methods, or thresholds rather than live conditions."
    }
  ],
  "metrics": {
    "candidate_count": 17,
    "promoted_decision_driving_count": 9,
    "health_checked_support_count": 1,
    "keep_catalog_only_count": 6,
    "reference_only_count": 1,
    "ready_for_widget_count": 9,
    "status_counts": {
      "promoted_decision_driving": 9,
      "keep_catalog_only": 6,
      "health_checked_support": 1,
      "reference_only": 1
    },
    "priority_counts": {
      "high": 11,
      "medium": 6
    }
  },
  "candidates": [
    {
      "id": "exat-bangkok-expressway-friction",
      "priority": "high",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "EXAT Data Catalog",
        "EXAT Traffic Surface"
      ],
      "decisionFamilies": [
        "route-check",
        "today"
      ],
      "targetPageOwners": [
        "/routes/",
        "/route-check/",
        "/today/"
      ],
      "travelerDecision": "Keep Bangkok expressway and airport/coast corridor friction visible before routing travelers out of the city.",
      "currentUse": "Already decision-driving through route and place-fit signals.",
      "nextStep": "Keep using as route-friction support; do not label it as guaranteed live traffic unless the connector verifies a current traffic observation.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "exat-data-catalog",
          "name": "EXAT Data Catalog",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/exat-data-catalog/",
          "decision_scope": [
            "where_to_go_today",
            "where_to_stay",
            "route_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        },
        {
          "source_id": "exat-traffic-surface",
          "name": "EXAT Traffic Surface",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/exat-traffic-surface/",
          "decision_scope": [
            "where_to_go_today",
            "where_to_stay",
            "route_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "doh-highway-traffic-route-friction",
      "priority": "high",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "DOH Highway Traffic"
      ],
      "decisionFamilies": [
        "route-check",
        "today"
      ],
      "targetPageOwners": [
        "/routes/",
        "/route-check/"
      ],
      "travelerDecision": "Let highway traffic, cameras, speed, flow, and road-search context influence overland route caution.",
      "currentUse": "Already decision-driving for route support and transfer burden.",
      "nextStep": "Keep automation terms visible and avoid stronger claims than the public surface supports.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "doh-highway-traffic",
          "name": "DOH Highway Traffic",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/doh-highway-traffic/",
          "decision_scope": [
            "where_to_go_today",
            "where_to_stay",
            "route_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "drr-rural-road-bridge-context",
      "priority": "high",
      "status": "keep_catalog_only",
      "sourceNames": [
        "Department of Rural Roads road and bridge web services"
      ],
      "decisionFamilies": [
        "route-check"
      ],
      "targetPageOwners": [
        "/routes/",
        "/route-check/"
      ],
      "travelerDecision": "Improve Pai, Kanchanaburi, island-access-road, and rural route confidence once road and bridge fields are mapped.",
      "currentUse": "Catalog-only until the schema is normalized into route support observations.",
      "nextStep": "Define road/bridge observation fields, then promote to health-checked before letting it affect route scores.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": false,
        "signal_mapping": false,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "department-of-rural-roads-road-and-bridge-web-services",
          "name": "Department of Rural Roads road and bridge web services",
          "runtime_role_key": "catalog-only",
          "runtime_role": "Catalog only",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/department-of-rural-roads-road-and-bridge-web-services/",
          "decision_scope": [],
          "used_in_layers": [
            "page_reference_only"
          ]
        }
      ],
      "currentRuntimeRole": "catalog-only",
      "gatesPassed": 5,
      "gatesTotal": 7,
      "readyForWidget": false
    },
    {
      "id": "marine-berth-ferry-evidence",
      "priority": "high",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "Marine Department Berth Status"
      ],
      "decisionFamilies": [
        "ferry-check",
        "route-check"
      ],
      "targetPageOwners": [
        "/ferries/",
        "/route-check/"
      ],
      "travelerDecision": "Use berth and movement evidence for ferry-risk confidence without pretending it is a ticket, schedule, or seat feed.",
      "currentUse": "Already decision-driving for ferry and route checks.",
      "nextStep": "Keep page copy clear that berth evidence is not operator seat availability.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "marine-department-berth-status",
          "name": "Marine Department Berth Status",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/marine-department-berth-status/",
          "decision_scope": [
            "where_to_go_today",
            "route_check",
            "ferry_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "tmd-maritime-ferry-risk",
      "priority": "high",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "TMD Shipping Forecast"
      ],
      "decisionFamilies": [
        "ferry-check",
        "route-check",
        "today"
      ],
      "targetPageOwners": [
        "/ferries/",
        "/today/islands/",
        "/route-check/"
      ],
      "travelerDecision": "Separate sea, wave, wind, and shipping risk from generic weather before recommending island transfers.",
      "currentUse": "Already decision-driving for ferry and island route signals.",
      "nextStep": "Add more granular Gulf/Andaman labels only if the source exposes stable regional fields.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "tmd-shipping-forecast",
          "name": "TMD Shipping Forecast",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/tmd-shipping-forecast/",
          "decision_scope": [
            "where_to_go_today",
            "route_check",
            "ferry_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "hss-spa-license-confidence",
      "priority": "high",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "HSS Health Establishment Directory",
        "HSS Spa Premium"
      ],
      "decisionFamilies": [
        "where-to-stay",
        "today"
      ],
      "targetPageOwners": [
        "/venues/spas-massage/",
        "/accommodation/"
      ],
      "travelerDecision": "Let licensed spa and massage evidence support venue and stay-area confidence without making quality claims.",
      "currentUse": "Already decision-driving for wellness/stay support.",
      "nextStep": "Keep license confidence separate from reviews, opening hours, and service quality.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "hss-health-establishment-directory",
          "name": "HSS Health Establishment Directory",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/hss-health-establishment-directory/",
          "decision_scope": [
            "where_to_go_today",
            "where_to_stay"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        },
        {
          "source_id": "hss-spa-premium",
          "name": "HSS Spa Premium",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/hss-spa-premium/",
          "decision_scope": [
            "where_to_go_today",
            "where_to_stay"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "anamai-food-sanitation",
      "priority": "high",
      "status": "keep_catalog_only",
      "sourceNames": [
        "Department of Health food sanitation and SAN standards"
      ],
      "decisionFamilies": [
        "food-route"
      ],
      "targetPageOwners": [
        "/food/",
        "/venues/restaurants/"
      ],
      "travelerDecision": "Add official food-sanitation confidence to food-route pages where coverage is usable.",
      "currentUse": "Catalog-only until establishment or area coverage can be mapped without overclaiming.",
      "nextStep": "Map fields to restaurant-area confidence and keep it separate from taste, popularity, and current opening status.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": false,
        "signal_mapping": false,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "department-of-health-food-sanitation-and-san-standards",
          "name": "Department of Health food sanitation and SAN standards",
          "runtime_role_key": "catalog-only",
          "runtime_role": "Catalog only",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/department-of-health-food-sanitation-and-san-standards/",
          "decision_scope": [],
          "used_in_layers": [
            "page_reference_only"
          ]
        }
      ],
      "currentRuntimeRole": "catalog-only",
      "gatesPassed": 5,
      "gatesTotal": 7,
      "readyForWidget": false
    },
    {
      "id": "moph-health-facility-fallback",
      "priority": "high",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "MOPH Health Facility Datasets"
      ],
      "decisionFamilies": [
        "where-to-stay",
        "today"
      ],
      "targetPageOwners": [
        "/accommodation/",
        "/today/"
      ],
      "travelerDecision": "Represent hospital and clinic fallback depth without implying emergency availability.",
      "currentUse": "Already decision-driving for stay and place confidence.",
      "nextStep": "Keep facility presence separate from live capacity, wait times, or emergency dispatch.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "moph-health-facility-datasets",
          "name": "MOPH Health Facility Datasets",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/moph-health-facility-datasets/",
          "decision_scope": [
            "where_to_go_today",
            "where_to_stay"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "dnp-park-tourism-closures",
      "priority": "high",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "DNP Tourism Datasets"
      ],
      "decisionFamilies": [
        "route-check",
        "today"
      ],
      "targetPageOwners": [
        "/routes/",
        "/today/"
      ],
      "travelerDecision": "Keep national-park, attraction, visitor, and closure context visible on nature-heavy routes.",
      "currentUse": "Already decision-driving for park and route support.",
      "nextStep": "Do not imply live park access unless a daily closure or announcement monitor is added.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "dnp-tourism-datasets",
          "name": "DNP Tourism Datasets",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/dnp-tourism-datasets/",
          "decision_scope": [
            "where_to_go_today",
            "route_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "tat-data-api-v2-update",
      "priority": "high",
      "status": "keep_catalog_only",
      "sourceNames": [
        "TAT Data API museum place and event detail"
      ],
      "decisionFamilies": [
        "today",
        "food-route"
      ],
      "targetPageOwners": [
        "/where-to-go/",
        "/food/",
        "/museums/"
      ],
      "travelerDecision": "Use TAT place and event data to improve attraction, food-area, and museum context once auth/access is explicit.",
      "currentUse": "Catalog-only because access/auth and field coverage need explicit connector handling.",
      "nextStep": "Create a registered connector and map places/events to entity identity before any recommendation changes.",
      "gates": {
        "traveler_decision": true,
        "access_clear": false,
        "timestamped_observation": false,
        "signal_mapping": false,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "tat-data-api-museum-place-and-event-detail",
          "name": "TAT Data API museum place and event detail",
          "runtime_role_key": "catalog-only",
          "runtime_role": "Catalog only",
          "access_class_key": "free-registration",
          "access_class": "Free registration",
          "source_profile_url": "/data/sources/tat-data-api-museum-place-and-event-detail/",
          "decision_scope": [],
          "used_in_layers": [
            "page_reference_only"
          ]
        }
      ],
      "currentRuntimeRole": "catalog-only",
      "gatesPassed": 4,
      "gatesTotal": 7,
      "readyForWidget": false
    },
    {
      "id": "provincial-hotel-registration-cluster",
      "priority": "medium",
      "status": "keep_catalog_only",
      "sourceNames": [
        "Provincial hotel registration GDC cluster"
      ],
      "decisionFamilies": [
        "where-to-stay"
      ],
      "targetPageOwners": [
        "/accommodation/"
      ],
      "travelerDecision": "Provide fragmented registered-accommodation evidence without pretending there is one national hotel-license feed.",
      "currentUse": "Catalog-only cluster until province resources can be normalized and coverage gaps displayed.",
      "nextStep": "Build province coverage metadata before attaching to stay confidence.",
      "gates": {
        "traveler_decision": true,
        "access_clear": false,
        "timestamped_observation": false,
        "signal_mapping": false,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "provincial-hotel-registration-gdc-cluster",
          "name": "Provincial hotel registration GDC cluster",
          "runtime_role_key": "catalog-only",
          "runtime_role": "Catalog only",
          "access_class_key": "free-registration",
          "access_class": "Free registration",
          "source_profile_url": "/data/sources/provincial-hotel-registration-gdc-cluster/",
          "decision_scope": [],
          "used_in_layers": [
            "page_reference_only"
          ]
        }
      ],
      "currentRuntimeRole": "catalog-only",
      "gatesPassed": 4,
      "gatesTotal": 7,
      "readyForWidget": false
    },
    {
      "id": "bangkok-airbkk-district-aq",
      "priority": "medium",
      "status": "health_checked_support",
      "sourceNames": [
        "AirBKK"
      ],
      "decisionFamilies": [
        "today"
      ],
      "targetPageOwners": [
        "/today/bangkok/",
        "/where-to-go/bangkok/"
      ],
      "travelerDecision": "Improve Bangkok district-level air-quality confidence as a local supplement to national and global AQ feeds.",
      "currentUse": "Health-checked only; not yet decision-driving.",
      "nextStep": "Map district observations and freshness before letting it rerank Bangkok guidance.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": false,
        "signal_mapping": false,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "airbkk",
          "name": "AirBKK",
          "runtime_role_key": "health-checked",
          "runtime_role": "Health checked",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/airbkk/",
          "decision_scope": [],
          "used_in_layers": [
            "source_health"
          ]
        }
      ],
      "currentRuntimeRole": "health-checked",
      "gatesPassed": 5,
      "gatesTotal": 7,
      "readyForWidget": false
    },
    {
      "id": "asmc-regional-haze-context",
      "priority": "medium",
      "status": "keep_catalog_only",
      "sourceNames": [
        "ASMC regional haze and hotspot portal"
      ],
      "decisionFamilies": [
        "today"
      ],
      "targetPageOwners": [
        "/today/north/",
        "/guides/thailand-burning-season/"
      ],
      "travelerDecision": "Add regional haze and cross-border hotspot context without replacing station-level Thai PM2.5 readings.",
      "currentUse": "Catalog-only until hotspot fields, cadence, and geography are normalized.",
      "nextStep": "Promote as regional context only; avoid station-level precision claims.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": false,
        "signal_mapping": false,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "asmc-regional-haze-and-hotspot-portal",
          "name": "ASMC regional haze and hotspot portal",
          "runtime_role_key": "catalog-only",
          "runtime_role": "Catalog only",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/asmc-regional-haze-and-hotspot-portal/",
          "decision_scope": [],
          "used_in_layers": [
            "page_reference_only"
          ]
        }
      ],
      "currentRuntimeRole": "catalog-only",
      "gatesPassed": 5,
      "gatesTotal": 7,
      "readyForWidget": false
    },
    {
      "id": "bangkok-flood-monitoring",
      "priority": "medium",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "Bangkok Flood Monitoring System"
      ],
      "decisionFamilies": [
        "route-check",
        "today",
        "where-to-stay"
      ],
      "targetPageOwners": [
        "/today/bangkok/",
        "/routes/",
        "/accommodation/bangkok/"
      ],
      "travelerDecision": "Let Bangkok drainage and flood conditions affect taxi, route, and hotel-area friction.",
      "currentUse": "Already decision-driving for Bangkok condition and route support.",
      "nextStep": "Keep the scope Bangkok-only and do not generalize it to all Thailand flood risk.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "bangkok-flood-monitoring-system",
          "name": "Bangkok Flood Monitoring System",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/bangkok-flood-monitoring-system/",
          "decision_scope": [
            "where_to_go_today",
            "where_to_stay",
            "route_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "pea-mea-outage-announcements",
      "priority": "medium",
      "status": "keep_catalog_only",
      "sourceNames": [
        "PEA and MEA power outage announcements"
      ],
      "decisionFamilies": [
        "where-to-stay",
        "today"
      ],
      "targetPageOwners": [
        "/accommodation/",
        "/today/"
      ],
      "travelerDecision": "Use scheduled outage announcements as utility-risk context only if stable public announcement data can be normalized.",
      "currentUse": "Catalog-only; useful reference but not live grid status.",
      "nextStep": "Do not promote until announcement scope, timestamps, and location matching are reliable.",
      "gates": {
        "traveler_decision": true,
        "access_clear": false,
        "timestamped_observation": false,
        "signal_mapping": false,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "pea-and-mea-power-outage-announcements",
          "name": "PEA and MEA power outage announcements",
          "runtime_role_key": "catalog-only",
          "runtime_role": "Catalog only",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/pea-and-mea-power-outage-announcements/",
          "decision_scope": [],
          "used_in_layers": [
            "page_reference_only"
          ]
        }
      ],
      "currentRuntimeRole": "catalog-only",
      "gatesPassed": 4,
      "gatesTotal": 7,
      "readyForWidget": false
    },
    {
      "id": "thai-gold-national-reference",
      "priority": "high",
      "status": "promoted_decision_driving",
      "sourceNames": [
        "Gold Traders Association Thailand gold prices",
        "Bank of Thailand API"
      ],
      "decisionFamilies": [
        "gold-buying-check"
      ],
      "targetPageOwners": [
        "/gold/thailand-gold-price/",
        "/gold/"
      ],
      "travelerDecision": "Display national Thai gold reference prices in THB per baht-weight and explain THB exchange-rate context.",
      "currentUse": "Already decision-driving for the gold buying check.",
      "nextStep": "Keep city cards as buying-friction context, not separate official local prices.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": true,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "gold-traders-association-thailand-gold-prices",
          "name": "Gold Traders Association Thailand gold prices",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "public",
          "access_class": "Public",
          "source_profile_url": "/data/sources/gold-traders-association-thailand-gold-prices/",
          "decision_scope": [
            "gold_buying_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        },
        {
          "source_id": "bank-of-thailand-api",
          "name": "Bank of Thailand API",
          "runtime_role_key": "decision-driving",
          "runtime_role": "Decision driving",
          "access_class_key": "free-registration",
          "access_class": "Free registration",
          "source_profile_url": "/data/sources/bank-of-thailand-api/",
          "decision_scope": [
            "gold_buying_check"
          ],
          "used_in_layers": [
            "source_health",
            "observation_ingest",
            "signal_compute",
            "decision_compute"
          ]
        }
      ],
      "currentRuntimeRole": "decision-driving",
      "gatesPassed": 7,
      "gatesTotal": 7,
      "readyForWidget": true
    },
    {
      "id": "tfex-gold-unit-reference",
      "priority": "medium",
      "status": "reference_only",
      "sourceNames": [
        "TFEX Gold Futures contract and market data"
      ],
      "decisionFamilies": [
        "gold-buying-check"
      ],
      "targetPageOwners": [
        "/gold/thai-gold-units/",
        "/gold/thailand-gold-price/"
      ],
      "travelerDecision": "Explain baht-weight, purity, and formula context without turning the site into a trading feed.",
      "currentUse": "Reference context only.",
      "nextStep": "Use for unit/formula explanation; do not promote as live retail price truth.",
      "gates": {
        "traveler_decision": true,
        "access_clear": true,
        "timestamped_observation": false,
        "signal_mapping": true,
        "decision_family": true,
        "page_explanation": true,
        "privacy_bounds": true
      },
      "sources": [
        {
          "source_id": "tfex-gold-futures-contract-and-market-data",
          "name": "TFEX Gold Futures contract and market data",
          "runtime_role_key": "catalog-only",
          "runtime_role": "Catalog only",
          "access_class_key": "commercial",
          "access_class": "Commercial",
          "source_profile_url": "/data/sources/tfex-gold-futures-contract-and-market-data/",
          "decision_scope": [],
          "used_in_layers": [
            "page_reference_only"
          ]
        }
      ],
      "currentRuntimeRole": "catalog-only",
      "gatesPassed": 6,
      "gatesTotal": 7,
      "readyForWidget": false
    }
  ]
}
