/**
 * Pipeline step: Publish evaluation report to the report store.
 *
 * Inlines the logic from the former pipeline/steps/publish-report-step.ts.
 * Uses ctx.reportStore and ctx.sinks from the composition root instead of
 * constructing ReportStore and loadSinks() internally.
 *
 * Design principles:
 * - P1: Reports are immutable events (write-once to Sanity)
 * - P5: Local-first (pipeline never fails because of a store write)
 * - P6: Sinks are fire-and-forget (failures logged, not thrown)
 */
import { type AppContext, type PipelineState, type PipelineStep, type PromptfooUrlEntry, type ReportAutoScope, type ReportDegradation, type ScoreSummary, type StepResult, type ValidationIssue } from "../../_vendor/ailf-core/index.d.ts";
import { type ProvenanceInput } from "../../pipeline/provenance.js";
export declare class PublishReportStep implements PipelineStep {
    private readonly pipelineStart;
    private readonly options;
    readonly name = "publish-report";
    readonly optional = true;
    constructor(pipelineStart: number, options?: {
        evalFingerprint?: string;
        promptfooUrls?: PromptfooUrlEntry[];
        publishTag?: string;
    });
    check(): ValidationIssue[];
    execute(ctx: AppContext, state: PipelineState): Promise<StepResult>;
}
/**
 * Build the report's auto-scope provenance from pipeline state.
 *
 * Two independent state slices feed it, both written by FetchDocsStep:
 * - `releaseAutoScope` — set only when auto-scoping narrowed the run to
 *   release-affected tasks.
 * - `releaseImpact` — set whenever a source-level perspective diff ran,
 *   carrying the release's `uncovered` slice: docs the release modified
 *   that no evaluated task references (D0066's visibility net).
 *
 * When narrowing occurred the record reflects it (`enabled: true`) and the
 * uncovered slice rides along — including an empty array, which means
 * "checked, every release edit is covered". When no narrowing occurred but
 * uncovered docs exist (e.g. every task was affected, so auto-scope added
 * no value), a record with `enabled: false` and empty task-ID arrays still
 * reaches the report — an applied fix outside the evaluated set must never
 * be silently unmeasured.
 *
 * Exported for unit testing — production callers reach it via execute().
 */
export declare function buildReportAutoScope(state: PipelineState): ReportAutoScope | undefined;
/**
 * Detect whether a report should publish as degraded.
 *
 * The symptom is a scored run whose per-test details never landed: a full
 * eval counted tests (`scores[].testCount > 0`) but `summary.testResults` is
 * absent because gap-analysis skipped or failed. Such a report renders an
 * empty "no tests" state in Studio despite carrying a score. Returns the
 * marker enumerating which enrichment surfaces are missing, or `undefined`
 * for a healthy report (or a run with no scored tests, where an empty report
 * is legitimate).
 *
 * Exported for unit testing — production callers reach it via execute().
 */
export declare function detectReportDegradation(summary: ScoreSummary): ReportDegradation | undefined;
/**
 * Assemble provenance input from the score summary and pipeline context.
 *
 * Exported for unit testing — direct consumers should still call
 * `buildProvenance` (which calls this transitively via the publish step).
 */
export declare function buildProvenanceInput(summary: ScoreSummary, ctx: AppContext, options: {
    evalFingerprint?: string;
    promptfooUrls?: PromptfooUrlEntry[];
}, autoScope?: ReportAutoScope): ProvenanceInput;
