/**
 * LiveTestRunner — the orchestrator that APPLIES the live-user-channel-proof standard
 * to the cross-machine transfer (docs/specs/live-user-channel-proof-standard.md §6 —
 * the first feature held to the bar). It encodes the capstone flow that a user-role
 * session runs:
 *
 *   1. MOVE THE SEAT FIRST — transfer the (throwaway) topic to the target machine.
 *      If the transfer reports the seat did NOT move, the capstone premise is false and
 *      we stop loudly (that "ok:true but moved nothing" lie is the original bug — we
 *      refuse to paper over it).
 *   2. Then run the LiveTestHarness over a scenario matrix that sends a real message
 *      through each channel and asserts the reply was served FROM the target machine
 *      (the `responderMachine` expectation — the deterministic cross-machine proof).
 *
 * This module is pure orchestration over the injected harness + an injected `transfer`
 * action, so it is unit-testable with fakes. The server.ts route wires the real
 * RealChannelDriver (real senders + placement reader) into the harness and the real
 * `POST /pool/transfer` into `transfer`.
 *
 * Honesty contract: a non-moved seat THROWS (never records a misleading PASS); a moved
 * seat that then fails to reply-from-target is a normal harness FAIL (recorded with the
 * responder mismatch). The artifact only ever shows PASS when the seat moved AND the
 * reply genuinely came from the target machine.
 */
import type { LiveTestHarness } from './LiveTestHarness.js';
export interface TransferResult {
    /** Did the seat genuinely move (the honest signal, NOT a bare ok:true)? */
    seatMoved: boolean;
    detail?: string;
}
export interface MultiMachineCapstoneOpts {
    featureId?: string;
    /** The machine the seat must move to (e.g. the Mini's machine id) — also the expected responder. */
    targetMachine: string;
    /** The throwaway Telegram topic id (also the placement key the responder reader uses). */
    telegramTopicId: string;
    /** Optional Slack channel id for the Slack half of the Telegram-AND-Slack bar. */
    slackChannelId?: string;
    /** The real transfer action (server.ts injects POST /pool/transfer). MUST report seatMoved honestly. */
    transfer: (topicId: string, toMachine: string) => Promise<TransferResult>;
    /** The user message to send (default a benign probe). */
    message?: string;
    timeoutMs?: number;
    runId?: string;
}
export declare class LiveTestRunnerError extends Error {
    constructor(message: string);
}
export declare class LiveTestRunner {
    private readonly deps;
    constructor(deps: {
        harness: LiveTestHarness;
        logger?: (m: string) => void;
    });
    private log;
    /**
     * Run the multi-machine transfer capstone. Throws LiveTestRunnerError if the seat did
     * not move (the capstone cannot meaningfully run). Otherwise returns the harness
     * artifact (PASS only when the reply came FROM `targetMachine`).
     */
    runMultiMachineTransferCapstone(opts: MultiMachineCapstoneOpts): Promise<{
        artifact: import("./LiveTestArtifactStore.js").LiveTestArtifact;
        entry: ReturnType<import("./LiveTestArtifactStore.js").LiveTestArtifactStore["write"]>;
    }>;
}
//# sourceMappingURL=LiveTestRunner.d.ts.map