Sebuah ekstensi peramban yang dirancang untuk menyimpan percakapan dari layanan kecerdasan buatan tampak berfungsi normal di mata pengguna. Mereka bisa membuka kembali obrolan yang disimpan dan membaca semua pertanyaan yang telah diketik. Yang membingungkan, tidak ada satupun balasan dari asisten AI muncul di file tersebut. Separuh dialog hilang, namun hilang dengan rapi tanpa pesan error maupun layar biru.
Pengembang ekstensi tersebut, yang membangun proyek bernama NotebookBloom secara terbuka, menghabiskan satu hari penuh untuk melacak cacat ini. Meski jumlah pengguna masih nol dan pendapatan nol dolar, ia bertekad memperbaiki alatnya karena bug berjenis ini adalah yang paling berbahaya: sistem terlihat sukses padahal menyimpan data yang salah.
Ekstensi itu bekerja dengan cara membaca halaman obrolan AI, mencakup ChatGPT, Claude, Gemini, hingga Perplexity, kemudian menarik teks percakapan untuk disimpan secara lokal. Tidak ada satupun platform yang menyediakan antarmuka pemrograman aplikasi (API) resmi untuk mengekspor riwayat obrolan ke pihak ketiga. Akibatnya, pengembang harus mengandalkan pembacaan kode HTML mentah dan berburu selektor CSS yang membungkus tiap pesan.
Masalahnya, selektor tersebut tidak pernah didokumentasikan karena memang tidak ditujukan untuk konsumsi eksternal. Setiap kali situs melakukan perombakan tampilan, nama kelas atau atribut berubah tanpa pemberitahuan. Sang pengembang mengakui beberapa kali melakukan tebakan berdasarkan ingatan lama, misalnya percaya bahwa pesan asisten Claude masih menggunakan kelas .font-claude-message seperti yang ia ingat beberapa bulan sebelumnya.
Tebakan itu terbukti keliru. Selektor lama tidak memicu satupun elemen, sementara pemilih pesan pengguna masih cocok. Hasilnya, ekstensi dengan senang hati mengambil seluruh pertanyaan pengguna dan membuang semua jawaban AI. Untuk Gemini, kesalahan terjadi berlawanan arah: ekstensi menangkap respons AI namun kehilangan pertanyaan manusia.
Di Indonesia, fenomena ini relevan mengingat lonjakan penggunaan ChatGPT dan Claude dalam kalangan pelajar, peneliti, dan pekerja kantor. Banyak dari mereka mengandalkan catatan lokal untuk mengarsipkan hasil brainstorming atau ringkasan dokumen. Ketergantungan pada ekstensi pihak ketiga buatan pengembang independen membuat pengguna tanah air rentan terhadap bug senyap semacam ini, apalagi ketika platform AI luar negeri kerap mengubah antarmuka tanpa koordinasi.
Belum ada produk lokal sekelas yang mendominasi pasar penyimpan obrolan AI, meski komunitas pengembang di dalam negeri cukup aktif membuat skrip otomatisasi. Kejadian ini menunjukkan bahwa siapa pun yang membuat alat scraping di Indonesia perlu menyadari bahwa struktur halaman yang tidak mereka kuasai bisa berubah setiap saat. Kesalahan kecil pada selektor dapat membuat arsip pembelajaran mahasiswa menjadi tidak berguna.
Perbandingan dengan situasi global menunjukkan bahwa masalah bukan pada kurangnya skill, melainkan metode. Alih-alih menebak, pengembang akhirnya menulis skrip pemeriksa sepanjang 40 baris yang ditempelkan ke konsol peramban langsung pada halaman nyata. Skrip tersebut melaporkan selektor mana yang cocok, berapa banyak elemen yang terkena, dan cuplikan teks untuk verifikasi.
Hasil pemeriksaan sangat jelas. Pada Claude, selektor usang .font-claude-message memang menghasilkan nol elemen. Sementara itu, atribut [data-is-streaming] berhasil menangkap empat pesan asisten dengan sampel teks "Claude responded: 人工智能对未来的影响是多方面的…". Selektor [data-testid='user-message'] menangkap empat pertanyaan pengguna. "Halaman di depan pengguna adalah satu-satunya sumber kebenaran. Skrip 40 baris yang membaca halaman itu mengalahkan tebakan terbaik saya setiap saat," tulis pengembang tersebut menceritakan pengalaman yang berkali-kali ia lupa.
Tantangan lain muncul pada penanganan gambar. Di Gemini, satu gambar memiliki tautan https biasa yang masih bisa disimpan, namun gambar berikutnya menggunakan skema blob: URL yang hanya hidup di memori tab peramban. Begitu tab ditutup, referensi itu hilang selamanya. Pengembang memilih jujur dengan menulis catatan "gambar ini tidak dapat disimpan" daripada menyimpan tautan rusak. Claude menyimpan nama file lampiran di luar elemen pesan, sehingga setidaknya tercatat "attachment: dog.jpeg".
Selain selektor, tombol salin sempat mati karena panel ekstensi berjalan di dalam iframe dan API clipboard diblokir kecuali induk memberikan izin; satu atribut memperbaiki itu. Pesan error "extension context invalidated" juga membanjiri log karena muat ulang ekstensi saat halaman lama masih terbuka, namun kini dibiarkan gagal tanpa suara agar tidak mengagetkan pengguna.
Kini keempat platform sudah tersimpan utuh, sesuatu yang pagi itu belum terjamin. Bagi pengembang perangkat lunak di Indonesia, pelajaran ini berharga: saat membangun alat yang mengandalkan halaman orang lain, tulis alat pemeriksa terlebih dahulu sebelum menebak. Kejujuran pada batasan teknis, seperti menolak menyimpan blob URL, lebih baik daripada ilusi fungsi yang utuh.