import { type ExtractionEnvelopeImport } from "./extraction-envelope.js"; import { type ReviewDecision, type ReviewItem } from "./review-resource.js"; import type { ReviewOutcome, SurveyInput } from "./types.js"; /** Portable reference to a producer-owned task. Survey never copies its executable schema. */ export interface ExtractionTaskSpecReference { version: string; digest: string; exampleDigests: string[]; } export interface ExtractionImprovementRecordDigests { extractionImport: string; reviewItem: string; reviewDecision: string; reviewOutcome: string; } /** Canonical projection derived from validated Survey records and their joins. */ export interface ExtractionImprovementLineage { taskSpec: ExtractionTaskSpecReference; extractionImportName: string; extractionId: string; proposalId: string; reviewItemName: string; reviewDecisionName: string; reviewOutcomeId: string; sourceSnapshotRef: string; preparedArtifact: { ref: string; digest: string; }; excerptLocator: string; recordDigests: ExtractionImprovementRecordDigests; } export interface BadExtractionDiagnosis { kind: "bad-extraction"; requestedTaskChanges: Array<"example-addition" | "guidance-update">; } export interface AcceptedExtractionDiagnosis { kind: "accepted-extraction"; requestedTaskChanges: Array<"grounded-positive-example" | "guidance-affirmation">; } export interface InsufficientSourceEvidenceDiagnosis { kind: "insufficient-source-evidence"; sourceRemediation: "obtain-authoritative-source" | "refresh-source-snapshot" | "expand-source-scope"; } /** Caller-supplied diagnosis; Survey never infers it from rationale prose. */ export type ExtractionImprovementDiagnosis = BadExtractionDiagnosis | AcceptedExtractionDiagnosis | InsufficientSourceEvidenceDiagnosis; export interface ExtractionImprovementReview { resolution: "accepted" | "rejected" | "could_not_confirm"; status: ReviewOutcome["status"]; reviewedAt: string; rationale: string; evidenceIds: string[]; attemptEvidenceIds: string[]; } export interface ExtractionImprovementDraft { id: string; kind: "survey.extraction-improvement-proposal"; schemaVersion: 1; state: "draft"; createdAt: string; lineage: ExtractionImprovementLineage; diagnosis: ExtractionImprovementDiagnosis; review: ExtractionImprovementReview; } export interface BuildExtractionImprovementProposalInput { createdAt: string; /** Version label paired with the task digest carried by the canonical import. */ priorTaskSpecVersion: string; extractionImport: ExtractionEnvelopeImport; proposalIndex: number; reviewItem: ReviewItem; reviewDecision: ReviewDecision; survey: SurveyInput; reviewOutcomeId: string; diagnosis: ExtractionImprovementDiagnosis; } export interface ProducerApproval { id: string; actor: string; approvedAt: string; rationale: string; evidenceIds: string[]; } /** Data-only request; the task owner must validate, store, and activate it. */ export interface ExtractionImprovementActivationRequest { id: string; dispositionKey: string; kind: "survey.extraction-improvement-activation-request"; schemaVersion: 1; state: "approved"; draftId: string; approval: ProducerApproval; nextTaskSpec: ExtractionTaskSpecReference; rollbackTaskSpec: ExtractionTaskSpecReference; guidanceChangeProofDigest?: string; } export interface ApproveExtractionImprovementProposalInput { draft: ExtractionImprovementDraft; approval: ProducerApproval; nextTaskSpec: ExtractionTaskSpecReference; rollbackTaskSpec: ExtractionTaskSpecReference; /** Required when the explicit remedy updates or affirms guidance. */ guidanceChangeProofDigest?: string; } export interface ExtractionImprovementRejection { id: string; dispositionKey: string; kind: "survey.extraction-improvement-rejection"; schemaVersion: 1; state: "rejected"; draftId: string; rejection: { id: string; actor: string; rejectedAt: string; rationale: string; evidenceIds: string[]; }; } export interface RejectExtractionImprovementProposalInput { draft: ExtractionImprovementDraft; rejection: ExtractionImprovementRejection["rejection"]; } /** One producer/store disposition is allowed for each shared dispositionKey. */ export type ExtractionImprovementDisposition = ExtractionImprovementActivationRequest | ExtractionImprovementRejection; export interface ExtractionImprovementDispositionConflict { kind: "survey.extraction-improvement-disposition-conflict"; dispositionKey: string; /** Canonically ordered distinct records. The fold never selects a winner. */ dispositions: readonly ExtractionImprovementDisposition[]; } export interface FoldExtractionImprovementDispositionsResult { /** One canonically ordered record for each uncontested disposition key. */ dispositions: readonly ExtractionImprovementDisposition[]; /** Canonically ordered conflicts for keys with more than one distinct record. */ conflicts: readonly ExtractionImprovementDispositionConflict[]; } /** * Folds producer-owned disposition records without performing I/O or selecting * between conflicting decisions. Byte-equivalent replay is idempotent. */ export declare function foldExtractionImprovementDispositions(input: readonly ExtractionImprovementDisposition[]): FoldExtractionImprovementDispositionsResult; /** Builds a frozen draft from validated canonical records. Performs no I/O. */ export declare function buildExtractionImprovementProposal(input: BuildExtractionImprovementProposalInput): ExtractionImprovementDraft; /** Emits a reversible activation request, never an activation. */ export declare function approveExtractionImprovementProposal(input: ApproveExtractionImprovementProposalInput): ExtractionImprovementActivationRequest; /** Emits an idempotent terminal rejection with the same disposition key as approval. */ export declare function rejectExtractionImprovementProposal(input: RejectExtractionImprovementProposalInput): ExtractionImprovementRejection;