/**
 * LiveTestGate — the deterministic completion-gate veto (spec
 * docs/specs/live-user-channel-proof-standard.md §4). It refuses a "done"/"shipped"
 * verdict for a USER-FACING feature unless a verified live-test artifact (§4.4)
 * proves it ran through its real surface (Telegram AND Slack for a channel feature)
 * across the required risk categories.
 *
 * Signal vs. Authority (§4.2 — the load-bearing placement): the keyword classifier
 * holds NO standalone blocking authority. The HARD veto rests only on OBJECTIVE
 * facts — an author-DECLARED `userFacing:true` AND the absence of a verified
 * artifact. An undeclared-but-user-facing-looking goal gets a SOFT 'nudge'
 * (return-to-work signal), never a hard block on a brittle guess. Both outcomes
 * keep an autonomous run working (they prevent a premature "done"); only the
 * REPORTED authority differs, so the structure is honest about which is objective.
 *
 * Rollout (§4.8): `mode` is dry-run → warn → veto. In dry-run/warn the decision is
 * computed + logged but `blocks` is false (it never actually stops the run); only
 * `veto` mode blocks. The SAFE direction on an unverifiable artifact is not-proven
 * (return to work), never a false "done".
 */
import type { LiveTestArtifactStore, Surface, LiveTestArtifact } from './LiveTestArtifactStore.js';
export type LiveTestGateMode = 'dry-run' | 'warn' | 'veto';
export declare function looksUserFacing(goalText: string): boolean;
export interface LiveTestGateInput {
    featureId: string;
    /** Author declaration; undefined → classifier signal (never a hard block). */
    userFacing?: boolean;
    goalText: string;
    /** The surfaces this feature has (channel/dashboard). Default ['telegram','slack']. */
    requiredSurfaces?: Surface[];
    mode: LiveTestGateMode;
}
export type GateOutcome = 'allow' | 'veto' | 'nudge';
export interface LiveTestGateResult {
    outcome: GateOutcome;
    /** Whether this actually stops the run (only outcome!=allow AND mode==='veto'). */
    blocks: boolean;
    mode: LiveTestGateMode;
    reason: string;
    /** True when the gate WOULD veto/nudge but mode held it (dry-run/warn telemetry). */
    wouldBlock: boolean;
}
/**
 * Evaluate the live-test artifact for a feature against the §4.5 surface +
 * §4.6 risk-category requirements. Returns null when the artifact fully satisfies
 * the bar, or a human reason string when it does not.
 */
export declare function evaluateArtifact(artifact: LiveTestArtifact, requiredSurfaces: Surface[]): string | null;
export declare class LiveTestGate {
    private readonly store;
    constructor(store: LiveTestArtifactStore);
    evaluate(input: LiveTestGateInput): LiveTestGateResult;
}
//# sourceMappingURL=LiveTestGate.d.ts.map