import { z } from 'zod'; /** CLAUDE.md §2 — every imported fact carries provenance; every derived value is reproducible. */ export const EvidenceType = z.enum([ 'registry', 'clinical_trial', 'meta_analysis', 'systematic_review', 'cohort', 'case_control', 'case_series', 'case_report', 'preclinical', 'regulatory', 'guideline', 'expert_curation', 'database', 'computed', ]); export type EvidenceType = z.infer; export const AccessLevel = z.enum(['open', 'registration_required', 'controlled', 'licensed']); export type AccessLevel = z.infer; export const ProvenanceInput = z.object({ sourceId: z.string(), sourceRecordId: z.string().optional(), sourceUrl: z.string().url().optional(), dataset: z.string().optional(), datasetVersion: z.string().optional(), publicationId: z.string().optional(), pmid: z.string().optional(), doi: z.string().optional(), retrievedAt: z.string().datetime(), publishedAt: z.string().optional(), updatedAt: z.string().optional(), geography: z.string().optional(), population: z.string().optional(), cohortSize: z.number().int().nonnegative().optional(), methodology: z.string().optional(), evidenceType: EvidenceType, accessLevel: AccessLevel, confidence: z.number().min(0).max(1).optional(), license: z.string().optional(), ingestRunId: z.string().optional(), }); export type ProvenanceInput = z.infer; /** Data layer a value belongs to (CLAUDE.md §2 — layers stay separable). */ export const DataLayer = z.enum(['raw', 'normalized', 'canonical', 'derived', 'ranked', 'ai_synthesis']); export type DataLayer = z.infer; /** Display category for scientific safety (CLAUDE.md §3). */ export const ClaimCategory = z.enum([ 'observed_data', 'published_evidence', 'curated_evidence', 'regulatory_status', 'clinical_guideline', 'computed_metric', 'ai_generated_synthesis', ]); export type ClaimCategory = z.infer; /** Entity mapping confidence (CLAUDE.md §221). */ export const MatchType = z.enum([ 'EXACT_IDENTIFIER', 'CURATED_EXACT', 'ONTOLOGY_EXACT', 'CURATED_BROADER', 'CURATED_NARROWER', 'ALIAS', 'PROBABILISTIC', 'UNRESOLVED', ]); export type MatchType = z.infer; /** Derived statistic envelope (CLAUDE.md §2). */ export interface DerivedValue { metric: string; value: number; computed: true; formulaVersion: string; inputs: string[]; }