Blackbox Testing — Master Summary & Fix Backlog (All Domains)
- Tanggal: 2026-08-19
- Ruang lingkup: PT (8 fitur), PP (4 fitur), Apostille & Legalisasi (5 fitur) = 17 fitur
- Metode: Hybrid API + Playwright UI, terhadap stack dev_4 yang berjalan (backend :47014, frontend :47024, OCR/GPU live)
- Status: 17/17 laporan fitur selesai (format seragam). Bug High diverifikasi ulang independen oleh orkestrator.
1. Ringkasan eksekutif
| Domain | Fitur | Skenario | PASS | FAIL/NA |
|---|---|---|---|---|
| PT | 8 | 115 | 109 | 6 |
| PP | 4 | 67 | 65 | 2 |
| Apostille | 5 | 30 | 30 | 0 |
| Total | 17 | 212 | 204 | 8 |
Cakupan fungsional menyeluruh; seluruh UI yang diakses user tercakup per fitur.
Delapan FAIL berasal dari bug nyata (bukan kesalahan uji). Tiga bug High/sistemik
diverifikasi ulang lewat penelusuran kode — dua di antaranya lebih luas dari
temuan awal supervisor (lihat §3).
2. Verifikasi independen bug High (orkestrator) + status perbaikan
Ketiga bug High ditelusuri ulang ke kode (file:line). Dua REAL & sudah diperbaiki;
satu ternyata BUKAN bug (by-design, dikonfirmasi lewat test suite).
| Bug | Verdict | Status | Catatan |
|---|---|---|---|
| B1 Submit gate bypass (perubahan-family) | REAL | FIXED | Bukan hanya Akuisisi/Penggabungan; Perubahan PT juga bocor identik. checkFailGate ditambahkan ke kedua arm submit. Tanpa regresi (33 test hijau). |
B2 POST /api/perbaikan 500 |
REAL | FIXED | Endpoint publik rusak (UI tak memakainya). OCR-on-demand ditambahkan di extraction service. Tanpa regresi (11 test hijau). |
| B3 Pembubaran APPROVE memicu voting | NOT A BUG | REVERTED | Voting pada pembubaran/berakhirnya disengaja by-design — ada test khusus ("ROSTER-SOURCE PIN") yang menegaskan MENUNGGU_VOTING + votes dari oldData.pemegang_saham. Supervisor OBS-1 adalah salah-nilai desain; pembubaran PT memang butuh persetujuan pemegang saham. Perubahan di-revert. |
Pelajaran verifikasi: penelusuran kode saja mengonfirmasi jalur B3 ada, tetapi
menjalankan test suite mengungkap bahwa perilaku itu disengaja. Selalu jalankan
test sebelum menerbitkan "fix".
3. Bug kritikal (prioritas perbaikan)
B1 — Submit gate bypass untuk perubahan-family (HIGH)
- Apa: Submit PERUBAHAN_PT / AKUISISI_PT / PENGGABUNGAN_PT tidak pernah memanggil
checkFailGate. Gate satu-satunya adalah persetujuan per-jenis section, sedangkan
aturan FAIL (NIK_KTP_AKTA, MODAL_HIERARCHY, PS_TOTAL_100, dll.) dipetakan ke section
approvable:false— jadi tidak ada yang menahannya saat submit. - Bukti:
routes/perubahan.ts:1256-1322(arm Akuisisi/Penggabungan) &:1325-1586
(arm Perubahan) tanpacheckFailGate; satu-satunya panggilan (:1220-1224) dijaga
khusus untuk tipe FOREIGN. FAIL ditulis diservices/perubahan-processor.ts:434/
akuisisi-processor.ts:454. Pemetaan section:review/projectors/pt-perubahan-review.ts:88-153. - Dampak: Pengajuan dengan FAIL belum di-override bisa mencapai COMPLETED + antrean
verifikator. Semua flow lain (pembubaran/berakhirnya/laporan-rups/peleburan) memakai
checkFailGate— perubahan-family satu-satunya yang tidak. - Rekomendasi: Tambahkan
checkFailGate(submissionId, flowFor(type))sebelum set
COMPLETED pada KEDUA arm submit perubahan-family (hormatibypassdebug seperti flow lain).
B2 — POST /api/perbaikan multipart tidak meng-OCR (HIGH endpoint / MED risiko)
- Apa: Handler membuat Document status
UPLOADEDtetapi tidak pernah memicu OCR
(processDocument).runSuratPernyataanExtractionmengasumsikanrawTextsudah ada
dan melempar error bila kosong → 500, submission tersangkut EXTRACTING. - Bukti:
routes/perbaikan.ts:168-226(tak ada pemicu OCR) vs
services/perbaikan-processor.ts:64-91(throwbilarawTextkosong). Jalur UI
memakaifrom-keterangan/:skId(:98) yang benar; endpoint multipart ini tidak dipakai UI. - Dampak: Endpoint publik rusak; bisa meninggalkan submission korup. Tidak
terjangkau lewat alur UI normal → severity efektif Medium. - Rekomendasi: Picu OCR (
processDocument/antre ekstraksi) untuk tiap dokumen yang
diunggah sebeluminitializePerbaikan, atau tandai endpoint deprecated/ditutup bila
memang hanya jalur SK-generator yang didukung.
B3 — Pembubaran PT APPROVE memicu voting pemegang saham (BUKAN BUG — by-design)
- Investigasi: Route
decidebersama membuatShareholderVotepada APPROVE awal;
PEMBUBARAN_PT & BERAKHIRNYA_STATUS_PT memang masuk jalur ini (voting dari
oldData.pemegang_saham). - Kesimpulan REVISI: Ini disengaja. Test suite memuat uji khusus dan rinci yang
menegaskan perilaku ini — `verifikator × PEMBUBARAN_PT > decide-APPROVE ... MENUNGGU_VOTING - votes ... (ROSTER-SOURCE PIN)` dan padanan BERAKHIRNYA_STATUS_PT + varian empty-roster
422. Pembubaran PT membutuhkan persetujuan pemegang saham (RUPS) sebagai bagian sah
dari alur; email undangan voting adalah perilaku benar. - Aksi: Fix awal (skip-voting untuk pembubaran) di-revert karena merusak perilaku
yang disengaja & teruji. Tidak ada perbaikan kode. Supervisor OBS-1 ditutup sebagai
salah-nilai desain, bukan bug.
4. Backlog bug lengkap (lintas-domain, per prioritas)
High
- PT B1 perubahan-family gate bypass (Perubahan/Akuisisi/Penggabungan) — FIXED — §3.
- PT B2
/api/perbaikan500 (endpoint publik) — FIXED — §3. - ~~PT B3 pembubaran voting~~ — BUKAN BUG (by-design, reverted) — §3.
Medium
- ~~PT Perbaikan: guard FAIL per-section tak menahan~~ — BUKAN BUG YANG JELAS / butuh
keputusan desain. Filter memang membacadetails.correctionIdtop-level padahal data
didetails.instances[].correctionId, tetapi membuat guard "menyala" MERUSAK alur yang
disengaja: test integrasiperbaikan-submit-override (Task 38)menyetujui section NPWP
lebih dulu, lalu meng-overrideDOC_REQUIRED_PRESENTFAIL saat submit ("akan diupload
terpisah"). Jika guard memblok approve saat FAIL scoped aktif, section tak pernah
disetujui dan submit tetap 409. Perbedaan yang perlu diputuskan PO: apakah FAIL
document-presence (overridable) HARUS memblok approve, ATAU hanya FAIL nilai-invalid
(mis. format NPWP). Fix di-revert; submit gate (UNRESOLVED_FAIL_VALIDATION) tetap
menangkap, jadi tak ada bypass. - PT Laporan RUPS: field akta kosong pada scan nyata (extractor "perubahan" tak
menghasilkan field dari scan) —pt-laporan-rupsOBS-1. - PT Laporan RUPS: 6 slot lampiran tak auto-terisi (classifier tak menghasilkan label LAMPIRAN_*) — OBS-2.
- PT Peralihan PP→PT:
/finalizeserver tak mewajibkan konfirmasi field (parity gate vs Pendirian) — OBS-1. - PT Pendirian: dokumen wajib (PENDIRIAN_REQUIRED_DOCS) bisa di-override — perlu keputusan desain.
- PP Pendirian: classifier salah klasifikasi Surat Pernyataan sebagai BUKTI_TRANSFER (conf 0.9999) — BUG-02.
- PP Pendirian: master KBLI kurang kode 47711 (isu seed data) — BUG-01.
- PP Perubahan/Perbaikan: Surat Domisili & Bukti Setor tidak auto-fill (hanya KTP/NPWP) — BUG-P1/K1; perlu keputusan desain.
- Apostille Classification: KTP format PDF salah klasifikasi jadi KEPENDUDUKAN → memblok happy-path ORANG_LAIN — BUG-CLS-01.
Low / Info
- ~~Lintas-PT: tombol Submit/Kirim tanpa
data-testid~~ — FIXED (2cda1561): testid ditambahkan
ke tombol submit/finalisasi pembubaran/peleburan/berakhirnya/laporan-rups +ReviewProgressHeader
(mencakup Perubahan/Akuisisi/Pendirian V2). - PT Perubahan/Pembubaran:
AKTA_DATE_WINDOWbisa di-override (inkonsisten dengan kebijakan lock Pendirian) — perlu penyeragaman (keputusan desain). - ~~PT Pembubaran: teks menyesatkan "maks 30 hari" & "kuorum Ps.89"~~ — BUKAN ISU (diverifikasi):
teks legal AKURAT — "kuorum Ps.89(1) >=3/4" memang aturan pembubaran; "30 hari" adalah Ps.147(1)
kewajiban likuidator, ditandai jelas "boleh menyusul (tidak menghalangi submit)". - PT Pendirian: error OCR transien sesekali (reliability).
- ~~Apostille dead-path
outOfType~~ — BUKAN ISU (diverifikasi):outOfTypeAKTIF dipakai di
ApostilleClassificationPage.tsx:903untuk men-disable tombol lanjut saat ada dokumen di luar
layanan. Menghapusnya akan merusak guard nyata. - PP Pendirian: KTP+NPWP tanpa SP diam-diam di-infer PENDIRIAN_PT lalu ERROR (UI mencegah; perlu pesan lebih jelas) — BUG-04.
5. Tema lintas-cutting (bukan bug tunggal)
- Kebijakan gate FAIL tidak seragam — perubahan-family pakai section-approval saja;
flow lain pakaicheckFailGate. Seragamkan (akar B1). - Auto-fill dokumen pendukung tidak konsisten (PP) — Domisili/Bukti Setor tidak
auto-fill; perlu keputusan desain (wire autofill vs "evidence-only"). - Ekstraksi dari scan nyata — Laporan RUPS & beberapa akta scan menghasilkan field
kosong; classifier tak menghasilkan label lampiran/KTP-PDF. Butuh perhatian pipeline OCR. data-testidhilang pada banyak tombol Submit — utang otomasi UI; tambahkan testid stabil.- Kebijakan override tanggal akta (
AKTA_DATE_WINDOW) berbeda antar-flow — seragamkan.
6. Kesenjangan lingkungan (butuh aksi user, bukan bug)
- Signature specimen belum tersedia (MinIO/
signatureVerifyoff) → SignatureCompareModal
Apostille belum teruji. - Registry PP hanya satu entitas (idPtp 952322) → positive finalize PP Perubahan/Perbaikan
untuk jenis peralihan/owner-data terblokir data (KTP uji ≠ owner terdaftar). Butuh PP kedua
atau flipPP_REGISTRY_MODE=mock. - Fast-track Apostille vs SIMPADHU live tak terverifikasi (jendela waktu + pembayaran).
- Scan Peleburan 129 halaman tak di-OCR end-to-end (berat/timeout).
7. Rekomendasi urutan tindakan
- ~~Perbaiki B1~~ — SELESAI (satu perbaikan, tutup kebocoran gate untuk 3 tipe sekaligus).
- ~~Perbaiki B2~~ — SELESAI (OCR-on-demand di extraction service).
- ~~B3~~ — tidak ada aksi (by-design, di-revert).
- Berikutnya (Medium): guard FAIL per-section Perbaikan (
details.instances[]);
pipeline ekstraksi scan (Laporan RUPS + label lampiran/KTP-PDF); klasifikasi Surat
Pernyataan PP (misclass BUKTI_TRANSFER); KTP-PDF Apostille misclass; seed KBLI 47711. - Keputusan desain (user/PO): override dokumen-wajib (Pendirian); auto-fill
Domisili/Bukti Setor (PP); kebijakanAKTA_DATE_WINDOW(seragamkan lock vs override). - Utang otomasi: tambahkan
data-testidpada tombol Submit lintas-flow. - Aset lingkungan (user): signature specimen, PP kedua di registry, jendela fast-track.
9. Ringkasan perbaikan yang diterapkan (Round 1 → fix)
| Bug | Berkas diubah | Perubahan | Verifikasi |
|---|---|---|---|
| B1 | routes/perubahan.ts |
checkFailGate ditambahkan di arm submit Perubahan & Akuisisi/Penggabungan (hormati bypass) |
tsc clean; 33 test area hijau |
| B2 | services/perbaikan-processor.ts |
OCR-on-demand saat rawText kosong (no-op bila sudah ada) |
tsc clean; 11 test area hijau |
| B3 | routes/verifikator.ts |
(di-revert — bukan bug) | 37 test verifikator hijau |
8. Lampiran — indeks laporan per fitur
report/pt-{pendirian,perubahan,perbaikan,peralihan-pp-pt,pembubaran,merger,akuisisi,laporan-rups}.md,
report/pp-{pendirian,perubahan,perbaikan,pembubaran}.md,
report/apostille-{intake,classification,eligibility,verifier,legalisasi}.md,
report/pt-00-summary.md (ringkasan PT).