/**
 * The resume ladder's gate-match rung and the review / park TWINS (E3), verbatim from
 * `Runner.resumeStream`: the outcome arm must match the persisted gate kind; a review-gate outcome
 * (plan_review / dry_run_review) is captured into a plain twin with its domain and text-payload checks, the
 * break-out-tag hygiene and the env_failed replay guard; the two tool-less park lanes (wake / resource_limit)
 * get their twins too, so no lane hands the caller's object downstream. Synchronous; every refusal throws
 * pre-CAS.
 */
import { type Checkpoint, type PendingSteerEntry, type ResumeOutcome } from "../checkpoint-store.js";
export interface ResumeReviewOutcomeInput {
    /** borrowed-readonly — the pending row (the lane is keyed on the STORED gate kind). */
    cp: Checkpoint;
    /** borrowed-readonly — the caller's outcome; each review field is read exactly once, into the twin. */
    outcome: ResumeOutcome;
    /** borrowed-readonly — the ONE read of the outcome discriminant, taken at admission. */
    outcomeGate: ResumeOutcome["gate"];
    /** borrowed-readonly — the validated wake message, carried into the wake twin. */
    wakeMessage: Omit<PendingSteerEntry, "seq"> | undefined;
}
export interface ResumeReviewOutcomeResult {
    /** The review lane's plain twin (a plan_review / needs_review row), else undefined. */
    plainReviewOutcome: Extract<ResumeOutcome, {
        gate: "plan_review" | "dry_run_review";
    }> | undefined;
    /** The tool-less park lanes' plain twin (a wake or a resource_limit continue), else undefined. */
    plainParkOutcome: Extract<ResumeOutcome, {
        gate: "wake" | "resource_limit";
    }> | undefined;
}
export declare function resumeReviewOutcome(input: ResumeReviewOutcomeInput): ResumeReviewOutcomeResult;
