/** Deterministic mulberry32. Same seed → same trace, always. */
export declare class Rng {
    private state;
    constructor(seed: number);
    next(): number;
    int(min: number, max: number): number;
    pick<T>(items: readonly T[]): T;
    chance(p: number): boolean;
    shuffle<T>(items: T[]): T[];
}
/** Fake clock — the only time the harness is allowed to consult. */
export declare class Clock {
    nowMs: number;
    advance(ms: number): void;
    iso(): string;
}
export interface FaultConfig {
    dropRate: number;
    duplicateRate: number;
    reorder: boolean;
    maxDelayMs: number;
    crashBeforeCommitRate: number;
    crashAfterCommitRate: number;
    httpFailRate: number;
}
export declare const NO_FAULTS: FaultConfig;
export declare function faultsFromRng(rng: Rng): FaultConfig;
export type LiveEvent = {
    type: "message:created";
    messageId: number;
} | {
    type: "message:edited";
    messageId: number;
} | {
    type: "message:deleted";
    messageId: number;
    seq: number;
} | {
    type: "reaction:changed";
    messageId: number;
} | {
    type: "presence:changed";
    userId: number;
    status: "active" | "offline";
};
interface Envelope {
    toUserId: number;
    event: LiveEvent;
    deliverAt: number;
}
/**
 * Scriptable transport (§6). Not Socket.IO — a queue the world drains
 * against the fake clock, so every run is replayable from a seed.
 */
export declare class Transport {
    private readonly clock;
    private readonly rng;
    private readonly faults;
    private pending;
    /** Users currently partitioned (cannot receive). */
    readonly partitioned: Set<number>;
    constructor(clock: Clock, rng: Rng, faults: FaultConfig);
    broadcast(memberIds: readonly number[], event: LiveEvent): void;
    sendTo(userId: number, event: LiveEvent): void;
    deliverDue(): Envelope[];
    remaining(): number;
    /** Deliver everything not blocked by a partition, jumping the clock if needed. */
    flushUnpartitioned(): Envelope[];
}
export declare class CommitCrash extends Error {
    constructor();
}
export declare class EmitCrash extends Error {
    constructor();
}
export declare class HttpFault extends Error {
    constructor();
}
export {};
//# sourceMappingURL=sim.d.ts.map