think
16px
820px

Tahap 0 — Baseline & kalibrasi (berakhirnya status PT)

Dihasilkan: 2026-07-15 · branch fix/berakhirnya-status-badan-hukum @ parent feacb3f6.
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.

flowchart TB subgraph NOW["Sekarang — scan SELURUH halaman"] P["Halaman koran utuh\n(banyak boks PT lain)"] --> S["cek PERTANGGUNGJAWABAN dulu\n(ada di boks PT LAIN)"] --> W["→ _152 (SALAH untuk 4/5 149)"] end subgraph FIX["Tahap B — anchor ke nama PT pemohon"] P2["Halaman koran utuh"] --> A["window ±N char di sekitar\n'PT BUKIT LENTERA'"] --> X["hanya keyword di boks pemohon"] --> C["+ axis 149 diperluas (PAILIT|PUTUSAN|...)\n→ _149 (BENAR)"] end

Bukti kunci — kasus PT Bukit Lentera (149)

Boks pemohon sebenarnya berbunyi: "PENGUMUMAN PUTUSAN PERNYATAAN PENGAKHIRAN PAILITPT
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
    sebagai BERITA_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 2026 MUNCUL DUA KALI —
    di kelas BERITA_ACARA_RUPS dan LAPORAN_LIKUIDASI (file identik). Konfirmasi bug dwifungsi;
    Tahap D = angkat ke reviewer, jangan implement.
  • Tahap A item 1 (BSBHP_AKTA_RECENCY) SUDAH tercakup oleh rule wrapped AKTA_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, perluas pengumumanOrderRule).

Rekomendasi kalibrasi untuk Tahap B

  1. 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.
  2. Axis 149: KREDITOR|PEMBUBARAN → tambah PAILIT|KURATOR|PUTUSAN|KEBERATAN|TAGIHAN.
  3. Axis 152: tambah HASIL AKHIR di samping HASIL LIKUIDASI|PERTANGGUNGJAWABAN.
  4. Laporan: tambah PERNYATAAN .* HASIL AKHIR .* LIKUIDASI.
  5. SIRKULER→BAR: KEPUTUSAN SIRKULER|SIRKULER PARA PEMEGANG SAHAM + konteks pembubaran/likuidasi.

Pertanyaan untuk reviewer (sebelum Tahap B)

  1. 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)?
  2. "PEMBERITAHUAN PEMBUBARAN" sebagai SURAT_PERMOHONAN — di luar 5 item Tahap B plan. Tambahkan
    sekalian, atau biarkan (operator board yang assign)?