/**
 * LegalHold error hierarchy -- P4-RET-03
 *
 * Fail-closed philosophy: every error condition is named and typed.
 * Callers must handle each case explicitly.
 *
 * Spec: P4-RET-01 AC 21
 *
 * @connexum/ai-governance
 */
/**
 * Base class for all LegalHold errors.
 * Extends Error so callers can use instanceof LegalHoldError as a
 * catch-all before narrowing to subtypes.
 */
export declare class LegalHoldError extends Error {
    readonly code: string;
    constructor(message: string, code: string);
}
/**
 * Thrown when a LegalHold creation request carries a scope with NO
 * populated fields (tenantId, contractId, agentId, caseTag, packId).
 * A system-wide hold with an empty scope is not expressible by default
 * (requires explicit opt-in not implemented in this cycle per spec).
 *
 * Spec: P4-RET-01 Section 2.3, "fail-closed. Empty scope refused."
 */
export declare class LegalHoldScopeEmptyError extends LegalHoldError {
    constructor();
}
/**
 * Thrown when a requested holdId does not exist in the store.
 */
export declare class LegalHoldNotFoundError extends LegalHoldError {
    readonly holdId: string;
    constructor(holdId: string);
}
/**
 * Thrown when a race condition is detected that would let a hold be
 * created and deleted in the same tick without an intervening approval
 * event.
 *
 * The canonical scenario (pentest PT-RET-2): a deletion job starts
 * scanning; another thread calls create() immediately followed by
 * release() before the approval-queue event fires. The store detects
 * this by verifying that a 'pending' hold cannot transition directly
 * to 'released' without first passing through 'active' (which requires
 * a resolved approval event).
 *
 * Spec: P4-RET-01 AC 21
 */
export declare class LegalHoldConcurrencyError extends LegalHoldError {
    readonly holdId: string;
    readonly attemptedTransition: string;
    constructor(holdId: string, attemptedTransition: string);
}
//# sourceMappingURL=legal-hold-errors.d.ts.map