North star: ship a generic router for all customers; the Trust Router is the first customer. The engine does pure model selection (boolean rules + classifiers, first-match) and emits a decision trace. Everything trust-specific — verdicts, block, audit persistence, consent — is expressed on top via the per-rule outputs pass-through bag, refusal-routing, request metadata, and client-side trace logging. No trust code in the engine.
Policy lives in a collection.router collection JSON (sibling to collection.omni); pointing the model field at the collection name triggers the engine — no /v1/route, no "auto". Vocabulary mirrors vLLM Semantic Router for migration.
📋 Full Decision Log is maintained in the comments on this issue.
Approval gate — schemas ✅ SIGNED OFF
🎯 Priority 0 — first demo slice (priority:p0)
The minimum spine to demo routing from main before the milestone is complete: a collection.router policy with deterministic rules (keywords / regex / metadata / length) routes a request to different candidate models. No model-backed classifiers, no backend wiring — pure CPU. 8 of the milestone's issues; critical path is 5 sequential levels deep.
Demo critical path: #2407 → [#2378 ‖ #2379] → #2380 → #2382 → [#2383 ‖ #2385] → #2386
Not on the demo path: #2381 (semantic), #2405 (llm router), #2384 (Router wiring), #2388 (docs/e2e), #2406 (UI), #2425 (corpus) — all additive after the first demo.
Foundation (first dev step after sign-off)
Engine core (pure, fake services)
Policy loading
Dispatch
Exit
Optional / non-gating
Dependency graph
{#2375,#2376} → #2407 → #2378,#2379 → {#2380,#2381} → #2382 → {#2383,#2384} → {#2385, #2405} → #2386 → #2388
(#2407 interfaces gates #2378/#2379/#2384. #2405 depends on #2379/#2383/#2384 and feeds the #2388 e2e.)
Deferred → Trust Router (first customer) milestone
Exit criterion: a collection.router collection, driven by a vanilla openai client, routes a PII-flagged query and a support query to different candidates and everything else to default_model, with the per-condition trace returned on the response.
North star: ship a generic router for all customers; the Trust Router is the first customer. The engine does pure model selection (boolean rules + classifiers, first-match) and emits a decision trace. Everything trust-specific — verdicts,
block, audit persistence, consent — is expressed on top via the per-ruleoutputspass-through bag, refusal-routing, requestmetadata, and client-side trace logging. No trust code in the engine.Policy lives in a
collection.routercollection JSON (sibling tocollection.omni); pointing themodelfield at the collection name triggers the engine — no/v1/route, no"auto". Vocabulary mirrors vLLM Semantic Router for migration.📋 Full Decision Log is maintained in the comments on this issue.
Approval gate — schemas ✅ SIGNED OFF
route_to/default_model/routing.router) — Q1/Q2/Q3 resolved; signed off (PR [Router] Interfaces + fixtures stub (foundation) #2408 approved by @SlawomirNowaczyk + @eddierichter-amd;reference_phrasesrename,metadatacondition,[0,1]bounds, type-specific requirements incorporated)metadatainputs;route_traceopt-in) — resolved; signed off (request-sidemetadata/route_traceschema added per review)🎯 Priority 0 — first demo slice (
priority:p0)The minimum spine to demo routing from
mainbefore the milestone is complete: acollection.routerpolicy with deterministic rules (keywords / regex / metadata / length) routes a request to different candidate models. No model-backed classifiers, no backend wiring — pure CPU. 8 of the milestone's issues; critical path is 5 sequential levels deep.min_chars)route()collection.router)Demo critical path:
#2407 → [#2378 ‖ #2379] → #2380 → #2382 → [#2383 ‖ #2385] → #2386Not on the demo path: #2381 (semantic), #2405 (llm router), #2384 (Router wiring), #2388 (docs/e2e), #2406 (UI), #2425 (corpus) — all additive after the first demo.
Foundation (first dev step after sign-off)
Engine core (pure, fake services)
any/all/not)on_error)keywords_*/regex/min_chars/has_*)semantic_similarityclassifier (M5)llmrouter classifier +routing.routerdesugaring (L0a)default_model)Policy loading
embed+run_classifier+ chat for L0a)Dispatch
Exit
Optional / non-gating
collection.routerin the desktop custom-collection panel (UI-owned per AGENTS.md; not on the engine critical path — hand-authoring + CLI import work without it)Decisiontests) — guard rail, not a build step: mechanically enforces "never break an older-major policy". Best filled once#2382producesDecisions; corpus fixtures can be authored earlier.Dependency graph
(
#2407interfaces gates #2378/#2379/#2384.#2405depends on #2379/#2383/#2384 and feeds the #2388 e2e.)Deferred → Trust Router (first customer) milestone
warn/blocksemantics (refusal-routing +outputsbag interpretation)config.yaml→routingmigration tool · token-based length.Exit criterion: a
collection.routercollection, driven by a vanillaopenaiclient, routes a PII-flagged query and a support query to different candidates and everything else todefault_model, with the per-conditiontracereturned on the response.