Lewati ke konten
getnextpdf.com

Enterprise edisi

Evidence — Referensi Mendalam

Halaman ini adalah referensi mendalam untuk modul NextPDF\Enterprise\Evidence. Modul ini menyegel temuan validasi ke dalam EvidencePackage yang immutable, mengekspornya sebagai JSON deterministik dengan digest SHA-256 yang stabil, mempersistensikannya melalui kontrak store yang dapat dipasang, dan melacak regresi antar-run dengan ContinuousMonitor. Modul ini mengonsumsi temuan yang dihasilkan oleh permukaan Validation dan Compliance; ia tidak melakukan pemeriksaan konformansi apa pun sendiri. Untuk panduan alur kerja, baca halaman kapabilitas Evidence terlebih dahulu.

Kapabilitas ini hadir dalam NextPDF Enterprise (nextpdf/enterprise) dan diaktifkan dengan envelope lisensi tingkat Enterprise. Deployment tanpa entitlement tersebut tidak memuat kelas-kelas kapabilitas ini. Bandingkan edisi dan dapatkan lisensi.

Permukaan ini dilisensikan oleh kapabilitas enterprise.compliance.evidence; entitlement yang ditolak menolak fitur ini. Core dan Pro menghasilkan temuan dan laporan; menyegel temuan ke dalam paket yang immutable, deterministik, dan opsional ber-timestamp dengan pelacakan regresi tidak memiliki padanan pada tingkat Core maupun Pro.

Terminal window
composer require nextpdf/enterprise:^3
SymbolParametersDefault behaviorReturnsThrows or fails withNotes
EvidencePortal::__constructEvidenceStoreInterface $store, EvidenceExporter $exporterMerangkai store dan exporterEvidencePortalTidak ada yang dideklarasikanKedua kolaborator dapat diinjeksikan
EvidencePortal::generateEvidencestring $documentHash, list<EvidenceRecord> $records, ?string $tsaTimestamp = nullMenghitung pass/fail, menyegel paket dengan id UUID baru dan generatedAt waktu dinding, mempersistensikannyaEvidencePackageTidak ada yang dideklarasikanMempersistensi melalui store(), bukan persistImmutable()
EvidencePortal::getEvidencestring $documentHashPaket tersimpan terbaru untuk hash tersebut?EvidencePackageTidak ada yang dideklarasikannull ketika tidak ada yang tersimpan
EvidencePortal::getHistorystring $documentHashRiwayat lengkap, terbaru dahululist<EvidencePackage>Tidak ada yang dideklarasikanPengurutan disediakan oleh store
EvidencePortal::exportAsJsonEvidencePackage $packageMendelegasikan ke exporternon-empty-stringJsonExceptionByte yang sama dengan EvidenceExporter::toJson
EvidencePackage::__constructdelapan parameter bernama, lihat fenceValue object immutableEvidencePackageTidak ada yang dideklarasikanCount tidak divalidasi terhadap $records
EvidencePackage::allPassedtidak adafailedCount === 0boolTidak ada yang dideklarasikantrue untuk paket kosong; gate pada totalFindings
EvidencePackage::passRatetidak adapassedCount / totalFindingsfloatTidak ada yang dideklarasikan0.0 ketika totalFindings === 0
EvidenceRecord::__constructstring $policyName, bool $passed, string $details, string $validatorVersion, DateTimeImmutable $timestampHasil pemeriksaan policy tunggal yang immutableEvidenceRecordTidak ada yang dideklarasikanSemua properti adalah public readonly
EvidenceExporter::toJsonEvidencePackage $packageJSON dengan urutan kunci tetap; slash dan Unicode tak ter-escapenon-empty-stringJsonExceptionUrutan kunci bersifat load-bearing
EvidenceExporter::exportHashEvidencePackage $packageSHA-256 atas byte toJson()non-empty-string (64 hex)JsonExceptionStabil per paket
EvidenceStoreInterface::storeEvidencePackage $packageMenambahkan; riwayat per document hash diperbolehkanvoidDitentukan oleh implementasiSemantik append-only diwajibkan
EvidenceStoreInterface::persistImmutableEvidencePackage $packagePenulisan WORM jika backend mendukungnyavoidDitentukan oleh implementasiBackend non-WORM berperilaku seperti store()
EvidenceStoreInterface::findByDocumentHashstring $documentHashPaket terbaru untuk hash tersebut?EvidencePackageDitentukan oleh implementasi
EvidenceStoreInterface::findAllByDocumentHashstring $documentHashSemua paket untuk hash tersebut, terbaru dahululist<EvidencePackage>Ditentukan oleh implementasi
EvidenceStoreInterface::counttidak adaJumlah total paket tersimpanint<0, max>Ditentukan oleh implementasi
InMemoryEvidenceStoreclassStore berbasis array untuk pengujian dan pengembangann/an/aTidak durable; tanpa semantik WORM
ContinuousMonitor::__constructEvidenceStoreInterface $storeMerangkai storeContinuousMonitorTidak ada yang dideklarasikan
ContinuousMonitor::checkEvidencePackage $currentEvidence, string $documentHashMembandingkan nama policy yang gagal terhadap paket terbaru tersimpanMonitorResultTidak ada yang dideklarasikanCheck pertama memperlakukan setiap kegagalan saat ini sebagai baru
ContinuousMonitor::isDuestring $documentHash, MonitorSchedule $scheduleDue ketika tidak ada evidence sebelumnya, interval telah berlalu, atau evidence tersimpan bertanggal masa depanboolTidak ada yang dideklarasikanFail-safe terhadap clock skew
MonitorResult::__constructdelapan parameter bernama, lihat fenceHasil diff yang immutableMonitorResultTidak ada yang dideklarasikanMenyertakan kedua paket dan checkedAt
MonitorSchedule::__constructMonitorFrequency $frequency, int $retentionDays = 90, bool $alertOnNewIssues = trueValue object konfigurasiMonitorScheduleTidak ada yang dideklarasikanRetensi dan alerting ditegakkan oleh host
MonitorFrequencyenum berbasis stringCase Daily, Weekly, Monthlyn/an/aNilai backing daily, weekly, monthly
MonitorFrequency::intervalSecondstidak adaInterval per case: 86400, 604800, 2592000positive-intTidak ada yang dideklarasikanMonthly adalah tetap 30 hari
final class EvidencePortal
{
public function __construct(
private readonly EvidenceStoreInterface $store,
private readonly EvidenceExporter $exporter,
)
public function generateEvidence(string $documentHash, array $records, ?string $tsaTimestamp = null): EvidencePackage
public function getEvidence(string $documentHash): ?EvidencePackage
public function getHistory(string $documentHash): array
public function exportAsJson(EvidencePackage $package): string
}
final readonly class EvidencePackage
{
public function __construct(
public string $packageId,
public string $documentHash,
public array $records,
public int $totalFindings,
public int $passedCount,
public int $failedCount,
public DateTimeImmutable $generatedAt,
public ?string $tsaTimestamp = null,
)
public function allPassed(): bool
public function passRate(): float
}
final readonly class EvidenceRecord
{
public function __construct(
public string $policyName,
public bool $passed,
public string $details,
public string $validatorVersion,
public DateTimeImmutable $timestamp,
)
}
final readonly class EvidenceExporter
{
public function toJson(EvidencePackage $package): string
public function exportHash(EvidencePackage $package): string
}
interface EvidenceStoreInterface
{
public function store(EvidencePackage $package): void;
public function persistImmutable(EvidencePackage $package): void;
public function findByDocumentHash(string $documentHash): ?EvidencePackage;
public function findAllByDocumentHash(string $documentHash): array;
public function count(): int;
}
final class ContinuousMonitor
{
public function __construct(
private readonly EvidenceStoreInterface $store,
)
public function check(EvidencePackage $currentEvidence, string $documentHash): MonitorResult
public function isDue(string $documentHash, MonitorSchedule $schedule): bool
}
final readonly class MonitorSchedule
{
public function __construct(
public MonitorFrequency $frequency,
public int $retentionDays = 90,
public bool $alertOnNewIssues = true,
)
}
enum MonitorFrequency: string
{
case Daily = 'daily';
case Weekly = 'weekly';
case Monthly = 'monthly';
public function intervalSeconds(): int
}

EvidencePortal::generateEvidence(string $documentHash, list<EvidenceRecord> $records, ?string $tsaTimestamp = null): EvidencePackage adalah titik masuk penyegelan. Aturan yang dapat diamati secara eksternal:

  1. Perakitan. generateEvidence menghitung record yang passed dan failed serta menetapkan totalFindings ke jumlahnya. Ia menetapkan packageId UUID versi-4 yang baru, menstempel generatedAt dengan waktu dinding, mempersistensikan paket melalui EvidenceStoreInterface::store, dan mengembalikannya. Daftar record ditanamkan dalam urutan yang diberikan, tanpa modifikasi.
  2. Immutabilitas. EvidencePackage adalah final readonly dan tidak pernah dimutasi setelah konstruksi; ia cocok untuk penyimpanan WORM. allPassed() adalah failedCount === 0. passRate() adalah passedCount / totalFindings, dan 0.0 ketika totalFindings === 0.
  3. Ekspor deterministik. EvidenceExporter::toJson memancarkan envelope dan setiap record dengan urutan kunci tetap yang ditulis tangan; urutan record mengikuti paket. Encoding bersifat ketat dan melempar pada kegagalan, dengan slash dan Unicode dibiarkan tak ter-escape (JSON_UNESCAPED_SLASHES). Timestamp diserialisasi dengan DateTimeInterface::RFC3339_EXTENDED, bentuk RFC 3339 extended dengan pecahan detik. exportHash mengembalikan digest hex SHA-256 sepanjang 64 karakter atas byte-byte tersebut secara persis. Paket yang sama selalu menghasilkan digest yang sama, di host mana pun, kapan pun. Menghasilkan ulang evidence untuk dokumen yang sama menghasilkan packageId dan generatedAt yang baru, sehingga digest baru: determinisme bersifat per paket, bukan per dokumen.
  4. Timestamp adalah bukti waktu, bukan verdict. Sebuah paket dapat membawa token RFC 3161 opsional yang disuplai pemanggil (ter-encode base64). Token mengikat datum paket ke sebuah nilai waktu. Modul menanamkannya sebagai string opak; ia tidak mengambil, mem-parse, atau memverifikasi token, dan ia tidak menjamin TSA. Verifikasi token adalah milik modul Signature dan Security.
  5. Pelacakan regresi. ContinuousMonitor::check memuat paket terbaru tersimpan untuk document hash dan membandingkan nama policy gagal yang unik. Isu dikategorikan sebagai newIssues (gagal sekarang, tidak sebelumnya), resolvedIssues (gagal sebelumnya, tidak sekarang), dan unchangedIssues (gagal pada keduanya). hasChanges bernilai true hanya ketika terdapat isu baru atau terselesaikan; kegagalan yang tidak berubah saja melaporkan false. Pada check pertama, setiap kegagalan saat ini adalah baru.
  6. Penjadwalan. ContinuousMonitor::isDue mengembalikan true ketika tidak ada evidence untuk hash tersebut, ketika waktu yang berlalu sejak generatedAt tersimpan mencapai interval frekuensi schedule, atau ketika evidence tersimpan bertanggal masa depan relatif terhadap host polling. Kasus bertanggal masa depan bersifat fail-safe: paling buruk satu check ulang ekstra, tidak pernah yang terlewat.
  7. Kontrak store. Implementasi EvidenceStoreInterface harus mendukung semantik append-only; beberapa paket per document hash membentuk riwayat, terbaru dahulu. persistImmutable menargetkan backend yang mampu WORM; implementasi non-WORM harus berperilaku persis seperti store.
  • Paket kosong melaporkan allPassed() true dan passRate() 0.0. Gate pada totalFindings > 0 sebelum memperlakukan sebuah paket sebagai pass.
  • Konstruksi EvidencePackage langsung tidak memvalidasi count terhadap $records. Gunakan portal, atau jaga sendiri konsistensi count.
  • generateEvidence mempersistensi sebelum mengembalikan. Jalankan ContinuousMonitor::check dengan paket baru sebelum mempersistensikannya; check setelah persistensi membandingkan paket terhadap dirinya sendiri dan melaporkan tidak ada perubahan.
  • exportHash mencakup byte toJson secara persis. Digest yang dihitung ulang oleh serializer, urutan kunci, atau kebijakan escaping lain tidak akan cocok.
  • MonitorFrequency::Monthly adalah jendela tetap 30 hari, bukan bulan kalender.
  • MonitorSchedule::$retentionDays dan $alertOnNewIssues adalah konfigurasi yang dibawa untuk scheduler host. Modul tidak pernah menghapus evidence dan tidak pernah mengirim alert.
  • InMemoryEvidenceStore adalah untuk pengujian dan pengembangan. Paket hilang saat proses keluar, dan persistImmutable-nya tidak memiliki semantik WORM.
  • String details record diekspor apa adanya; exporter tidak meredaksi. Jauhkan rahasia dan data pribadi teregulasi dari details. Residensi, retensi, dan kontrol akses mengikuti implementasi store operator.
  • Argumen tsaTimestamp diterima sebagai string opak. Token yang malformed ditanamkan tanpa perubahan dan hanya muncul pada verifikasi hilir.

Modul ini menghitung digest SHA-256 dan menanamkan token RFC 3161 yang disuplai pemanggil. Ia tidak melakukan penandatanganan maupun kustodi kunci. Perilaku mode FIPS diatur oleh modul Security dan Signature.

ClaimStandardClause
Sebuah token time-stamp menunjukkan bahwa sebuah datum sudah ada pada suatu titik waktu tertentu.IETF RFC 3161§2
Timestamp yang diekspor menggunakan profil tanggal/waktu Internet dari ISO 8601, dengan pecahan detik.IETF RFC 3339§5.6
Material validasi yang ditanamkan di dalam PDF termasuk dalam Document Security Store; permukaan tersebut adalah milik modul Signature, bukan modul ini.ISO 32000-2:2020§12.8.4

Semua klausa diparafrasakan; NextPDF tidak mereproduksi teks normatif. NextPDF tidak membuat klaim sertifikasi. Penangkapan evidence mendukung alur kerja audit; ia bukan atestasi legal dan bukan sertifikasi audit. Sebuah token timestamp adalah bukti waktu saja, dan modul ini tidak menyatakan bahwa konten apa pun compliant. Validitas dan konformansi tetap merupakan properti dari file final ditambah sebuah validator. Referensi ini bukan opini legal; konsultasikan dengan penasihat kepatuhan dan legal Anda sendiri.

  • Sumber modul membawa @since 2.2.0; referensi ini mendokumentasikan permukaan sebagaimana dikirim dalam nextpdf/enterprise 3.1.0.
  • Segalanya berjalan dalam proses di host Anda. Modul tidak melakukan I/O jaringan dan tidak pernah menghubungi TSA sendiri.
  • Urutan kunci literal-array exporter bersifat load-bearing secara desain. Menyusun ulangnya akan mengubah exportHash dan membatalkan digest yang sebelumnya tersimpan; sumber melarangnya.
  • packageId adalah UUID versi-4 yang dirakit dari keluaran \random_bytes(16); identifier bersifat unik tetapi tidak reproducible.
  • Persistensi durable disediakan oleh host. Penegakan WORM dan kontrol akses adalah tanggung jawab operator; store in-memory adalah satu-satunya implementasi yang dibundel.
  • MonitorResult adalah value object final readonly; delapan propertinya bersifat public, termasuk checkedAt, waktu dinding dari check tersebut.

Halaman ini mendokumentasikan hanya perilaku yang dapat diamati secara eksternal dan permukaan API publik yang didukung. Jalur namespace internal, kelas helper, tabel mekanisme, nama file runbook, dan prefiks tiket berada di luar cakupan.