/ 2menit

Agent yang menyunting file harus minta izin dulu

Menahan setiap penulisan sampai manusia menyetujui rencananya, dan kenapa gerbang persetujuan itu milik runtime, bukan prompt.

Pagar pengaman di level prompt hanyalah saran. Kalau satu-satunya yang berdiri antara agent dan file proyek pengguna adalah instruksi di system prompt, maka model yang cukup bingung cepat atau lambat akan menulis sesuatu yang tidak pernah disetujui siapa pun. Untuk tool builder yang agent-nya menyunting workspace sungguhan, itu bukan mode kegagalan yang bisa diterima.

Solusinya bukan prompt yang lebih baik. Solusinya memindahkan gerbang itu ke luar jangkauan model.

Dua fase, satu transkrip

Setiap giliran chat membangun ulang agent dari transkrip tersimpan, yang menjaga runtime tetap stateless antar giliran dan membuat sebuah run bisa direproduksi. Giliran itu lalu berjalan dalam dua fase.

Di fase perencanaan agent boleh membaca apa saja dan menulis apa pun. Penulisan file ditahan di memori sebagai usulan perubahan, tidak diterapkan ke disk. Saat agent selesai merencanakan, buffer itu disajikan ke pengguna sebagai rencana.

Di fase eksekusi, yang hanya dimulai setelah persetujuan, buffer ditulis dan penulisan baru diizinkan lewat. Rencana yang ditolak membuang buffer, dan proyek tetap persis seperti sebelumnya.

if (!approved) {
  buffer.discard();
  return { status: "rejected" };
}
buffer.flush(); // satu entri riwayat, bukan satu per file

Flush-nya menjadi satu entri di riwayat proyek. Itu lebih penting daripada kelihatannya: kalau setiap penulisan file menjadi langkah undo sendiri, membatalkan run yang ditolak tapi sudah setengah diterapkan berarti mengklik undo belasan kali dan berharap tidak ada yang terlewat.

Metering yang bisa dijumlahkan

Tempat kedua di mana desain yang terlalu permisif menggigit adalah biaya. Kredit berupa bilangan bulat, pemakaian token tidak, dan mengonversi di antara keduanya pada momen yang salah menghasilkan entah drift pembulatan atau kredit pecahan yang tidak pernah benar-benar mencapai nol.

Pendekatannya di sini adalah ledger penggunaan aditif. Setiap run menambahkan pemakaian terukurnya, dan meter menghitung kredit dari jumlahnya alih-alih memutasi saldo di tempat. Drift berhenti menjadi kebocoran pelan dan menjadi sesuatu yang bisa dihitung ulang dari ledger kapan saja.

Pelajaran yang sama dengan gerbang persetujuan, sebenarnya. Saat sebuah angka atau sebuah file penting, turunkan dari catatan tentang apa yang benar-benar terjadi, bukan dari nilai yang disesuaikan di tempat dan tidak lagi bisa diaudit.

Portabilitas adalah kendala, bukan fitur

Satu keputusan lagi membentuk skemanya: basis kode yang sama berjalan di PostgreSQL dan SQLite. Itu menyingkirkan sebagian besar kemudahan yang biasa diambil pada satu database: tidak ada partial index dengan sintaks berbeda, tidak ada operator JSON khas dialek di jalur panas.

Menulis di irisan keduanya lebih lambat didesain dan jauh lebih cepat di-deploy, karena yang Anda uji secara lokal adalah yang berjalan di deployment kecil, dan yang berjalan di deployment kecil adalah yang bisa Anda serahkan ke pengguna yang ingin self-host.

Tulisan lain

2 menit

Failover tanpa merusak stream

Memindahkan request ke provider yang sehat itu mudah. Melakukannya setelah token pertama sampai ke klien: itu bagian yang sulit.

  • Rust
  • Streaming
  • Reliability
Baca artikel

2 menit

Satu route, lima jendela

Bagaimana satu route SvelteKit menjadi workspace, dock, papan yang terkunci ke desktop, dan dua jendela on-demand, semuanya membaca database lokal yang sama.

  • Tauri
  • Svelte
  • Desktop
Baca artikel

2 menit

Memberi LLM akses data ERP tanpa memberi SQL

Cara server MCP berbasis Rust membuka analitik ke klien LLM lewat tool yang sudah diizinkan, dan kenapa parameter binding lebih baik daripada model yang menulis query.

  • Rust
  • MCP
  • AI
Baca artikel