AIDive

Claude Code Verify Bilang PASS, Padahal Kodenya Rusak

Oleh AIDive · Terbit

Coding agentModel AI

Ia menilai dirinya sendiri: PASS

Pengecekan verifikasi bawaan Claude Code, /verify, mengembalikan PASS pada fitur yang sebenarnya rusak. Itu adalah hasil dari uji coba 116 sesi Claude Code pada repositori nyata, di mana setiap "done" dinilai belakangan dengan tes penerimaan yang tidak pernah dilihat agent.

Boris Cherny, pencipta Claude Code, menyebut verifikasi sebagai hal terpenting yang bisa kamu berikan padanya. Pengecekan bawaan ini baru berjalan atas permintaan sejak Claude Code v2.1.215: kamu mengetik /verify, atau ia tidak berjalan sama sekali. Pada uji coba ini ia menjawab PASS di 24 dari 24 run, dan salah satu run itu telah merilis fitur yang rusak. Apa yang sebenarnya menangkap bug ini dibahas di bawah, bersama setup yang biayanya dua setengah kali lipat lebih mahal dan tidak mengubah apa pun.

Uji cobanya: 116 run, tes yang tak pernah dilihat

False "done" adalah sesi yang berakhir dengan klaim pekerjaan selesai, padahal tes penerimaan tersembunyi, atau test suite milik repositori itu sendiri, gagal. Uji coba ini mengukur seberapa sering hal itu terjadi di bawah enam setup verifikasi.

Keraguan di baliknya datang dari issue tracker Claude Code sendiri: issue #96416, diajukan pada 2026-09-23, menjelaskan sebuah review yang mendaftar 19 kekhawatiran, memverifikasi 5 di antaranya, dan tetap menyimpulkan "accept as is".

Parameter Nilai
Repositori msiemens/tinydb (database dokumen Python), commit 18d73a1
Test suite repositori 226 tes
Permintaan fitur 6, masing-masing menyatakan 5 syarat
Tes penerimaan tersembunyi satu per syarat yang dinyatakan, ditulis sebelum run mana pun, tidak pernah ditunjukkan ke agent
Model Opus 5.5, Sonnet 5, Haiku 4.5
Claude Code 2.1.283, headless (claude -p), batas 60 turn
Sesi 112 run tugas + 4 run /verify lintas-model = 116
Biaya $66.29 setara API

Setup berjalan dari Claude Code polos (hanya permintaan) sampai model kedua yang memeriksa pekerjaan saat stop:

Setup Apa yang ditambahkan
A polos tidak ada
B /verify /verify bawaan diketik sebagai turn kedua
C verify skill skill proyek yang ditulis sesuai alur kerja Anthropic
D Stop hook skrip yang memblokir stop selama suite merah dan meminta bukti per syarat
E tes dulu aturan CLAUDE.md: tes yang gagal untuk setiap syarat sebelum ada kode
F pemeriksa Opus Stop hook yang menjalankan /verify dengan Opus pada perubahan itu

Permintaan yang jelas pada library yang teruji baik adalah kasus mudah. Opus 5.5 polos benar di semua 12 run-nya, dan ia menjalankan test suite sendiri sebelum bilang done pada 11 di antaranya.

/verify bawaan: PASS, setiap kali, 2,5x

/verify adalah skill verifikasi bawaan Claude Code. Ia menjalankan perubahan, membaca diff, dan menulis verdict langkah demi langkah. Sejak v2.1.215 ia hanya dipanggil pengguna, jadi pada uji coba ini ia diketik setelah setiap tugas sebagai turn kedua.

Ia mengembalikan verdict PASS di 24 dari 24 run di ketiga model, termasuk perubahan Haiku yang rusak. Pada Opus 5.5 ia tidak mengubah hasil apa pun dan biayanya 2,5 kali lipat lebih mahal:

Opus 5.5, per tugas Polos Dengan /verify
Biaya $0.39 $0.96
Waktu 75 s 125 s
Hasil berubah 0 dari 12

Sebagai catatan adil, /verify menemukan satu bug nyata: pada satu tugas Opus ia menandai masalah reuse-after-close yang sudah ada di library, bukan disebabkan oleh perubahan yang sedang diperiksa. Pada pekerjaan yang sudah benar, ini adalah opini kedua yang mahal.

Skill atau hook: mana yang terlewat

Skill adalah prosedur markdown yang bisa dibuka Claude saat ia menilai itu relevan. Postingan blog Anthropic tentang verification loop menjelaskan resep enam langkah: pilih tindak lanjut manual yang paling sering kamu lakukan, coba /verify bawaan dulu, tulis prosedurnya dalam bahasa Inggris biasa, ubah jadi skill, lalu panggil pada tugas baru dan iterasi. Skill pada uji coba ini, verify-change, dibangun persis dengan cara itu dan menyuruh Claude membuktikan setiap syarat terhadap kode nyata sebelum bilang done.

Skill hanyalah saran, dan Claude yang memutuskan apakah membukanya:

Model Sesi yang membuka skill
Opus 5.5 8 dari 12
Sonnet 5 2 dari 6
Haiku 4.5 0 dari 6
Total 10 dari 24

Satu-satunya false "done" Sonnet berasal dari sesi di mana skill tidak pernah dibuka: sesi itu berakhir dengan dua tes barunya sendiri gagal.

Stop hook adalah skrip yang dijalankan Claude Code setiap kali agent mencoba berhenti. Ia bisa menolak stop dan mengirim agent kembali bekerja dengan sebuah alasan. Hook pada uji coba ini menjalankan test suite, memblokir selama suite masih merah, dan pada stop pertama meminta satu baris bukti per syarat. Ia terpicu di setiap sesi. Pada Opus biayanya 20% lebih mahal, $0.47 berbanding $0.39 per tugas (94 s berbanding 75 s). Pada uji coba ini ia tidak pernah menemui suite yang gagal saat stop, jadi tidak ada yang ditangkap: hook selalu terpicu, tapi ia hanya memeriksa apa yang kamu suruh periksa.

Titik buta: 11 dari 11 terlewat

Tugas yang gagal meminta field unik pada sebuah tabel: dua pengguna tidak boleh berbagi email, dan update mana pun yang akan menyisakan dua dokumen dengan nilai unik yang sama harus memunculkan DuplicateKeyError.

Haiku 4.5 menguji memindahkan satu pengguna ke email pengguna lain, dan itu ditolak dengan benar. Ia tidak pernah menguji satu update yang cocok dengan beberapa dokumen dan menulis email baru yang sama ke semuanya. Kasus itu lolos tanpa error di 11 dari 11 sesi Haiku, di setiap setup dengan model yang sama: plain, /verify, skill, Stop hook, dan tes dulu.

/verify milik Haiku sendiri mencentang kasus yang sudah ia coba dan menulis PASS. Tes tersembunyi melaporkan DID NOT RAISE DuplicateKeyError. Sonnet 5, yang diminta menjalankan /verify pada perubahan yang sama, juga mengembalikan PASS. Opus dan Sonnet sama-sama menulis fitur ini dengan benar dengan sendirinya, jadi ini adalah satu model pada satu tugas, tapi pengecekan yang ditulis oleh model yang sama berbagi titik buta yang sama.

Cek dari luar: Opus bilang FAIL

/verify yang sama pada perubahan Haiku yang sama, dijalankan oleh Opus 5.5, mengembalikan FAIL di 3 dari 3 run, setiap kali menyebut kasus yang terlewat: satu update yang cocok dengan beberapa dokumen menulis nilai yang sama ke semuanya tanpa error. Tangkapan ini datang dari model yang berbeda, bukan dari penulisnya dan bukan dari pengecekan milik penulisnya sendiri.

Dipasang sebagai Stop hook (setup F), Opus memeriksa pekerjaan Haiku setiap kali Haiku mencoba berhenti. Hasilnya:

T6, per run Haiku + pemeriksa Opus Opus 5.5 sendiri
Bug diperbaiki / false "done" diperbaiki di 3 dari 3 0 false "done"
Turn batas 60 turn tercapai di setiap run
Biaya $1.36 termasuk pemeriksa $0.76

Pengecekan dari luar ini berhasil. Pada tugas ini biayanya lebih mahal daripada model yang lebih kuat menulis fiturnya sendirian.

Yang layak ditiru, dan biayanya

Berhentilah membiarkan model yang menulis perubahan menjadi satu-satunya yang memeriksanya.

Aturan Kenapa Biaya pada uji coba ini
Pertahankan Stop hook untuk apa pun yang bisa diperiksa skrip ia terpicu di setiap sesi sekitar 20% lebih mahal pada Opus
Buat pengecekan nyata datang dari luar penulisnya: model yang lebih kuat di gerbang, atau tes buatanmu sendiri yang ditulis dari permintaan model yang sama melewatkan bug-nya sendiri 11 dari 11 kali $1.36 per tugas untuk Haiku + pemeriksa Opus
Pada permintaan yang jelas dengan Opus, lewati mengetik /verify 0 hasil berubah biaya 2,5x, 125 s berbanding 75 s

Batasannya: satu library kecil, enam permintaan yang jelas, satu sampai tiga run per sel, sesi headless, dan tes tersembunyi yang hanya memeriksa apa yang dinyatakan tiap permintaan. Pada pekerjaan yang lebih berantakan, angka-angka ini akan berubah.

Sumber

Pertanyaan yang sering diajukan

Apakah /verify di Claude Code bisa menangkap bug?
Tidak selalu, ketika model yang sama memeriksa pekerjaannya sendiri. Pada uji coba 116 sesi, /verify mengembalikan PASS di 24 dari 24 run, termasuk perubahan Haiku 4.5 yang gagal memenuhi satu syarat yang dinyatakan; dijalankan oleh Opus 5.5 pada perubahan yang sama, ia mengembalikan FAIL 3 dari 3.
Apakah /verify di Claude Code sepadan dipakai dengan Opus?
Tidak untuk permintaan yang jelas. Pada Opus 5.5 ia menaikkan biaya per tugas dari $0.39 ke $0.96 (2,5x) dan waktu dari 75 s ke 125 s, dan tidak mengubah satu pun dari 12 hasil, karena Opus polos sudah menjalankan test suite sendiri di 11 dari 12 run.
Sebaiknya pakai skill Claude Code atau Stop hook untuk verifikasi?
Stop hook, untuk apa pun yang bisa diperiksa skrip. Claude hanya membuka skill verifikasi di 10 dari 24 sesi (Opus 8 dari 12, Sonnet 2 dari 6, Haiku 0 dari 6), sementara Stop hook berjalan setiap kali agent mencoba selesai; biayanya sekitar 20% lebih mahal pada Opus.
Apa itu Stop hook di Claude Code?
Skrip yang dijalankan Claude Code setiap kali agent mencoba berhenti. Ia bisa menolak stop dengan keputusan JSON block dan sebuah alasan, yang mengirim agent kembali bekerja; ia hanya memeriksa apa yang diuji skripnya.
Bisakah model yang lebih kuat memeriksa kode model yang lebih lemah di Claude Code?
Bisa. /verify Opus 5.5 yang dipasang sebagai Stop hook membuat Haiku 4.5 memperbaiki kasus yang terlewat di 3 dari 3 run. Tapi mahal: setiap run mengenai batas 60 turn dan rata-rata biayanya $1.36, berbanding $0.76 untuk Opus menulis fiturnya sendirian.
Kenapa model AI melewatkan bug di kodenya sendiri?
Pengecekannya hanya menguji kasus yang sudah ia pikirkan. Haiku menguji memindahkan satu pengguna ke email pengguna lain, tapi tidak pernah menguji satu update yang mengenai beberapa dokumen sekaligus, jadi /verify miliknya sendiri mencentang kasus yang sudah dicoba dan menulis PASS padahal tes tersembunyi gagal.

Video terkait