LAPORAN AUDIT LAB SAKILA vs PRD V5.2
STATUS 16 Sep 2026: 9 FAIL + 8 PARTIAL TUNTAS 100%.
Rincian bukti di Laporan Harian 16 Sep.
Dokumen ini snapshot beku 15 Sep (arsip, jangan diubah).
Tanggal: 15 September 2026 Β· Target:/var/www/dev+ DB labinv_skd(46 user)
Metode: 3 tim audit paralel (finansial, akses-privasi, omnichannel-Safira-API) + verifikasi silang Lead
Scope: backend Laravel lab SAJA. Flutter mobile (sumber di laptop) dan prodadm.umv.or.idTIDAK disentuh.
Ringkasan: 30 cek β 9 PASS Β· 12 PARTIAL Β· 9 FAIL
1. FAIL (wajib ditutup)
| # | Temuan | Bukti |
|---|---|---|
| F1 | Status transaksi non-kanonis: kolom varchar(255) tanpa constraint, kode menulis paid (tak ada di PRD 03.2) |
MobileAdminController@approve:374, live: paid=9, verified=1, pending=1 |
| F2 | is_verified desync: kolom NOT NULL DEFAULT 0 + accessor kembalikan nilai tersimpan β trx paid/verified baca false |
Transaction.php:72-78 |
| F3 | Lifecycle adjustment lompat: draftβapplied langsung, tanpa endpoint approve + tanpa gate finance_manager (staff/super_admin bisa apply) |
routes/api.php:201-206, MobileWakafAdminController@applyAdjustment:787-791 |
| F4 | audit_logs KOSONG β jejak finansial ke activities, tanpa trail CORRECT/APPLIED |
audit_logs COUNT=0, transaction_adjustments COUNT=0 |
| F5 | finance_staff pegang DONATION_ADJUST penuh (PRD: draft-only) |
role_has_permissions lab |
| F6 | Route mobile/volunteer/* tanpa middleware permission β token siapa pun bisa accept/submit distribusi |
routes/api.php:171-177 |
| F7 | Emergency bypass 02.2 NOL implementasi; sebaliknya super_admin pegang DONATION_ADJUST permanen |
grep emergency_bypass = 0 hit; route draft pakai role_or_permission:...super_admin... |
| F8 | Envelope {success,message,data,meta} hanya di Inbox; mayoritas controller pakai format sendiri |
MobileApiController 0x success, MobileAuthController 0x |
| F9 | tests/Feature/SafiraAdversarialTest.php TIDAK ADA (PRD 10.3 wajib) |
ls tests/Feature nihil |
2. PARTIAL penting
- P1: Guard Eloquent
amountover-strict (blokir SEMUA termasuk koreksi pending) vs trigger DB vs PRD 03.3 β tiga sumber beda aturan (source conflict). - P2:
draftAdjustmenttanpaDB::transaction/lock;super_adminboleh draft (langgar SoD). - P3: 8 permission legacy (
manage_*,view_*) masih menempel di role. - P4:
internal-chat,asterisk/*,pbx/caller-lookup,voip/lookup-callerminim proteksi (lookup dichos via suffix-8-digit LIKE). - P5: Masking NIK ada, masking nomor HP TIDAK ada; controller masih petakan phone mentah.
- P6: Kolom idempotency (
logical_message_id,idempotency_key) hanya di Model, TANPA migrasi DB + tanpa constraint; pre-dispatch check opsional (client key tidak dipersist). - P7: Safira satu kelas raksasa (
GeminiService), tanpa polaAiService/Provider, timeout 20 dtk (PRD: 5 dtk); knowledge guard level prompt saja. - P8:
config/broadcasting.phphilang; Firestore mirror degradasi diam-diam tanpa service-account.
3. PASS (fondasi yang sudah benar)
- Trigger immutability 3 biji aktif + teruji 9/9; guard
applieddi Model; casts decimal. - 14 permission kanonik + middleware route wakaf/inbox/adjustment; blokir attacker 403 teruji 6/6.
- Enkripsi AES-256 NIK/HP/GPS + blind-index HMAC + GPS fuzzing deterministik 500mβ1km.
- Concurrency
lockForUpdate+ idempotency 409 di approve/apply.
4. Rekomendasi prioritas (urut)
- R1 β Kunci uang: endpoint
approveAdjustment/rejectAdjustmentkhususfinance_manager+ status perantaraapproved; cabutDONATION_ADJUSTdarifinance_staff&super_admin. - R2 β Selaraskan state: tulis
verified(bukanpaid), ENUM/CHECK status di DB, sinkronis_verifiedvia model event, alihkan jejak keaudit_logs. - R3 β Kunci distribusi & lookup: middleware
DISTRIBUTION_CREATEdi volunteer + batasi pbx/voip lookup. - R4 β Idempotency beneran: migrasi kolom + constraint + wajibkan & persist
idempotency_key. - R5 β Quality gate Safira: tulis adversarial test (3 case PRD) + pecah provider pattern + timeout 5 dtk.
- R6 β Seragamkan envelope API + masking HP + implementasi emergency bypass 4-lapis.
Catatan: temuan di atas kondisi LAB. Prod butuh audit baca-saja tersendiri sebelum deploy apa pun (10-Step Safety Gate PRD 15).