/**
 * Outbound ports (interfaces) for the application.
 * <p>
 * Outbound ports define the contracts for interacting with external systems and infrastructure.
 * All calls flow FROM the application OUT TO infrastructure adapters through these ports.
 * <p>
 * Configuration and runtime ports:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.ConfigurationPort}
 *       — Loading application startup configuration</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.RunLockPort}
 *       — Exclusive run lock for preventing concurrent batch instances</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.ClockPort}
 *       — System time access for timestamps and run context</li>
 * </ul>
 * <p>
 * Source document discovery and extraction ports:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.SourceDocumentCandidatesPort}
 *       — Load PDF document candidates from the source folder</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.PdfTextExtractionPort}
 *       — Extract text content and page count from a single PDF</li>
 * </ul>
 * <p>
 * AI-based naming and invocation ports:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.PromptPort}
 *       — Load an external prompt template and derive its stable identifier</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.AiInvocationPort}
 *       — Invoke an AI service over an OpenAI-compatible HTTP boundary</li>
 * </ul>
 * <p>
 * Persistence and fingerprinting ports:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.FingerprintPort}
 *       — Compute the content-based SHA-256 fingerprint of a processing candidate</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.DocumentRecordRepository}
 *       — Read and write the document master record (Dokument-Stammsatz)</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.ProcessingAttemptRepository}
 *       — Write and read the per-document attempt history (Versuchshistorie)</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.PersistenceSchemaInitializationPort}
 *       — Initialise the SQLite schema at program startup</li>
 * </ul>
 * <p>
 * Value types and result types:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.FailureCounters}
 *       — Immutable snapshot of content-error and transient-error counters per document</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.DocumentRecord}
 *       — Application-facing representation of the document master record</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.ProcessingAttempt}
 *       — Application-facing representation of one historised processing attempt</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.FingerprintResult}
 *       — Sealed result of a fingerprint computation (success or technical error)</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.DocumentRecordLookupResult}
 *       — Sealed result of a master record lookup (unknown / processable / terminal / failure)</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.PromptLoadingResult}
 *       — Sealed result of prompt loading (success with identifier and content, or failure)</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.AiInvocationResult}
 *       — Sealed result of AI service invocation (success with raw response, or technical failure)</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.AiResponseParsingResult}
 *       — Sealed result of parsing raw response into JSON structure (success or parsing failure)</li>
 * </ul>
 * <p>
 * Retry policy and logging types:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.DocumentErrorClassification}
 *       — Unified classification of all document-level errors (content, transient, target copy)</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.RetryDecision}
 *       — Sealed type representing the authoritative retry decision for a document error</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.ImmediateRetryDecision}
 *       — Decision governing whether a within-run target copy retry is permitted</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.AiContentSensitivity}
 *       — Sensitivity decision governing whether AI-generated content may be logged</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.DocumentLogCorrelation}
 *       — Sealed type carrying the correlation context for document-related log entries</li>
 * </ul>
 * <p>
 * Exception types:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.RunLockUnavailableException}
 *       — Thrown when run lock cannot be acquired (another instance running)</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.SourceDocumentAccessException}
 *       — Thrown when source folder cannot be read or accessed</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.application.port.out.DocumentPersistenceException}
 *       — Thrown when a persistence write operation or schema init fails</li>
 * </ul>
 * <p>
 * Architecture Rule: Outbound ports are implementation-agnostic and contain no business logic.
 * They define "what the application depends on externally". All dependencies point inward;
 * the application depends on ports, adapters implement ports.
 */
package de.gecheckt.pdf.umbenenner.application.port.out;
