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.
AIDive