- Agen penulisan kode AI dapat menghasilkan kode dan menerapkan perubahan ke branch saat developer sedang tidur, tetapi verifikasi akurasi dan keandalan hasilnya sulit dilakukan
- Jika kode yang ditulis AI diuji oleh AI yang sama, itu menjadi mesin saling memuji diri sendiri dan gagal menangkap kesalahpahaman yang berbeda dari niat awal
- Dengan meminjam prinsip inti TDD, kriteria penerimaan ditulis lebih dulu sebelum penulisan kode, lalu agen mengimplementasikannya berdasarkan kriteria tersebut dan melakukan verifikasi terpisah
- Sebagai alat verifikasi, dibangun pipeline 4 tahap yang menggabungkan mode headless Claude Code (claude -p) dan Playwright MCP, tanpa perlu backend terpisah
- Untuk dapat mempercayai keluaran agen, definisi "selesai" harus dibuat jelas sebelum pekerjaan dimulai; ini lebih sulit daripada menulis prompt, tetapi merupakan proses yang wajib
Masalah verifikasi kode pada agen otonom
- Dengan memanfaatkan alat AI seperti Gastown, agen dapat menulis kode selama berjam-jam dan menerapkan perubahan ke branch, tetapi tidak ada metode verifikasi yang tepercaya untuk memastikan hasilnya benar-benar tepat
- Hasil workshop Claude Code selama 6 bulan terakhir untuk lebih dari 100 engineer menunjukkan bahwa semua tim menghadapi masalah yang sama
- Tim yang menggunakan Claude untuk PR sehari-hari mengalami kenaikan jumlah merge PR dari sekitar 10 per minggu menjadi 40~50, sehingga menghabiskan jauh lebih banyak waktu untuk code review
- Semakin otonom sistem bekerja, semakin parah masalahnya — pada titik tertentu orang berhenti meninjau diff, hanya mengamati deployment sambil berharap tidak ada masalah, lalu baru menemukan error setelah rilis
Batasan solusi yang ada saat ini
- Metode merekrut reviewer tambahan tidak dapat mengejar kecepatannya, dan tidak efisien bila engineer senior membaca kode buatan AI sepanjang hari
- Jika Claude menulis test untuk kode yang ia tulis sendiri, strukturnya menjadi memverifikasi bukan apa yang benar-benar diinginkan pengguna, melainkan apa yang menurut Claude diinginkan
- Regression bug bisa tertangkap, tetapi kesalahpahaman (misunderstanding) awal tidak bisa dideteksi
- Jika AI yang sama dipakai sekaligus untuk menulis dan memverifikasi, itu menjadi "mesin saling memuji diri sendiri (self-congratulation machine)"
- Tujuan asli code review adalah adanya pandangan kedua selain penulis awal, tetapi cross-review antar AI berasal dari sumber yang sama sehingga cenderung melewatkan hal yang sama
Hal inti yang ditangkap TDD dengan benar
- Prinsip TDD: tulis test lebih dulu, tulis kode, lalu berhenti ketika test lulus (tanpa mengimplementasikan lebih jauh)
- Alasan sebagian besar tim tidak melakukan TDD adalah karena butuh waktu untuk memikirkan lebih dulu apa yang harus dilakukan kode
- AI mengatasi masalah kecepatan, jadi alasan itu hilang — sekarang bagian yang lambat justru menilai apakah kodenya benar
- Dibanding unit test, lebih mudah menjelaskan dalam bahasa biasa apa yang harus dilakukan fitur
- Contoh: "Pengguna melakukan autentikasi dengan email dan kata sandi. Jika kredensial salah, tampilkan 'Invalid email or password'. Jika berhasil, pindah ke /dashboard. Token sesi kedaluwarsa setelah 24 jam"
- Kriteria ini dapat ditulis sebelum editor kode dibuka, lalu agen mengimplementasikan dan sesuatu yang lain memverifikasinya
Contoh penerapan nyata
-
Perubahan frontend
- Membuat kriteria penerimaan (Acceptance Criteria) berbasis file spesifikasi
- AC-1: Saat mengakses /login dengan kredensial valid, pengguna diarahkan ke /dashboard dan session cookie disetel
- AC-2: Saat kata sandi salah dimasukkan, tampil tepat "Invalid email or password" dan tetap berada di halaman /login
- AC-3: Jika field kosong, tombol submit dinonaktifkan atau error inline ditampilkan
- AC-4: Setelah 5 kali gagal, login diblokir selama 60 detik dan pesan waktu tunggu ditampilkan
- Setiap kriteria dapat dinilai dengan jelas sebagai lulus atau gagal
- Setelah agen membangun fitur, agen browser Playwright menjalankan verifikasi untuk tiap AC, mengambil screenshot, dan membuat laporan hasil per kriteria
- Jika gagal, bisa diketahui dengan tepat kriteria mana yang gagal dan apa yang terlihat di browser
-
Perubahan backend
- Pola yang sama diterapkan tanpa browser
- Perilaku API yang bisa diamati (status code, response header, pesan error) dijelaskan secara eksplisit dan diverifikasi dengan perintah curl
-
Batasan
- Kesalahpahaman pada spesifikasi itu sendiri tidak bisa ditangkap — jika spesifikasinya salah sejak awal, fitur bisa tetap lolos verifikasi meski sebenarnya salah
- Hal yang bisa ditangkap Playwright: kegagalan integrasi, bug rendering, perilaku rusak di browser nyata
- Ini adalah klaim yang lebih sempit daripada "akurasi yang terverifikasi", tetapi tetap menangkap lebih banyak hal dibanding apa yang biasanya bisa ditangkap code review secara konsisten
-
Ringkasan workflow
- Tulis kriteria penerimaan sebelum prompt → agen mengimplementasikan sesuai kriteria → jalankan verifikasi → review hanya yang gagal (review kegagalan, bukan diff)
Cara membangunnya: pipeline 4 tahap
- Diimplementasikan sebagai Claude Skill (github.com/opslane/verify), menggunakan claude -p (mode headless Claude Code) dan Playwright MCP
- Tidak perlu custom backend terpisah atau API key tambahan; cukup gunakan token OAuth Claude yang sudah ada
-
Tahap 1: Pre-flight
- Bash murni, tanpa pemanggilan LLM
- Memeriksa apakah dev server berjalan, sesi autentikasi valid, dan file spesifikasi tersedia
- Gagal lebih cepat sebelum token terpakai
-
Tahap 2: Planner
- Satu kali pemanggilan Opus
- Membaca spesifikasi dan file yang berubah, lalu menentukan apa saja yang perlu diverifikasi dan bagaimana menjalankannya
- Karena membaca kode untuk menemukan selector yang benar, ia tidak menebak-nebak nama class
-
Tahap 3: Browser Agents
- Satu kali pemanggilan Sonnet per AC, semuanya dijalankan paralel
- Jika ada 5 AC, maka 5 agen bekerja secara independen untuk navigasi dan mengambil screenshot
- Sonnet 3~4 kali lebih murah dibanding Opus dan memiliki performa setara untuk tugas berbasis klik
-
Tahap 4: Judge
- Satu kali pemanggilan final Opus untuk membaca semua bukti dan mengembalikan hasil per kriteria: pass, fail, atau needs-human-review
-
Cara instalasi
- Dapat diinstal sebagai plugin Claude Code:
/plugin marketplace add opslane/verify
- Atau clone repo lalu sesuaikan sendiri — tiap tahap memiliki satu pemanggilan claude -p dengan input yang jelas dan output terstruktur
- Penggantian model, penambahan tahap, dan integrasi CI dimungkinkan dengan opsi --dangerously-skip-permissions
Pelajaran utama
- Intinya adalah "Jika definisi selesai tidak dinyatakan di awal, hasilnya tidak bisa dipercaya"
- Menulis kriteria penerimaan lebih sulit daripada menulis prompt, tetapi memaksa kita mempertimbangkan edge case sejak awal, sehingga kualitas meningkat
- Sama seperti alasan engineer menolak TDD, ada resistensi karena terasa lebih lambat di awal
- Tanpa kriteria penerimaan, yang bisa dilakukan hanya membaca hasil dan berharap itu benar
- Ini adalah prosedur wajib untuk memastikan keandalan dalam lingkungan pengembangan yang digerakkan AI
2 komentar
Sebanyak apa pun TDD dilakukan, pada level sekarang di mana LLM bisa memanipulasi tes agar lolos, review oleh manusia tetap mutlak diperlukan..
Komentar Hacker News
Rasanya framework LLM yang bermunculan belakangan justru membuat pengembangan jadi lebih sulit dan mahal
Dengan konfigurasi dasar saja sebenarnya sudah bisa melangkah cukup jauh, jadi membuat begitu banyak wrapper dan harness saat model terus berubah terasa tidak efisien
Pendekatan seperti ini, yang dibiarkan berjalan semalaman sambil membakar uang, rasanya nanti akan dikenang sebagai bahan tertawaan seperti meme PHP
Menurut artikel itu, “selama 6 bulan terakhir mereka telah mengadakan workshop Claude Code untuk lebih dari 100 engineer”
Nanti saat mereka menjalankannya siang malam sampai akhirnya perusahaan AI bangkrut, dan yang tersisa cuma spaghetti code buatan AI sebanyak 80%, kita lihat saja siapa yang tertawa
Saya malah merasa PHP 15 tahun lalu lebih baik daripada lingkungan full-stack JS/TS masa kini
PHP masih hidup dan terus berkembang. Tooling LLM pada akhirnya juga akan menjadi alat dasar seperti itu
Batas antara BA, PO, QA, dan SWE makin kabur. Kini muncul peran hibrida yang berada di tengah antara bisnis dan pengembangan
Sekarang rasanya orang memakai agen cuma demi bisa bilang mereka memakainya
Saya sendiri hanya menjalankan dua agen, satu untuk menulis dan satu untuk review, dan itu saja sudah cukup memberi produktivitas 5–7x
Saya menghabiskan lebih banyak waktu untuk meninjau spesifikasi, sementara coding diselesaikan agen dalam 10–30 menit, jadi tidak ada yang perlu diburu
Besok juga pekerjaan masih ada, jadi tidak ada alasan harus menjalankannya semalaman
Dari sudut pandang pelanggan, tidak banyak bedanya apakah bug datang dari India, San Francisco, atau AI
Ini jauh lebih terkendali dibanding ‘orkestrasi agen’ yang sedang populer
Karena itu saya membuat sendiri skill verify untuk memastikan Claude benar-benar mengikuti spesifikasi
Jika Claude diminta memakai pola red-green-refactor, kualitas test memang naik secara nyata
Lebih jauh lagi, membuat subagen red/green/refactor yang saling memverifikasi juga bekerja cukup baik
Kuncinya adalah jangan mencampur konteks
Reward hacking itu nyata dan sulit dicegah
Meski merujuk ke panduan ini, masalah test buruk tetap besar
Hasilnya bagus, jadi saya membagikan prinsip dan contoh serta starter repo
Pemisahan antara penulis dan validator itu penting, dan bahkan dengan model yang sama kualitas naik jika konteksnya dipisahkan
Dengan batas konteks LLM saat ini, agen sungguhan masih belum mungkin
Di kode lebih dari 500 baris, error meningkat tajam, dan sekitar 200 baris sudah menjadi batas praktis
Pada akhirnya LLM hanyalah alat yang harus dipakai berulang-ulang seperti kalkulator
Saya menyebut fenomena ini sebagai “Test Theatre”
Saya menulis tentangnya di sini. Ini sesuatu yang harus dihindari secara aktif
Test yang baik harus memverifikasi pola desain dan dependensi, serta membantu debugging
Misalnya dengan Schemathesis untuk memverifikasi secara otomatis hak akses pengguna atau ada tidaknya respons 5xx
POC terkait saya unggah di sini
Belakangan ini saya sedang bereksperimen dengan orkestrasi agen
Intinya adalah mengurangi pemanggilan LLM dan menghubungkannya lewat pipeline skrip deterministik
Rinciannya saya tulis dalam artikel ini
Seperti catatan eksperimen ini, skrip lebih menjadi inti daripada LLM
Saya menjalankan 6 agen untuk operasional bisnis
Mereka menangani berbagai peran seperti riset pasar, penulisan konten, dan skrip video
“Menjalankannya semalaman” itu konsep yang dilebih-lebihkan; dalam praktiknya yang efektif justru tujuan yang jelas dan cakupan sempit
Bottleneck yang sebenarnya bukan eksekusi, melainkan manajemen konteks
Saya tidak paham sebenarnya orang ini sedang membuat apa
Di LinkedIn yang terlihat hanya tulisan tentang Claude
Untuk bisnis yang benar-benar serius, hal seperti ini bahkan sulit dibayangkan
Pada akhirnya kode itu cuma menganggur sementara mereka sibuk mencari cara menjualnya
Ini sama seperti saat mempekerjakan orang yang hanya menulis test
Pada akhirnya yang dipastikan cuma “kode berjalan sesuai kodenya”
Pendefinisian spesifikasi yang jelas jauh lebih penting
Mengejutkan bahwa bidang rekayasa lain tidak terus mengulangi kesalahan ini, sementara software justru sangat sering
Bahkan jika rilis awal salah, setidaknya ia menjamin perilaku berikutnya tidak berubah
Banyak perusahaan konsultan bekerja dengan verifikasi berbasis acceptance criteria
AI saat ini bukan lagi alat bantu pengembangan, tetapi sudah sampai pada tingkat menggantikan developer
Fakta bahwa kita tidak lagi bisa mengendalikan atau memverifikasi kode adalah masalah serius
Ini terasa bukan seperti cara pengembangan baru, melainkan pergeseran yang nyaris religius, bergantung pada kepercayaan alih-alih pemahaman
Meski otonominya rendah, saya hanya akan merge kode yang bisa diverifikasi