/** A reason why a single candidate is stale. */
export interface StalenessReason {
    readonly candidateId: string;
    readonly reason: "source-changed" | "source-removed";
    readonly envelopeId: string;
}
/** Partitioned staleness report for a full run. */
export interface StalenessResult {
    readonly fresh: readonly string[];
    readonly changedStale: readonly StalenessReason[];
    readonly orphanedStale: readonly StalenessReason[];
}
export interface CompareStalenessArgs {
    /** Fingerprints persisted with the original run (from manifest.sourceFingerprints). */
    readonly oldFingerprints: readonly {
        envelopeId: string;
        integrityHashSha256Hex: string;
    }[];
    /** Optional atom-level fingerprints persisted with the original run (post-fix runs only). */
    readonly oldAtomFingerprints?: readonly {
        atomId: string;
        envelopeId: string;
        canonicalHashSha256Hex: string;
    }[];
    /** Evidence refs from the manifest (atomId → envelopeId mapping). */
    readonly evidenceRefs: readonly {
        envelopeId: string;
        atomId: string;
    }[];
    /** Candidates to classify. */
    readonly candidates: readonly {
        id: string;
        derivedFromAtomIds: readonly string[];
    }[];
    /** Fingerprints from re-ingesting the current sources right now. */
    readonly currentFingerprints: readonly {
        envelopeId: string;
        integrityHashSha256Hex: string;
    }[];
    /** Optional atom-level fingerprints from re-ingesting the current sources right now. */
    readonly currentAtomFingerprints?: readonly {
        atomId: string;
        envelopeId: string;
        canonicalHashSha256Hex: string;
    }[];
}
/**
 * Classify each candidate as fresh or stale based on whether their source envelopes have changed
 * since the run was persisted. Pure, deterministic; candidate input order is preserved.
 */
export declare function compareStaleness(args: CompareStalenessArgs): StalenessResult;
//# sourceMappingURL=staleness.d.ts.map