/** Phase-level restatement hint — loaded from strategy frontmatter `phase_hints`. */
export interface PhaseHint {
    id: string;
    keywords: string[];
    constraints: string;
    criticalTools: string[];
    /** When true, this hint is injected as unconditional fallback if keyword matching fails. */
    critical: boolean;
}
/**
 * A single mandatory aspect a plan must touch — sourced from a scene's
 * `plan_template.mandatory_aspects` frontmatter. The submit_plan /
 * revise_plan hard-gate fails when no plan phase mentions any of the
 * `matchKeywords`.
 */
export interface PlanMandatoryAspect {
    /** Stable identifier for diff-friendly tracking (e.g. `frame_jank_analysis`). */
    id: string;
    matchKeywords: string[];
    suggestion: string;
}
/** Plan template loaded from a strategy's `plan_template:` frontmatter. */
export interface PlanTemplate {
    mandatoryAspects: PlanMandatoryAspect[];
}
/**
 * Scene-owned final report contract. Strategies declare these as data so
 * runtime quality gates can enforce scene completeness without adding
 * TypeScript branches for every analysis scenario.
 */
export interface FinalReportContractRequirement {
    id: string;
    label: string;
    description?: string;
    patterns: string[];
    /** AND-of-OR groups. Each inner group must match at least one pattern. */
    patternGroups: string[][];
    /** Defaults to true. Optional entries document nice-to-have structure. */
    required: boolean;
}
export interface FinalReportContract {
    requiredSections: FinalReportContractRequirement[];
}
export type StrategyKind = 'normal' | 'contract_only';
export interface StrategyDefinition {
    scene: string;
    /** contract_only strategies expose contracts without classifier/prompt injection. */
    strategyKind: StrategyKind;
    priority: number;
    effort: string;
    keywords: string[];
    compoundPatterns: RegExp[];
    /** Capability IDs required for this scene (missing = critical gap) */
    requiredCapabilities: string[];
    /** Capability IDs that enhance analysis but are not required */
    optionalCapabilities: string[];
    /** Phase-level hints for mid-analysis restatement injection. */
    phaseHints: PhaseHint[];
    /**
     * Plan template — mandatory aspects every submitted plan must cover for
     * this scene. `null` (vs. an empty mandatoryAspects array) means the
     * scene has deliberately opted out of plan-template validation.
     */
    planTemplate: PlanTemplate | null;
    /**
     * Data-only contract for final answer completeness. Runtime code must
     * execute this contract generically instead of hardcoding scene checks.
     */
    finalReportContract: FinalReportContract | null;
    content: string;
    /**
     * Absolute path to the source `*.strategy.md` file. Required because the
     * scene id (e.g. `touch_tracking`) is not always the file basename
     * (`touch-tracking.strategy.md`); callers that need the file itself —
     * fingerprinting, hot-reload diffing — must resolve through this field
     * instead of `${scene}.strategy.md`.
     */
    sourcePath: string;
}
export declare function loadStrategies(): Map<string, StrategyDefinition>;
export declare function getStrategyContent(scene: string): string | undefined;
export declare function getRegisteredScenes(): StrategyDefinition[];
/** Get phase-level restatement hints for a scene. Returns [] if scene has no hints. */
export declare function getPhaseHints(scene: string): PhaseHint[];
/**
 * Get the plan template for a scene loaded from `plan_template:`
 * frontmatter. Returns `null` for unknown scenes and for scenes that
 * deliberately opted out (no `plan_template` block in their frontmatter).
 *
 * Phase 2.1 of v2.1 — strategies migrated to frontmatter take priority
 * over the legacy hardcoded `SCENE_PLAN_TEMPLATES` map; the legacy map
 * remains as a fallback in `scenePlanTemplates.ts` until every strategy
 * has migrated.
 */
export declare function getPlanTemplate(scene: string): PlanTemplate | null;
/**
 * Get the scene-owned final report completeness contract. Returns null for
 * scenes that have no declarative contract yet.
 */
export declare function getFinalReportContract(scene: string): FinalReportContract | null;
/**
 * Resolve the absolute path of the `*.strategy.md` file backing a scene.
 * Returns `undefined` for unknown scenes. Use this instead of `${scene}.strategy.md`
 * — file basenames may use hyphens (`touch-tracking.strategy.md`) where
 * the scene id uses underscores (`touch_tracking`).
 */
export declare function getStrategyFilePath(scene: string): string | undefined;
/** Clear cached strategies and templates — useful for dev/test reloads. */
export declare function invalidateStrategyCache(): void;
/**
 * Load a prompt template from `backend/strategies/<name>.template.md`.
 * Templates use `{{variable}}` placeholders that callers substitute at runtime via `renderTemplate()`.
 * Static templates (no variables) can be used directly as-is.
 *
 * Results are cached in `templateCache` and cleared by `invalidateStrategyCache()`.
 */
export declare function loadPromptTemplate(name: string): string | undefined;
/**
 * Load a selection context template from `backend/strategies/selection-<kind>.template.md`.
 * Delegates to `loadPromptTemplate()` with the `selection-` prefix.
 */
export declare function loadSelectionTemplate(kind: string): string | undefined;
/**
 * Substitute `{{key}}` placeholders in a template string with provided values.
 */
export declare function renderTemplate(template: string, vars: Record<string, string | number | undefined>): string;
//# sourceMappingURL=strategyLoader.d.ts.map