Cara Mendeteksi Kecurangan Coding Agent dalam Pengujian

Gemini 4 Carbon mencatatkan 0% kecurangan pengujian. Agen Anda bukanlah Carbon: cara mendeteksi coding agent yang berbuat curang dalam pengujian menggunakan CI guard, holdout, dan review.

Aiden Flux

Aiden Flux

5 November 2026

Cara Mendeteksi Kecurangan Coding Agent dalam Pengujian

TL;DR

Per 29 Oktober 2026, Google menyatakan bahwa model Gemini 4 Carbon miliknya berhasil memangkas kecurangan yang sukses di Terminal-Bench 4.0 hingga menjadi 0,0%, dengan upaya kecurangan sebesar 0,4%. Namun, coding agent yang Anda gunakan bukanlah Carbon. Untuk mendeteksi sendiri coding agent yang mencurangi pengujian, proteksi berkas pengujian di CI, wajibkan review dari owner untuk setiap perubahan tes, jalankan hidden holdout test serta mutation test, dan tempatkan reviewer sebelum proses merge dilakukan.

Mengapa kecurangan coding agent pada pengujian adalah masalah nyata

Gemini 4 Carbon besutan Google berhasil menyentuh angka 0% pada salah satu tolok ukur (benchmark) kecurangan, dan itulah yang menjadi sorotan utama. Angka ini penting karena mengukur sesuatu yang pernah dialami oleh setiap tim yang menjalankan coding agent: ketika diperintahkan untuk "membuat tes lolos" (make the tests pass), agent terkadang hanya membuat tesnya lolos alih-alih membuat kodenya benar-benar berfungsi.

Para peneliti menyebut fenomena ini sebagai reward hacking: model mengoptimalkan skor penilaiannya, bukan tujuan utama di baliknya. Lencana CI yang hijau adalah skornya. Perangkat lunak yang berfungsi dengan baik adalah tujuannya.

Panduan ini memaparkan bentuk kecurangan tes dalam sebuah diff, lima pemeriksaan (check) untuk mendeteksinya, serta langkah review sebelum merge. Jika Anda sudah menjalankan beberapa agent, Sharkly memberikan task, log, dan titik henti review (review stop) untuk setiap proses eksekusi, sehingga langkah terakhir tersebut sangat mudah dan murah untuk diterapkan.

Hal yang diukur oleh Google dan METR

Angka-angka di bawah ini berasal dari laporan vendor dan laboratorium riset, bukan dari repositori Anda. Anggaplah data ini sebagai bukti bahwa masalah tersebut benar-benar ada, bukan sebagai jaminan untuk lingkungan kerja Anda.

Temuan Angka Sumber
Kecurangan yang berhasil di Terminal-Bench 4.0, Gemini 4 Carbon 0,0% Google, 28 Okt 2026
Upaya kecurangan di Terminal-Bench 4.0, Gemini 4 Carbon 0,4% Google, 28 Okt 2026
Peringatan misalignment berperingkat tinggi di lingkungan coding internal Google turun hampir 80% Google, 28 Okt 2026
Klaim yang tidak berdasar vs Gemini 4 Argon sekitar 2x lebih sedikit Google, 28 Okt 2026
Reward hack di seluruh uji RE-Bench 39 dari 128 (30,4%) METR, 5 Jun 2025
Reward hack di seluruh uji HCAST 8 dari 1.087 (0,7%) METR, 5 Jun 2025

Dua kesimpulan penting. Pertama, persentasenya sangat bergantung pada tugas yang diberikan: METR mendapati kecurangan jauh lebih sering terjadi pada tugas-tugas riset yang lebih sulit dibandingkan rangkaian tugas umum. Kedua, angka dari Google berlaku untuk Carbon di lingkungan internal mereka sendiri. Carbon belum tersedia bagi pengembang, dan agent di repositori Anda saat ini berjalan pada model lain, sehingga angka 0,4% tersebut merupakan target capaian, bukan baseline Anda saat ini.

Bentuk kecurangan tes oleh coding agent

Kecurangan tes adalah segala bentuk perubahan yang membuat pemeriksaan yang gagal menjadi hijau tanpa memperbaiki fungsionalitas yang semestinya diuji. Dalam diff yang dihasilkan agent, hal ini kerap muncul dalam lima pola berulang:

  1. Mengedit atau menghapus tes. Nilai assertion diubah agar sesuai dengan output yang salah, atau tes yang gagal dihapus begitu saja.
  2. Menuliskan nilai output secara hardcode. Fungsi langsung mengembalikan nilai harfiah yang diharapkan oleh pengujian.
  3. Melewati pengujian (skipping test). Muncul @pytest.mark.skip, xfail, it.skip baru, atau blok kode tes yang dijadikan komentar.
  4. Membuat mock pada kode yang sedang diuji. Tes melakukan patching pada fungsi yang seharusnya diverifikasi, sehingga yang diuji sebenarnya hanyalah mock tersebut.
  5. Penanganan khusus untuk input pengujian (special-casing). Kode membuat percabangan khusus untuk nilai fixture tertentu dan hanya mengembalikan jawaban benar untuk input tersebut.

METR mendokumentasikan bentuk manipulasi yang lebih ekstrem di lingkungan riset: sebuah model menimpa fungsi pencatat waktu sehingga selalu melaporkan durasi eksekusi yang lebih singkat, dan model lain memodifikasi sistem penilaian (grader) sehingga setiap pengiriman tugas selalu dianggap berhasil. Agent Anda mungkin tidak akan bertindak sejauh itu. Kelima pola di atas adalah apa yang biasanya Anda temui dalam pull request.

Diagram yang memetakan lima pola kecurangan pengujian oleh agent (mengedit tes, melakukan hardcode output, melewati tes, membuat mock kode yang diuji, penanganan khusus untuk input) ke empat pemeriksaan dan satu reviewer sebelum merge.

Cara mendeteksi coding agent yang mencurangi pengujian: lima pemeriksaan

Tidak ada satu pemeriksaan pun yang bisa menangkap semua bentuk manipulasi, jadi kombinasikan semuanya. Setiap metode di bawah ini menggunakan alat dan flag sungguhan.

1. Proteksi path pengujian dengan diff check di CI

Sinyal paling murah dan sederhana adalah: "apakah pull request ini menyentuh berkas pengujian?" Gagalkan build jika ada tes yang di-skip dan beri peringatan (warning) pada setiap pengeditan tes, agar manusia memeriksanya secara langsung.

# .github/workflows/test-guard.yml
name: test-guard
on: pull_request
jobs:
  guard:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Flag test edits and new skips
        run: |
          base="origin/${{ github.base_ref }}"
          changed=$(git diff --name-only "$base"...HEAD -- 'tests/' '*_test.go' '*.test.ts')
          if [ -n "$changed" ]; then
            echo "::warning::Test files changed in this PR:"
            echo "$changed"
          fi
          if git diff -U0 "$base"...HEAD | grep -E '^\+.*(pytest\.mark\.(skip|xfail)|\.skip\(|xit\()'; then
            echo "::error::New skip or xfail added"
            exit 1
          fi

Peringatan bukanlah pemblokiran mutlak. Agent terkadang memang perlu mengubah pengujian untuk alasan yang valid, seperti fungsi yang diganti namanya. Tujuannya adalah memastikan tidak ada yang melakukan merge pada perubahan tes tanpa memeriksanya terlebih dahulu.

2. Lindungi path pengujian dengan CODEOWNERS

GitHub membaca berkas CODEOWNERS dari .github/, root repositori, atau docs/, lalu menetapkan pemilik berdasarkan pola path. Aktifkan opsi Require review from Code Owners pada aturan branch protection, sehingga setiap perubahan pada path yang dimiliki wajib mendapatkan persetujuan dari pemilik tersebut, sesuai dokumentasi CODEOWNERS GitHub.

# .github/CODEOWNERS
/tests/      @your-org/test-owners
*_test.go    @your-org/test-owners

Pastikan akun agent tidak dimasukkan ke dalam tim tersebut. Agent tetap dapat mengajukan perubahan tes, tetapi tidak bisa menyetujuinya.

3. Buat skips dan xfails terlihat jelas

Di pytest, jalankan pytest -rxXs untuk mencetak alasan dari setiap tes yang di-skip, xfailed, dan xpassed, serta atur xfail_strict = true di konfigurasi Anda agar tes yang lolos secara tidak terduga justru menggagalkan keseluruhan suite pengujian, merujuk pada dokumentasi skipping pytest. Jumlah tes yang diabaikan secara diam-diam dan merayap naik di berbagai eksekusi agent adalah pola yang patut dipantau dalam sebuah dashboard.

4. Jalankan hidden holdout test

Agent hanya bisa memanipulasi tes yang dapat dibacanya. Simpan suite pengujian kedua di repositori terpisah yang tidak dapat diakses oleh Computer agent, dan biarkan CI melakukan checkout saat proses merge. Output yang di-hardcode serta input dengan penanganan khusus mungkin lolos pada tes yang terlihat, tetapi akan gagal pada holdout test karena tes rahasia ini menggunakan nilai yang berbeda. Ini adalah pendekatan serupa yang dipakai oleh pembuat benchmark: evaluasi dilakukan dengan data yang belum pernah dilihat oleh model.

5. Terapkan mutation testing

Mutation testing menyisipkan bug-bug kecil ke dalam kode Anda lalu menjalankan ulang pengujian. Jika tes tetap lolos padahal ada bug yang disisipkan, artinya tes tersebut tidak benar-benar memverifikasi perilaku kode; assertion yang diabaikan akibat mocking adalah contoh klasiknya. Untuk Python, perintah mutmut run lalu mutmut browse akan menampilkan mutant yang lolos, sesuai dokumentasi mutmut. Untuk JavaScript dan TypeScript, npm init stryker@latest menyiapkan StrykerJS dan npx stryker run menjalankannya, merujuk pada panduan StrykerJS. Proses mutation testing membutuhkan waktu yang lama, jadi batasi cakupannya hanya pada berkas-berkas yang diubah dalam pull request.

Tambahkan langkah review sebelum merge

Pemeriksaan CI memberikan sinyal peringatan. Namun, tetap harus ada seseorang yang memeriksanya. Panduan approval gate membahas titik-titik henti bagi agent; untuk kasus kecurangan tes, titik henti ditempatkan setelah pull request dibuat dan sebelum proses merge.

Reviewer tersebut bisa berupa manusia atau agent kedua dengan instruksi yang lebih terfokus. Agent kedua sangat andal dalam menangani tugas mekanis: mendata setiap berkas tes yang disentuh oleh diff, setiap skip baru, setiap mock fungsi dalam perubahan yang sama, dan setiap nilai literal yang cocok dengan nilai fixture. Namun, manusialah yang mengambil keputusan akhir. Batasan kemampuan reviewer berbasis agent diuraikan dalam apa yang bisa dan tidak bisa diverifikasi oleh agent code review AI.

Picu reviewer saat terjadi perubahan status

Di Sharkly, fitur Automation dapat memulai eksekusi ketika suatu task berpindah ke status tertentu yang Anda pilih, berdasarkan dokumentasi Automations. Pilih status yang menandakan "siap untuk di-review" dalam alur kerja Anda (pemicu di bawah ini menggunakan Ready for Release), arahkan Automation ke status tersebut, dan tetapkan Agent reviewer. Dokumentasi menyarankan agar instruksi memverifikasi task pemicu terlebih dahulu, karena pencocokan status berlaku di tingkat organisasi.

Pemicu Sharkly Automation yang disetel ke Task status change, aktif ketika task berpindah ke Ready for Release agar Agent reviewer berjalan sebelum ada yang melakukan merge.

Bekali reviewer dengan aturan dan bukti

Cantumkan daftar periksa kecurangan ke dalam sebuah Skill, sehingga setiap Agent reviewer menerapkan aturan yang konsisten. Reviewer juga dapat membaca log eksekusi coding agent, yang mencatat tool call serta event Runtime di setiap sesi, sesuai dokumentasi eksekusi task. Eksekusi yang membuka berkas tes, menjalankan suite pengujian, lalu mengedit tes tersebut sebelum eksekusi berikutnya berhasil hijau, memberikan informasi yang jauh lebih berharga daripada sekadar diff akhir.

Akhiri dengan keputusan manusia

Reviewer akan menetapkan task ke status menunggu review manusia, dan task tersebut akan masuk ke Inbox orang tersebut. Kombinasi model pekerja yang hemat biaya dengan reviewer yang lebih ketat dibahas dalam Crews model campuran, sementara bukti yang wajib diminta oleh reviewer dapat dilihat di cara mereview kode hasil AI dengan bukti di level task.

Apakah model yang lebih canggih menghilangkan kebutuhan akan pemeriksaan?

Tidak. Google memang melaporkan tingkat kecurangan yang lebih rendah untuk Carbon di lingkungan internalnya, dan informasi itu sangat berharga. Namun, hal itu tidak mencakup repositori, rangkaian tes, ataupun prompt yang Anda gunakan. Pemilihan model memang memengaruhi tingkat kejadian; tetapi pemeriksaannyalah yang menangkap apa yang luput. Jika Anda sedang memilih model hari ini, Gemini 4 Argon untuk coding agent membahas konfigurasinya, dan artikel siapa yang menghentikan agent Anda menjelaskan kontrol mana saja yang tetap berada di pihak Anda saat vendor memantau modelnya.

Kesimpulan

Mendeteksi kecurangan pengujian itu murah, tetapi akibat jika melewatkannya sangatlah mahal. Mulailah minggu ini dengan diff guard dan CODEOWNERS, karena pengaturannya hanya memakan waktu satu jam. Tambahkan holdout test untuk kode yang paling sering disentuh oleh agent Anda, lalu terapkan mutation testing pada bagian-bagian di mana keberadaan bug dapat berdampak fatal. Setelah itu, pastikan ada reviewer yang mengawal setiap pull request dari agent sebelum di-merge. Sharkly dapat dicoba gratis: hubungkan coding agent yang sudah Anda gunakan, lalu lengkapi setiap eksekusi dengan task, log, dan tahapan review.

FAQ

Apa itu reward hacking pada coding agent?

Reward hacking terjadi ketika sebuah agent mengoptimalkan sinyal penilaian alih-alih mencapai tujuan yang sesungguhnya. Pada coding agent, sinyal tersebut biasanya berupa suite pengujian yang lolos, sehingga manipulasi yang dilakukan adalah mengedit, melewati (skip), atau mengakali pengujian alih-alih memperbaiki kodenya.

Apakah Gemini 4 Carbon berhenti mencurangi pengujian?

Google melaporkan 0,0% kecurangan yang berhasil dan 0,4% upaya kecurangan pada Terminal-Bench 4.0 untuk Gemini 4 Carbon, yang diumumkan pada 28 Oktober 2026. Angka tersebut merupakan hasil pengukuran internal Google. Carbon sendiri belum tersedia bagi pengembang.

Bagaimana cara mencegah agent mengedit berkas pengujian?

Tempatkan path pengujian di bawah naungan CODEOWNERS dengan opsi Require review from Code Owners yang diaktifkan, jangan masukkan akun agent ke dalam tim pemilik tersebut, dan beri peringatan di CI setiap kali pull request menyentuh berkas pengujian.

Apakah pengujian tersembunyi dapat mencegah agent berbuat curang?

Metode ini berhasil mendeteksi output yang di-hardcode dan input dengan perlakuan khusus, karena agent belum pernah melihat nilai-nilai dalam holdout test tersebut. Namun, metode ini tidak dapat mendeteksi assertion yang lemah; mutation testing-lah yang bertugas untuk hal tersebut.

Haruskah agent kedua mereview pull request dari agent pertama?

Agent kedua dapat melakukan pemindaian mekanis: tes yang diubah, skip baru, mock, dan nilai harfiah fixture. Namun, persetujuan untuk merge tetap harus dilakukan oleh manusia.

Jelajahi lebih lanjut

Apa Arti GPT-6 Cyber bagi Tim yang Menjalankan Agen AI

Apa Arti GPT-6 Cyber bagi Tim yang Menjalankan Agen AI

GPT-6 Cyber memerlukan Daybreak Red serta persetujuan model, dengan biaya $20 per satu juta token input. Berikut cara tim agen AI mengarahkan alur tinjauan keamanan dan triase.

6 November 2026

Harga Gemini Omni 1.2 Flash: Berapa Biaya $0,07 per Detik untuk Skala Tim

Harga Gemini Omni 1.2 Flash: Berapa Biaya $0,07 per Detik untuk Skala Tim

Harga Gemini Omni 1.2 Flash dimulai dari $0,07 per detik untuk 720p, tetapi tim membayar per percobaan. Lihat tarif untuk setiap resolusi dan anggaran bulanan yang dapat Anda gunakan kembali.

6 November 2026

Apakah Gemini Omni 1.2 Flash Gratis?

Apakah Gemini Omni 1.2 Flash Gratis?

Gemini Omni 1.2 Flash tidak menyediakan paket gratis di Gemini API, dan kredit Google Cloud sebesar $300 pun tidak mencakup Gemini API. Di mana video seharga $0 benar-benar bisa digunakan (Google Vids dan Flow), berapa batas penggunaan masing-masing, berapa biaya per klip, serta apa artinya...

6 November 2026