Tahap 0 — Baseline & kalibrasi (berakhirnya status PT)
Dihasilkan: 2026-07-15 · branch
fix/berakhirnya-status-badan-hukum@ parentfeacb3f6.
Data: 30 PDF verifikasi (6 kelas × 5) di~/remote-development/poc-ahu-ai/sample-berakhirnya
(di luar worktree — tidak masuk git). Harness throwaway:backend/tmp/baseline-berakhirnya.ts
(gitignored). Output mentah:~/remote-development/poc-ahu-ai/baseline-berakhirnya.json
+ dump rawText per file di~/remote-development/poc-ahu-ai/baseline-berakhirnya-rawtext/.
CHECKPOINT — menunggu review sebelum lanjut ke Tahap A/B/C.
Cara
Tiap PDF → (1) GPU classifier gateway (POST /api/classifier/classify) → label + confidence +
reason; (2) PaddleOCR extractTextWithWords(unwarp:false, orient:false) → rawText; (3)
suggestByKeyword(rawText) saat ini (seam sebelum Tahap B) → bukti before/after. Tidak menyentuh
kode aplikasi; tidak butuh backend dev_3 hidup (harness memanggil gateway langsung dengan header
CONVENTIONS).
Temuan 1 — GPU "confident-wrong" terbukti (semua 30)
Tidak satu pun dari 3 kelas dokumen baru punya label GPU — dan GPU tidak abstain. Ringkas per kelas:
| Kelas sample | Label GPU (confidence) | Catatan |
|---|---|---|
AKTA_BERAKHIRNYA (5) |
PENETAPAN_GANTI_NAMA@0.99, AKTA_PERUBAHAN@0.99 ×3, AKTA_PERUBAHAN@0 |
ditangani akta-txn-classifier (refinement), bukan seam |
BERITA_ACARA_RUPS (5) |
BERITA_ACARA_RUPS@0.99 ×4, AKTA_PERUBAHAN@0.99 ×1 |
GPU tahu BAR — termasuk yang berjudul "Keputusan Sirkuler" (2 file) |
BUKTI_PENGUMUMAN_149 (5) |
OTHER@0.99 ×4, BERITA_ACARA_RUPS@0.99 ×1 |
koran = OTHER (pass-through), bukan salah-kelas berbahaya |
BUKTI_PENGUMUMAN_152 (5) |
OTHER@0.99 ×4, BUKTI_TRANSFER-SURAT_KETERANGAN_BANK@0.96 ×1 |
idem |
LAPORAN_LIKUIDASI (5) |
BERITA_ACARA_RUPS@{0.99×2, 0.0017}, OTHER@0.02, BUKTI_TRANSFER-SURAT_PERNYATAAN_SETOR_LEGACY@0.998 |
paling berserak — format sangat beragam |
SURAT_PERMOHONAN (5) |
BERITA_ACARA_RUPS@{0.42,0.0008,0.135}, OTHER@0.03, AKTA_PERUBAHAN@0.66 |
idem |
Implikasi: koreksi tetap di seam + operator board (bukan naikkan threshold GPU / retraining). Sesuai desain.
Temuan 2 — Seam axis 149/152 SEKARANG salah pada mayoritas koran
suggestByKeyword saat ini menetapkan axis dengan scan seluruh halaman:
_152 jika /(HASIL LIKUIDASI|PERTANGGUNGJAWABAN)/, else _149 jika /(KREDITOR|PEMBUBARAN)/.
Hasil pada sample (kolom "seam" harness):
| File 149 | axis diusulkan | benar? |
|---|---|---|
| PT KAN, PT PORTAL, PT MAJA, PT BUKIT LENTERA | _152 | ❌ (4 dari 5 salah) |
| PT BIS | _149 | ✅ |
Akar masalah (terbukti dari rawText): sample koran = HALAMAN KORAN UTUH berisi banyak boks
pengumuman PT lain (reksa dana, pengambilalihan saham, likuidasi PT lain). Frasa PERTANGGUNGJAWABAN
/ HASIL LIKUIDASI muncul di boks PT LAIN, dan karena _152 dicek lebih dulu, hampir semua koran
jatuh ke _152. Axis operator-assigned (never auto-accept) jadi ini "nudge salah", bukan korupsi
data — tapi nudge salah lebih buruk dari tanpa nudge.
Bukti kunci — kasus PT Bukit Lentera (149)
Boks pemohon sebenarnya berbunyi: "PENGUMUMAN PUTUSAN PERNYATAAN PENGAKHIRAN PAILIT … PT
BUKIT LENTERA SEJAHTERA (DALAM PAILIT)" — pengumuman pengakhiran pailit lewat putusan
pengadilan. Dalam window ±300 char di sekitar nama PT: KREDITOR=0, PEMBUBARAN=0,
PERTANGGUNGJAWABAN=0, HASIL LIKUIDASI=0 — tak satu pun keyword axis SEKARANG ada di boks pemohon;
PERTANGGUNGJAWABAN=1 & KREDITOR=1 di seluruh halaman semuanya dari boks PT lain.
→ Dua fix Tahap B saling melengkapi & keduanya wajib: (1) anchoring membuang keyword lintas-boks;
(2) perluasan axis 149 (PAILIT|KURATOR|PUTUSAN|KEBERATAN|TAGIHAN) menyediakan sinyal yang benar-benar
ada di boks pemohon. Nama PT pemohon HADIR di rawText koran → anchoring layak.
Temuan 3 — Varian dokumen yang seam SEKARANG tidak tangkap (seam=none)
| File | Kelas | Kenapa lolos | Fix Tahap B |
|---|---|---|---|
| "surat pery hasil likuidasi" (PT KAN) | LAPORAN | teks = "PERNYATAAN … Selaku Likuidator … Hasil Akhir Proses Likuidasi" — regex LAPORAN (AKHIR )?LIKUIDASI\|PERTANGGUNGJAWABAN LIKUIDATOR tak match |
item 5: tambah PERNYATAAN .* HASIL AKHIR .* LIKUIDASI |
| "SURAT PERNYATAAN DAN NERACA" (PT MAJA) | LAPORAN | varian pernyataan+neraca | item 5 |
| "PEMBERITAHUAN PEMBUBARAN PT MAJA JAYA" | SURAT_PERMOHONAN | bukan kata "permohonan" | (di luar 5 item Tahap B — lihat catatan) |
Varian bilingual "liquidators accountability report" (11k kata) salah ke _152 (koran-rule kena
karena ada "pengumuman"+"likuidasi") — anchoring + urutan rule perlu dijaga agar tak menang atas laporan.
Temuan 4 — Konfirmasi lain
- SIRKULER→BAR (Tahap B item 4): 2 file BAR berjudul "Keputusan Sirkuler" sudah dikenali GPU
sebagaiBERITA_ACARA_RUPS@0.99. Jadi prioritas rendah pada sample ini, tapi tetap murah sebagai
jaring pengaman (kasus GPU meleset). - Dokumen dwifungsi (Tahap D): file
BAR PT BUKIT LENTERA … TGL 03 JUNI 2026MUNCUL DUA KALI —
di kelasBERITA_ACARA_RUPSdanLAPORAN_LIKUIDASI(file identik). Konfirmasi bug dwifungsi;
Tahap D = angkat ke reviewer, jangan implement. - Tahap A item 1 (
BSBHP_AKTA_RECENCY) SUDAH tercakup oleh rule wrappedAKTA_DATE_WINDOW
(isPerubahan=true→ window 30 hari = persis [H−30, H]). Tidak akan diduplikasi. Tahap A
menyusut jadi item 2 saja (batas atas 152:t152 ≤ tRUPS + 30 hari, perluaspengumumanOrderRule).
Rekomendasi kalibrasi untuk Tahap B
- Anchoring: window ±300–400 char di sekitar tiap kemunculan nama perseroan pemohon (nama
dinormalisasi; PaddleOCR memecah baris → normalisasi whitespace dulu). Scan axis HANYA di gabungan
window. Bila nama PT tak ditemukan di rawText → fallback ke perilaku sekarang (whole-page) + tetap
never-auto-accept. - Axis 149:
KREDITOR|PEMBUBARAN→ tambahPAILIT|KURATOR|PUTUSAN|KEBERATAN|TAGIHAN. - Axis 152: tambah
HASIL AKHIRdi sampingHASIL LIKUIDASI|PERTANGGUNGJAWABAN. - Laporan: tambah
PERNYATAAN .* HASIL AKHIR .* LIKUIDASI. - SIRKULER→BAR:
KEPUTUSAN SIRKULER|SIRKULER PARA PEMEGANG SAHAM+ konteks pembubaran/likuidasi.
Pertanyaan untuk reviewer (sebelum Tahap B)
- Sumber nama PT untuk anchoring saat klasifikasi board. Klasifikasi berjalan SEBELUM company
selection. Nama PT pemohon paling andal dari OCR akta di bundel yang sama, bukan dari submission
(belum dipilih). Setuju anchoring pakai nama PT yang diekstrak dari akta bundel (fallback
whole-page bila belum ada)? Atau batasi anchoring ke tahap re-extract (submission sudah punya
oldData.perseroan.nama)? - "PEMBERITAHUAN PEMBUBARAN" sebagai SURAT_PERMOHONAN — di luar 5 item Tahap B plan. Tambahkan
sekalian, atau biarkan (operator board yang assign)?