/**
 * GuardPostureStore — durable last-known guard posture per machine
 * (GUARD-POSTURE-ENDPOINT-SPEC §2.3(c)).
 *
 * The in-memory pool registry is rebuilt from heartbeats, so last-known
 * posture would evaporate on a local server restart — defeating dark-peer
 * honesty in exactly the GAP-001 topology (a week-dark Mini + the laptop's
 * routine update restarts). This store persists each machine's most recent
 * posture block alongside the RECEIVER-side receipt time, reloads at boot,
 * and lets the pool view render "as of <age> ago" for a peer that has been
 * dark for days.
 *
 * Identity rule: callers key records on the REGISTRY's machine identity
 * (the heartbeat ingestion chokepoint already does) — a body-claimed
 * machineId never reaches this store.
 */
import type { GuardPostureSummary } from './types.js';
export interface StoredGuardPosture {
    posture: GuardPostureSummary;
    /** Receiver-side receipt epoch-ms (the router's clock at heartbeat arrival). */
    receivedAtMs: number;
}
/** Field-wise posture equality EXCLUDING generatedAt (which changes every
 *  beat by construction and must not defeat write-on-change). */
export declare function postureSemanticsEqual(a: GuardPostureSummary, b: GuardPostureSummary): boolean;
export declare class GuardPostureStore {
    private readonly filePath;
    private machines;
    constructor(stateDir: string);
    private load;
    /** Persist a machine's posture (write-on-change: a SEMANTICALLY unchanged
     *  posture refreshes nothing on disk, so the 30s heartbeat loop doesn't
     *  churn fs — `generatedAt` is always fresh and deliberately excluded from
     *  the comparison; perf review 2026-06-12 finding #2). */
    record(machineId: string, posture: GuardPostureSummary, receivedAtMs: number): void;
    get(machineId: string): StoredGuardPosture | null;
}
//# sourceMappingURL=GuardPostureStore.d.ts.map