/**
 * Scene plan templates — mandatory aspects per scene type, used by
 * `submit_plan` / `revise_plan` to validate that an agent's plan covers
 * scene-critical phases.
 *
 * Keys MUST match `*.strategy.md` frontmatter `scene:` ids (underscore
 * form for compound names — `touch_tracking`, NOT `touch-tracking`).
 * A hyphen-form key silently disables hard-gate for the affected scene;
 * the coverage test guards against that regression.
 */
import type { SceneType } from './sceneClassifier';
export interface ScenePlanTemplateAspect {
    /**
     * Stable identifier for the aspect — populated when the template comes
     * from strategy frontmatter (Phase 2.1) and synthesised from the first
     * matchKeyword for legacy hardcoded entries.
     */
    id?: string;
    matchKeywords: string[];
    suggestion: string;
}
export interface ScenePlanTemplate {
    mandatoryAspects: ScenePlanTemplateAspect[];
}
/**
 * Scenes that intentionally have no mandatory plan aspects. Listing them
 * explicitly distinguishes "deliberately absent" from "accidentally
 * missing" (forgotten when adding a new scene).
 */
export declare const SCENES_WITHOUT_PLAN_TEMPLATE: ReadonlySet<SceneType>;
/**
 * Resolve the plan template for a scene. Returns `undefined` for scenes
 * in {@link SCENES_WITHOUT_PLAN_TEMPLATE}, unknown scenes, or scenes that
 * have deliberately opted out via empty `mandatoryAspects`.
 *
 * Phase 2.1 of v2.1 — strategies that ship a `plan_template:` block in
 * their `*.strategy.md` frontmatter take priority. The hardcoded
 * `SCENE_PLAN_TEMPLATES` map remains as a fallback for scenes that have
 * not yet migrated; once every scene migrates it can be removed.
 */
export declare function getScenePlanTemplate(scene: SceneType): ScenePlanTemplate | undefined;
/**
 * Enumerated scene keys that have a non-empty plan template — covers
 * both frontmatter-sourced and legacy hardcoded scenes.
 */
export declare function listScenePlanTemplateKeys(): SceneType[];
export interface PlanValidationResult {
    /** Human-readable suggestions for any uncovered aspect (one per aspect). */
    warnings: string[];
    /**
     * Stable handles for the missing aspects, derived from the first
     * matchKeyword. Lets callers (e.g. revise_plan diff) tell whether the
     * same aspects keep recurring across attempts.
     */
    missingAspectIds: string[];
}
/** Minimum justification length for a waiver to be accepted. */
export declare const MIN_WAIVER_REASON_CHARS = 50;
/**
 * Detect mandatory aspects of a scene's plan template that a submitted
 * `phases` array fails to mention. Returns empty arrays for scenes without
 * a template or when all aspects are covered.
 *
 * `waivers` is an optional set of agent-declared opt-outs; an aspect with
 * a matching `aspectId` and a `reason` of at least
 * {@link MIN_WAIVER_REASON_CHARS} characters is treated as covered.
 *
 * Pure function — both `submit_plan` and `revise_plan` delegate here so
 * the hard-gate cannot be bypassed by silently re-issuing a plan via the
 * revise endpoint.
 */
export declare function validatePlanAgainstSceneTemplate(phases: ReadonlyArray<{
    name: string;
    goal: string;
    expectedTools?: string[];
}>, scene: SceneType | undefined, waivers?: ReadonlyArray<{
    aspectId: string;
    reason: string;
}>): PlanValidationResult;
//# sourceMappingURL=scenePlanTemplates.d.ts.map