/* RFC-0278/RFC-0279/RFC-0285 shared governance contracts for PSEO autonomy, auditable AI review, and human escalation budgets. Do not run reviewers, mutate logs, or decide promotions. RFC-0278/RFC-0279/RFC-0285: governance contract types. */ import { z } from "zod"; export const approverSchema = z.discriminatedUnion("kind", [ z.object({ kind: z.literal("human"), handle: z.string().min(1) }).strict(), z .object({ kind: z.literal("agent"), modelId: z.string().min(1), promptId: z.string().min(1), version: z.string().min(1), }) .strict(), ]); export const fieldClassSchema = z.enum(["structural", "narrative", "claims", "product"]); export const autonomyLevelSchema = z.enum(["L0", "L1", "L2", "L3", "L4"]); export const autonomyScopeSchema = z .object({ module: z.string().min(1), fieldClass: fieldClassSchema, locale: z.string().min(1), }) .strict(); export const autonomyStateSchema = z .object({ scope: autonomyScopeSchema, level: autonomyLevelSchema, ceiling: autonomyLevelSchema, sinceAt: z.string().datetime({ offset: true }), evidenceRef: z.string().min(1), lastReviewedBy: approverSchema.optional(), }) .strict(); export const approvalRecordSchema = z .object({ approver: approverSchema, atLevel: autonomyLevelSchema, approvedAt: z.string().datetime({ offset: true }), confidence: z.number().min(0).max(1).optional(), }) .strict(); export const reviewInputSchema = z .object({ artifactRef: z.string().min(1), fieldClass: fieldClassSchema, grounding: z .object({ record: z.unknown().optional(), approvedClaims: z.array(z.unknown()).optional(), moduleContext: z.unknown(), glossaryId: z.string().min(1).optional(), sourceArtifactRef: z.string().min(1).optional(), translatorNoteId: z.string().min(1).optional(), }) .strict(), }) .strict(); export const reviewVerdictSchema = z .object({ artifactRef: z.string().min(1), reviewer: z.object({ modelId: z.string(), promptId: z.string(), version: z.string() }).strict(), decision: z.enum(["approve", "reject", "escalate"]), confidence: z.number().min(0).max(1), checks: z.array( z.object({ id: z.string().min(1), pass: z.boolean(), note: z.string().optional() }).strict(), ), groundingViolations: z.array(z.string()), samples: z.number().int().min(1), reviewedAt: z.string().datetime({ offset: true }), }) .strict(); export const escalationReasonSchema = z.enum([ "low-reviewer-confidence", "novel-template", "claims-class", "anomaly", "demotion-review", "product-language", ]); export const escalationSchema = z .object({ id: z.string().min(1), scope: z.string().min(1), reason: escalationReasonSchema, artifactRef: z.string().min(1).optional(), openedAt: z.string().datetime({ offset: true }), resolvedAt: z.string().datetime({ offset: true }).optional(), resolvedBy: z .object({ kind: z.literal("human"), handle: z.string().min(1) }) .strict() .optional(), verdict: z.enum(["approve", "reject", "fix-record"]).optional(), minutesSpent: z.number().min(0).optional(), feedback: z .object({ toGolden: z.boolean().optional(), toCalibration: z.boolean().optional(), toRecord: z.string().min(1).optional(), }) .strict(), }) .strict(); export const escalationBudgetSchema = z .object({ scope: z.string().min(1), windowDays: z.number().int().min(1), humanMinutesAvailable: z.number().min(0), humanMinutesUsed: z.number().min(0), minutesPer1000Pages: z.number().min(0), }) .strict(); export type Approver = z.infer; export type FieldClass = z.infer; export type AutonomyLevel = z.infer; export type AutonomyScope = z.infer; export type AutonomyState = z.infer; export type ApprovalRecord = z.infer; export type ReviewInput = z.infer; export type ReviewVerdict = z.infer; export type EscalationReason = z.infer; export type Escalation = z.infer; export type EscalationBudget = z.infer;