/**
 * Stage 2 promotion gate — outcome-validated, no LLM self-grading.
 *
 * Authoritative source: `docs/opensquid-real-design.md` §"Two-stage wedge gate"
 * Stage 2 + §"Strategic moat" + `feedback_user_authored_lessons_immune` +
 * `project_opensquid_wedge_gate_two_stages` (memory).
 *
 * The wedge-gate moat is anchored here: every other LLM memory system on the
 * market (Mem0, Letta, Zep, Anthropic Auto-Dream, claude-auto-memory)
 * self-grades — the model decides whether its own lessons are good. Open-
 * squid's promotion decision is PURELY EXTERNAL. The only signals that move
 * a lesson from "pending" → "applied skill mutation" are:
 *
 *   1. User explicit confirm (short-circuit promote).
 *   2. Both `applied >= threshold.minApplications`
 *      AND `(passRateAfter - passRateBefore) >= threshold.minImprovement`.
 *
 * The audit-grep for this module checks for any LLM-primitive call name and
 * MUST return empty. If a future change adds an LLM call here, the audit
 * fails and the moat is broken. (See the matching test + the
 * phase-7-wedge-gate.md spec for the exact regex pattern.)
 *
 * For `schedule_outcome` lessons (SCHED.4), promotion is delegated to
 * `schedule_outcome.ts` — schedules are time-series across N fires (not a
 * single lesson + pass-rate-delta), so `shouldPromote` does not handle them.
 * Both modules share the anti-self-grading invariant: external user signal
 * (`approve` / `redo` / `manual_override`) is the ONLY promotion input.
 *
 * `shouldPromote` is intentionally pure (no I/O, no clock, no random) so the
 * caller can drive it from any signal source (verdict catalog, hook
 * counters, end-of-automation cycle). The caller is responsible for:
 *
 *   - Collecting `verdictPassRateBefore` (e.g. mean over the N events
 *     immediately preceding lesson capture).
 *   - Collecting `verdictPassRateAfter` (mean over the N events after the
 *     lesson started getting applied).
 *   - Counting `applied` (how many times the lesson was consulted).
 *
 * Phase 7's deliverable is the pure decision function; the signal-collection
 * pipeline lands in Phase 8 (mutation + tracking).
 *
 * Imports from: nothing.
 * Imported by: src/runtime/wedge/index.ts.
 */
export interface OutcomeSignal {
    lessonId: string;
    applied: number;
    verdictPassRateBefore: number;
    verdictPassRateAfter: number;
    userExplicitConfirm: boolean;
}
export interface PromotionThreshold {
    minApplications: number;
    minImprovement: number;
}
export declare function shouldPromote(signal: OutcomeSignal, threshold: PromotionThreshold): boolean;
//# sourceMappingURL=promote.d.ts.map