Context
Parent: #2 · POC: #16
The POC in #16 classifies per request (Context::default() each time). If the judge fails mid-chat, on_failure: open continues without a sticky tier and may leave the request unrouted. That can flap Weak ↔ Strong across turns, or change behavior quietly when the judge is flaky.
Epic #2 already calls out thinking through classifier reachability and avoiding turn-by-turn thrashing.
Goal
Define and demonstrate a mid-session failure policy that does not thrash tiers.
Proposed work
- Document current behavior (judge timeout / 5xx / unreachable mid-chat).
- Add a demo scenario (and/or tests) that kills or breaks the judge mid-conversation and shows resulting tiers.
- Implement a sticky policy, e.g.:
- keep last successful tier for the session key when the judge fails, or
- fail-closed / reject instead of re-deciding, or
- another explicit operator-chosen fallback (must be documented).
- Make the chosen policy observable via filter metadata/logs.
Out of scope (unless we decide otherwise)
Acceptance criteria
Context
Parent: #2 · POC: #16
The POC in #16 classifies per request (
Context::default()each time). If the judge fails mid-chat,on_failure: opencontinues without a sticky tier and may leave the request unrouted. That can flap Weak ↔ Strong across turns, or change behavior quietly when the judge is flaky.Epic #2 already calls out thinking through classifier reachability and avoiding turn-by-turn thrashing.
Goal
Define and demonstrate a mid-session failure policy that does not thrash tiers.
Proposed work
Out of scope (unless we decide otherwise)
Acceptance criteria
on_failure: openandclosed.