/**
 * floorDriftCanary — verifies the code-pinned required-contexts floor still
 * matches reality, so a renamed workflow / split job / changed app slug surfaces
 * as `floor-drift` instead of turning the watcher into a silent permanent
 * refuser (green-pr-automerge-enforcement R8, L5(b)/P18). Observe-only.
 *
 * Per-family references (round-6 — the round-5 single-reference design was
 * structurally unsatisfiable): the pinned floor mixes PR-triggered gates (eli16,
 * decision-audit) whose runs attach to PR HEAD shas, never default-branch
 * commits, and push-triggered contexts (CI suite) that DO run on main. So:
 *   - PR-triggered floor contexts validate against the head shas of recently
 *     MERGED agent-namespace PRs (newest-qualifying-wins).
 *   - push-triggered contexts validate against the most recent default-branch
 *     commit qualified INDEPENDENTLY of the pinned set (any completed non-skip-ci
 *     runs present — qualifying ON the pinned set would let a rename hide).
 * No qualifying reference within a family's bound → `floor-drift-unverifiable`
 * (distinct from `floor-drift`: "couldn't check" never wears the "drifted" label).
 *
 * All gh I/O is injected so this is unit-testable without the network.
 */
export interface FloorPin {
    context: string;
    workflowPath: string;
    appSlug: string;
    /** Which event the producing workflow fires on. */
    trigger: 'pull_request' | 'push';
}
/** A completed check run on some commit (own + producer identity). */
export interface ReferenceCheckRun {
    name: string;
    conclusion: string;
    appSlug: string | null;
    workflowPath: string | null;
}
/** A candidate reference: a commit/head sha plus its completed check runs. */
export interface ReferenceCandidate {
    sha: string;
    checkRuns: ReferenceCheckRun[];
}
export interface FloorDriftDeps {
    /**
     * Recently MERGED agent-namespace PR heads, newest-first, bounded by
     * `floorDriftLookbackPrs`. Each carries that head's completed check runs.
     */
    recentMergedPrRefs(limit: number): Promise<ReferenceCandidate[]>;
    /**
     * Recent default-branch commits, newest-first, bounded by
     * `floorDriftLookbackCommits`, each with its completed check runs.
     */
    recentDefaultBranchRefs(limit: number): Promise<ReferenceCandidate[]>;
}
export interface FloorDriftConfig {
    floorDriftLookbackPrs: number;
    floorDriftLookbackCommits: number;
}
export type FloorDriftClass = 'ok' | 'floor-drift' | 'floor-drift-unverifiable';
export interface FloorDriftFinding {
    context: string;
    cls: FloorDriftClass;
    detail?: string;
}
export interface FloorDriftResult {
    findings: FloorDriftFinding[];
    drifted: FloorDriftFinding[];
    unverifiable: FloorDriftFinding[];
}
/** Does this candidate "qualify" as a reference for a push-triggered family? */
export declare function qualifiesAsPushReference(c: ReferenceCandidate): boolean;
/** A PR head qualifies as a PR-family reference if it carries any completed runs. */
export declare function qualifiesAsPrReference(c: ReferenceCandidate): boolean;
/** Is the pin satisfied at this reference (name + producer binding)? */
export declare function pinSatisfiedAt(pin: FloorPin, ref: ReferenceCandidate): boolean;
export declare class FloorDriftCanary {
    private readonly pins;
    private readonly deps;
    private readonly cfg;
    constructor(pins: FloorPin[], deps: FloorDriftDeps, cfg: FloorDriftConfig);
    check(): Promise<FloorDriftResult>;
    /**
     * Newest-qualifying-wins (round-7 build note): walk references newest-first;
     * the FIRST that qualifies is authoritative. If it satisfies the pin → ok;
     * else → floor-drift. If NO reference in the bound qualifies →
     * floor-drift-unverifiable (never floor-drift).
     */
    private evaluate;
    private safe;
}
//# sourceMappingURL=floorDriftCanary.d.ts.map