Skip to content

Commit 22b78d9

Browse files
authored
docs(stage-router): mark capable_first experimental, and warn at startup (#363)
Every published threshold and routing result comes from efficient_first runs. capable_first works and the server accepts it, but it has not been benchmarked, so there is no calibrated confidence_threshold for it and no measured accuracy or cost to set expectations against. The docs now list efficient_first first and carry a warning admonition saying so, and the TOML schema table marks capable_first experimental. The server logs a warning at startup when a stage_router route selects it, so the caveat reaches operators who never read the page. Signed-off-by: Sabhatina Selvam <sabhatinas@nvidia.com>
1 parent 1e5767b commit 22b78d9

3 files changed

Lines changed: 17 additions & 3 deletions

File tree

crates/switchyard-server/src/config.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,11 @@ fn build_algorithm(
928928
classifier,
929929
..
930930
} => {
931+
if matches!(picker, PickerMode::CapableFirst) {
932+
tracing::warn!(
933+
"stage_router route {route_name} uses picker \"capable_first\", which is experimental: published thresholds and routing results all come from \"efficient_first\", so there is no calibrated confidence_threshold for it and no measured accuracy or cost. Use \"efficient_first\" unless you are running your own calibration."
934+
);
935+
}
931936
let capable = resolve_target(route_name, capable_target, targets)?;
932937
let efficient = resolve_target(route_name, efficient_target, targets)?;
933938
let mut config = StageRouterConfig::new(*picker, *confidence_threshold);

docs/reference/toml_schema.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ optional `handoff_notes` and `classifier` tables and for tuning.
174174
|---|:---:|---|---|
175175
| `capable_target` | Yes || Capable tier. |
176176
| `efficient_target` | Yes || Efficient tier. |
177-
| `picker` | Yes || `capable_first` or `efficient_first`. Tier used when the signals are not confident. |
177+
| `picker` | Yes || `efficient_first`, or `capable_first` (experimental, unbenchmarked). Tier used when the signals are not confident. |
178178
| `confidence_threshold` | Yes || Corroboration a decisive pick needs. In `[0, 1]`. |
179179
| `recent_turn_window` | No | `3` | Trailing tool results the signals are computed over. |
180180
| `capable_system_prompt` | No | unset | System prompt handed to the capable tier. |

docs/routing_algorithms/stage_router_routing.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,22 @@ the classifier). Raising the threshold shrinks that path; lowering it widens it.
6767
The picker name says which tier is the **default**: the tier used when the
6868
signals are ambiguous and no classifier verdict is available.
6969

70-
- **`capable_first`**: capable is the default; drop to efficient only when the
71-
signals (or the classifier) clearly say so. Quality-first.
7270
- **`efficient_first`**: efficient is the default; escalate to capable only when
7371
the signals (or the classifier) clearly say so. Cost-first.
72+
- **`capable_first`** *(experimental)*: capable is the default; drop to efficient
73+
only when the signals (or the classifier) clearly say so. Quality-first.
7474

7575
Both pickers read the same signals; only the default tier differs.
7676

77+
!!! warning "`capable_first` is experimental"
78+
79+
Every published threshold and routing result comes from `efficient_first`
80+
runs. `capable_first` works and the server accepts it, but it has not been
81+
benchmarked, so there are no calibrated thresholds for it and no measured
82+
accuracy or cost figures to set expectations against. The server logs a
83+
warning at startup when a route selects it. Use `efficient_first` unless you
84+
are running your own calibration.
85+
7786
## Tuning `confidence_threshold`
7887

7988
The scorer rates each turn from `0` (signals are neutral) to `1` (signals point

0 commit comments

Comments
 (0)