package reporting import ( "encoding/json" "fmt" "os" "time" ) type ProcessReport struct { Phase string `json:"phase"` Status string `json:"status"` Operation string `json:"operation"` TranscriptPath string `json:"transcript_path"` GlossaryPath string `json:"glossary_path"` OutputPath string `json:"output_path,omitempty"` Modules []string `json:"modules"` StartedAt time.Time `json:"started_at"` CompletedAt *time.Time `json:"completed_at,omitempty"` ErrorMessage string `json:"error_message,omitempty"` ErrorPhase string `json:"error_phase,omitempty"` InputSegmentCount *int `json:"input_segment_count,omitempty"` NormalizedSegmentCount *int `json:"normalized_segment_count,omitempty"` NormalizationMerges *int `json:"normalization_merges,omitempty"` NormalizationIDReassignments *int `json:"normalization_id_reassignments,omitempty"` NormalizationSkipped struct { DifferentSpeakers *int `json:"different_speakers,omitempty"` GapTooLarge *int `json:"gap_too_large,omitempty"` DurationExceeded *int `json:"duration_exceeded,omitempty"` TokenLimitExceeded *int `json:"token_limit_exceeded,omitempty"` } `json:"normalization_skipped,omitempty"` } func WriteProcessReport(path string, report ProcessReport) error { payload, err := json.MarshalIndent(report, "", " ") if err != nil { return fmt.Errorf("failed to marshal process report JSON: %w", err) } payload = append(payload, '\n') if err := os.WriteFile(path, payload, 0o644); err != nil { return fmt.Errorf("failed to write report JSON file %q: %w", path, err) } return nil }