Enterprise edisi
Jejak audit AST — Referensi Mendalam
Sekilas
Bagian berjudul “Sekilas”Modul AST Enterprise mencatat mutasi dokumen dan menyiapkan dokumen untuk pipeline retrieval.
AstAuditTrailInterfacemendefinisikan jejak audit per-dokumen yang append-only di atasMutationLogAST Pro.AstAuditEntryadalah rekaman immutable dari satu mutasi: identitas node, jenis mutasi, halaman, snapshot before/after, timestamp UTC.InMemoryAstAuditTrailadalah implementasi referensi per-proses dari kontrak jejak tersebut.AstAwareChunkermenelusuri AST secara depth-first dan menghasilkan nilaiAstChunkberbasis anchor sitasi untuk ingesti RAG.
Ketersediaan & lisensi
Bagian berjudul “Ketersediaan & lisensi”Kemampuan ini disertakan dalam NextPDF Enterprise (nextpdf/enterprise) dan aktif dengan envelope lisensi tier Enterprise. Deployment tanpa entitlement tersebut tidak memuat kelas-kelas kemampuan ini. Bandingkan edisi dan dapatkan lisensi.
Permukaan jejak audit AST dilisensikan oleh kapabilitas enterprise.compliance.evidence. Entitlement yang ditolak menolak fitur ini.
| Tier | Menyediakan |
|---|---|
| Core | Model dokumen AST (AstDocument, AstNode, NodeId) |
| Pro | Alur mutasi AST dan MutationLog |
| Enterprise | Jejak audit per-dokumen yang append-only; chunker berbasis anchor sitasi |
Permukaan Enterprise mengonsumsi log mutasi Pro. Ia tidak menggantikan model AST.
composer require nextpdf/enterprise:^3Permukaan API publik
Bagian berjudul “Permukaan API publik”| Simbol | Parameter | Perilaku default | Mengembalikan | Melempar atau gagal dengan | Catatan |
|---|---|---|---|---|---|
AstAuditTrailInterface::record() | string $documentSourceHash, MutationLog $log | Mengonversi setiap entri mutasi dalam log menjadi AstAuditEntry dan menambahkannya | void | Tidak ada pada implementasi referensi | Panggilan berulang dengan hash yang sama mengakumulasi entri |
AstAuditTrailInterface::findByDocument() | string $documentSourceHash | Mengembalikan entri yang tercatat untuk satu dokumen, dalam urutan penyisipan | list<AstAuditEntry> | Tidak ada pada implementasi referensi | List kosong bila tidak ada entri yang cocok dengan hash |
AstAuditTrailInterface::count() | tidak ada | Menghitung entri audit | int<0, max> | Tidak ada pada implementasi referensi | Total lintas semua dokumen, bukan per-dokumen |
InMemoryAstAuditTrail | tidak ada | Jejak berbasis array yang dibatasi pada proses saat ini | mengimplementasikan AstAuditTrailInterface | Tidak ada | Tidak durable; cocok untuk siklus hidup single-request |
AstAuditEntry | konstruktor mempromosikan semua field | Rekaman audit immutable | value object | Tidak ada | final readonly; lihat fence signature di bawah |
AstAwareChunker::__construct() | int $maxChunkChars = 1500, int $overlapChars = 150 | Memvalidasi batas chunking saat konstruksi | instance | InvalidArgumentException pada konfigurasi di luar rentang | Batas: 16 <= maxChunkChars <= 1048576; 0 <= overlapChars < maxChunkChars |
AstAwareChunker::chunk() | AstDocument $document | Penelusuran depth-first; heading membatasi chunk; teks leaf diakumulasi | list<AstChunk> | Tidak ada | List kosong untuk dokumen tanpa teks yang dapat diakumulasi |
AstChunk | konstruktor mempromosikan semua field | Rekaman chunk berbasis anchor sitasi | value object | Tidak ada | final readonly; lihat fence signature di bawah |
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, ) {}}Kontrak perilaku
Bagian berjudul “Kontrak perilaku”Jejak audit
Bagian berjudul “Jejak audit”- Append-only. Implementasi harus append-only: entri yang tercatat tidak dapat dimodifikasi atau dihapus melalui API ini. Panggilan
record()berulang dengan hash yang sama mengakumulasi entri. - Konversi.
record()mengonversi setiap entri dariMutationLogPro (viaMutationLog::all()) menjadiAstAuditEntrydan menambahkannya. Semua entri yang dihasilkan oleh satu panggilanrecord()berbagi satu timestamp UTCoccurredAt. - Isolasi per-dokumen.
findByDocument()memfilter berdasarkan hash sumber dokumen yang tepat dan mempertahankan urutan penyisipan.count()adalah total lintas semua dokumen. - Snapshot.
beforedanafteradalah peta atribut yang diindeks olehtext_content. Mutasiupdatedmengisi kedua sisi;insertedmembiarkanbeforekosong;deletedmembiarkanafterkosong.mutationTypeadalah nilai string dari enumMutationTypePro:updated,inserted, ataudeleted. - Derivasi halaman.
pageIndexdiekstrak dari ID node kanonis (ast:{hash}:{page}:{seq}). ID node yang malformed menghasilkanpageIndex0; entri tetap dicatat.
Append-only adalah kontrak dari store yang dikonfigurasi, bukan properti kriptografis. Tamper-evidence dan non-repudiation berasal dari bagaimana jejak dipersistensikan dan diberi timestamp (modul Evidence), bukan dari modul ini sendiri.
Chunker
Bagian berjudul “Chunker”- Traversal.
chunk()menelusuri AST secara depth-first dari root dokumen. - Akumulasi teks. Teks leaf bertipe Paragraph, ListItem, TableCell, Code, atau Annotation diakumulasi ke buffer saat ini. Tipe kontainer (Document, Section, Artifact, FormField, Figure, Table, List, TableRow) ditelusuri tanpa menghasilkan teks.
- Delimiter. Node Heading mem-flush buffer saat ini sebagai chunk dan menyemai buffer berikutnya dengan teks heading.
- Splitting. Ketika teks yang terakumulasi akan melampaui
maxChunkChars, chunker mengisi ruang yang tersisa, mem-flush chunk, dan melanjutkan denganoverlapCharskarakter terakhir ditambah overflow. Perhitungan panjang berbasis karakter UTF-8. - Anchor sitasi. Setiap
AstChunkmembawanodeId,pageIndex,bbox, dannodeTypedari node kontributor pertamanya, ditambah hash sumber dokumen danchunkIndexsekuensial berbasis-0. - Finalisasi. Buffer akhir dengan konten non-whitespace di-flush sebagai chunk terakhir; sisa yang hanya whitespace dibuang, dan teks chunk di-trim.
Kasus tepi & mode kegagalan
Bagian berjudul “Kasus tepi & mode kegagalan”- Mencatat
MutationLogyang sama dua kali mengakumulasi entri duplikat; idempotensi harus ditegakkan di hulu. InMemoryAstAuditTrailyang baru dan tidak dibagikan selalu kosong. Kontrak integrasi mengharuskan satu instanceAstAuditTrailInterfaceyang dibagikan diserahkan ke alur penghasil-mutasi dan konsumen pembaca-audit, denganrecord()dipanggil setelah setiap penulisan yang berhasil. Hingga saat itu,findByDocument()mengembalikan list kosong dancount()mengembalikan 0.- Jejak in-memory bersifat per-proses dan tidak durable; entri tidak bertahan melewati request yang membuatnya. Produksi menyediakan implementasi yang persisten.
- ID node yang gagal parsing kanonis tidak membatalkan pencatatan; entri yang terpengaruh jatuh kembali ke
pageIndex0. AstAwareChunker::__construct()menolak konfigurasi degeneratif (overlapChars >= maxChunkChars, ataumaxChunkCharsdi luar[16, 1048576]) denganInvalidArgumentException. Ini mencegah pertumbuhan buffer yang tak terbatas selama chunking.AstChunk::$bboxbernilainullketika node kontributor pertama tidak membawa bounding box.- Dokumen tanpa teks yang dapat diakumulasi menghasilkan list chunk kosong.
- Modul ini tidak melakukan operasi kriptografis. Hashing, signing, dan timestamping untuk tamper-evidence ditangani oleh modul Evidence, Security, dan Signature; kebijakan mode FIPS berada di sana.
Konformansi
Bagian berjudul “Konformansi”| Perilaku | Referensi |
|---|---|
| Konteks incremental-update / integritas-signature | ISO 32000-2:2020 §12.8 |
Jejak audit adalah alat bantu pencatatan. Ia mendukung alur kerja bukti bergaya audit; ia bukan sertifikasi dan bukan atestasi hukum, dan NextPDF tidak memegang sertifikasi apa pun.
Catatan pengembangan
Bagian berjudul “Catatan pengembangan”- Sediakan implementasi
AstAuditTrailInterfaceyang durable untuk retensi lintas-request. Persistensikan dalam store berkemampuan WORM ketika compliance memerlukan immutabilitas; jaminan append-only hanya sekuat store pendukungnya. - Snapshot mutasi dapat membawa data pribadi; residensi data mengikuti store operator.
- Jejak mengonsumsi log mutasi Pro sebagaimana dihasilkan; ia tidak menurunkan ulang mutasi dari state dokumen.
- Default chunker (
maxChunkChars1500,overlapChars150) cocok untuk ingesti RAG tipikal; sesuaikan dalam batas yang terdokumentasi untuk model embedding dengan budget konteks yang berbeda. - Detail mekanisme internal tetap berada di dokumentasi internal repositori sumber dan berada di luar cakupan manual ini.
Batas publikasi
Bagian berjudul “Batas publikasi”Halaman ini mendokumentasikan hanya perilaku yang dapat diamati secara eksternal dan permukaan API publik yang didukung. Path namespace internal, kelas helper, tabel mekanisme, nama file runbook, dan prefiks tiket berada di luar cakupan.