Enterprise Edition
AST-Audit-Trail — Ausführliche Referenz
Auf einen Blick
Abschnitt betitelt „Auf einen Blick“Das Enterprise-AST-Modul zeichnet Dokumentmutationen auf und bereitet Dokumente für Retrieval-Pipelines vor.
AstAuditTrailInterfacedefiniert einen Append-only-Audit-Trail je Dokument über dem Pro-AST-MutationLog.AstAuditEntryist ein unveränderlicher Datensatz einer Mutation: Knotenidentität, Mutationsart, Seite, Vorher-/Nachher-Snapshots, UTC-Zeitstempel.InMemoryAstAuditTrailist die prozessweise Referenzimplementierung des Trail-Vertrags.AstAwareChunkerdurchläuft den AST tiefensuchend und gibt zitationsverankerteAstChunk-Werte für die RAG-Aufnahme aus.
Verfügbarkeit & Lizenzierung
Abschnitt betitelt „Verfügbarkeit & Lizenzierung“Diese Fähigkeit ist in NextPDF Enterprise (nextpdf/enterprise) enthalten und wird mit einem Lizenz-Envelope der Enterprise-Stufe aktiviert. Eine Bereitstellung ohne diese Berechtigung lädt die Klassen der Fähigkeit nicht. Editionen vergleichen und Lizenz erwerben.
Die AST-Audit-Trail-Oberfläche wird durch die Fähigkeit enterprise.compliance.evidence lizenziert. Eine verweigerte Berechtigung verweigert die Funktion.
| Stufe | Stellt bereit |
|---|---|
| Core | AST-Dokumentmodell (AstDocument, AstNode, NodeId) |
| Pro | AST-Mutationsfluss und MutationLog |
| Enterprise | Append-only-Audit-Trail je Dokument; zitationsverankerter Chunker |
Die Enterprise-Oberfläche konsumiert das Pro-Mutationslog. Sie ersetzt nicht das AST-Modell.
composer require nextpdf/enterprise:^3Öffentliche API-Oberfläche
Abschnitt betitelt „Öffentliche API-Oberfläche“| Symbol | Parameter | Standardverhalten | Rückgabe | Wirft oder scheitert mit | Hinweise |
|---|---|---|---|---|---|
AstAuditTrailInterface::record() | string $documentSourceHash, MutationLog $log | Wandelt jeden Mutationseintrag im Log in einen AstAuditEntry um und hängt ihn an | void | Nichts in der Referenzimplementierung | Wiederholte Aufrufe mit demselben Hash sammeln Einträge an |
AstAuditTrailInterface::findByDocument() | string $documentSourceHash | Gibt die für ein Dokument aufgezeichneten Einträge in Einfügereihenfolge zurück | list<AstAuditEntry> | Nichts in der Referenzimplementierung | Leere Liste, wenn kein Eintrag zum Hash passt |
AstAuditTrailInterface::count() | keine | Zählt Audit-Einträge | int<0, max> | Nichts in der Referenzimplementierung | Summe über alle Dokumente, nicht je Dokument |
InMemoryAstAuditTrail | keine | Array-gestützter Trail, begrenzt auf den aktuellen Prozess | implementiert AstAuditTrailInterface | Nichts | Nicht dauerhaft; geeignet für Einzelanfrage-Lebenszyklen |
AstAuditEntry | Konstruktor promotet alle Felder | Unveränderlicher Audit-Datensatz | Value Object | Nichts | final readonly; siehe Signatur-Fence unten |
AstAwareChunker::__construct() | int $maxChunkChars = 1500, int $overlapChars = 150 | Validiert die Chunking-Grenzen bei der Konstruktion | Instanz | InvalidArgumentException bei Konfiguration außerhalb des Bereichs | Grenzen: 16 <= maxChunkChars <= 1048576; 0 <= overlapChars < maxChunkChars |
AstAwareChunker::chunk() | AstDocument $document | Tiefensuche-Durchlauf; Überschriften begrenzen Chunks; Blatttext akkumuliert | list<AstChunk> | Nichts | Leere Liste für ein Dokument ohne akkumulierbaren Text |
AstChunk | Konstruktor promotet alle Felder | Zitationsverankerter Chunk-Datensatz | Value Object | Nichts | final readonly; siehe Signatur-Fence unten |
namespace NextPDF\Enterprise\Ast;
use NextPDF\Pro\Ast\Mutation\MutationLog;
interface AstAuditTrailInterface{ public function record(string $documentSourceHash, MutationLog $log): void;
/** @return list<AstAuditEntry> */ public function findByDocument(string $documentSourceHash): array;
/** @return int<0, max> */ public function count(): int;}final readonly class AstAuditEntry{ public function __construct( public readonly string $documentSourceHash, public readonly string $nodeId, public readonly string $mutationType, public readonly int $pageIndex, public readonly array $before, public readonly array $after, public readonly DateTimeImmutable $occurredAt, ) {}}final class AstAwareChunker{ public function __construct( private readonly int $maxChunkChars = 1500, private readonly int $overlapChars = 150, ) {}
/** @return list<AstChunk> */ public function chunk(AstDocument $document): array {}}final readonly class AstChunk{ public function __construct( public readonly string $text, public readonly string $nodeId, public readonly int $pageIndex, public readonly ?array $bbox, public readonly string $nodeType, public readonly string $documentSourceHash, public readonly int $chunkIndex, ) {}}Verhaltensvertrag
Abschnitt betitelt „Verhaltensvertrag“Audit-Trail
Abschnitt betitelt „Audit-Trail“- Append-only. Implementierungen müssen append-only sein: Ein aufgezeichneter Eintrag kann über diese API weder geändert noch entfernt werden. Wiederholte
record()-Aufrufe mit demselben Hash sammeln Einträge an. - Konvertierung.
record()wandelt jeden Eintrag des Pro-MutationLog(überMutationLog::all()) in einenAstAuditEntryum und hängt ihn an. Alle von einemrecord()-Aufruf erzeugten Einträge teilen sich einen einzigen UTC-occurredAt-Zeitstempel. - Isolation je Dokument.
findByDocument()filtert auf den exakten Dokument-Source-Hash und wahrt die Einfügereihenfolge.count()ist die Summe über alle Dokumente. - Snapshots.
beforeundaftersind Attribut-Maps mit dem Schlüsseltext_content. Eineupdated-Mutation füllt beide Seiten;insertedlässtbeforeleer;deletedlässtafterleer.mutationTypeist der String-Wert des Pro-MutationType-Enums:updated,insertedoderdeleted. - Seitenherleitung.
pageIndexwird aus der kanonischen Knoten-ID (ast:{hash}:{page}:{seq}) extrahiert. Eine fehlerhafte Knoten-ID ergibtpageIndex0; der Eintrag wird dennoch aufgezeichnet.
Append-only ist ein Vertrag des konfigurierten Stores, keine kryptografische Eigenschaft. Manipulationssicherheit und Nichtabstreitbarkeit ergeben sich daraus, wie der Trail persistiert und mit Zeitstempeln versehen wird (Evidence-Modul), nicht aus diesem Modul allein.
Chunker
Abschnitt betitelt „Chunker“- Durchlauf.
chunk()durchläuft den AST tiefensuchend von der Dokumentwurzel aus. - Textakkumulation. Blatttext der Typen Paragraph, ListItem, TableCell, Code oder Annotation akkumuliert in den aktuellen Puffer. Containertypen (Document, Section, Artifact, FormField, Figure, Table, List, TableRow) werden durchlaufen, ohne Text auszugeben.
- Trennzeichen. Ein Heading-Knoten leert den aktuellen Puffer als Chunk und initialisiert den nächsten Puffer mit dem Überschriftentext.
- Aufteilung. Wenn der akkumulierte Text
maxChunkCharsüberschreiten würde, füllt der Chunker den verbleibenden Raum, leert den Chunk und fährt mit den letztenoverlapCharsZeichen plus dem Überlauf fort. Die Längenberechnung erfolgt zeichenbasiert nach UTF-8. - Zitationsanker. Jeder
AstChunkträgt dienodeId,pageIndex,bboxundnodeTypeseines ersten beitragenden Knotens sowie den Dokument-Source-Hash und einen fortlaufenden, 0-basiertenchunkIndex. - Finalisierung. Ein abschließender Puffer mit nicht-leerem Inhalt wird als letzter Chunk geleert; reine Whitespace-Reste werden verworfen, und der Chunk-Text wird getrimmt.
Randfälle & Fehlermodi
Abschnitt betitelt „Randfälle & Fehlermodi“- Das zweimalige Aufzeichnen desselben
MutationLogsammelt doppelte Einträge an; Idempotenz muss vorgelagert durchgesetzt werden. - Ein frischer, nicht geteilter
InMemoryAstAuditTrailist stets leer. Der Integrationsvertrag verlangt eine einzige geteilteAstAuditTrailInterface-Instanz, die sowohl dem mutationserzeugenden Fluss als auch dem audit-lesenden Konsumenten übergeben wird, wobeirecord()nach jedem erfolgreichen Schreibvorgang aufgerufen wird. Bis dahin gibtfindByDocument()eine leere Liste undcount()0 zurück. - Der In-Memory-Trail ist prozessweise und nicht dauerhaft; Einträge überdauern die Anfrage nicht, die sie erzeugt hat. Der Produktivbetrieb stellt eine persistente Implementierung bereit.
- Eine Knoten-ID, die das kanonische Parsen nicht besteht, bricht die Aufzeichnung nicht ab; der betroffene Eintrag fällt auf
pageIndex0 zurück. AstAwareChunker::__construct()weist entartete Konfigurationen (overlapChars >= maxChunkCharsodermaxChunkCharsaußerhalb von[16, 1048576]) mit einerInvalidArgumentExceptionab. Dies verhindert unbegrenztes Pufferwachstum während des Chunkings.AstChunk::$bboxistnull, wenn der erste beitragende Knoten keine Bounding-Box trägt.- Ein Dokument ohne akkumulierbaren Text ergibt eine leere Chunk-Liste.
- Dieses Modul führt keine kryptografischen Operationen aus. Hashing, Signierung und Zeitstempelung für Manipulationssicherheit werden von den Modulen Evidence, Security und Signature übernommen; die FIPS-Mode-Richtlinie liegt dort.
Konformität
Abschnitt betitelt „Konformität“| Verhalten | Referenz |
|---|---|
| Kontext für inkrementelle Aktualisierung / Signaturintegrität | ISO 32000-2:2020 §12.8 |
Der Audit-Trail ist eine Aufzeichnungshilfe. Er unterstützt audit-artige Nachweis-Workflows; er ist keine Zertifizierung und keine rechtliche Bescheinigung, und NextPDF hält keine Zertifizierung.
Entwicklungshinweise
Abschnitt betitelt „Entwicklungshinweise“- Stellen Sie eine dauerhafte
AstAuditTrailInterface-Implementierung für die anfrageübergreifende Aufbewahrung bereit. Persistieren Sie sie in einem WORM-fähigen Store, wo Compliance Unveränderlichkeit verlangt; die Append-only-Garantie ist nur so stark wie der zugrunde liegende Store. - Mutations-Snapshots können personenbezogene Daten enthalten; die Datenresidenz richtet sich nach dem Store des Betreibers.
- Der Trail konsumiert das Pro-Mutationslog wie erzeugt; er leitet Mutationen nicht erneut aus dem Dokumentzustand ab.
- Die Chunker-Standardwerte (
maxChunkChars1500,overlapChars150) passen zur typischen RAG-Aufnahme; justieren Sie innerhalb der dokumentierten Grenzen für Embedding-Modelle mit abweichenden Kontextbudgets. - Interne Mechanismusdetails verbleiben in der internen Dokumentation des Quell-Repositorys und liegen außerhalb des Umfangs dieses Handbuchs.
Veröffentlichungsgrenze
Abschnitt betitelt „Veröffentlichungsgrenze“Diese Seite dokumentiert ausschließlich extern beobachtbares Verhalten und die unterstützte öffentliche API-Oberfläche. Interne Namespace-Pfade, Hilfsklassen, Mechanismustabellen, Runbook-Dateinamen und Ticket-Präfixe liegen außerhalb des Umfangs.