import type { CinemaSha256 } from './cinema-types.js'; export interface CinemaEvidenceFile { sourcePath: string; contentHash: CinemaSha256; bytes: number; } interface CinemaEvidenceDecisionBase { decisionId: string; reviewerId: string; decidedAt: string; reason: string; contentHash: CinemaSha256; } export interface CinemaCharacterSheetDecision extends CinemaEvidenceDecisionBase { kind: 'character-sheet'; characterVersionId: string; sheetHash: CinemaSha256; verdict: 'approved'; evidence: CinemaEvidenceFile[]; } export interface CinemaRecognitionDecision extends CinemaEvidenceDecisionBase { kind: 'recognition'; assetId: string; versionId: string; conditionId: string; verdict: 'pass' | 'fail'; evidence: CinemaEvidenceFile[]; } export interface CinemaRightsDecision extends CinemaEvidenceDecisionBase { kind: 'rights'; assetId: string; verdict: 'cleared' | 'rejected'; owner: string | null; permittedScope: string | null; evidence: CinemaEvidenceFile[]; } export interface CinemaVoiceDecision extends CinemaEvidenceDecisionBase { kind: 'voice'; characterId: string; verdict: 'locked' | 'rejected'; voiceId: string | null; auditionEvidence: CinemaEvidenceFile[]; releaseEvidence: CinemaEvidenceFile[]; } export type CinemaEvidenceDecision = CinemaCharacterSheetDecision | CinemaRecognitionDecision | CinemaRightsDecision | CinemaVoiceDecision; export type CinemaEvidenceDecisionInput = CinemaEvidenceDecision extends infer Decision ? Decision extends CinemaEvidenceDecision ? Omit : never : never; export interface CinemaEvidenceLedgerArtifact { schemaVersion: 1; projectSlug: string; planningReceiptHash: CinemaSha256; generatedAt: string; decisions: CinemaEvidenceDecision[]; contentHash: CinemaSha256; } export interface CinemaEvidenceIssue { code: string; path: string; message: string; } export interface CinemaEvidenceValidation { ok: boolean; issues: CinemaEvidenceIssue[]; }