/**
 * guardPosture — the SINGLE shared definition of "what is a guard and what
 * does the config say about it" (GUARD-POSTURE-ENDPOINT-SPEC §2.1).
 *
 * Consumed by BOTH the boot-time GuardPostureTripwire (transition alarms) and
 * the GET /guards endpoint (steady-state readability). Never re-derive this
 * extraction elsewhere — the SafeGitExecutor single-funnel lesson: two copies
 * of "what counts as a guard" WILL drift, and the drifted one is always the
 * one watching when the next Mini incident happens.
 *
 * Also home of resolveGuardConfigSnapshot(): the one-disk-read resolved-config
 * snapshot the endpoint derives everything from. Disk, not the in-memory
 * config object, because the original incident (2026-06-05) was an emergency
 * DIRECT DISK EDIT invisible to in-memory config until restart.
 */
import { type AgentType } from '../config/ConfigDefaults.js';
export type GuardPosture = Record<string, boolean>;
export interface GuardPostureDiff {
    /** Guards that were enabled last boot and are disabled now. */
    disabled: string[];
    /** Guards that were disabled last boot and are enabled now. */
    enabled: string[];
}
/** Posture keys whose false→true transition is COST-INCREASING and must be
 *  surfaced as loudly as a guard-disable (FABLE-MODEL-ESCALATION-SPEC §10). */
export declare const COST_INCREASING_ENABLE_KEYS: ReadonlySet<string>;
/**
 * Extract the guard posture from a resolved config object.
 *
 * Covered surface (generic by design — a future guard is covered the moment
 * it follows the `monitoring.<key>.enabled` convention, with no change here):
 *   - `monitoring.<key>.enabled` (boolean) → `monitoring.<key>.enabled`
 *   - `monitoring.<key>` (plain boolean)   → `monitoring.<key>`
 *   - `scheduler.enabled` (boolean)        → `scheduler.enabled`
 *   - `models.tierEscalation.{enabled,dryRun}`
 */
export declare function extractGuardPosture(config: unknown): GuardPosture;
/**
 * Diff two postures. Only keys present in BOTH snapshots can transition —
 * a key appearing for the first time (new feature) or vanishing (config
 * cleanup) is a shape change, not a guard flip, and raises nothing.
 */
export declare function diffGuardPosture(prev: GuardPosture, cur: GuardPosture): GuardPostureDiff;
export interface GuardPostureBootSnapshot {
    ts: string;
    posture: GuardPosture;
}
export declare function guardPostureSnapshotPath(stateDir: string): string;
/** Read the tripwire's boot-time posture snapshot. null = absent/corrupt —
 *  callers degrade to `divergence: "snapshot-unavailable"`, never invent. */
export declare function readGuardPostureBootSnapshot(stateDir: string): GuardPostureBootSnapshot | null;
export interface ResolvedGuardConfigSnapshot {
    /** Defaults + on-disk file deep-merged, dev gates resolved. The ONLY object
     *  posture derivation reads config from. */
    resolved: Record<string, unknown>;
    /** Defaults alone (same agent type, dev gates resolved against the merged
     *  config's developmentAgent) — the baseline for offClass classification. */
    defaults: Record<string, unknown>;
    /** True when `.instar/config.json` was absent (a defaults-only snapshot). */
    fileAbsent: boolean;
    /** Set when the file existed but could not be read/parsed. The caller must
     *  surface this as a top-level error — never an empty-truthful inventory. */
    readError?: string;
}
/**
 * Read the on-disk agent config ONCE and resolve it the way the server would:
 * shared defaults (by agent type) + file deep-merged on top + every
 * DEV_GATED_FEATURES `enabled` resolved via resolveDevAgentGate (their
 * convention is to OMIT `enabled` and let the gate decide).
 *
 * EXACTLY ONE fs read of config.json per call — the endpoint calls this once
 * per request (Tier-1 pinned), never per guard.
 */
export declare function resolveGuardConfigSnapshot(projectDir: string, opts?: {
    agentType?: AgentType;
}): ResolvedGuardConfigSnapshot;
//# sourceMappingURL=guardPosture.d.ts.map