dialogue state tracking — slots fill, update, correct across turns turn 1 "I want a cheap restaurant in the north." cuisine: — area: north price: cheap people: — turn 2 "Italian food please." cuisine: italian area: north price: cheap people: — turn 3 "Actually make it moderate pricing." cuisine: italian area: north price: moderate people: — turn 4 "For four people." cuisine: italian area: north price: moderate people: 4 final state (JGA counts if and only if all slots match gold) {cuisine: italian, area: north, price: moderate, people: 4} → pass to backend: book_restaurant(cuisine=italian, area=north, price=moderate, people=4) invariants — correction overwrites (turn 3); explicit negation clears; untouched slots persist