Skip to content

Token AI Saya Bocor dari Snapshot Browser, Bukan dari Tesnya

Adityo Guni Waluyo

Saya kira tesnya yang mahal. Ternyata tiap klik di agent browser mengembalikan satu snapshot accessibility tree, dan konteks habis di situ.

Ringkasan

Saya punya masalah dengan QA. Saya tidak perlu biaya token tinggi. Saya ubah cara kerja agent.

Loop QA-nya sudah jalan empat puluh menit dan tiap kali saya klik, agent mengembalikan satu snapshot accessibility tree yang baru. Sesi itu membengkak, konteks penuh, dan saya berhenti di tengah jalan karena jawaban model makin pendek dan makin generik. Tebakan pertama saya: test-nya terlalu berat, mungkin terlalu banyak kasus, mungkin butuh parallel worker tambahan.

Tebakan itu salah. Tesnya sendiri tidak berjalan lama, reporter-nya saja butuh beberapa detik. Yang mahal justru cara saya mengawasi jalannya tes, dan pengawasan itu ternyata jalan di dalam konteks yang sama dengan percakapan.

Snapshot di Setiap Aksi

Playwright MCP bekerja lewat "structured accessibility snapshots, bypassing the need for screenshots or visually-tuned models" [1]. Saya memakainya karena memang itu yang saya mau: agent membaca struktur halaman, bukan menebak piksel. Yang tidak saya perhitungkan, snapshot itu dikembalikan pada setiap aksi. Sepuluh klik berarti sepuluh snapshot masuk ke konteks yang sama, jadi biaya mengikuti jumlah aksi, bukan jumlah tes yang saya jalankan.

Playwright sendiri sudah menandai ini. Di README-nya, untuk coding agent mereka menawarkan jalur CLI + skill dengan alasan yang lugas: invokasi CLI "more token-efficient: they avoid loading large tool schemas and verbose accessibility trees into the model context" [1]. Jalur MCP tetap mereka pertahankan untuk kasus "where maintaining continuous browser context outweighs token cost concerns" [1], artinya bukan MCP-nya yang salah, tapi pemakaiannya tanpa rem.

Opini saya tegas: kanal pengamatan itu pilihan arsitektur, bukan detail implementasi. Kalau agent harus melihat layar setiap kali tes berjalan, biayanya ikut terbawa ke setiap iterasi, dan yang habis bukan modelnya melainkan perhatian yang saya izinkan masuk.

Empat Aturan yang Saya Pakai

Perubahan pertama soal regression test. Test berulang saya jalankan lewat file spec dari shell, bukan lewat browser agent. Yang masuk ke konteks hanya output reporter: pass/fail dan diff kegagalan. Vitest sudah membantu di sini tanpa saya suruh, konfigurasi defaultnya memilih reporter minimal "when Vitest detects an AI coding agent" [2]. Untuk mode yang lebih tenang lagi ada dot: "Prints a single dot for each completed test to provide minimal output while still showing all tests that have run" [2], dan reporter json-nya menulis ke .vitest/json/output.json alih-alih menumpahkan laporan ke stdout [2].

Untuk Go saya pakai go test tanpa -v, dan tail untuk output panjang.

Kedua, loop eksplorasi browser yang panjang pindah ke subagent. Claude Code menjelaskan subagen sebagai sesuatu yang "runs in its own context window with a custom system prompt, specific tool access, and independent permissions" [4], dan tugas berat "does that work in its own context and returns only the summary" [4]. Snapshot besar mati bersama konteks subagen; ke controller hanya balik verdict, temuan, dan path bukti.

Ketiga, bukti hidup di file. Screenshot dan laporan disimpan di disk dengan path relatif yang bisa diklik dari laporan QA. Tidak ada gambar yang di-inline ke percakapan, konteks dibaca sekali saat dibutuhkan, bukan disimpan selama sisa sesi.

Keempat, bukti dikumpulkan saat berguna, bukan setiap kali. Konfigurasi Playwright yang saya pakai menaruh trace hanya di retry, lengkap dengan komentar bawaannya sendiri: "Collect trace when retrying the failed test" lewat trace: 'on-first-retry' [3].

use: {
  // Collect trace when retrying the failed test.
  trace: 'on-first-retry',
}

Empat aturan itu terdengar sepele sampai saya jalankan ulang siklus QA yang sama. Sesi yang biasanya habis di tengah jalan kini selesai, dan sisa konteks controller masih cukup untuk membaca temuan, menimbang mana yang bug asli dan mana yang cuma test yang rapuh.

Keputusan yang Saya Ambil

Saya memutuskan berhenti membiarkan agent menyaksikan semuanya. Agent membaca hasil, bukan layar; yang memang harus melihat halaman adalah tes yang didesain untuk itu, dan manusia saat membuka trace. Sejak aturan itu masuk, yang berubah bukan cuma tagihan token, diskusi QA saya jadi soal temuan, bukan soal konteks yang habis sebelum temuan sempat dibaca.

Sumber:

Sources

Artikel terkait