What to build
The Dispatcher's Tier-4 legacy fallback proxy.resolve_slot (path/name heuristics) is reached at exactly one site and is superseded by Tiers 1-3. Retire it: delete Tier-4, raise NoRouteFound when Tiers 1-3 miss (confirm no model bindings rely on the legacy path first). Also add a public SlotManager.state(name) -> SlotState and switch the Dispatcher off the private _current_state() leak. Add a short ARCHITECTURE note documenting the two orthogonal routing axes (Dispatcher = model-id→URL transport; route_for_request = capability→slot selection) so this isn't misread as redundant again.
Do NOT touch omni_router / route_for_request — they stay (verified load-bearing for omni's tool selection + dispatch).
Pointers: dispatcher/proxy.py:58, dispatcher/router.py:549,669,704. Audit Q2.1.
Acceptance criteria
Blocked by
None - can start immediately
What to build
The Dispatcher's Tier-4 legacy fallback
proxy.resolve_slot(path/name heuristics) is reached at exactly one site and is superseded by Tiers 1-3. Retire it: delete Tier-4, raiseNoRouteFoundwhen Tiers 1-3 miss (confirm no model bindings rely on the legacy path first). Also add a publicSlotManager.state(name) -> SlotStateand switch the Dispatcher off the private_current_state()leak. Add a short ARCHITECTURE note documenting the two orthogonal routing axes (Dispatcher = model-id→URL transport;route_for_request= capability→slot selection) so this isn't misread as redundant again.Do NOT touch
omni_router/route_for_request— they stay (verified load-bearing for omni's tool selection + dispatch).Pointers:
dispatcher/proxy.py:58,dispatcher/router.py:549,669,704. Audit Q2.1.Acceptance criteria
resolve_slotremoved; Tiers 1-3 raiseNoRouteFoundon missSlotManager.state()added; Dispatcher no longer calls_current_state()Blocked by
None - can start immediately