/**
 * Typed Ax output for analyst findings.
 *
 * Replaces the legacy `findings:string[]` pattern (where every bullet
 * became a flat-severity `AnalystFinding`) with a structured object
 * array. Ax binds the field as `findings:json[]` so the provider emits
 * native structured output; at the kind-factory boundary we Zod-validate
 * each emitted finding so malformed rows fail loud instead of being
 * silently lifted with default severity.
 *
 * Why not `f.object().array()` directly in the signature? The Ax
 * signature string `question:string -> findings:json[]` already lets
 * the provider emit JSON arrays. A Zod boundary is required either
 * way (the provider can return any JSON), and Zod gives us a single
 * validation surface independent of which Ax version is installed.
 */
import { z } from 'zod';
export declare const ANALYST_SEVERITIES: readonly ["critical", "high", "medium", "low", "info"];
export declare const RawAnalystFindingSchema: z.ZodObject<{
    severity: z.ZodEnum<{
        info: "info";
        critical: "critical";
        medium: "medium";
        low: "low";
        high: "high";
    }>;
    claim: z.ZodString;
    subject: z.ZodOptional<z.ZodString>;
    evidence_uri: z.ZodString;
    evidence_excerpt: z.ZodOptional<z.ZodString>;
    confidence: z.ZodNumber;
    rationale: z.ZodOptional<z.ZodString>;
    recommended_action: z.ZodOptional<z.ZodString>;
}, z.core.$strict>;
export type RawAnalystFinding = z.infer<typeof RawAnalystFindingSchema>;
/**
 * Description embedded into the actor prompt so the LLM knows what
 * shape to emit. Kept here so kinds share one source of truth rather
 * than restating the schema in every prompt.
 */
export declare const RAW_FINDING_SCHEMA_PROMPT = "Each finding MUST be a JSON object with these fields:\n  - severity: one of \"critical\" | \"high\" | \"medium\" | \"low\" | \"info\"\n  - claim: one-sentence statement (max 2000 chars)\n  - subject?: the routing locus this finding is about. It MUST be one of the exact subject forms listed in this kind's instructions above (e.g. `system-prompt:<section>`, `agent-knowledge:wiki:<slug>`, `tool-doc:<tool>`). A free phrase, a bare noun, or any form not in that list is REJECTED at parse time and the finding is discarded \u2014 omit subject entirely rather than guess a form.\n  - evidence_uri: REQUIRED, never blank. Exactly one of \"span://<trace_id>/<span_id>\" (trace evidence), \"artifact://<relative-path>\" (files), \"metric://<name>\" (named scalars) \u2014 ALWAYS cite a real id surfaced by the tools. If you have no citable id, do not emit the finding.\n  - evidence_excerpt?: short quote (<=2000 chars) from the cited span/artifact\n  - confidence: number 0..1 \u2014 0.9+ when backed by exact quotes, 0.6-0.8 for inferred patterns, <0.5 for speculative\n  - rationale?: one or two sentences explaining the reasoning\n  - recommended_action?: concrete change phrased as an imperative (\"Add ...\", \"Replace ...\", \"Stop ...\") \u2014 omit when the finding is purely descriptive\n\nEmit an empty array when the question has no findings to report. Do not fabricate evidence.";
/**
 * Validate one row emitted by the LLM. Returns the typed finding on
 * success; returns `null` and logs the reason on failure so the kind
 * factory can skip-and-count rather than abort the whole analyst run.
 */
export declare function parseRawFinding(row: unknown, log?: (msg: string, fields?: Record<string, unknown>) => void): RawAnalystFinding | null;
//# sourceMappingURL=finding-signature.d.ts.map