/**
 * Domain model package containing core value objects and enumerations.
 * <p>
 * This package contains the fundamental domain entities and status models required for document processing:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.ProcessingStatus} — enumeration of all valid document processing states,
 *       including intermediate non-terminal states such as {@code READY_FOR_AI} and {@code PROPOSAL_READY}</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.RunId} — unique identifier for a batch run</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.BatchRunContext} — technical context for a batch run</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.DocumentFingerprint} — content-based document identity (SHA-256 hex); primary key for persistence</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.SourceDocumentCandidate} — discovered PDF from source folder</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.SourceDocumentLocator} — opaque locator passed from scan adapter to extraction adapter</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.PdfPageCount} — typed page count validation</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.PdfExtractionResult} — sealed result of PDF text extraction</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.ProcessingDecision} — sealed result of pre-checks</li>
 * </ul>
 * <p>
 * AI-based naming and proposal types:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.DateSource} — enumeration of valid date sources
 *       for resolved document dates</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.AiErrorClassification} — distinguishes technical vs.
 *       functional AI errors</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.PromptIdentifier} — stable identifier for an external prompt</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.AiRawResponse} — unvalidated raw response from AI service</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.ParsedAiResponse} — successfully parsed JSON structure from AI response</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.AiResponseParsingResult} — sealed result of parsing the raw response</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.NamingProposal} — validated naming proposal derived from AI result</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.AiRequestRepresentation} — deterministic representation of an AI request</li>
 * </ul>
 * <p>
 * Additional classes:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.PreCheckFailureReason} — enumeration of pre-check failure reasons</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.DocumentProcessingOutcome} — sealed interface for all document processing outcomes</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.TechnicalDocumentError} — technical failure during extraction</li>
 * </ul>
 *
 * Implementation classes:
 * <ul>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.PreCheckPassed} — document passed pre-checks</li>
 *   <li>{@link de.gecheckt.pdf.umbenenner.domain.model.PreCheckFailed} — document failed pre-check</li>
 * </ul>
 *
 * Document Processing Outcome Model:
 * The complete document processing pipeline results in one of three outcomes, all implementing
 * {@link de.gecheckt.pdf.umbenenner.domain.model.DocumentProcessingOutcome}:
 * <ul>
 *   <li>Pre-check passed: Document text extracted and validated successfully (ready for further processing)</li>
 *   <li>Pre-check failed: Deterministic content error (no usable text, page limit exceeded)</li>
 *   <li>Technical document error: Infrastructure or parsing failure (I/O, access, PDF parsing)</li>
 * </ul>
 *
 * All classes in this package are:
 * <ul>
 *   <li>Infrastructure-agnostic (no database, filesystem, network, or framework dependencies)</li>
 *   <li>Immutable value objects or enumerations</li>
 *   <li>Reusable across all layers via the Application and Adapter contracts</li>
 * </ul>
 * <p>
 * <strong>Retry and status semantics summary (see {@link de.gecheckt.pdf.umbenenner.domain.model.ProcessingStatus}
 * for full detail):</strong>
 * <ul>
 *   <li>{@code SUCCESS} and {@code FAILED_FINAL} are terminal; documents with these statuses
 *       receive a historised skip attempt in future runs and are never reprocessed.</li>
 *   <li>{@code FAILED_RETRYABLE} is only valid while at least one further scheduler run
 *       is fachlich zulässig for the document.</li>
 *   <li>Deterministic content errors follow the 1-retry rule: first occurrence →
 *       {@code FAILED_RETRYABLE}; second occurrence → {@code FAILED_FINAL}.</li>
 *   <li>Transient technical errors follow the configurable {@code max.retries.transient}
 *       rule (Integer &ge; 1): the attempt reaching the limit transitions to
 *       {@code FAILED_FINAL}.</li>
 *   <li>The within-run target copy immediate retry does not increment the transient-error
 *       counter and is not a cross-run retry.</li>
 *   <li>Document-level errors never produce exit-code&nbsp;1; they are contained within
 *       the batch run.</li>
 * </ul>
 */
package de.gecheckt.pdf.umbenenner.domain.model;
