/** * rankingConfidence — honesty marker for an influence ranking (RFC-003 honesty * marker; influence-core block D6). Internal concept: "attributability". * * Pattern: pure, embedder-free function over a `scoreInfluence` result. * Deterministic; no I/O. * Role: `src/lib/influence-core/` leaf. The honesty companion to the * four-signal scorer: it says when the ranking is a SHORTLIST, * not a verdict. * * ## Why this exists (the measured blind spot) * * Output-similarity influence ranks sources by how much they resemble the * final answer. That is structurally blind to ABSENCE / CROWDING bugs: a * culprit that caused the error by *displacing* context (history truncation, * context dilution) need not resemble the answer — so it ranks low, or below * an innocent that the answer happens to talk about. The tell is not a low * absolute score; it is a FLAT top — no source clearly dominates. This * function reports that flatness honestly so consumers escalate to ablation * (the causal tier) instead of trusting a confident-but-wrong rank-1. * * Honest claim (RFC-002 §2 discipline): `clearWinner` is a proxy for "the * ranking has a clear lead", never "the lead is the cause". A clear lead can * still be an innocent the answer rationalizes over — only ablation makes * causal claims. */ import type { ConfidenceStrategy, InfluenceScore, RankingConfidence } from './types.js'; /** * Default strategy: ABSOLUTE top-2 gap `s0 − s1 >= threshold`. Simple and * interpretable, but embedder-relative (the gap scale depends on the embedding * geometry). Use `ratioStrategy` for cross-embedder transfer. */ export declare function marginStrategy(threshold?: number): ConfidenceStrategy; /** * Scale-invariant strategy: top-2 gap as a FRACTION of the top score, * `(s0 − s1) / |s0| >= threshold`. Transfers across embedders / answer lengths * where the absolute margin does not. A zero (or all-equal) top is never a * clear winner. */ export declare function ratioStrategy(threshold?: number): ConfidenceStrategy; export interface RankingConfidenceOptions { /** * The decisiveness rule. Default: `marginStrategy(clearWinnerMargin)`. * When set, it WINS — `clearWinnerMargin` is ignored. Bring your own * (e.g. entropy / dispersion) or use the shipped `ratioStrategy`. */ readonly strategy?: ConfidenceStrategy; /** Threshold for the DEFAULT margin strategy (ignored when `strategy` is * set). Default: `DEFAULT_CLEAR_WINNER_MARGIN` (0.05). */ readonly clearWinnerMargin?: number; /** Score band below the top defining the shortlist to double-check. * Default: `DEFAULT_SHORTLIST_BAND` (0.1). Recommended >= * `clearWinnerMargin` so the shortlist is at least as wide as the * winning gap (the function also guarantees the runner-up is shortlisted * when there is no clear winner, so a smaller value is safe). */ readonly shortlistBand?: number; } /** * Assess whether an influence ranking has a clear winner to trust as a lead, * or is too close to call and should be confirmed by ablation. * * Guarantees (relied on by the localizer): the returned `shortlist` always * contains `lead` when there is one, and — when there is NO clear winner and * there are ≥2 suspects — always contains the runner-up too (so ablation over * the shortlist covers the real culprit even if it ranked below an innocent). * * @param scores `scoreInfluence` output (any order — re-sorted defensively). * Ids are assumed unique (as `scoreInfluence` enforces); the * shortlist is de-duplicated defensively regardless. * @throws Error on negative or NaN options. */ export declare function rankingConfidence(scores: readonly InfluenceScore[], options?: RankingConfidenceOptions): RankingConfidence;