import { ClaimType, RecordType } from './claim-evidence-types.js';
import type { APSBundle } from './accountability/types/bundle.js';
import type { ContestStatus } from './accountability/types/contestability.js';
export type OpenContestationLookup = {
    contestationId: string;
    status: ContestStatus;
} | null;
export type OpenContestationResolver = (recordId: string) => OpenContestationLookup;
export type ClaimVerificationResult = {
    status: 'valid';
    claimType: ClaimType;
    satisfiedBy: RecordType[];
} | {
    status: 'missing_evidence';
    claimType: ClaimType;
    missing: RecordType[];
    provided: RecordType[];
} | {
    status: 'forbidden_substitution';
    claimType: ClaimType;
    offendingRecord: RecordType;
    reason: string;
} | {
    status: 'unsupported_claim_type';
    claimType: ClaimType;
} | {
    status: 'profile_not_populated';
    claimType: ClaimType;
} | {
    status: 'bundle_requires_inclusion_proof';
    claimType: ClaimType;
    bundleRecord: APSBundle;
} | {
    status: 'contested';
    claimType: ClaimType;
    contestedRecordId: string;
    contestationId: string;
    contestationStatus: ContestStatus;
};
export interface ClaimVerificationInput {
    claim: {
        type: ClaimType;
        subject: string;
    };
    evidence: Array<{
        recordType: RecordType;
        record: unknown;
        receiptId?: string;
    }>;
    /** Optional Module 4 hook. When provided, every evidence entry that
     *  carries a receiptId is checked against the resolver after the
     *  static registry passes but before the verifier returns 'valid'.
     *  Statuses 'filed', 'under_review', 'upheld', 'remedied' all
     *  block; 'rejected', 'abandoned', 'expired' do not. */
    openContestationResolver?: OpenContestationResolver;
}
export declare function verifyEvidenceClaim(input: ClaimVerificationInput): ClaimVerificationResult;
//# sourceMappingURL=claim-verifier.d.ts.map