Skip to content

[Router] Milestone tracker — Lemonade Router (generic core) #2389

Description

@ramkrishna2910

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions