The bare-appliance branches in home_status_target (water pressure, sump pump, sous vide, baby monitor, and the water+hot pair) key on the noun phrase alone, with no status-question shape required. A command that merely contains the noun is hijacked into a status read instead of abstaining so the LLM can ground the write.
Reproduced on main @ 9bff670 via route():
remind me to check the water pressure -> home_status {entity: "water pressure"}
remind me to test the sump pump -> home_status {entity: "sump pump"}
remind me to buy a baby monitor -> home_status {entity: "baby monitor"}
remind me to buy a sous vide -> home_status {entity: "sous vide"}
how do i cook sous vide -> home_status {entity: "sous vide"}
remind me to buy hot water bottles -> home_status {entity: "water heater"}
Every one of these is a write/lookup the deterministic router cannot serve; the user asks for a reminder and gets a device report instead — a wrong tool fires, and the reminder is silently never set. The sibling iron block already solved exactly this ("remind me to iron my shirt" used to hijack the iron appliance branch) by requiring looks_like_status_query(text) || text.starts_with("did "); these five branches are the same bug without the gate.
Genuine status questions ("Check the water pressure", "Is the sump pump running?", "Is the sous vide on?", "Is the baby monitor on?", "Is the water hot?", "How hot is the water?") must keep resolving to the same entities.
The bare-appliance branches in
home_status_target(water pressure, sump pump, sous vide, baby monitor, and the water+hot pair) key on the noun phrase alone, with no status-question shape required. A command that merely contains the noun is hijacked into a status read instead of abstaining so the LLM can ground the write.Reproduced on
main@ 9bff670 viaroute():Every one of these is a write/lookup the deterministic router cannot serve; the user asks for a reminder and gets a device report instead — a wrong tool fires, and the reminder is silently never set. The sibling iron block already solved exactly this ("remind me to iron my shirt" used to hijack the iron appliance branch) by requiring
looks_like_status_query(text) || text.starts_with("did "); these five branches are the same bug without the gate.Genuine status questions ("Check the water pressure", "Is the sump pump running?", "Is the sous vide on?", "Is the baby monitor on?", "Is the water hot?", "How hot is the water?") must keep resolving to the same entities.