/* Maintains packages/ontology/src/operations/materialization.ts as an authored ontology authored module so agents can evolve it without rediscovering local boundaries. Does not define mission lifecycle — that is RFC-0355. Does not define release discipline — that is RFC-0357. RFC-0356: initial materialization report schemas. */ import { z } from "zod"; export const materializationReportSchema = z.object({ schemaVersion: z.string().min(1), missionId: z.string().min(1), systemId: z.string().min(1), versionComparison: z.object({ verdict: z.enum(["in-sync", "catch-up", "refuse-downgrade"]), pinVersion: z.string(), platformVersion: z.string(), packagesDrift: z.boolean(), message: z.string(), }), migratorChain: z.array( z.object({ fromVersion: z.string(), toVersion: z.string(), rfc: z.string(), applied: z.boolean(), }), ), capabilityDiff: z.object({ tier: z.enum(["green", "yellow", "red"]), items: z.array( z.object({ semanticId: z.string(), status: z.enum(["unchanged", "additive", "renamed-or-bumped", "removed"]), tier: z.enum(["green", "yellow", "red"]), resolution: z.string().nullable(), }), ), }), regeneration: z.object({ regeneratedFiles: z.array(z.string()), success: z.boolean(), }), materializedAt: z.string().datetime(), }); export const validationReportSchema = z.object({ schemaVersion: z.string().min(1), missionId: z.string().min(1), contractFull: z.object({ passed: z.boolean(), validators: z.array( z.object({ name: z.string(), status: z.enum(["pass", "fail"]), diagnostics: z.array( z.object({ ruleId: z.string(), severity: z.string(), message: z.string(), }), ), }), ), }), build: z.object({ succeeded: z.boolean(), routeCount: z.number(), sitemapHash: z.string(), }), validatedAt: z.string().datetime(), }); export const authoredDiffSchema = z.object({ schemaVersion: z.string().min(1), missionId: z.string().min(1), added: z.array(z.string()), modified: z.array(z.string()), removed: z.array(z.string()), }); export type MaterializationReport = z.infer; export type ValidationReport = z.infer; export type AuthoredDiff = z.infer;