export type SddStage = 'PRE_WRITE' | 'PRE_COMMIT' | 'PRE_PUSH' | 'CI'; export type SddDecisionCode = | 'ALLOWED' | 'PRE_WRITE_EXPERIMENTAL_DISABLED' | 'SDD_EXPERIMENTAL_DISABLED' | 'OPENSPEC_MISSING' | 'OPENSPEC_VERSION_UNSUPPORTED' | 'OPENSPEC_PROJECT_MISSING' | 'SDD_SESSION_MISSING' | 'SDD_SESSION_INVALID' | 'SDD_CHANGE_MISSING' | 'SDD_CHANGE_ARCHIVED' | 'SDD_VALIDATION_FAILED' | 'SDD_VALIDATION_ERROR' | 'SDD_VALIDATION_EMPTY_SCOPE' | 'SDD_DEGRADED_MODE_BLOCKED' | 'SDD_CHANGE_INCOMPLETE'; export type SddDecision = { allowed: boolean; code: SddDecisionCode; message: string; details?: Record; }; export type OpenSpecValidationSummary = { ok: boolean; exitCode: number; stdout: string; stderr: string; totals: { items: number; failed: number; passed: number; }; issues: { errors: number; warnings: number; infos: number; }; }; export type SddSessionState = { repoRoot: string; active: boolean; changeId?: string; updatedAt?: string; expiresAt?: string; ttlMinutes?: number; valid: boolean; remainingSeconds?: number; }; export type SddStatusPayload = { repoRoot: string; openspec: { installed: boolean; version?: string; projectInitialized: boolean; minimumVersion: string; recommendedVersion: string; compatible: boolean; parsedVersion?: string; }; session: SddSessionState; }; export type SddEvaluateResult = { stage: SddStage; decision: SddDecision; status: SddStatusPayload; validation?: OpenSpecValidationSummary; };