export interface FreezeOptions {
    lcDir?: string;
    lockPath?: string;
}
/**
 * `totem spine windtunnel freeze`
 *
 * Validates that the lock file at `LOCK_REL_PATH` (or `opts.lockPath`) is
 * schema-valid and that `resolvedPrs === selectionRule(asOfCommit)` (S4 —
 * completeness assertion). Writes the canonical lock path.
 *
 * The completeness assertion requires the lc clone (`--lc-dir`) so the
 * command can re-derive the full code-touching PR set at `asOfCommit` and
 * diff it against `resolvedPrs`. In the harness phase (no real lc run yet)
 * the assertion is skipped with a loud warning.
 */
export declare function freezeCommand(opts: FreezeOptions): Promise<void>;
export interface RunOptions {
    lcDir?: string;
    lockPath?: string;
    phase?: string;
}
/**
 * `totem spine windtunnel run`
 *
 * Reads and validates the lock, derives the freeze proof from git history (C3),
 * rejects a harness lock when `--phase certifying` is passed (P1), builds the
 * shared post-image readStrategy, runs the engine (mock for harness phase),
 * scores the result, and prints the verdict.
 *
 * Exit codes: 0 = PASS, 1 = FAIL / HONEST-NEGATIVE / needs-adjudication.
 */
export declare function runCommand(opts: RunOptions): Promise<void>;
type SafeExecFn = typeof import('@mmnto/totem').safeExec;
/**
 * Boolean predicate: is `ancestor` an ancestor of `descendant` in the repo at
 * `cwd`? `git merge-base --is-ancestor` encodes the answer in its exit code
 * (0 = yes, 1 = no), so a non-zero exit is a legitimate FALSE, not an error to
 * swallow. Any other failure (bad ref, repo unreadable) re-throws so it is not
 * masked as a clean "false".
 */
export declare function isCommitAncestor(ancestor: string, descendant: string, cwd: string, safeExec: SafeExecFn): boolean;
/**
 * Build a post-image readStrategy (S1/C1).
 * When lcDir is provided, resolves blobs via `git show <asOfCommit>:<path>` in
 * the lc clone. Throws on unresolvable blob for an evaluated added file (C2).
 * When lcDir is absent, returns null for all files (fail-open — harness mock).
 */
export declare function buildReadStrategy(lcDir: string | undefined, asOfCommit: string, safeExec: SafeExecFn): (file: string) => Promise<string | null>;
/**
 * Verify the freeze proof from git history (C3).
 * `git log --format=%H -- <lockPath>` must return at least one commit that is
 * an ancestor of HEAD. The lock blob at that commit must be byte-identical to
 * the current lock.
 */
export declare function verifyFreezeProof(lockPath: string, repoRoot: string, safeExec: SafeExecFn): void;
/**
 * Compute gate-1-scoped fixtureSha via `git hash-object` over ALL control dirs
 * (positive AND negative), so the single fixtureSha protects every fixture
 * (OQ3 — do NOT extend the existing .totem/tests FIXTURE_DIR).
 */
export declare function computeFixtureSha(controlDirs: string[], repoRoot: string, safeExec: SafeExecFn): string | null;
/**
 * Verify control-fixture integrity (C6 / §5 no-silent-shrink). The lock ALWAYS
 * declares a fixtureSha (schema-required) covering ALL control dirs (positive
 * AND negative), so any missing/empty control dir or hash mismatch is corpus
 * shrinkage / tampering — it MUST fail loud, never silently pass.
 */
export declare function verifyControlIntegrity(controlDirs: string[], expectedSha: string, repoRoot: string, safeExec: SafeExecFn): void;
/**
 * Assert corpus completeness (S4): resolvedPrs === selectionRule(asOfCommit).
 * In the harness phase this is a structural check only (no real lc API call).
 */
export declare function assertCorpusCompleteness(lock: import('@mmnto/totem').WindtunnelLock, lcDir: string, repoRoot: string, safeExec: SafeExecFn): Promise<void>;
export {};
//# sourceMappingURL=spine-windtunnel.d.ts.map