Checksum Bukti: Angka Test Lulus Itu Klaim Sampai Di_checksum
Output mentah perintah verifikasi dibungkus checksum sha256 otomatis, dan gerbang fail-closed menolak irisan tanpa putusan review terjangkar.
Ringkasan
Agen coding bilang tests passed dan coverage 42%, tapi ternyata cuma klaim, nggak ada bukti output mentahnya. Solusinya, skrip shell nyimpen bundel bukti plus checksum sha256, jadi kalau angkanya disunting, ketahuan. Ada juga gerbang fail-closed: irisan nggak boleh disebut selesai kalau review-nya belum PASS semua.
Layar terminal menampilkan hijau: "All tests passed, coverage 42.0%". Agen pengkodean melaporkannya dengan percaya diri, lengkap dengan daftar file yang "selesai". Waktu itu saya percaya. Secara sekilas fiturnya memang jalan di antarmuka, jadi kenapa harus curiga?
Keraguan datang belakangan, waktu saya mau membuktikan ulang angka itu. Tidak ada log eksekusi yang tersisa. Yang ada cuma ringkasan teks buatan agen yang mengklaim keberhasilan. Di titik itu saya sadar: angka tanpa output mentah bukan bukti, cuma klaim.
Bundel Bukti dengan Checksum Sendiri
Perbaikannya berupa skrip shell 144 baris di repo kerja KotaPortal (catatan kerja proyek). Mode pertamanya menangkap bukti: jalankan perintah verifikasi, tulis baris perintah plus seluruh output mentah plus exit code ke satu file bundel per irisan, lalu tutup dengan satu baris sha256: <digest>. Digest dihitung dari isi file tanpa baris checksum itu sendiri.
Perintah evidence-check menghitung ulang digest dan membandingkan. Ada yang menyunting angka di bundel? Kecocokannya rusak. Selftest-nya persis menguji ini: satu angka cakupan diubah dari 42.0% jadi 99.9%, dan pemeriksaan wajib gagal (catatan kerja proyek). Polanya sama dengan sha256sum yang menawarkan "print or check SHA256 (256-bit) checksums" dengan opsi -c untuk memeriksa ulang [6]; bedanya, checksum di sini menempel di tubuh bundel itu sendiri.
Gerbang Selesai yang Fail-Closed
Checksum saja tidak cukup kalau proses review bisa dilewati. Mode kedua skrip itu adalah gerbang penyelesaian irisan: sebuah irisan hanya boleh ditandai selesai kalau file brief, report, dan review ada. Review wajib membawa dua putusan yang keduanya harus PASS, yaitu kepatuhan spesifikasi dan kualitas tugas. Ada FAIL atau BLOCKED di mana pun, semuanya gagal.
Detail paling penting justru cara memparse kata setuju. Putusan akhir dibaca dengan jangkar: barisnya harus diawali Overall: diikuti approve. Kata approve yang terkubur di tengah kalimat naratif tidak lolos. Gerbang juga menuntut blok output mentah (baris berawalan $ ) dan baris hitungan temuan Finding counts: Critical n, Major n. Temuan Critical atau Major harus punya catatan resolved, fixed, atau parked. Kata unresolved bertindak sebagai veto otomatis.
Desain ini lahir dari review yang gagal. Versi pertama gerbang mendapat Versi pertamanya dapat REQUEST-CHANGES plus temuan keamanan tingkat menengah dari review ganda (catatan kerja proyek). Putaran perbaikannya menghasilkan tiga hal: cek approve dijangkar supaya prosa tidak bisa menembus, veto unresolved, dan pemicu checksum yang menyala saat bundel ada atau report menyebut kata coverage. Jumlah kasus selftest naik dari 13 jadi 16.
OWASP menaruh asumsi tanpa verifikasi integritas dalam kategori A08, dan salah satu mitigasinya persis: verifikasi bahwa data berasal dari sumber yang diharapkan dan tidak diubah [5]. Selftest utuh, termasuk uji tamper, ada sejak hari pertama [1].
Batas Jujurnya
Checksum yang dihitung dan disimpan di file yang sama oleh sesi yang sama hanya mendeteksi pemalsuan murah: suntingan tidak sengaja, angka yang diubah malas, report yang diketik ulang. Penyerang yang bertekad tinggal menghitung ulang hash-nya. Klaim jujurnya adalah tamper-evidence untuk forgery murah, bukan tamper-proof. Jalur naiknya jelas: tanda tangan kriptografis atau jangkar eksternal, sejalan dengan konsep attestation dalam in-toto, yaitu metadata terautentikasi tentang artefak yang dikonsumsi mesin kebijakan otomatis dengan digest kriptografis untuk imutabilitas [7].
Ada tradeoff yang saya biarkan sengaja: pemicu checksum bersifat advisory, menyala kalau bundel ada atau report menyebut coverage. Report tanpa keduanya lolos tanpa dicek. Kalau bypass-nya jadi kebiasaan, format report terstruktur adalah upgrade berikutnya.
Untuk yang ingin meniru: mulai dari selftest, bukan dari gerbangnya. Kasus "checksum valid", "tamper terdeteksi", "verdict palsu ditolak" adalah spesifikasi yang bisa dijalankan. Gerbang fail-closed tanpa selftest cuma skrip yang percaya diri, dan kita sudah tahu betapa berbahayanya sesuatu yang percaya diri tanpa bukti.