import { z } from "zod"; export const GateStatus = z.enum(["pass", "fail", "warn", "skip"]); export const GateSeverity = z.enum(["hard", "soft"]); export const GateResult = z.object({ gate: z.string(), severity: GateSeverity, status: GateStatus, message: z.string(), evidence: z.record(z.string(), z.unknown()).default({}), }); export type GateResult = z.infer; export const RubricDimension = z.enum([ "novelty_relevance", "scientific_validity", "evidence_traceability", "reproducibility_robustness", "manuscript_craftsmanship", "integrity_disclosure", ]); export const RubricScore = z.object({ dimension: RubricDimension, score: z.number().int().min(0).max(5), evidence: z.string(), }); export const ReviewFinding = z.object({ id: z.string(), severity: z.enum(["blocker", "major", "minor"]), category: z.string(), title: z.string(), detail: z.string(), proposedTest: z.string().optional(), resolution: z.enum(["open", "resolved", "wontfix"]).default("open"), resolutionNote: z.string().optional(), }); export const ReviewReport = z.object({ round: z.number().int().min(1), reviewerModel: z.string(), summary: z.string(), rubric: z.array(RubricScore), findings: z.array(ReviewFinding), recommendation: z.enum(["accept", "minor_revision", "major_revision", "reject"]), limitationsOfThisReview: z.string(), }); export type ReviewReport = z.infer; export const QaReport = z.object({ policyVersion: z.string(), mode: z.string(), evaluatedAt: z.string(), gates: z.array(GateResult), publishable: z.boolean(), hardFailures: z.array(z.string()), warnings: z.array(z.string()), synthetic: z.boolean().default(false), }); export type QaReport = z.infer;