pi-smart-router 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/.pi/extensions/smart-router/command-formatters.ts +88 -7
  2. package/.pi/extensions/smart-router/commands.ts +4 -1
  3. package/.pi/extensions/smart-router/index.ts +4 -0
  4. package/README.md +22 -3
  5. package/config/operator-config.json.example +8 -0
  6. package/dist/config/defaults.d.ts +1 -1
  7. package/dist/config/defaults.d.ts.map +1 -1
  8. package/dist/config/defaults.js +3 -2
  9. package/dist/config/defaults.js.map +1 -1
  10. package/dist/domain/pinning/loop-escalation.d.ts +23 -1
  11. package/dist/domain/pinning/loop-escalation.d.ts.map +1 -1
  12. package/dist/domain/pinning/loop-escalation.js +107 -20
  13. package/dist/domain/pinning/loop-escalation.js.map +1 -1
  14. package/dist/domain/pipeline/router-pipeline.d.ts +7 -1
  15. package/dist/domain/pipeline/router-pipeline.d.ts.map +1 -1
  16. package/dist/domain/pipeline/router-pipeline.js +63 -7
  17. package/dist/domain/pipeline/router-pipeline.js.map +1 -1
  18. package/dist/domain/triage/triage-engine.d.ts.map +1 -1
  19. package/dist/domain/triage/triage-engine.js +15 -0
  20. package/dist/domain/triage/triage-engine.js.map +1 -1
  21. package/dist/domain/triage/turn-envelope.d.ts.map +1 -1
  22. package/dist/domain/triage/turn-envelope.js +4 -0
  23. package/dist/domain/triage/turn-envelope.js.map +1 -1
  24. package/dist/domain/types/schemas.d.ts +15 -0
  25. package/dist/domain/types/schemas.d.ts.map +1 -1
  26. package/dist/domain/types/schemas.js +20 -0
  27. package/dist/domain/types/schemas.js.map +1 -1
  28. package/dist/infrastructure/telemetry/routing-telemetry.d.ts +4 -0
  29. package/dist/infrastructure/telemetry/routing-telemetry.d.ts.map +1 -1
  30. package/dist/infrastructure/telemetry/routing-telemetry.js +13 -0
  31. package/dist/infrastructure/telemetry/routing-telemetry.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/config/defaults.ts +9 -1
  34. package/src/domain/pinning/loop-escalation.ts +136 -20
  35. package/src/domain/pipeline/router-pipeline.ts +88 -11
  36. package/src/domain/triage/triage-engine.ts +15 -0
  37. package/src/domain/triage/turn-envelope.ts +4 -0
  38. package/src/domain/types/schemas.ts +24 -0
  39. package/src/infrastructure/telemetry/routing-telemetry.ts +15 -0
@@ -2,7 +2,11 @@ import {
2
2
  DEFAULT_HISTORY_LIMIT,
3
3
  MAX_HISTORY_LIMIT,
4
4
  } from '../../../src/infrastructure/telemetry/telemetry-limits.js';
5
- import type { RoutingDecision, RoutingTelemetry } from '../../../src/domain/types/index.js';
5
+ import type {
6
+ ModelProfile,
7
+ RoutingDecision,
8
+ RoutingTelemetry,
9
+ } from '../../../src/domain/types/index.js';
6
10
  import { SMART_ROUTER_USAGE } from './commands.js';
7
11
  import {
8
12
  DEFAULT_TELEMETRY_CONTRIB_EXPORT_LIMIT,
@@ -15,6 +19,78 @@ import {
15
19
  import { formatPricingStalenessLine } from './pricing-lifecycle.js';
16
20
  import type { FleetMode, SmartRouterCommand, SmartRouterRuntime } from './types.js';
17
21
 
22
+ /** Opaque / virtual auto ids that hide the concrete delegated fleet model (SP-178). */
23
+ function isBareOrSmartRouterAuto(modelId: string): boolean {
24
+ return modelId === 'auto' || modelId === 'smart-router/auto';
25
+ }
26
+
27
+ /**
28
+ * Resolve the operator-facing model id for history/status (SP-178 / #99).
29
+ * Prefer a concrete delegated/primary id over virtual `auto`.
30
+ */
31
+ export function resolveHistoryModelId(
32
+ entry: Pick<
33
+ RoutingTelemetry,
34
+ | 'selected_model_id'
35
+ | 'planning_delegate_primary_model_id'
36
+ | 'planning_delegate_model_id'
37
+ >,
38
+ fleet?: readonly ModelProfile[],
39
+ ): string {
40
+ let modelId = entry.selected_model_id;
41
+
42
+ if (isBareOrSmartRouterAuto(modelId)) {
43
+ const primary = entry.planning_delegate_primary_model_id;
44
+ if (primary && !isBareOrSmartRouterAuto(primary)) {
45
+ modelId = primary;
46
+ } else if (
47
+ entry.planning_delegate_model_id &&
48
+ !isBareOrSmartRouterAuto(entry.planning_delegate_model_id)
49
+ ) {
50
+ modelId = entry.planning_delegate_model_id;
51
+ }
52
+ }
53
+
54
+ return qualifyModelIdForDisplay(modelId, fleet);
55
+ }
56
+
57
+ /**
58
+ * Qualify bare `auto` with provider when fleet is available so history never
59
+ * looks like the smart-router virtual model.
60
+ */
61
+ export function qualifyModelIdForDisplay(
62
+ modelId: string,
63
+ fleet?: readonly ModelProfile[],
64
+ ): string {
65
+ if (modelId !== 'auto') {
66
+ return modelId;
67
+ }
68
+
69
+ const profile = fleet?.find((m) => m.id === 'auto');
70
+ if (profile) {
71
+ return `${profile.provider}/${profile.id}`;
72
+ }
73
+
74
+ // Cursor opaque auto is the common bare-`auto` fleet id; never leave it unqualified.
75
+ return 'cursor/auto';
76
+ }
77
+
78
+ export function resolveStatusModelId(
79
+ decision: RoutingDecision,
80
+ fleet?: readonly ModelProfile[],
81
+ ): string {
82
+ const primary = decision.features?.planning_delegate?.primary_model_id ?? null;
83
+ const delegate = decision.features?.planning_delegate?.delegate_model_id ?? null;
84
+ return resolveHistoryModelId(
85
+ {
86
+ selected_model_id: decision.selected_model_id,
87
+ planning_delegate_primary_model_id: primary,
88
+ planning_delegate_model_id: delegate,
89
+ },
90
+ fleet,
91
+ );
92
+ }
93
+
18
94
  export function parseHistoryLimit(raw: string | undefined): number {
19
95
  if (raw === undefined) {
20
96
  return DEFAULT_HISTORY_LIMIT;
@@ -142,8 +218,9 @@ export function formatStatusMessage(
142
218
  return lines.join('\n');
143
219
  }
144
220
 
221
+ const displayModelId = resolveStatusModelId(decision, runtime.streamDeps.fleet);
145
222
  lines.push(
146
- `Model: ${decision.selected_model_id}`,
223
+ `Model: ${displayModelId}`,
147
224
  `Stage: ${decision.stage}`,
148
225
  `Reason: ${decision.reason_code}`,
149
226
  `Latency: ${decision.routing_latency_ms}ms`,
@@ -151,16 +228,20 @@ export function formatStatusMessage(
151
228
  return lines.join('\n');
152
229
  }
153
230
 
154
- export function formatHistoryMessage(entries: readonly RoutingTelemetry[]): string {
231
+ export function formatHistoryMessage(
232
+ entries: readonly RoutingTelemetry[],
233
+ options?: { fleet?: readonly ModelProfile[] },
234
+ ): string {
155
235
  if (entries.length === 0) {
156
236
  return 'No routing history yet.';
157
237
  }
158
238
 
239
+ const fleet = options?.fleet;
159
240
  return entries
160
- .map(
161
- (entry) =>
162
- `${entry.timestamp} | ${entry.selected_model_id} | ${entry.stage} | ${entry.turn_type} | ${entry.routing_latency_ms}ms`,
163
- )
241
+ .map((entry) => {
242
+ const modelId = resolveHistoryModelId(entry, fleet);
243
+ return `${entry.timestamp} | ${modelId} | ${entry.stage} | ${entry.turn_type} | ${entry.routing_latency_ms}ms`;
244
+ })
164
245
  .join('\n');
165
246
  }
166
247
 
@@ -160,7 +160,10 @@ export function registerSmartRouterCommand(
160
160
  throwIfCommandAborted(signal);
161
161
  const rows = await runtime.store.listTelemetry({ limit: parsed.limit });
162
162
  throwIfCommandAborted(signal);
163
- ctx.ui.notify(formatHistoryMessage(rows), 'info');
163
+ ctx.ui.notify(
164
+ formatHistoryMessage(rows, { fleet: runtime.streamDeps.fleet }),
165
+ 'info',
166
+ );
164
167
  return;
165
168
  }
166
169
 
@@ -38,6 +38,8 @@ import {
38
38
  formatHistoryMessage,
39
39
  formatStatusMessage,
40
40
  parseSmartRouterArgs,
41
+ resolveHistoryModelId,
42
+ qualifyModelIdForDisplay,
41
43
  } from './command-formatters.js';
42
44
  import { formatPricingStalenessLine, refreshPricingCatalog } from './pricing-lifecycle.js';
43
45
  import {
@@ -87,8 +89,10 @@ export {
87
89
  getSmartRouterArgumentCompletions,
88
90
  mapContextMessages,
89
91
  parseSmartRouterArgs,
92
+ qualifyModelIdForDisplay,
90
93
  refreshPricingCatalog,
91
94
  resolveDelegationOptions,
95
+ resolveHistoryModelId,
92
96
  logRoutingDecision,
93
97
  toDatasetExportRecord,
94
98
  capturePreRouteOutcomes,
package/README.md CHANGED
@@ -197,7 +197,7 @@ Cursor models bill against your **Cursor Pro subscription quota**, not per-token
197
197
  |---------|---------|
198
198
  | `/smart-router` | Same as `status` (default when no subcommand is given) |
199
199
  | `/smart-router status` | Show fleet mode, fleet size, pricing freshness/staleness, and the last routing decision (stage, tier, selected model, latency) |
200
- | `/smart-router history` | Show recent routing telemetry from SQLite (default limit; optional numeric limit, e.g. `/smart-router history 20`) |
200
+ | `/smart-router history` | Show recent routing telemetry from SQLite (default limit; optional numeric limit, e.g. `/smart-router history 20`). Displays the concrete delegated model id (never bare virtual `auto`) |
201
201
  | `/smart-router mode scoped` | Route only among pi's **enabled model patterns** (default) |
202
202
  | `/smart-router mode all` | Route among **all authenticated models** in the registry |
203
203
  | `/smart-router pricing refresh` | Manually fetch LiteLLM pricing from `LITELLM_PRICING_URL`, persist to SQLite, and rebuild the fleet with updated rates |
@@ -339,7 +339,7 @@ Cluster IDs are stable reason-code prefixes (`cluster_low_stakes_general`, `clus
339
339
  | Variable | Default | Purpose |
340
340
  |----------|---------|---------|
341
341
  | `ROUTER_STATE_DB_PATH` | `./.pi-smart-router/state.db` | Override SQLite state store location (telemetry, pricing catalog, session data) |
342
- | `SMART_ROUTER_LOG_ROUTING` | (unset) | Set to `1` to log each routing decision to stderr as JSON (debugging dogfood sessions) |
342
+ | `SMART_ROUTER_LOG_ROUTING` | (unset) | Set to `1` to log each routing decision to stderr as JSON (debugging dogfood sessions). Canonical payload builder (`buildRoutingDecisionLogPayload`) includes top-level `stage`, `reason_code`, `low_intensity_score`, `tier_hint`, `local_eligible_reason`, and `cluster_id` (plus nested `cluster_summary` / `features`). The pi extension’s live stderr logger is still a slim subset — see [LOG_ROUTING field checklist](#log_routing-field-checklist) |
343
343
  | `SMART_ROUTER_DATASET` | (unset) | Set to `1` to opt in to privacy-safe routing dataset capture (metadata and feature fields only; 30-day / 10k-row retention). Prompt text, messages, and tool arguments are never stored. Required for outcome labels and P(success) training export. See [#8](https://github.com/beettlle/pi-smart-router/issues/8). |
344
344
  | `SMART_ROUTER_DATASET_FINGERPRINT` | (unset) | Set to `1` (requires `SMART_ROUTER_DATASET=1`) to store an install-local HMAC-SHA256 fingerprint of each normalized prompt for duplicate detection within this install. The install pepper lives in `.pi-smart-router/.dataset-key` (gitignored) and is never exported. **Warning:** short or common prompts are vulnerable to offline rainbow-table guessing; use only when you accept that tradeoff. See [#10](https://github.com/beettlle/pi-smart-router/issues/10). |
345
345
  | `MODELS_YAML_PATH` | `./config/models.yaml` | Fleet catalog path (library API only) |
@@ -354,6 +354,23 @@ Cluster IDs are stable reason-code prefixes (`cluster_low_stakes_general`, `clus
354
354
  | `ROUTER_SAFE_DEFAULT_TIER` | `economical-cloud` | Fallback tier on any routing failure |
355
355
  | `LITELLM_PRICING_URL` | — | LiteLLM pricing JSON source |
356
356
 
357
+ ### LOG_ROUTING field checklist
358
+
359
+ When `SMART_ROUTER_LOG_ROUTING=1`, prefer the canonical payload from `buildRoutingDecisionLogPayload` (library / tests). Checklist for [#99](https://github.com/beettlle/pi-smart-router/issues/99):
360
+
361
+ | Field | In payload builder? | Notes |
362
+ |-------|---------------------|-------|
363
+ | `stage` | Yes (top-level) | Pipeline stage that decided |
364
+ | `reason_code` | Yes (top-level) | Machine-readable reason |
365
+ | `low_intensity_score` | Yes (top-level + `cluster_summary`) | Null when low-intensity stage did not run |
366
+ | `tier_hint` | Yes (top-level + `cluster_summary`) | Null when no tier hint |
367
+ | `local_eligible_reason` | Yes (top-level + `features`) | Null when local_zero did not evaluate eligibility |
368
+ | `cluster_id` | Yes (top-level + `cluster_summary`) | Null when no cluster match |
369
+
370
+ **Gap:** the pi extension’s live stderr path (`logRoutingDecision` in `.pi/extensions/smart-router`) still emits a slim JSON object (`selected_model_id`, `stage`, `reason_code`, `features`, `delegate`) and does **not** yet call `buildRoutingDecisionLogPayload`. SQLite `/smart-router history` and the payload builder carry the full checklist; wire the extension logger in a follow-up if dogfood needs identical stderr shape.
371
+
372
+ **History model id:** `/smart-router history` resolves bare/`smart-router` virtual `auto` to the concrete planning-delegate primary (or qualifies Cursor opaque `auto` as `cursor/auto`) so operators see the delegated fleet model, not the virtual router id.
373
+
357
374
  ### SAAR session pin and cache breakeven (v0.2.0 Continuity)
358
375
 
359
376
  v0.2.0 adds **Session-Aware Agentic Routing (SAAR)** pin knobs ([#72](https://github.com/beettlle/pi-smart-router/issues/72)) and a **cache breakeven gate** ([#73](https://github.com/beettlle/pi-smart-router/issues/73)) that blocks tier switches when `marginal_savings + future_cache_value <= cache_reprime_cost` — preventing cheap-turn savings from invalidating a warm prefix cache.
@@ -567,8 +584,10 @@ Additional operator defaults:
567
584
 
568
585
  | Key | Default | Purpose |
569
586
  |-----|---------|---------|
570
- | `loop_escalation.threshold` | 3 | Consecutive identical failures before escalating to frontier |
587
+ | `loop_escalation.threshold` | 3 | Consecutive identical failures before escalating to frontier. Also used as the default **zero-tier tool-call churn** threshold (SP-178 / [#99](https://github.com/beettlle/pi-smart-router/issues/99)): while pinned to `zero-tier`, unsupported/unknown tool results escalate immediately, and N `tool_result` turns escalate via the same `loop_escalation` pin path (FR-014) — not a cache-breakeven bypass |
571
588
  | `pin_only_fallback` | `false` | Emergency pin-on-first-turn mode — see [Pin-only emergency fallback](#pin-only-emergency-fallback) |
589
+ | `local_zero.enabled` | `true` | When `false`, skip `local_zero` dispatch (fall through to later stages). Default keeps the cheap local path for true trivial traffic |
590
+ | `local_zero.max_tool_use_requirement` | `0.25` | Ceiling (0–1) on cheap predicted tool_use for `local_zero`. Effective limit is `min(local model tool_use, this value)`. Skips agentic git/bash/edit/explore/delete/repo cues with telemetry reason `tool_use_capability_shortfall` (SP-177 / [#98](https://github.com/beettlle/pi-smart-router/issues/98)) |
572
591
  | `local.min_memory_gb_full` | 16 | Minimum RAM for full local inference |
573
592
  | `local.battery_threshold_pct` | 20 | Minimum battery to allow local inference |
574
593
  | `pricing.staleness_days` | 14 | Max age before re-fetching pricing data |
@@ -60,5 +60,13 @@
60
60
  "exclude_execution_history": true
61
61
  }
62
62
  },
63
+ "local_zero": {
64
+ "enabled": true,
65
+ "max_tool_use_requirement": 0.25,
66
+ "_documentation": {
67
+ "enabled": "When false, skip local_zero entirely (fall through to triage cloud / HyDRA). Default true — does not disable local for trivial traffic.",
68
+ "max_tool_use_requirement": "Ceiling (0–1) on cheap predicted tool_use for local_zero dispatch. Effective limit is min(local model tool_use capability, this value). Default 0.25 keeps format/lint local while skipping agentic git/bash/edit/explore/delete/repo cues (SP-177, #98)."
69
+ }
70
+ },
63
71
  "pin_only_fallback": false
64
72
  }
@@ -3,7 +3,7 @@
3
3
  * Values sourced from specs/001-build-smart-router/data-model.md § Configuration (Operator).
4
4
  */
5
5
  import { type OperatorConfig } from '../domain/types/schemas.js';
6
- export { DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv } from '../domain/types/schemas.js';
6
+ export { DEFAULT_LOCAL_ZERO_CONFIG, DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv, } from '../domain/types/schemas.js';
7
7
  /** Merge operator env overrides onto defaults (SAAR and planning delegate sections). */
8
8
  export declare function resolveOperatorConfigFromEnv(base?: OperatorConfig): OperatorConfig;
9
9
  export declare const DEFAULT_OPERATOR_CONFIG: Readonly<OperatorConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEnK,wFAAwF;AACxF,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE,cAAwC,GAC7C,cAAc,CAMhB;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CA+BnD,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,mBAAmB,EACnB,oCAAoC,EACpC,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AAEpC,wFAAwF;AACxF,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE,cAAwC,GAC7C,cAAc,CAMhB;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CAgCnD,CAAC"}
@@ -2,9 +2,9 @@
2
2
  * Operator configuration defaults (FR-021).
3
3
  * Values sourced from specs/001-build-smart-router/data-model.md § Configuration (Operator).
4
4
  */
5
- import { DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv, } from '../domain/types/schemas.js';
5
+ import { DEFAULT_LOCAL_ZERO_CONFIG, DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv, } from '../domain/types/schemas.js';
6
6
  import { DEFAULT_LOW_INTENSITY_WEIGHTS } from '../domain/routing/tier-features.js';
7
- export { DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv } from '../domain/types/schemas.js';
7
+ export { DEFAULT_LOCAL_ZERO_CONFIG, DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv, } from '../domain/types/schemas.js';
8
8
  /** Merge operator env overrides onto defaults (SAAR and planning delegate sections). */
9
9
  export function resolveOperatorConfigFromEnv(base = DEFAULT_OPERATOR_CONFIG) {
10
10
  return {
@@ -43,6 +43,7 @@ export const DEFAULT_OPERATOR_CONFIG = {
43
43
  },
44
44
  saar: DEFAULT_SAAR_CONFIG,
45
45
  planning_delegate: DEFAULT_PLANNING_DELEGATE_CONFIG,
46
+ local_zero: DEFAULT_LOCAL_ZERO_CONFIG,
46
47
  pin_only_fallback: false,
47
48
  };
48
49
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gCAAgC,EAChC,mBAAmB,EACnB,oCAAoC,EACpC,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEnK,wFAAwF;AACxF,MAAM,UAAU,4BAA4B,CAC1C,OAAuB,uBAAuB;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,iBAAiB,EAAE,oCAAoC,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,SAAS,EAAE;QACT,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,gBAAgB,EAAE,IAAI;KACvB;IACD,eAAe,EAAE;QACf,SAAS,EAAE,CAAC;KACb;IACD,OAAO,EAAE;QACP,cAAc,EAAE,EAAE;KACnB;IACD,KAAK,EAAE;QACL,kBAAkB,EAAE,EAAE;QACtB,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,mBAAmB,EAAE,0BAA0B;QAC/C,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,oBAAoB;KAClC;IACD,aAAa,EAAE;QACb,OAAO,EAAE,6BAA6B;QACtC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,GAAG;KACrB;IACD,IAAI,EAAE,mBAAmB;IACzB,iBAAiB,EAAE,gCAAgC;IACnD,iBAAiB,EAAE,KAAK;CAChB,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,mBAAmB,EACnB,oCAAoC,EACpC,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,mBAAmB,EACnB,oCAAoC,EACpC,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AAEpC,wFAAwF;AACxF,MAAM,UAAU,4BAA4B,CAC1C,OAAuB,uBAAuB;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,iBAAiB,EAAE,oCAAoC,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,SAAS,EAAE;QACT,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,gBAAgB,EAAE,IAAI;KACvB;IACD,eAAe,EAAE;QACf,SAAS,EAAE,CAAC;KACb;IACD,OAAO,EAAE;QACP,cAAc,EAAE,EAAE;KACnB;IACD,KAAK,EAAE;QACL,kBAAkB,EAAE,EAAE;QACtB,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,mBAAmB,EAAE,0BAA0B;QAC/C,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,oBAAoB;KAClC;IACD,aAAa,EAAE;QACb,OAAO,EAAE,6BAA6B;QACtC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,GAAG;KACrB;IACD,IAAI,EAAE,mBAAmB;IACzB,iBAAiB,EAAE,gCAAgC;IACnD,UAAU,EAAE,yBAAyB;IACrC,iBAAiB,EAAE,KAAK;CAChB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Loop escalation — FR-014, FR-008 rule #3.
2
+ * Loop escalation — FR-014, FR-008 rule #3 / #4.
3
3
  *
4
4
  * Detects bounded repeated identical tool failures and signals
5
5
  * session pin escalation to a frontier-capable tier.
@@ -7,12 +7,27 @@
7
7
  * Escalation fires once per session; no tier oscillation (FR-008).
8
8
  * Threshold defaults to 3 identical tool failures (operator configurable).
9
9
  *
10
+ * Zero-tier observational pin-break (SP-178 / #99):
11
+ * SAAR pins preserve prefix-cache value, but a zero-tier pin that faces
12
+ * unsupported/unknown tools or sustained tool-loop churn is a capability
13
+ * mismatch — the same class of observational signal as identical tool
14
+ * failures (FR-014). Escalation reuses the `loop_escalation` pin reason
15
+ * (allowed FR-008 break) rather than inventing a cache-economics bypass.
16
+ * Voluntary cross-provider switches still go through breakeven; this path
17
+ * only fires on observational evidence that the pinned zero-tier model
18
+ * cannot complete the tool loop.
19
+ *
10
20
  * Design: pure evaluation function — caller (pipeline stage) is
11
21
  * responsible for applying pin state updates via SessionPinner.
12
22
  */
13
23
  import type { ModelProfile, RoutingRequest, SessionPin } from '../types/index.js';
14
24
  export interface LoopEscalationConfig {
15
25
  readonly threshold: number;
26
+ /**
27
+ * Tool-result turns while pinned to zero-tier before observational escalate.
28
+ * Defaults to `threshold` when omitted (same operator knob, no schema change).
29
+ */
30
+ readonly zero_tier_tool_call_threshold?: number;
16
31
  }
17
32
  export interface LoopEscalationResult {
18
33
  readonly shouldEscalate: boolean;
@@ -20,6 +35,8 @@ export interface LoopEscalationResult {
20
35
  readonly escalationTarget: ModelProfile | null;
21
36
  readonly reason: string;
22
37
  }
38
+ /** Stable signature for zero-tier tool-call churn counting (SP-178). */
39
+ export declare const ZERO_TIER_TOOL_CHURN_SIGNATURE: "zt:tool_churn";
23
40
  /**
24
41
  * Extract a tool-failure signature from the request's messages.
25
42
  * Returns null when the request does not carry a tool failure.
@@ -28,6 +45,11 @@ export interface LoopEscalationResult {
28
45
  * carry observational failure signals (FR-014: no post-generation judging).
29
46
  */
30
47
  export declare function extractToolFailureSignature(request: RoutingRequest): string | null;
48
+ /**
49
+ * True when the latest tool result reports an unsupported/unknown tool
50
+ * (capability mismatch — escalate immediately on zero-tier pins).
51
+ */
52
+ export declare function isUnsupportedOrUnknownToolResult(request: RoutingRequest): boolean;
31
53
  /**
32
54
  * Evaluate whether the session should escalate to a higher tier.
33
55
  *
@@ -1 +1 @@
1
- {"version":3,"file":"loop-escalation.d.ts","sourceRoot":"","sources":["../../../src/domain/pinning/loop-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIlF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAgBD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAclF;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,UAAU,GAAG,IAAI,EACtB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,MAAM,EAAE,oBAAoB,GAC3B,oBAAoB,CAkEtB"}
1
+ {"version":3,"file":"loop-escalation.d.ts","sourceRoot":"","sources":["../../../src/domain/pinning/loop-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIlF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wEAAwE;AACxE,eAAO,MAAM,8BAA8B,EAAG,eAAwB,CAAC;AA4BvE;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAOlF;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAKjF;AA+GD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,UAAU,GAAG,IAAI,EACtB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,MAAM,EAAE,oBAAoB,GAC3B,oBAAoB,CAwDtB"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Loop escalation — FR-014, FR-008 rule #3.
2
+ * Loop escalation — FR-014, FR-008 rule #3 / #4.
3
3
  *
4
4
  * Detects bounded repeated identical tool failures and signals
5
5
  * session pin escalation to a frontier-capable tier.
@@ -7,9 +7,21 @@
7
7
  * Escalation fires once per session; no tier oscillation (FR-008).
8
8
  * Threshold defaults to 3 identical tool failures (operator configurable).
9
9
  *
10
+ * Zero-tier observational pin-break (SP-178 / #99):
11
+ * SAAR pins preserve prefix-cache value, but a zero-tier pin that faces
12
+ * unsupported/unknown tools or sustained tool-loop churn is a capability
13
+ * mismatch — the same class of observational signal as identical tool
14
+ * failures (FR-014). Escalation reuses the `loop_escalation` pin reason
15
+ * (allowed FR-008 break) rather than inventing a cache-economics bypass.
16
+ * Voluntary cross-provider switches still go through breakeven; this path
17
+ * only fires on observational evidence that the pinned zero-tier model
18
+ * cannot complete the tool loop.
19
+ *
10
20
  * Design: pure evaluation function — caller (pipeline stage) is
11
21
  * responsible for applying pin state updates via SessionPinner.
12
22
  */
23
+ /** Stable signature for zero-tier tool-call churn counting (SP-178). */
24
+ export const ZERO_TIER_TOOL_CHURN_SIGNATURE = 'zt:tool_churn';
13
25
  // ─── Failure signature extraction ─────────────────────────────────────────────
14
26
  const FAILURE_PATTERNS = [
15
27
  'error',
@@ -22,6 +34,17 @@ const FAILURE_PATTERNS = [
22
34
  'econnreset',
23
35
  'epipe',
24
36
  ];
37
+ /** Host/agent signals that the model invoked a tool the runtime does not expose. */
38
+ const UNSUPPORTED_TOOL_PATTERNS = [
39
+ 'unknown tool',
40
+ 'unsupported tool',
41
+ 'tool not found',
42
+ 'no such tool',
43
+ 'unrecognized tool',
44
+ 'is not a valid tool',
45
+ 'tool does not exist',
46
+ 'not a known tool',
47
+ ];
25
48
  /**
26
49
  * Extract a tool-failure signature from the request's messages.
27
50
  * Returns null when the request does not carry a tool failure.
@@ -30,17 +53,35 @@ const FAILURE_PATTERNS = [
30
53
  * carry observational failure signals (FR-014: no post-generation judging).
31
54
  */
32
55
  export function extractToolFailureSignature(request) {
56
+ const content = latestToolContent(request);
57
+ if (content === null)
58
+ return null;
59
+ if (looksLikeFailure(content)) {
60
+ return computeSignature(content);
61
+ }
62
+ return null;
63
+ }
64
+ /**
65
+ * True when the latest tool result reports an unsupported/unknown tool
66
+ * (capability mismatch — escalate immediately on zero-tier pins).
67
+ */
68
+ export function isUnsupportedOrUnknownToolResult(request) {
69
+ const content = latestToolContent(request);
70
+ if (content === null)
71
+ return false;
72
+ const lower = content.toLowerCase();
73
+ return UNSUPPORTED_TOOL_PATTERNS.some((p) => lower.includes(p));
74
+ }
75
+ function latestToolContent(request) {
33
76
  const msgs = request.messages;
34
77
  if (!msgs || msgs.length === 0)
35
78
  return null;
36
79
  for (let i = msgs.length - 1; i >= 0; i--) {
37
80
  const msg = msgs[i];
38
81
  if (msg.role === 'tool') {
39
- if (looksLikeFailure(msg.content)) {
40
- return computeSignature(msg.content);
41
- }
42
- return null;
82
+ return msg.content;
43
83
  }
84
+ return null;
44
85
  }
45
86
  return null;
46
87
  }
@@ -57,6 +98,63 @@ function computeSignature(content) {
57
98
  }
58
99
  return `tf:${(h >>> 0).toString(16)}`;
59
100
  }
101
+ function resolvePinnedTier(pin, fleet) {
102
+ return fleet.find((m) => m.id === pin.pinned_model_id)?.tier ?? null;
103
+ }
104
+ function resolveZeroTierToolCallThreshold(config) {
105
+ return config.zero_tier_tool_call_threshold ?? config.threshold;
106
+ }
107
+ function tryEscalate(pin, fleet, updated, reason) {
108
+ const target = selectEscalationTarget(fleet, pin.pinned_model_id);
109
+ if (target) {
110
+ return {
111
+ shouldEscalate: true,
112
+ updatedPin: updated,
113
+ escalationTarget: target,
114
+ reason,
115
+ };
116
+ }
117
+ return {
118
+ shouldEscalate: false,
119
+ updatedPin: updated,
120
+ escalationTarget: null,
121
+ reason: 'no_frontier_available',
122
+ };
123
+ }
124
+ /**
125
+ * Zero-tier pin: unsupported tool → immediate escalate; else count every
126
+ * tool_result turn and escalate after N (observational agentic churn).
127
+ */
128
+ function evaluateZeroTierObservationalBreak(pin, request, fleet, config) {
129
+ const now = new Date().toISOString();
130
+ if (isUnsupportedOrUnknownToolResult(request)) {
131
+ const updated = {
132
+ ...pin,
133
+ consecutive_tool_failures: Math.max(pin.consecutive_tool_failures, 1),
134
+ last_tool_failure_signature: 'zt:unsupported_tool',
135
+ updated_at: now,
136
+ };
137
+ return tryEscalate(pin, fleet, updated, 'zero_tier_unsupported_tool');
138
+ }
139
+ const churnThreshold = resolveZeroTierToolCallThreshold(config);
140
+ const isChurn = pin.last_tool_failure_signature === ZERO_TIER_TOOL_CHURN_SIGNATURE;
141
+ const newCount = isChurn ? pin.consecutive_tool_failures + 1 : 1;
142
+ const updated = {
143
+ ...pin,
144
+ consecutive_tool_failures: newCount,
145
+ last_tool_failure_signature: ZERO_TIER_TOOL_CHURN_SIGNATURE,
146
+ updated_at: now,
147
+ };
148
+ if (newCount >= churnThreshold) {
149
+ return tryEscalate(pin, fleet, updated, 'zero_tier_tool_churn');
150
+ }
151
+ return {
152
+ shouldEscalate: false,
153
+ updatedPin: updated,
154
+ escalationTarget: null,
155
+ reason: 'zero_tier_below_threshold',
156
+ };
157
+ }
60
158
  // ─── Evaluation ───────────────────────────────────────────────────────────────
61
159
  /**
62
160
  * Evaluate whether the session should escalate to a higher tier.
@@ -77,6 +175,9 @@ export function evaluateLoopEscalation(pin, request, fleet, config) {
77
175
  if (request.turn_type !== 'tool_result') {
78
176
  return noEscalation('not_tool_result');
79
177
  }
178
+ if (resolvePinnedTier(pin, fleet) === 'zero-tier') {
179
+ return evaluateZeroTierObservationalBreak(pin, request, fleet, config);
180
+ }
80
181
  const signature = extractToolFailureSignature(request);
81
182
  if (!signature) {
82
183
  if (pin.consecutive_tool_failures > 0) {
@@ -103,21 +204,7 @@ export function evaluateLoopEscalation(pin, request, fleet, config) {
103
204
  updated_at: new Date().toISOString(),
104
205
  };
105
206
  if (newCount >= config.threshold) {
106
- const target = selectEscalationTarget(fleet, pin.pinned_model_id);
107
- if (target) {
108
- return {
109
- shouldEscalate: true,
110
- updatedPin: updated,
111
- escalationTarget: target,
112
- reason: 'threshold_exceeded',
113
- };
114
- }
115
- return {
116
- shouldEscalate: false,
117
- updatedPin: updated,
118
- escalationTarget: null,
119
- reason: 'no_frontier_available',
120
- };
207
+ return tryEscalate(pin, fleet, updated, 'threshold_exceeded');
121
208
  }
122
209
  return {
123
210
  shouldEscalate: false,
@@ -1 +1 @@
1
- {"version":3,"file":"loop-escalation.js","sourceRoot":"","sources":["../../../src/domain/pinning/loop-escalation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop-escalation.js","sourceRoot":"","sources":["../../../src/domain/pinning/loop-escalation.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@
10
10
  */
11
11
  import type { ModelProfile, PlanningDelegateConfig, PriceCatalog, RoutingDecision, RoutingRequest, SaarConfig, Tier } from '../types/index.js';
12
12
  import type { QuotaWindowPosition } from '../types/entities.js';
13
- import type { LowIntensityConfig, VirtualCostV2Config } from '../types/schemas.js';
13
+ import type { LowIntensityConfig, LocalZeroConfig, VirtualCostV2Config } from '../types/schemas.js';
14
14
  import type { HardwareProbeConfig, SystemInfo } from '../../infrastructure/hardware/hardware-probe.js';
15
15
  import type { ThroughputMeter } from '../../infrastructure/hardware/throughput-meter.js';
16
16
  import type { HttpFetchPort, LocalZeroTierConfig } from '../../infrastructure/local/local-zero-tier.js';
@@ -49,6 +49,8 @@ export interface LocalEligibleResult {
49
49
  * OR high-confidence zero-tier cluster match.
50
50
  */
51
51
  export declare function resolveLocalEligible(input: LocalEligibleInput): LocalEligibleResult;
52
+ export declare function estimateCheapToolUseRequirement(promptText: string): number;
53
+ export declare function resolveLocalZeroToolUseCeiling(localToolUseCapability: number, maxToolUseRequirement: number): number;
52
54
  export interface PipelineOptions {
53
55
  readonly hardwareConfig?: HardwareProbeConfig;
54
56
  readonly localConfig?: LocalZeroTierConfig;
@@ -83,6 +85,8 @@ export interface PipelineOptions {
83
85
  readonly pinOnlyFallback?: boolean;
84
86
  /** Rolling median tok/s gate for local_zero dispatch (SP-164, #84). */
85
87
  readonly throughputMeter?: ThroughputMeter;
88
+ /** Pre-local_zero tool-use capability gate (SP-177, #98). */
89
+ readonly localZeroConfig?: LocalZeroConfig;
86
90
  }
87
91
  export declare class RouterPipeline {
88
92
  private readonly stages;
@@ -163,6 +167,8 @@ export declare class RouterPipeline {
163
167
  /**
164
168
  * SC-007: classification_only MUST NOT dispatch full local.
165
169
  * Eligibility: triage trivial OR low-intensity zero-tier hint OR zero-tier cluster (SP-111).
170
+ * Pre-dispatch tool-use capability gate (SP-177, #98) skips when predicted need exceeds
171
+ * min(local tool_use capability, local_zero.max_tool_use_requirement).
166
172
  */
167
173
  private localZeroTierStage;
168
174
  private triage;
@@ -1 +1 @@
1
- {"version":3,"file":"router-pipeline.d.ts","sourceRoot":"","sources":["../../../src/domain/pipeline/router-pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router-pipeline.d.ts","sourceRoot":"","sources":["../../../src/domain/pipeline/router-pipeline.ts"],"names":[],"mappings":"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"}