import { type FailureCategory } from './failureTaxonomy';
export interface PhaseHintProposal {
    failureCategoryEnum: FailureCategory;
    evidenceSummary: string;
    candidateKeywords: string[];
    candidateConstraints: string;
    candidateCriticalTools: string[];
    /** Optional override for the timestamp baked into the rendered entry. */
    appliedAt?: number;
}
export type RenderRejectReason = 'unknown_category' | 'no_template' | 'invalid_payload' | 'tool_not_in_registry' | 'security_scan';
export type RenderResult = {
    ok: true;
    yaml: string;
    patchFingerprint: string;
    phaseHintId: string;
} | {
    ok: false;
    reason: RenderRejectReason;
    details: string;
};
export interface RenderOptions {
    templatesDir?: string;
    toolRegistry?: ReadonlySet<string>;
}
/**
 * Validate a proposal and emit a stable patch fingerprint without rendering.
 * Useful when the caller needs to detect a duplicate proposal before the
 * (more expensive) template substitution.
 */
export declare function validateProposal(raw: unknown, toolRegistry?: ReadonlySet<string>): {
    ok: true;
    value: PhaseHintProposal;
} | {
    ok: false;
    reason: RenderRejectReason;
    details: string;
};
/**
 * Render a phase_hints entry. Returns a yaml string that callers append
 * verbatim to the target strategy file's `phase_hints:` block.
 */
export declare function renderPhaseHint(raw: unknown, opts?: RenderOptions): RenderResult;
declare function computePatchFingerprint(proposal: PhaseHintProposal): string;
/** Useful for tests + the patch orchestration layer. */
export declare const __testing: {
    TEMPLATES_DIR: string;
    MAX_KEYWORDS: number;
    MAX_KEYWORD_CHARS: number;
    MAX_CONSTRAINTS_CHARS: number;
    MAX_TOOLS: number;
    MAX_TOOL_CHARS: number;
    computePatchFingerprint: typeof computePatchFingerprint;
};
export {};
//# sourceMappingURL=phaseHintsRenderer.d.ts.map