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 diAWAITING_CLASSIFICATIONuntuk papan drag-drop;POST /:id/startmelanjutkan fase-2 viacontinueFlow. Dormant untuk semua flow lain. - Ekstraksi lewat jalur generik:
APOSTILLE_DOCUMENTsekarang ditanganidocument-processor(blok OCR-only dipecah kedocument-processor-ocr-only.ts— kena plafon monster-file) + focused passapostille-doc(proyeksi record + pre-match penandatangan ke registri spesimen). - 14 aturan
AP_*di-port keRule<ApostilleCtx>(validator murninya tetap satu sumber); persist lewat runner generik dengan scopeAPOSTILLE_RULE_CODES; rematch =rematch.custom. - Proyektor review = konsumen PERTAMA section kind
document-setdi kontrak; signer VM diperluas (NIP-match, confidence, OCR hints, institusi, kandidat). Papan klasifikasi + halaman review sekarang makan dariGET /api/submissions/:id/reviewgenerik. - FE:
DocumentSetSectionrenderer generik;ApostilleReviewPagejadi 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_fileberisi kunci objek (spesimen-file/YYYYMM/<hash>.pdf) untuk 135.881 dari 135.882 pejabat; berkasnya di MinIO AHU (bucketapostille) yang kredensialnya sedang kau mintakan (Q3). - Model
SpecimenFile(cache lokal per spesimenId; MANUAL menang atas MINIO) + klienBun.S3Clientenv-gatedSPECIMEN_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; 404SPECIMEN_UNAVAILABLE) +POSTunggah 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_URL — dormant 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 kita — vpn-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
- Kredensial MinIO (Q3) → isi
SPECIMEN_MINIO_*di~/ahu-ai-staging/ocr/infra/env/shared.env+ restart → link spesimen hidup untuk 135 rb pejabat → jalankancalibrate.py(C5) → threshold % terkalibrasi data nyata. - 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.
- 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.