AI Native Model Router
Use this Skill as a deterministic route/v1 resolver with additive route/v2
assurance routing. It owns project-local selection and returns a machine-readable
RouteDecision; it does not execute a host, call a provider, load credentials,
or claim that a route was enforced.
Version 0.4.0 removes the bundled route/v1 Profile. The only bundled Profile is
gpt5.6, and it uses route/v2. The route/v1 schemas and APIs remain available
for explicitly selected safe project Profiles. Retired Profile IDs are rejected
before configuration, discovery, or Profile loading; they are not aliases or
supported discovery names.
Contract navigation
- Read interface for the v1 and v2 RouteRequest and
RouteDecision contracts.
- Read configuration for selection precedence,
version pairing, digest checks, safe project profiles, and collision handling.
- Read provider evidence before relying on a
dated identity or fallback claim.
- Use resolve_route.py for validation and resolution.
The Phase 1 config helper remains router_config.py.
- The package contract is in provider-catalog.json,
the immutable bundled gpt5.6 profile,
and the v1 config,
v1 request,
v1 decision,
v2 config,
v2 request, and
v2 decision schemas.
Operating rules
- Every request explicitly selects a profile. The bundled
gpt5.6 profile is
default_active: false with explicit-owner-selection; file presence never
activates a profile. Require explicit task selection for
writer.high-volume-deterministic.
- Preserve
route/v1 and its validator.independent independent-validation
semantics. Mixed v1/v2 request, config, and profile versions fail closed.
route/v2 uses validator.assurance: same-model review is allowed and is
reported through same_model_as_writer; it is not independent validation.
R1 is gpt-5.6-luna:max -> gpt-5.6-terra:max -> gpt-5.6-sol:high.
R2 is gpt-5.6-terra:max -> gpt-5.6-sol:high. R3 requires
gpt-5.6-terra:max + gpt-5.6-sol:high and must never degrade to one Validator.
For R3, apply this precedence: missing or unaccepted route-bound evidence for
any unavailable required route => decision_status: blocked, even when the
other required route is unknown; otherwise, any required route with
unknown availability => decision_status: unknown; otherwise, accepted
unavailability => decision_status: blocked. R3 never selects or degrades to
one route.
- route-bound evidence may be only
model-not-found,
authenticated-provider-outage, quota-exhaustion, or
repeated-bounded-transport-failure, keyed to the unavailable route.
Treat unknown as unknown; unknown remains unknown after the R3 precedence
above; never infer availability. A valid Validator rejection is not a route
failure. A substantive Validator rejection does not trigger escalation; create
a new candidate ID before revalidation.
- Resolve a fallback only for an unavailable route with complete accepted
evidence and an available next route. Return
enforcement_status: not-executed always; this is not an execution receipt.
- Keep provider execution, authentication, and transport outside this package.
No secret, endpoint, credential, transport command, or price value belongs in
configuration, profiles, catalog data, prompts, or evidence.
CLI
python scripts/resolve_route.py list-profiles
python scripts/resolve_route.py validate-profile --profile <id>
python scripts/resolve_route.py resolve --request <json-path-or-json> [--config <path>] [--injected-config <path-or-json>]
CLI success is JSON on stdout. Errors are JSON-free diagnostics on stderr with a
nonzero exit code. Ordering is deterministic.
1---2name: ai-native-model-router3description: Deterministic model routing with evidence-bound fallbacks.4license: MIT5---67# AI Native Model Router89Use this Skill as a deterministic `route/v1` resolver with additive `route/v2`10assurance routing. It owns project-local selection and returns a machine-readable11`RouteDecision`; it does not execute a host, call a provider, load credentials,12or claim that a route was enforced.1314Version 0.4.0 removes the bundled route/v1 Profile. The only bundled Profile is15`gpt5.6`, and it uses route/v2. The route/v1 schemas and APIs remain available16for explicitly selected safe project Profiles. Retired Profile IDs are rejected17before configuration, discovery, or Profile loading; they are not aliases or18supported discovery names.1920## Contract navigation2122- Read [interface](references/interface.md) for the v1 and v2 RouteRequest and23 RouteDecision contracts.24- Read [configuration](references/configuration.md) for selection precedence,25 version pairing, digest checks, safe project profiles, and collision handling.26- Read [provider evidence](references/provider-evidence.md) before relying on a27 dated identity or fallback claim.28- Use [resolve_route.py](scripts/resolve_route.py) for validation and resolution.29 The Phase 1 config helper remains [router_config.py](scripts/router_config.py).30- The package contract is in [provider-catalog.json](assets/provider-catalog.json),31 the immutable bundled [gpt5.6 profile](assets/profiles/gpt5.6.json),32 and the [v1 config](assets/model-router-config.v1.schema.json),33 [v1 request](assets/route-request.v1.schema.json),34 [v1 decision](assets/route-decision.v1.schema.json),35 [v2 config](assets/model-router-config.v2.schema.json),36 [v2 request](assets/route-request.v2.schema.json), and37 [v2 decision](assets/route-decision.v2.schema.json) schemas.3839## Operating rules40411. Every request explicitly selects a profile. The bundled `gpt5.6` profile is42 `default_active: false` with `explicit-owner-selection`; file presence never43 activates a profile. Require explicit task selection for44 `writer.high-volume-deterministic`.452. Preserve `route/v1` and its `validator.independent` independent-validation46 semantics. Mixed v1/v2 request, config, and profile versions fail closed.473. `route/v2` uses `validator.assurance`: same-model review is allowed and is48 reported through `same_model_as_writer`; it is not independent validation.49 R1 is `gpt-5.6-luna:max -> gpt-5.6-terra:max -> gpt-5.6-sol:high`.50 R2 is `gpt-5.6-terra:max -> gpt-5.6-sol:high`. R3 requires51 `gpt-5.6-terra:max + gpt-5.6-sol:high` and must never degrade to one Validator.52 For R3, apply this precedence: missing or unaccepted route-bound evidence for53 any unavailable required route => `decision_status: blocked`, even when the54 other required route is `unknown`; otherwise, any required route with55 `unknown` availability => `decision_status: unknown`; otherwise, accepted56 unavailability => `decision_status: blocked`. R3 never selects or degrades to57 one route.584. route-bound evidence may be only `model-not-found`,59 `authenticated-provider-outage`, `quota-exhaustion`, or60 `repeated-bounded-transport-failure`, keyed to the unavailable route.61 Treat `unknown` as unknown; unknown remains unknown after the R3 precedence62 above; never infer availability. A valid Validator rejection is not a route63 failure. A substantive Validator rejection does not trigger escalation; create64 a new candidate ID before revalidation.655. Resolve a fallback only for an unavailable route with complete accepted66 evidence and an available next route. Return `enforcement_status:67 not-executed` always; this is not an execution receipt.686. Keep provider execution, authentication, and transport outside this package.69 No secret, endpoint, credential, transport command, or price value belongs in70 configuration, profiles, catalog data, prompts, or evidence.7172## CLI7374```text75python scripts/resolve_route.py list-profiles76python scripts/resolve_route.py validate-profile --profile <id>77python scripts/resolve_route.py resolve --request <json-path-or-json> [--config <path>] [--injected-config <path-or-json>]78```7980CLI success is JSON on stdout. Errors are JSON-free diagnostics on stderr with a81nonzero exit code. Ordering is deterministic.