Penjelasan Audit Data

Arti audit, istilah, dan cara skor dihitung (implementasi includes/audit_engine.php).

1. Apa itu audit ini?

Audit Data adalah penilaian otomatis berbasis aturan terhadap kualitas data yang sudah masuk ke tabel final (report_ppls, report_ppl_items), dibandingkan dengan sumber dari Telegram (log_msg_telegram: teks dan JSON hasil ekstraksi).

Audit bersifat read-mostly: hasilnya disimpan di tabel report_ppl_audits dan tidak mengubah isi laporan final. Tujuannya dua arah:

Audit ini bukan penilaian oleh AI/OpenAI. Semua skor memakai logika PHP, pengecekan field, dan kemiripan string (score_similarity_percent di includes/helpers.php).

2. Istilah & definisi

Istilah / kolomArti singkat
report_ppl_auditsBaris riwayat audit per laporan (bisa lebih dari satu jika dijalankan ulang tanpa skip).
audit_batch_uuidID satu kali jalan CLI step6_audit_reports.php; semua baris dalam run yang sama punya UUID sama.
report_ppl_idID laporan final di report_ppls.
log_msg_telegram_idID baris log Telegram yang terhubung lewat posted_report_ppl_id (bisa kosong jika tidak ketemu).
completeness_scoreSkor 0–100: seberapa lengkap field penting (tanggal, tipe, desa, aktivitas, masalah, solusi, komoditas untuk lapangan, dll.).
content_quality_scoreSkor 0–100: apakah isi teks field bermakna (bukan placeholder), tidak terlalu pendek, nama petani tidak mencurigakan.
consistency_scoreSkor 0–100: konsistensi logis antar field (mis. lapangan harus ada komoditas; luas negatif; dll.).
reference_match_scoreSkor 0–100: desa ada di master; komoditas cocok master/sinonim (untuk lapangan); skor tambahan jika ada peserta / pengirim terlacak ke users.
extraction_accuracy_scoreSkor 0–100: kemiripan antara teks sumber (ppl_report_text atau text_message) dengan nilai final (desa, komoditas, aktivitas, masalah, solusi).
overall_audit_scoreSkor gabungan 0–100 dari lima skor di atas dengan bobot tetap (lihat bagian 3).
audit_statusRingkasan tiga nilai: good, warning, bad (lihat bagian 4).
missing_critical_fieldsDaftar field penting yang dianggap kurang (format JSON array string).
inconsistency_flagsDaftar kode aturan yang melanggar konsistensi (format JSON array string).
raw_audit_jsonDetail teknis perhitungan (breakdown, bukti singkat, id sumber) untuk debug dan analitik lanjutan.

3. Mekanisme perhitungan skor

3.1 Skor keseluruhan (overall_audit_score)

Rumus berbobot (sumber kode):

KomponenBobot
completeness_score25%
content_quality_score20%
consistency_score20%
reference_match_score15%
extraction_accuracy_score20%

Overall = jumlah (skor_komponen × bobot), dibulatkan ke 2 desimal.

3.2 Kelengkapan (completeness_score)

Beberapa aspek dinilai 0–1 lalu dirata-rata menjadi 0–100. Untuk laporan lapangan, diwajibkan minimal satu item dengan komoditas. Untuk administratif, blok komoditas dianggap terpenuhi. Nama petani (lapangan) mendapat bobot sedikit; jika mencurigakan (pola seperti di suspicious_farmer_name()) skor poin petani diturunkan.

3.3 Mutu isi (content_quality_score)

Mulai dari 100, lalu pengurangan jika aktivitas/masalah/solusi berupa placeholder (“tidak ada”, “-”, dll.), terlalu pendek, atau nama petani mencurigakan.

3.4 Konsistensi (consistency_score)

Mulai dari 100, pengurangan per pelanggaran aturan (contoh: lapangan tanpa komoditas, village_id kosong, luas negatif, solusi ada tanpa masalah, kombinasi umur tanam vs aktivitas panen, dll.). Detail kode ada di stage6_score_consistency().

3.5 Referensi master (reference_match_score)

Tiga blok (40% + 40% + 20% dari skor referensi ini secara internal): validitas desa di master; kecocokan komoditas (untuk administratif blok komoditas diberi penuh tanpa wajib match); skor PPL/pengirim jika ada peserta atau from_id cocok kolom Telegram di tabel users/user.

3.6 Akurasi ekstraksi (extraction_accuracy_score)

Teks sumber utama: ppl_report_text, jika kosong text_message. Untuk tiap pasangan yang relevan dihitung score_similarity_percent antara teks normalisasi. Jika sumber kosong, skor ekstraksi diberi nilai netral (50). Opsional: perbandingan aktivitas final vs cuplikan di extracted_json masuk ke breakdown di raw_audit_json.

4. Status audit_status

Threshold persis dihitung di stage6_compute_audit_record() — bila diubah di kode, halaman ini perlu diselaraskan.

5. Menjalankan audit

CLI: php step6_audit_reports.php (skrip audit data). Pengaturan di config.php (stage6_dry_run, stage6_limit, stage6_skip_already_audited, dll.).

Setiap run menghasilkan banyak baris di report_ppl_audits dengan audit_batch_uuid yang sama per eksekusi.