{
 "rule": "Two moments are the same gap if one single knowledge-base entry would have answered both. For TOOL-class moments (no entry can answer), read as: one fix (one tool) would have served both.",
 "entry_vs_tool": "ENTRY if the requested thing is absent from the database, exists in <=3 venues (one entry can list them), or is an attraction type confined to known areas. TOOL if the answer depends on live availability or a multi-attribute search.",
 "gaps": [
  {
   "name": "No Caribbean (Cuban / Jamaican) restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0014"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Caribbean (Cuban / Jamaican) restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Scandinavian (Danish / Swedish) restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0016"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Scandinavian (Danish / Swedish) restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Southeast Asian (Malaysian / Singaporean / Indonesian) restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0017"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Southeast Asian (Malaysian / Singaporean / Indonesian) restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Central European (Austrian / Hungarian) restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0018"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Central European (Austrian / Hungarian) restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No German / Swiss restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0024"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no German / Swiss restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Corsican restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0039"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Corsican restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Australian / Australasian restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0043"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Australian / Australasian restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Moroccan / Middle Eastern restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0047"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Moroccan / Middle Eastern restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Pan-Asian restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0048"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Pan-Asian restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Vegetarian / vegan restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0049"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Vegetarian / vegan restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Irish restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0052"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Irish restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Christmas food restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0054"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Christmas food restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Russian restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0055"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Russian restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Persian restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0056"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Persian restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Afghan restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0063"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Afghan restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Greek restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0065"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Greek restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Venetian restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0068"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Venetian restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Polynesian restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0069"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Polynesian restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Tuscan restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0070"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Tuscan restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Kosher restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0072"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Kosher restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Catalan restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0075"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Catalan restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Polish restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0076"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Polish restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Fusion restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0079"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Fusion restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Bistro restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0082"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Bistro restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Eritrean restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0084"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Eritrean restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Molecular gastronomy restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0085"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Molecular gastronomy restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Welsh restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0086"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Welsh restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Crossover restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0088"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Crossover restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Halal restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0089"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Halal restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Barbecue restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0090"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Barbecue restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Sri Lankan restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0093"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Sri Lankan restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Cantonese restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0109"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Cantonese restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Romanian restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0115"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Romanian restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Light bites restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0118"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Light bites restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Canap\u00e9s restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0120"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Canap\u00e9s restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No New Zealand restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0124"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no New Zealand restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Afternoon tea restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0129"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Afternoon tea restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "No Modern eclectic restaurant",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0133"
   ],
   "rationale": "The cuisine does not exist in the database at all; one entry ('we have no Modern eclectic restaurants \u2014 closest options are \u2026') answers every phrasing."
  },
  {
   "name": "African restaurant in the wrong area / price",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0026"
   ],
   "rationale": "The database has 1 African restaurant(s); misses were for price/area combinations. One entry listing them ('our only African place is \u2026') answers every phrasing."
  },
  {
   "name": "Lebanese restaurant in the wrong area / price",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0092"
   ],
   "rationale": "The database has 1 Lebanese restaurant(s); misses were for price/area combinations. One entry listing them ('our only Lebanese place is \u2026') answers every phrasing."
  },
  {
   "name": "Vietnamese restaurant in the wrong area / price",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0081"
   ],
   "rationale": "The database has 1 Vietnamese restaurant(s); misses were for price/area combinations. One entry listing them ('our only Vietnamese place is \u2026') answers every phrasing."
  },
  {
   "name": "Japanese restaurant in the wrong area / price",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0099"
   ],
   "rationale": "The database has 1 Japanese restaurant(s); misses were for price/area combinations. One entry listing them ('our only Japanese place is \u2026') answers every phrasing."
  },
  {
   "name": "Korean restaurant in the wrong area / price",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0113"
   ],
   "rationale": "The database has 1 Korean restaurant(s); misses were for price/area combinations. One entry listing them ('our only Korean place is \u2026') answers every phrasing."
  },
  {
   "name": "Seafood restaurant in the wrong area / price",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0143"
   ],
   "rationale": "The database has 1 Seafood restaurant(s); misses were for price/area combinations. One entry listing them ('our only Seafood place is \u2026') answers every phrasing."
  },
  {
   "name": "Thai restaurant in the wrong area / price",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0107"
   ],
   "rationale": "The database has 2 Thai restaurant(s); misses were for price/area combinations. One entry listing them ('our only Thai place is \u2026') answers every phrasing."
  },
  {
   "name": "Turkish restaurant in the wrong area / price",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0097"
   ],
   "rationale": "The database has 3 Turkish restaurant(s); misses were for price/area combinations. One entry listing them ('our only Turkish place is \u2026') answers every phrasing."
  },
  {
   "name": "Multiple-sports venue outside the east",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0007",
    "R0127"
   ],
   "rationale": "One entry ('the only multiple-sports venue is in the east') answers every phrasing."
  },
  {
   "name": "Entertainment venue in the centre",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0008",
    "R0104",
    "R0110"
   ],
   "rationale": "One entry ('entertainment venues exist only in the east, south and west') answers every phrasing."
  },
  {
   "name": "Theatre / cinema in an area with none",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0025"
   ],
   "rationale": "One entry ('theatres and cinemas are only in the centre and south') answers every phrasing."
  },
  {
   "name": "Swimming pool in an area with none",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0028"
   ],
   "rationale": "One entry ('pools are only in the centre, east and north') answers every phrasing."
  },
  {
   "name": "College outside the centre / west",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0035",
    "R0147",
    "R0163"
   ],
   "rationale": "One entry ('colleges are only in the centre and west') answers every phrasing."
  },
  {
   "name": "Concert hall outside the centre",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0036"
   ],
   "rationale": "One entry ('the only concert hall is in the centre') answers every phrasing."
  },
  {
   "name": "Architecture outside the centre",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0038"
   ],
   "rationale": "One entry ('architecture attractions are only in the centre') answers every phrasing."
  },
  {
   "name": "Nightclub outside the centre / south",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0041"
   ],
   "rationale": "One entry ('nightclubs are only in the centre and south') answers every phrasing."
  },
  {
   "name": "Boating in an area with none",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0108"
   ],
   "rationale": "One entry ('boats are only in the centre, east and north') answers every phrasing."
  },
  {
   "name": "Park in the west",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0111"
   ],
   "rationale": "One entry ('there are no parks in the west') answers every phrasing."
  },
  {
   "name": "Entrance fee / admission price not in the data",
   "fix": "ENTRY",
   "raw_clusters": [
    "R0012",
    "R0174"
   ],
   "rationale": "The database has no fee for these attractions; one entry per attraction-fee policy ('fees are not listed \u2014 call the venue on \u2026') answers every phrasing. Mostly lexical (C) moments."
  },
  {
   "name": "Booking slot unavailable (room or table)",
   "fix": "TOOL",
   "raw_clusters": [
    "R0000",
    "R0001",
    "R0005",
    "R0009",
    "R0011",
    "R0034",
    "R0046",
    "R0064",
    "R0074",
    "R0083",
    "R0087",
    "R0096",
    "R0101",
    "R0103",
    "R0112",
    "R0122",
    "R0125",
    "R0126",
    "R0131",
    "R0132",
    "R0135",
    "R0136",
    "R0137",
    "R0140",
    "R0146",
    "R0154",
    "R0157",
    "R0160",
    "R0161",
    "R0166",
    "R0167",
    "R0170",
    "R0171",
    "R0172",
    "R0177"
   ],
   "rationale": "No entry can say whether a date/time/party size is free; it needs a live availability check that offers alternatives. Loosest merge in the table: hotel and restaurant bookings share one fix (an availability tool) but different back-ends."
  },
  {
   "name": "Hotel search: no match for the requested combination",
   "fix": "TOOL",
   "raw_clusters": [
    "R0002",
    "R0003",
    "R0004",
    "R0006",
    "R0029",
    "R0061",
    "R0071",
    "R0095",
    "R0130",
    "R0169"
   ],
   "rationale": "33 hotels; misses are star / price / area / parking / wifi combinations. The answer depends on the combination, so it needs a live filtered search, not an entry."
  },
  {
   "name": "Restaurant search: common cuisine, no match for price / area",
   "fix": "TOOL",
   "raw_clusters": [
    "R0023",
    "R0066",
    "R0151",
    "R0100",
    "R0139"
   ],
   "rationale": "Indian (22 venues), Chinese (17), Italian (15), gastropub (4): too many to list in one entry; a miss on price/area needs a live filtered search."
  },
  {
   "name": "Train: no service at the requested time / route",
   "fix": "TOOL",
   "raw_clusters": [
    "R0057",
    "R0062",
    "R0073",
    "R0094",
    "R0116",
    "R0134",
    "R0141",
    "R0165",
    "R0176"
   ],
   "rationale": "Timetable lookups; an entry cannot answer 'is there a train after 09:30 from Kings Lynn on Sunday'."
  },
  {
   "name": "Buy / reserve attraction tickets",
   "fix": "TOOL",
   "raw_clusters": [
    "R0173"
   ],
   "rationale": "The system has no ticketing action for attractions; needs a booking tool, not an entry."
  }
 ],
 "excluded_reviewed_clusters": {
  "mixed \u2014 the locked rule cannot unify the members (different facts would answer them)": [
   "R0010",
   "R0019",
   "R0020",
   "R0021",
   "R0032",
   "R0033",
   "R0044",
   "R0077",
   "R0098",
   "R0149",
   "R0168",
   "R0013",
   "R0022",
   "R0144"
  ],
  "context-dependent fragment \u2014 the request only makes sense with earlier turns (an area, a price, a day, a party size)": [
   "R0027",
   "R0030",
   "R0031",
   "R0040",
   "R0045",
   "R0053",
   "R0058",
   "R0067",
   "R0078",
   "R0091",
   "R0105",
   "R0114",
   "R0117",
   "R0138",
   "R0142",
   "R0145",
   "R0150",
   "R0155",
   "R0156",
   "R0159",
   "R0164",
   "R0178",
   "R0179",
   "R0148",
   "R0158",
   "R0152",
   "R0153",
   "R0102",
   "R0128"
  ],
  "not a gap \u2014 in-schema request the annotators left untagged (step-0 D noise: reference numbers, addresses, star rating, cost, travel time, 'help me find a place')": [
   "R0015",
   "R0037",
   "R0042",
   "R0050",
   "R0051",
   "R0059",
   "R0060",
   "R0080",
   "R0106",
   "R0119",
   "R0121",
   "R0123",
   "R0162",
   "R0175"
  ]
 }
}