Zum Inhalt springen
getnextpdf.com

Enterprise Edition

Signaturprüfung — Ausführliche Referenz

Diese Seite ist die Deep Reference für die AdES-Verify-Seite in NextPDF Enterprise. Der Einstiegspunkt ist NextPDF\Enterprise\Security\Validation\AdESValidationEngine. Er implementiert die ETSI-modellierten Validierungsabläufe von NextPDF für Basic-, With-Time-, Long-Term- und Archival-Zeitstempelprüfungen: Basic-Validierung, Validierung mit Zeit, Validierung mit Long-Term-Daten und Archival-DocTimeStamp-Coverage-Chain-Validierung. Die Ergebnisse sind ValidationReport-Werte, die MainIndication- und SubIndication-Enum-Fälle mit ETSI-URN-Zeichenkettenwerten tragen. Weitere hier dokumentierte Flächen: die SignatureDataExtractor-SPI und ihre CmsSignatureDataExtractor-Implementierung, der byteweise PdfSignatureDictionaryScanner, die Pfadvalidierungsfläche NextPDF\Enterprise\Security\Pki und BatchSignatureValidator. Für eine Anleitung auf Workflow-Ebene siehe Signaturprüfung: kryptografische AdES-/PAdES-Verify-Seite.

Diese Fähigkeit wird mit NextPDF Enterprise (nextpdf/enterprise) ausgeliefert und aktiviert sich mit einem Lizenz-Envelope der Enterprise-Stufe. Ein Deployment ohne diese Berechtigung lädt die Klassen der Fähigkeit nicht. Editionen vergleichen und Lizenz erwerben.

SymbolParameterStandardverhaltenRückgabeWirft oder scheitert mitHinweise
AdESValidationEngine::__construct11 optionale Parameter: ?PathValidatorInterface $chainValidator, ?SignatureDataExtractor $extractor, ClockInterface $clock, ?LoggerInterface $logger, string $defaultPolicy, NetworkPolicy $networkPolicy und fünf optionale Verifier-KollaboratorenAlle Defaults sind fail-closed: Pki-Pfadvalidator über die Engine-Uhr, kein Extractor, kein TSA-Trust-StoreNeue EngineWirft nichtOhne Trust-Store meldet die TSA-Chain-Auswertung „untrusted“; das mappt auf INDETERMINATE, niemals auf ein Bestehen
AdESValidationEngine::validateBasicstring $signedData, string $signatureBasic-Validierung: Format, Digest, Krypto, Weak-Algorithm, Chain, provenienzgesteuerte RevocationValidationReportWirft nicht; Extraktions- und Pfadfehler mappen auf fail-closed BerichteOhne Extractor nur Guard-Prüfungen; siehe Edge Cases
AdESValidationEngine::validateWithTimestring $signedData, string $signature, DateTimeImmutable $claimedTimeZuerst Basic-Validierung; Zertifikatsfenster und Revocation gegen die angegebene Zeit verglichenValidationReportWirft nichtStriktes Signaturzeitstempel-Gate, wenn das Attribut vorhanden ist; $claimedTime bleibt der Zeitanker
AdESValidationEngine::validateWithLongTermDatastring $signedData, string $signature, array $dssData (certs/ocsps/crls)Basic-Bestehen erforderlich; Signaturzeitstempel-Gate mit TSA-at-genTime scharfgestellt; POE-, DSS-Revocation- und Archival-GatesValidationReportWirft nichtNetworkPolicy::STRICT_OFFLINE mit unzureichenden eingebetteten Daten ergibt INDETERMINATE / TRY_LATER
AdESValidationEngine::validateArchivalTimestampChainstring $pdfBytes, array $dssData = [], ?TrustAnchorStoreInterface $anchors = nullEvidenzbasierte DocTimeStamp-Coverage-Chain über die exakten ByteRange-BytesValidationReportWirft nicht bei feindlichen BytesTOTAL_PASSED nur für eine vertrauenswürdige, EOF-abdeckende Chain
MainIndicationString-basiertes Enum, drei FälleETSI-URN-Werte; siehe die Fallliste unten
SubIndicationString-basiertes Enum, fünfzehn FälleETSI-URN-Werte; siehe die Fallliste unten
ValidationReport::__constructMainIndication $mainIndication, ?SubIndication $subIndication, DiagnosticData $diagnosticData, DateTimeImmutable $validationTime, string $validationPolicy = ''Unveränderliches (final readonly) ValidierungsergebnisNeuer BerichtWirft nichtisPassed(), isFailed(), isIndeterminate(), toArray()
DiagnosticData::__constructarray $certificateChain, array $timestamps, array $revocationData, string $validationPolicy, string $signatureFormat, array $warnings (alle mit Default)Unveränderlicher Evidenzcontainer; nur Audit-TrailNeuer WertWirft nichttoArray() serialisiert Referenzen für die Berichterstattung
SignatureDataExtractor::extractstring $signedData, string $signatureSPI: das CMS parsen und Validierungskomponenten extrahierenExtractedSignatureDataSignatureExtractionException, wenn die Signatur nicht geparst werden kannInterface; entkoppelt das ASN.1-Parsing von der Engine
CmsSignatureDataExtractor::extractstring $signedData, string $signatureExtrahieren plus kryptografische Verifikation einer detached PAdES-Basic-SignaturExtractedSignatureDataSignatureExtractionException nur, wenn das CMS überhaupt nicht geparst werden kannEin Krypto- oder Bindungsfehler liefert Daten mit cryptoValid / hashValid false; er wirft dafür niemals
PdfSignatureDictionaryScanner::scanstring $pdfBytesByteweiser Scan nach /ByteRange- + /Contents-Dictionaries mit passgenauen Anti-Spoof-Cross-Checkslist<PdfSignatureOccurrence>Total; wirft niemals; fehlerhafte Kandidaten werden übersprungenGeordnet nach Coverage-Ende, frühestes zuerst
PathValidatorInterface::validatearray $chain, ?DateTimeImmutable $validationTime = null, array $initialPolicies = []RFC-5280-§6.1.4-Pfadvalidierung mit Policy-VerarbeitungPathValidationResultPathValidationException bei einer strukturell ungültigen Chain oder einem überschrittenen adversarialen LimitChain ist End-Entity zuerst, Anchor zuletzt
PathValidatorInterface::validateWithAiaChasingarray $chain, ?DateTimeImmutable $validationTime = nullAIA-Auflösung fehlender Intermediates, dann ValidierungPathValidationResultPathValidationExceptionFetches sind durch Timeout und Byte-Limits begrenzt
CertificateChainValidatorKonstruktor: Engine, PathValidationOptions, Uhr, Logger; statisch withDefaults()Die SPI-Implementierung mit den adversarialen Standard-CapsPathValidationResult aus beiden MethodenPathValidationExceptionWird auch geworfen, wenn ein OpenSSLCertificate nicht nach PEM exportiert werden kann
PathValidationOptions::__constructCaps (maxDepth, maxPolicyFanout, fetchTimeoutSeconds, fetchSizeCapBytes) plus Policy-Flags, ?TrustAnchorStoreInterface $trustAnchors, bool $requireTrustedAnchorTiefe 32, Fanout 64, 5 s pro Fetch, 10 MiB pro Fetch; alle Flags falseNeue OptionsWirft nichtFactories: defaults(), strict(), withTrustAnchors()
PathValidationResult::__constructbool $valid, string $trustAnchorFingerprint, DateTimeImmutable $validatedAt, array $validPolicies, ?RevocationCheckResult $revocation, bool $trustAnchorTrusted, array $fetchedCertificates, array $failureReasonsUnveränderliches Ergebnis; trustAnchorTrusted ist per Default false (fail-closed)Neuer WertWirft nichtTrust-Mitgliedschaft ist von struktureller Gültigkeit verschieden
PolicyProcessorKonstruktor: PolicyTreeState $state, PathValidationOptions $options; processCertificate(string $certDer, int $depth, bool $selfIssued), finalizeWrapUp(), tree()RFC-5280-§6.1.4-Policy-Tree-Expansion, -Mapping und -Wrap-upvoid / list<non-empty-string> / PolicyTreePathValidationException bei jedem Policy-Verarbeitungsfehler (fail-closed)Wrap-up gibt die überlebenden Policy-OIDs zurück, ausgenommen anyPolicy
PolicyTreeattach(PolicyTreeNode $node, PathValidationOptions $options), enforceFanout(...), remove(...), plus Lese-QueriesDer valid_policy_tree-Zustand mit einem TiefenindexVariiert je MethodePathValidationException, wenn die Live-Leaf-Zahl den Fanout-Cap überschreitetStellt ANY_POLICY_OID (2.5.29.32.0) bereit
NameConstraintsChecker::processCertificatestring $certDer, bool $applyNameCheckAkkumuliert und erzwingt permitted / excluded Subtrees gemäß RFC 5280 §6.1.4(g)voidPathValidationException bei einem verletzten Subtree, einer nicht unterstützten GeneralName-Form in einer Constraint oder einem überschrittenen CapNicht vergleichbare Namen werden fail-closed behandelt
TrustAnchorStoreInterface::containsFingerprintstring $anchorDerSha256HexMitgliedschaft per lowercase-Hex-SHA-256 über das DER-Zertifikat des AnchorsboolWirft nichtDie vom Pfadvalidator konsultierte Trust-Naht
BatchSignatureValidator::validatearray $inputs (list<DocumentSignatureInput>)Multi-Dokument-Signaturvalidierung mit Revocation-Caching pro BatchBatchValidationReportInvalidArgumentException bei einer leeren Liste; ein Ressourcen-Guard weist Batches über 1000 Dokumenten abLiegt in NextPDF\Enterprise\Signature
final class AdESValidationEngine
public function validateBasic(string $signedData, string $signature): ValidationReport
public function validateWithTime(
string $signedData,
string $signature,
DateTimeImmutable $claimedTime,
): ValidationReport
public function validateWithLongTermData(
string $signedData,
string $signature,
array $dssData,
): ValidationReport
public function validateArchivalTimestampChain(
string $pdfBytes,
array $dssData = [],
?TrustAnchorStoreInterface $anchors = null,
): ValidationReport
public function validate(
array $chain,
?DateTimeImmutable $validationTime = null,
array $initialPolicies = [],
): PathValidationResult;
public function validateWithAiaChasing(
array $chain,
?DateTimeImmutable $validationTime = null,
): PathValidationResult;
public static function withDefaults(
?ClockInterface $clock = null,
?AiaChaser $aiaChaser = null,
?LoggerInterface $logger = null,
): self
public function containsFingerprint(string $anchorDerSha256Hex): bool;
public function extract(string $signedData, string $signature): ExtractedSignatureData;
public function scan(string $pdfBytes): array
public function validate(array $inputs): BatchValidationReport

Indication-Enums. MainIndication-Fälle: TOTAL_PASSED, TOTAL_FAILED, INDETERMINATE. Die zugrunde liegenden Werte folgen dem Muster urn:etsi:019102:mainindication:total-passed (lowercase, mit Bindestrichen). SubIndication-Fälle: HASH_FAILURE, SIG_CRYPTO_FAILURE, REVOKED, EXPIRED, NOT_YET_VALID, NO_POE, TRY_LATER, CERTIFICATE_CHAIN_GENERAL_FAILURE, FORMAT_FAILURE, REVOKED_CA_NO_POE, CRYPTO_CONSTRAINTS_FAILURE, POLICY_PROCESSING_FAILURE, REVOCATION_OUT_OF_BOUNDS_NO_POE, NO_SIGNING_CERTIFICATE_FOUND, TIMESTAMP_ORDER_FAILURE. Jeder ist mit urn:etsi:019102:subindication:<CASE_NAME> unter dem exakten Fallnamen hinterlegt.

  • Berichte rein, Berichte raus. Die vier Engine-Einstiegspunkte geben bei feindlicher Eingabe einen ValidationReport zurück, statt zu werfen. Eine gefangene SignatureExtractionException wird auf den Guard-Pfad geleitet; eine gefangene PathValidationException mappt auf TOTAL_FAILED / CERTIFICATE_CHAIN_GENERAL_FAILURE.
  • Reihenfolge der Basic-Validierung. Zuerst Formatprüfung; eine nicht parsebare Struktur ist TOTAL_FAILED / FORMAT_FAILURE (EN 319 102-1 §5.3.4). Dann Digest (HASH_FAILURE) und kryptografische Verifikation (SIG_CRYPTO_FAILURE), entsprechend den Building-Block-Ergebnissen von EN 319 102-1 §5.2.7.4. Der Digest wird vom Verifier neu berechnet und mit dem signierten Attribut messageDigest verglichen (RFC 5652 §5.6); vom Erzeuger gelieferte Digests werden niemals vertraut.
  • Schwache Algorithmen degradieren. Eine Signatur, die unter SHA-1 verifiziert, oder mit einer schwachen Signaturzertifikatsbindung, gibt INDETERMINATE / CRYPTO_CONSTRAINTS_FAILURE zurück, niemals TOTAL_PASSED. Der Zeitpfad bekräftigt dies erneut, sodass eine schwache Signatur niemals in ein zeitgültiges Bestehen umgemünzt wird.
  • Revocation-Provenienz-Gate. Revocation-Flags des Extractors werden nur konsultiert, wenn der Extractor tatsächlich eine Revocation-Prüfung durchgeführt hat (revocationChecked true). Ein ungeprüfter Default ist weder „verifiziert nicht widerrufen“ noch ein REVOKED-Auslöser. Revocation-Evidenz wird über den DSS-Pfad etabliert.
  • Non-Pass-Propagation. Der Zeit- und der Long-Term-Pfad werten ein Non-Pass-Basic-Ergebnis niemals auf. Eine Ausnahme besteht: ein Basic-INDETERMINATE / REVOKED wird gegen $claimedTime aufgelöst; ein Widerruf zum oder vor dem angegebenen Zeitpunkt ist TOTAL_FAILED / REVOKED. Dies spiegelt das Muster von EN 319 102-1 §5.3.4 wider, ein revocation-bezogenes Indeterminate mit Zeitnachweis aufzulösen. Kann der Vergleich nicht durchgeführt werden, wird der ungelöste Basic-Bericht wortgetreu propagiert.
  • Strikte Signaturzeitstempelbindung (fail-closed; BC-Bruch). Wenn das CMS ein unsigniertes id-aa-timeStampToken-Attribut trägt, löst dessen Präsenz die Durchsetzung in sowohl dem Zeit- als auch dem Long-Term-Pfad aus; es gibt keinen Warn-only-Modus. Die Kardinalität muss exakt ein Attribut mit exakt einem Wert sein (EN 319 122-1 §5.3); jede andere Form ist TOTAL_FAILED / FORMAT_FAILURE. Das Token muss durchgängig kryptografisch verifizieren; ein nicht verifizierbares Token, ein Parser-Differential-Konflikt oder ein Imprint-Mismatch ist INDETERMINATE / TIMESTAMP_ORDER_FAILURE. Ein nicht unterstützter oder SHA-1-Imprint-Algorithmus ist INDETERMINATE / CRYPTO_CONSTRAINTS_FAILURE. Die Bindungsregel ist RFC 3161 Appendix A: der messageImprint des Tokens muss gleich dem Hash der SignerInfo-signature-Wert-Oktette sein, verglichen in konstanter Zeit.
  • Long-Term-Pfad-Gates. Im mit Clause 5.4 annotierten Pfad erhält der gebundene Signaturzeitstempel zusätzlich eine TSA-Zertifikatsauswertung zum genTime des Tokens; ein nicht vertrauenswürdiger Anchor ist INDETERMINATE / CERTIFICATE_CHAIN_GENERAL_FAILURE, niemals ein Bestehen. NetworkPolicy::STRICT_OFFLINE mit unzureichendem eingebettetem DSS-Material gibt INDETERMINATE / TRY_LATER zurück. Proof-of-Existence-, DSS-Revocation- und Archival-Chain-Befunde brechen jeweils zu INDETERMINATE mit einer gemappten Sub-Indication kurz.
  • Archival-Chain-Gates. Kein DocTimeStamp vorhanden ist INDETERMINATE / NO_POE. Ein strukturell nicht konformer ByteRange ist TOTAL_FAILED / FORMAT_FAILURE. Jedes Token muss verifizieren, seinen Imprint an die exakt vom ByteRange abgedeckten Bytes binden und das TSA-at-genTime-Facet-Mapping bestehen (EXPIRED, NOT_YET_VALID, REVOKED_CA_NO_POE, CERTIFICATE_CHAIN_GENERAL_FAILURE oder TRY_LATER unter Strict-Offline). Die Reihenfolge wird erzwungen: nicht abnehmende genTime, strikt fortschreitende Coverage und spätere Tokens, die das /Contents-Loch des vorigen Tokens enthalten. Das jüngste Token muss das letzte Byte abdecken; nachlaufende Bytes sind TIMESTAMP_ORDER_FAILURE. Ein genTime, das mehr als 300 Sekunden vor der Verifier-Uhr liegt, ist TIMESTAMP_ORDER_FAILURE.
  • Diagnostik entscheidet nie. DiagnosticData::$timestamps-Proof-of-Existence-Einträge sind ausschließlich Audit-Trail. Sie ändern niemals eine Indication, und der Akkumulator wird an jedem Einstiegspunkt zurückgesetzt.
  • Pki-Limits gehen der Krypto voraus. Die PathValidationOptions-Caps (Tiefe 32, Policy-Fanout 64, 5 s und 10 MiB pro Fetch) werden vor teurer Arbeit geprüft. PathValidationResult::$trustAnchorTrusted ist von $valid verschieden; requireTrustedAnchor macht einen nicht bestätigten Terminus ungültig. strict() aktiviert requireExplicitPolicy, Hard-Fail-Revocation-Transport und requireTrustedAnchor. Die Pfadgültigkeit ist anchor-relativ gemäß RFC 5280 §6.1: ein gültiger Pfad beginnt an einem als Eingabe gelieferten Trust-Anchor.
  • Batch-Fläche. BatchSignatureValidator::validate() wirft InvalidArgumentException bei einer leeren Liste und weist Batches über 1000 Dokumenten über einen Ressourcen-Guard ab. PHP besitzt in dieser Pipeline die gesamte kryptografische Validierung.
  • Die Default-Engine hat keinen Extractor. new AdESValidationEngine() führt nur Guard-Prüfungen durch: leere Signatur oder leere Signed Data ist TOTAL_FAILED; jedes nicht leere Paar löst sich zu INDETERMINATE / NO_SIGNING_CERTIFICATE_FOUND auf, niemals zu TOTAL_PASSED. Injizieren Sie NextPDF\Enterprise\Security\Validation\CmsSignatureDataExtractor, um kryptografische Verifikation zu erhalten.
  • Die Default-TSA-Trust-Prüfung hat keinen Store. Jede TSA-Chain meldet dann „untrusted“, sodass Archival- und Long-Term-Signaturzeitstempel-Ergebnisse INDETERMINATE bleiben. Liefern Sie Anchors über validateArchivalTimestampChain(..., $anchors) oder eine konfigurierte TsaCertificateAtGenTimeCheck.
  • Leere $pdfBytes. validateArchivalTimestampChain('') gibt TOTAL_FAILED / FORMAT_FAILURE zurück.
  • Vor-Fix-Signaturzeitstempel können nicht bestehen. Tokens, die von NextPDF-Versionen vor dem Strict-Binding-Fix erzeugt wurden, haben einen anderen Input imprintet. Sie scheitern dauerhaft an der Appendix-A-Bindung; signieren und zeitstempeln Sie neu, um ein positives Ergebnis wiederherzustellen. Dies ist ein bewusster, dokumentierter BC-Bruch.
  • Doppelte oder überlappende DocTimeStamps. Ein Duplikat in derselben Revision, eine gleiche oder überlappende Coverage oder ein späteres Token, das das Signaturloch des vorigen Tokens nicht enthält, scheitert am Ordering-Gate.
  • Der Scanner ist total und byteweise. scan() überspringt fehlerhafte oder gespoofte Kandidaten stillschweigend; ein Köder-/ByteRange innerhalb eines Content-Streams wird abgewiesen. Er löst keine indirekten Objekte auf und läuft nicht die Cross-Reference-Tabelle ab.
  • Coverage, nicht Reachability. validateArchivalTimestampChain() beweist kryptografische Byte-Range-Coverage bis zum Dateiende. Reachability-Analyse auf Objektebene (zum Beispiel ein umgelenkter Document Root innerhalb einer abgedeckten Revision) ist als außerhalb des Geltungsbereichs erklärt.
  • Direkte Pki-Nutzung wirft. Der direkte Aufruf von PathValidatorInterface-Implementierungen bringt PathValidationException bei strukturell ungültigen Chains, überschrittenen Caps, nicht unterstützten Constraint-Formen und einem fehlgeschlagenen PEM-Export eines OpenSSLCertificate-Handles zutage. Die Engine fängt diese Klasse; Ihre eigenen Aufrufer müssen sie behandeln.

Die Verify-Seite akzeptiert RSA PKCS#1 v1.5 mit SHA-2 und ECDSA auf P-256/P-384/P-521. RSASSA-PSS-, EdDSA- und SHA-3-Tokens scheitern fail-closed als nicht unterstützt; SHA-1 degradiert zu CRYPTO_CONSTRAINTS_FAILURE. Unter dem Enterprise-FIPS-140-3-Krypto-Policy-Profil (dokumentiert beim Security-Modul) gilt die Einschränkung dafür, welche Algorithmen akzeptiert werden; der Validierungsablauf selbst — Digest-Neuberechnung, Signaturprüfungen, Bindung, Pfadvalidierung — bleibt unverändert. NextPDF besitzt kein FIPS-140-3-Zertifikat und diese Seite beansprucht keines.

AussageStandardKlausel
Basic Signature validation ist ein wiederverwendbarer Building Block für Time-Stamp- und With-Time-Validierung.ETSI EN 319 102-1§5.3.1
Integritätsfehler mappt auf HASH_FAILURE; eine fehlgeschlagene Signaturprüfung mappt auf SIG_CRYPTO_FAILURE.ETSI EN 319 102-1§5.2.7.4
Die Formatprüfung läuft zuerst und ein Non-Pass stoppt den Prozess.ETSI EN 319 102-1§5.3.4
Ein revocation-bezogenes Indeterminate kann mit Zeitnachweis aufgelöst werden.ETSI EN 319 102-1§5.3.4
Ein gültiger Zertifizierungspfad beginnt an einem als Eingabe gelieferten Trust-Anchor.RFC 5280§6.1
Der Verifier berechnet den Content-Digest neu; er muss gleich dem signierten Attribut messageDigest sein.RFC 5652§5.6
Der messageImprint des Signaturzeitstempels hasht den SignerInfo-signature-Feldwert.RFC 3161Appendix A
Das signature-time-stamp-Attribut trägt exakt ein AttributeValue.ETSI EN 319 122-1§5.3

Alle Klauseln sind paraphrasiert; NextPDF gibt keinen normativen Text wieder. NextPDF erhebt keinen AdES-/PAdES-Konformitäts- oder Zertifizierungsanspruch. Die Unterstützung eines Standards ist keine Konformität mit ihm, und Konformität ist keine Zertifizierung — NextPDF hält keine Zertifizierung und gewährt keine. Die Engine implementiert die zitierten Validierungsverfahren als Fähigkeit; sie ist kein qualifizierter oder zertifizierter Validierungsdienst, und ein TOTAL_PASSED-Bericht ist eine kryptografische Aussage, keine rechtliche Feststellung. Die Enum-Werte verwenden das ETSI-URN-Identifier-Muster für die Interoperabilität von Berichtsdaten wieder; diese Wiederverwendung behauptet keine Billigung.

  • Klausel-Label-Mapping. Der Paketquellcode annotiert die Einstiegspunkte als EN-319-102-1-Klauseln 5.2, 5.3 und 5.4. Das Compliance-Korpus verortet den Basic-Signature-Validierungsprozess selbst bei Klausel 5.3, mit dem kryptografischen Building Block bei 5.2.7.4. Diese Seite zitiert die abgerufenen Klauselnummern; maßgeblich ist der Verhaltensvertrag, nicht das Label.
  • Deterministische Tests. Jeder Zeitvergleich fließt durch das injizierte PSR-20-ClockInterface. Injizieren Sie eine eingefrorene Uhr, um Fensterprüfungen, die 300-Sekunden-genTime-Skew-Grenze und CRL-Freshness-Entscheidungen zu testen.
  • Komposition. Alle Engine-Kollaboratoren sind konstruktor-injiziert und optional, mit fail-closed Defaults. Der Default-Pfadvalidator ist CertificateChainValidator::withDefaults() über die Engine-Uhr; die Default-Options halten die Policy- und Name-Constraint-Verarbeitung für konforme, uneingeschränkte Eingaben zu einem No-Op.
  • Namespaces. Die Engine-Fläche liegt in NextPDF\Enterprise\Security\Validation, die Pfadvalidierungsfläche in NextPDF\Enterprise\Security\Pki und der Batch-Orchestrator in NextPDF\Enterprise\Signature.
  • Bericht-Hygiene. Berichte sind unveränderlich und über toArray() serialisierbar. Der Diagnostik-Kontext wird an jedem Einstiegspunkt zurückgesetzt, sodass ein Bericht niemals Evidenz aus einem früheren Lauf auf derselben Engine-Instanz trägt.

Diese Seite dokumentiert ausschließlich extern beobachtbares Verhalten und die unterstützte öffentliche API-Fläche. Interne Namespace-Pfade, Hilfsklassen, Mechanismus-Tabellen, Runbook-Dateinamen und Ticket-Präfixe sind außerhalb des Geltungsbereichs.