/**
 * Decision-model guard for dictionary substitutions.
 *
 * An alias is usually an ordinary word as well ("part" is how engines hear a
 * name that sounds like it), so applying the dictionary blindly rewrites the
 * literal word every time it is said. The guard asks a decision model, in one
 * request, one question per candidate: did the speaker mean the term, or the
 * word as written?
 *
 * Why a `choice` and not a yes/no: a boolean "is this the name X?" question
 * was measured to be leading — it said yes to nearly everything. A choice
 * between the term and the literal reading, each with its own rubric,
 * discriminates: "my name is part" → the term at 97%, "part of the plan" →
 * literal. Answers are matched by position (`candidate__N`), never by the
 * alias text, so an alias the wire normalises cannot misroute an answer.
 *
 * Fail-open, like every other `decide` consumer: with no decision provider,
 * on timeout (default 4 s) or on any error the dictionary is applied as is,
 * and each record says why in `note`.
 *
 * @module voice/correction/guard
 */
import type { STTCorrectionDeps, STTDecisionRecord, STTDictionaryCandidate } from "../../types/index.js";
/** Default guard timeout; on expiry the dictionary is applied as is. */
export declare const DEFAULT_DECIDE_TIMEOUT_MS = 4000;
/**
 * Judge every candidate in one decision request. Returns one record per
 * candidate, in candidate order; a candidate the guard could not judge is
 * recorded as `"term"` with a `note` saying why, so `applyDictionary` applies
 * it exactly as it would without a guard.
 */
export declare function decideCandidates(text: string, candidates: readonly STTDictionaryCandidate[], decide: STTCorrectionDeps["decide"] | undefined, options?: {
    context?: string;
    timeoutMs?: number;
}): Promise<STTDecisionRecord[]>;
