/**
 * Model-aliased skill router (Phase 3 Task 3.4).
 *
 * Purpose: take the embedder-shortlisted candidate skills (output of
 * `prefilterSkills`) and ask a fast classifier LLM which subset is
 * actually needed for the current task. Returns the filtered skill
 * list. This is the second tier of the two-tier dynamic-load pipeline
 * — the embedder is high-recall / low-precision; the classifier is
 * the precision step.
 *
 * Model neutrality (per `feedback_stop_haiku_drift` +
 * `project_opensquid_model_neutral_subagent_primitive`): we route via
 * the `fast_classifier` ALIAS, never a vendor model name. The user's
 * `models.yaml` maps the alias to whichever subscription CLI or API
 * binding they prefer. No model id ever appears in this file.
 *
 * Prompt shape — a tight classification prompt with three rules:
 *   1. Task subject up front (top-of-context bias).
 *   2. Skills listed with `name: prose` so the classifier sees what
 *      each skill is FOR, not just the bare ids.
 *   3. Output instruction is comma-separated names OR the `NONE` token.
 *      `llm_classify` itself clamps unknown outputs to `UNCERTAIN`, so
 *      we treat both `UNCERTAIN` and `NONE` as the safety fallback.
 *
 * Failure ladder ("fail safe-ward" — toward more skills, never fewer):
 *   - classifier errors / not-ok      → return ALL candidates
 *   - classifier returns UNCERTAIN    → return ALL candidates
 *   - classifier returns NONE         → return ALL candidates
 *   - classifier returns "a, b, c"    → return matching candidates
 *
 * The NONE/UNCERTAIN cases biasing toward "load everything" matches
 * the prefilter's fail-open contract: this layer is an optimization,
 * never a gate. A drifting classifier should never lock the agent out
 * of a needed skill. The cost of a false-positive (loading a skill
 * we didn't strictly need) is context dilution; the cost of a
 * false-negative (omitting a needed skill) is a missed verification
 * pass. Phase 3 picks the former.
 *
 * Imports from: ../functions/registry.js (FunctionRegistry + EvalCtx),
 *   ./types.js (Skill).
 * Imported by: src/runtime/index.ts (re-exported as `routeSkills`)
 *   and the dispatcher pipeline once Phase 3 wiring lands.
 */
import type { EvalCtx, FunctionRegistry } from '../functions/registry.js';
import type { Skill } from './types.js';
/**
 * Ask the `fast_classifier`-aliased LLM which of `candidates` are
 * needed for `taskSubject`. Returns a filtered subset of `candidates`,
 * or — under any fallback condition — the full `candidates` list.
 *
 * `registry` must have `llm_classify` registered (the LLM primitive
 * from `src/functions/llm.ts`). `ctx` is forwarded verbatim; the
 * primitive uses only its model dispatcher, not the bindings or event,
 * so any well-formed `EvalCtx` works.
 */
export declare function routeSkills(taskSubject: string, candidates: Skill[], registry: FunctionRegistry, ctx: EvalCtx): Promise<Skill[]>;
//# sourceMappingURL=skill_router.d.ts.map