think
16px
820px

Apostille Recode — Progress Report (2026-07-10, autopilot run 1)

TL;DR: SEMUA fase kode selesai — Fase A (migrasi v2) + B (Jalur Percepatan) + C1 (berkas spesimen) + C2–C4 (AI verifikasi tanda tangan) — teruji penuh (backend 2505/0, frontend 970/0). Service ahu-signature-verify dibangun & di-deploy di GPU host (GPU 1); fakeshield dihapus (42 GB, disk 96%→84%). Kalibrasi C5 menunggu korpus spesimen nyata (kredensial MinIO — Q3). Deploy staging sempat TERBLOKIR ~15 menit karena VPN AHU putus (secure.ahu.go.id down; vpn-monitor di valserver auto-reconnect pukul 20:16 WIB) — deploy dilanjutkan setelah tunnel pulih. Keputusan Q1–Q8-mu terekam di tidyup/2026-07-10-apostille-recode-plan.md.


Fase A — Apostille/Legalisasi di atas v2 flow engine + review engine ✅ (bade76a0)

Apostille adalah tenant v1-fork TERAKHIR — sekarang v2-generic. Tidak ada perubahan skema; semua perilaku lama dipertahankan, kodenya pindah ke rel engine.

  • Engine seam baru classification (konsumen pertama): dispatch menjalankan fase-1 (ekstraksi KTP + klasifikasi 13 kategori) lalu parkir di AWAITING_CLASSIFICATION untuk papan drag-drop; POST /:id/start melanjutkan fase-2 via continueFlow. Dormant untuk semua flow lain.
  • Ekstraksi lewat jalur generik: APOSTILLE_DOCUMENT sekarang ditangani document-processor (blok OCR-only dipecah ke document-processor-ocr-only.ts — kena plafon monster-file) + focused pass apostille-doc (proyeksi record + pre-match penandatangan ke registri spesimen).
  • 14 aturan AP_* di-port ke Rule<ApostilleCtx> (validator murninya tetap satu sumber); persist lewat runner generik dengan scope APOSTILLE_RULE_CODES; rematch = rematch.custom.
  • Proyektor review = konsumen PERTAMA section kind document-set di kontrak; signer VM diperluas (NIP-match, confidence, OCR hints, institusi, kandidat). Papan klasifikasi + halaman review sekarang makan dari GET /api/submissions/:id/review generik.
  • FE: DocumentSetSection renderer generik; ApostilleReviewPage jadi shell tipis ReviewEngine (peran pemohon/verifikator tetap: gate kirim termasuk blok signer AMBIGUOUS; advisory + ringkasan + panel keputusan verifikator utuh).
  • Dihapus tanpa back-compat (Q7): pipeline v1 (classify/start/process + runner validasi), GET /:id/review-data, POST /:id/finalize, apostille-documents-section, apostille-edits-panel.

Fase B — Jalur Percepatan, DIBANGUN BEKERJA ✅ (a0170a66)

Temuan riset: fitur ini tidak pernah hidup di mana pun — legacy tidak punya sama sekali; di rebuild fieldnya ada tapi dropdown-nya di-comment, cek kuota hardcoded false, biayanya tak pernah ditagih, dan worklist tak pernah memprioritaskan. Yang kubangun = niat yang terdokumentasi, DENGAN penegakan:

Aspek Implementasi
Skema Enum JalurPermohonan (REGULER/PERCEPATAN) di Submission + satelit (migrasi 20260710160000)
Opt-in Kartu ⚡ di halaman unggah (copy resmi: 1 hari kerja, Rp500.000, 08.00–12.00 WIB, kuota) — hanya muncul saat layanan Apostille
Gate server Layanan Apostille-only + jendela hari-kerja WIB + kuota harian — env-tunable (FASTTRACK_DAILY_QUOTA, FASTTRACK_HOUR_START/END) supaya demo di luar jam tidak terkunci
Eligibility Rule AP_FASTTRACK_ELIGIBLE: dokumen ber-penandatangan-wajib yang UNMATCHED di registri → FAIL dengan remedi jelas (AMBIGUOUS dihitung terdaftar — pemilihannya sudah di-gate saat submit)
Escape hatch PATCH /:id/jalur — turun ke reguler selalu boleh; naik re-gate; tombol "Ubah ke jalur reguler" di halaman review
Verifikator /list urut percepatan dulu + slaDeadline (submit + 1 hari kerja, lewati akhir pekan, WIB); kolom Jalur dengan chip SLA merah saat lewat tenggat; badge ⚡ di header review
Biaya Display-only (Rp500.000 informasi — kita bukan sisi penagihan PNBP)

Fase C1 — Berkas spesimen: stub MinIO + fallback unggah manual ✅ (bbcfc8e8)

Fondasi data untuk AI verifikasi tanda tangan (C2–C5):

  • Fakta registri: spesimen_position.spesimen_file berisi kunci objek (spesimen-file/YYYYMM/<hash>.pdf) untuk 135.881 dari 135.882 pejabat; berkasnya di MinIO AHU (bucket apostille) yang kredensialnya sedang kau mintakan (Q3).
  • Model SpecimenFile (cache lokal per spesimenId; MANUAL menang atas MINIO) + klien Bun.S3Client env-gated SPECIMEN_MINIO_* — dormant sampai kredensial datang (tanpa env = perilaku sama persis, hanya jalur manual).
  • Focused pass menghangatkan spesimen untuk signer MATCHED (fail-soft — kegagalan spesimen tak pernah mengganggu ekstraksi).
  • GET /api/apostille/spesimen/:id/file (stream; lazy-fetch saat MinIO aktif; 404 SPECIMEN_UNAVAILABLE) + POST unggah manual.
  • UI blok penandatangan: link "Lihat spesimen tanda tangan" saat tersedia; verifikator dapat tombol "Unggah spesimen" sebagai fallback (aksi sisi-registri — tidak terkunci mode read-only review).

Begitu kredensial MinIO kau kirim: isi SPECIMEN_MINIO_ENDPOINT/ACCESS_KEY/SECRET_KEY (+_BUCKET, default apostille) di env staging → restart → QC = buka review apostille yang signer-nya MATCHED, link spesimen harus langsung menampilkan PDF-nya.

Fase C2–C4 — AI verifikasi tanda tangan ✅ (847e1c29)

Service ahu-signature-verify (folder signature-verify-service/ di repo; container di GPU host, port 5006, GPU 1 sesuai Q5):
- Deteksi: YOLOv8s signature-detector (checkpoint terbuka tech4humans) dengan fallback heuristik CV klasik (blob tinta) bila checkpoint tak tersedia.
- Perbandingan: embedding DINOv2-base pada crop tanda tangan → cosine similarity → match % (pemetaan baseline, env-tunable SIGVERIFY_CAL_FLOOR/CEIL sampai kalibrasi C5).
- Pola platform doc-classifier: bobot model di-bake saat build (aturan on-prem, tanpa internet runtime), cache Redis + audit event + heartbeat semuanya env-gated.

Integrasi backend (env SIGNATURE_VERIFY_URLdormant bila kosong):
- SignerMatch += skor/status/crop (migrasi 20260710200000); klien fail-soft (outage → SERVICE_ERROR, tak pernah mengganggu ekstraksi).
- Pemicu: pass ekstraksi dokumen (signer MATCHED), pilih/set pejabat oleh operator, dan unggah spesimen manual (re-verify semua dokumen pejabat itu).
- Rule SPESIMEN_TTD_MATCH — plafon WARNING permanen (severityFloor): skor <50 "kemungkinan berbeda", 50–79 "periksa manual", ≥80 PASS. Tidak pernah memblokir — keputusan terima/tolak 100% di verifikator (kebutuhan intimu).

UI verifikator: di blok penandatangan — crop tanda tangan berdampingan (dokumen vs spesimen), badge % dengan tier warna (hijau/kuning/merah), caption eksplisit "Advisori (kalibrasi baseline) — keputusan tetap pada verifikator".

C5 (kalibrasi): signature-verify-service/scripts/calibrate.py siap — diberi korpus spesimen per pejabat, ia menghitung distribusi genuine-vs-impostor, sweep threshold (TPR/FPR), dan menyarankan CAL_FLOOR/CEIL. Jalan begitu kredensial MinIO tersedia; sampai itu % berlabel baseline di UI.

Pembersihan host (Q4): fakeshield (direktori riset 42 GB) dihapus + docker image prune → disk GPU host 96% → 84%.

Insiden: VPN AHU putus (±20:02–20:16 WIB)

Saat hendak deploy, secure.ahu.go.id:443 (concentrator VPN AHU) tidak bisa dihubungi → tun0 valserver mati → GPU host (192.168.83.20), staging :3520, SABH/registry semua tak terjangkau. Bukan masalah di sisi kitavpn-monitor di valserver mendeteksi & reconnect otomatis pukul 20:16. Catatan: lingkungan dev_1/2/3 juga ikut kehilangan GPU/SABH selama jendela itu.

Sisa pekerjaan / menunggu input-mu

  1. Kredensial MinIO (Q3) → isi SPECIMEN_MINIO_* di ~/ahu-ai-staging/ocr/infra/env/shared.env + restart → link spesimen hidup untuk 135 rb pejabat → jalankan calibrate.py (C5) → threshold % terkalibrasi data nyata.
  2. Smoke visual-mu di staging: alur apostille penuh (unggah + kartu ⚡ percepatan → papan klasifikasi → review → keputusan verifikator) — halaman di balik role switcher jadi tak bisa ku-screenshot headless; jalur API sudah kuverifikasi hidup.
  3. Opsional lanjutan: kartu Ringkasan AI (LLM) untuk apostille seperti flow PT/PP; wiring audit/heartbeat service ttd ke platform gateway registry.

Deploy record (final run ini)

Backend ahu-ai-ocr:847e1c29 live di Server 2 (:3520) — migrasi 20260710160000 + 20260710180000 + 20260710200000 auto-applied; verifikasi live: proyeksi review parse bersih di submission lama, revalidate memunculkan AP_FASTTRACK_ELIGIBLE + SPESIMEN_TTD_MATCH (SKIPPED sesuai kondisi — reguler & belum ada skor), total 16 rules.

Service AI ahu-signature-verify live di GPU host (port 5006, GPU 1, detector yolos): /health OK; smoke fungsional: pasangan tanda tangan SAMA → 100%, BERBEDA → 0%, deteksi bekerja dua sisi, ~270 ms warm. Backend menjangkaunya via network compose (SIGNATURE_VERIFY_URL=http://ahu-signature-verify:5006, terverifikasi dari dalam container web).

Catatan teknis: checkpoint yolov8s tech4humans ternyata gated di HF (401 anonim) — dipindah ke mdefrance/yolos-base-signature-detection (terbuka, label tunggal signature, via transformers); ditambah guard startup yang menolak detector tanpa label signature (insiden build pertama: ultralytics diam-diam mengunduh model COCO generik — tak akan terulang).

Deploy pertama run ini: ahu-ai-ocr:bbcfc8e8 live di Server 2 (:3520, x056.ahu-demo.ocr.val.id) via infra/deploy/build-and-ship.sh (build di dind sandbox → ship 461 MB → Server 2); migrasi 20260710160000_jalur_permohonan + 20260710180000_specimen_file auto-applied oleh CMD container; health OK.

Verifikasi live (API):
- GET /api/apostille/list → baris membawa jalurPermohonan + slaDeadline
- GET /api/submissions/81354581…/review (submission apostille lama buatan v1!) → proyeksi engine bersih: 3 section (permohonan custom / identitas_pemohon field-list / dokumen document-set), payload permohonan lengkap (incl. jalur+SLA), 14 validasi, 11 field ✔ — data lama TIDAK pecah, langsung terlayani engine baru.
- Screenshot halaman apostille tidak bisa diambil headless (halaman di balik role switcher umum/verifikator) — smoke visualnya bagianmu; jalur API sudah terbukti.