import type { GroundTruthLabel } from './windtunnel-scorer.js';
/**
 * The closed disposition taxonomy (strategy#709 RULED). `accepted-fix` and
 * `declined-as-false-positive` are the only LABEL-BEARING classes; the rest are
 * deliberately UNLABELED outcomes — a valid-but-not-actioned decline is NOT
 * evidence the code is clean, so it never labels a firing.
 */
export type DispositionClass = 'accepted-fix' | 'declined-as-false-positive' | 'scope' | 'defer' | 'superseded' | 'style' | 'ambiguous';
/** A single review-thread comment (the provider-neutral subset the taxonomy reads). */
export interface DispositionComment {
    author: string;
    body: string;
}
/**
 * Classify a held-out review thread's disposition under the closed taxonomy.
 *
 * Reads the HUMAN (non-bot) comments only — the human is the one who disposes; a
 * bot's own follow-up is not a disposition (and `isResolved` alone is never TP,
 * codex WARNING-5). Conservative precedence:
 *   1. No human disposition comment              → ambiguous (UNLABELED)
 *   2. accepted-fix AND false-positive present   → ambiguous (conflicting signals)
 *   3. accepted-fix, no decline of any kind      → accepted-fix (TP)
 *   4. false-positive, no fix and no soft decline → declined-as-false-positive (FP)
 *   5. otherwise a soft decline present          → scope | defer | superseded | style (UNLABELED)
 *   6. no recognizable signal                    → ambiguous (UNLABELED)
 *
 * Steps 3/4 require a CLEAN signal: a fix that is also scoped/deferred, or an FP
 * rebuttal that is also a scope/defer decline, collapses to ambiguous — the
 * answer key must not credit a contradictory disposition. This defeats codex's
 * falsifying case ("declined, too broad / tracked for later" never becomes FP).
 */
export declare function classifyDisposition(comments: ReadonlyArray<DispositionComment>): DispositionClass;
/**
 * Project a taxonomy class onto a cert-run ground-truth label. The two
 * label-bearing classes map to TP/FP; every UNLABELED class returns `null` — the
 * deriver OMITS the firing's labelId from `ground-truth-labels.json`, and the
 * scorer routes the un-keyed firing to `needsAdjudication` → HONEST-NEGATIVE.
 */
export declare function dispositionToLabel(cls: DispositionClass): GroundTruthLabel | null;
//# sourceMappingURL=disposition-taxonomy.d.ts.map