think
16px
820px

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) tanpa checkFailGate; satu-satunya panggilan (:1220-1224) dijaga
    khusus untuk tipe FOREIGN. FAIL ditulis di services/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 (hormati bypass debug seperti flow lain).

B2 — POST /api/perbaikan multipart tidak meng-OCR (HIGH endpoint / MED risiko)

  • Apa: Handler membuat Document status UPLOADED tetapi tidak pernah memicu OCR
    (processDocument). runSuratPernyataanExtraction mengasumsikan rawText sudah 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 (throw bila rawText kosong). Jalur UI
    memakai from-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 sebelum initializePerbaikan, 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 decide bersama membuat ShareholderVote pada 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/perbaikan 500 (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 membaca details.correctionId top-level padahal data
    di details.instances[].correctionId, tetapi membuat guard "menyala" MERUSAK alur yang
    disengaja: test integrasi perbaikan-submit-override (Task 38) menyetujui section NPWP
    lebih dulu, lalu meng-override DOC_REQUIRED_PRESENT FAIL 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-rups OBS-1.
  • PT Laporan RUPS: 6 slot lampiran tak auto-terisi (classifier tak menghasilkan label LAMPIRAN_*) — OBS-2.
  • PT Peralihan PP→PT: /finalize server 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_WINDOW bisa 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): outOfType AKTIF dipakai di
    ApostilleClassificationPage.tsx:903 untuk 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)

  1. Kebijakan gate FAIL tidak seragam — perubahan-family pakai section-approval saja;
    flow lain pakai checkFailGate. Seragamkan (akar B1).
  2. Auto-fill dokumen pendukung tidak konsisten (PP) — Domisili/Bukti Setor tidak
    auto-fill; perlu keputusan desain (wire autofill vs "evidence-only").
  3. Ekstraksi dari scan nyata — Laporan RUPS & beberapa akta scan menghasilkan field
    kosong; classifier tak menghasilkan label lampiran/KTP-PDF. Butuh perhatian pipeline OCR.
  4. data-testid hilang pada banyak tombol Submit — utang otomasi UI; tambahkan testid stabil.
  5. Kebijakan override tanggal akta (AKTA_DATE_WINDOW) berbeda antar-flow — seragamkan.

6. Kesenjangan lingkungan (butuh aksi user, bukan bug)

  • Signature specimen belum tersedia (MinIO/signatureVerify off) → 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 flip PP_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

  1. ~~Perbaiki B1~~ — SELESAI (satu perbaikan, tutup kebocoran gate untuk 3 tipe sekaligus).
  2. ~~Perbaiki B2~~ — SELESAI (OCR-on-demand di extraction service).
  3. ~~B3~~ — tidak ada aksi (by-design, di-revert).
  4. 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.
  5. Keputusan desain (user/PO): override dokumen-wajib (Pendirian); auto-fill
    Domisili/Bukti Setor (PP); kebijakan AKTA_DATE_WINDOW (seragamkan lock vs override).
  6. Utang otomasi: tambahkan data-testid pada tombol Submit lintas-flow.
  7. 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).