Uyarı etiketi bir kontrol değildir
Bir kodlama ajanı devreye alan çoğu ekip aynı yapıtla başlar: modele dosyaları silmemesini, sırları dışarı sızdırmamasını, güvenilmeyen paketler kurmamasını söyleyen bir sistem prompt'u. Bu bir uyarı etiketidir. Okuduğu herhangi bir içerikten — bir README, bir bağımlılığın postinstall betiği, bir stack trace, getirilen bir issue başlığı — etkilenebilecek stokastik bir sisteme doğal dille ifade edilmiş bir ricadır. Bu talimat, bağlam penceresindeki diğer her token'la rekabet eder.
Yürütme sandbox'ı rekabet etmez. Çekirdek, container runtime ve ağ katmanı tarafından uygulanan bir sınırdır. Ajan /workspace dışına yazamıyorsa, hiçbir prompt injection onu /workspace dışına yazdıramaz. Çıkış varsayılan olarak reddediliyorsa, üretilen bir curl çağrısı modelin takdirinde değil, socket seviyesinde başarısız olur.
Bu yüzden sandbox sözleşmesi ajan tanımlanmadan önce yazılmalıdır. Ajanın yetenekleri, araç yüzeyi, otonomi seviyesi — bunların hepsi ortamın izin verdiklerinin altındadır. Ajanı önce tanımlamak, sandbox'ın sonradan uyum sağlamak zorunda kaldığı bir tasarım üretir; bu, kısıtlamanın yanlış yönüdür.
Kodlama ajanları gerçekte nerede zarar verir
Kodlama ajanlarından kaynaklanan zarar nadiren dramatik olur. Genellikle üç sıradan kategoriden biridir ve her biri model özelliği değil, ortam özelliğidir.
Çalışma ağacının ötesine uzanan dosya sistemi erişimi
Bir modülü yeniden düzenlemesi istenen ajan, bitişik yapılandırmayı "temizlemeye", bir lockfile'ı yeniden yazmaya veya bir import'u çözmek için üst dizine geçmeye karar verebilir. Container geliştiricinin ana dizinini veya ana makinenin kaynak ağacını bağlarsa, yazılabilir küme fiilen sınırsız olur. Hata, modelin kötü seçim yapması değil; ortamın bu seçeneği sunmasıdır.
Geliştirici ortamından devralınan kimlik bilgisi erişimi
Geliştirici kabuğundan başlatılan ajanlar ortam değişkenlerini, bulut kimlik bilgisi dosyalarını, SSH agent socket'lerini ve önbelleğe alınmış token'ları devralır. Ortamdaki uzun ömürlü bir bulut anahtarı, o anahtarın yapabildiği her şey için kalıcı bir yetkidir. Ajanın onu kötüye kullanmak için kötü niyetli olması gerekmez; yalnızca ortamı okuyup bir yere gönderen bir komut çalıştırması yeterlidir ki bu, derleme araçları için normal bir şeydir.
Bu üç kategori model hatası değildir. Yapılandırma hatalarıdır ve tek bir token üretilmeden önce düzeltilebilirler.
Sözleşmeyi belirtmek

Sandbox sözleşmesinin üç maddesi vardır: neyin yazılabileceği, neyin okunabileceği ve neyin dışarı çıkabileceği.
Yazılabilir kümeyi, okunabilir kümeyi tanımlayın ve geri kalan her şeyi reddedin
Reddetmeyle başlayın ve izinleri sıralayın. Bir kodlama görevi için işleyebilir bir varsayılan şöyle görünür:
writable: /workspace/repo/**
readable: /workspace/repo/**, /usr/lib/**, /usr/share/**
denied: everything else
Depo, çalışma birimidir. Onun dışındaki her şey ya salt okunur olması gereken bir sistem bağımlılığı ya da hiç görünmemesi gereken bir ana makine kaynağıdır. Bu bir prompt talimatı değil, mount politikasıdır ve container runtime tarafından uygulanır.
Ödünleşim gerçektir: dar bir yazılabilir küme, meşru olarak bir üst dizine, kardeş bir depoya veya global bir önbelleğe dokunması gereken iş akışlarını bozar. Bu iş akışlarına ihtiyaç duyan ekipler sözleşmeyi kazara geniş bir sözleşme devralmak yerine bilinçli olarak genişletmeli ve nedenini belgelemelidir. Genişletme, incelenebilir bir olaydır; kazara geniş bir mount değildir.
Çıkışı varsayılan olarak reddedin, kayıt defterlerine ve uç noktalara izin verin
Ağ politikası dosya sistemi politikasını yansıtmalıdır. Varsayılan, giden bağlantı yoktur. İzin listesi açık ve küçüktür: projenin gerçekten kullandığı paket kayıt defteri, ajan bir tane çağırıyorsa model sağlayıcısının uç noktası ve görevin gerektirdiği herhangi bir iç servis.
egress: deny
allow: registry.npmjs.org
allow: api.internal.example
Bu, kurulum yolunu ve üretilen kod yolunu aynı anda kısıtlar. Ayrıca ajanın ağ davranışını gözlemlenebilir kılar: izin listesi dışındaki her bağlantı denemesi gürültü değil, bir sinyaldir.
Dürüst ödünleşim operasyonel sürtünmedir. Meşru derlemeler bazen öngörülmeyen bir uç noktaya ihtiyaç duyar ve hata modu, geçici bir hata gibi görünen engellenmiş bir istektir. İzin listesi sürüm kontrolü altındaki yapılandırma olarak ele alınmalı, kod gibi incelenmeli ve bir görev meşru olarak gerektirdiğinde güncellenmelidir — bir derleme başarısız oldu diye allow: * olarak gevşetilmemelidir.
Göreve kapsamlanmış kısa ömürlü kimlik bilgileriyle çalıştırın
Kimlik bilgileri görev için üretilmeli ve onunla birlikte sona ermelidir. Sandbox başlangıcında verilen ve kapatmada iptal edilen kapsamlı, kısa ömürlü bir token, herhangi bir sızdırmanın değerini sınırlar. Geliştiricinin kendi uzun ömürlü kimlik bilgileri sandbox'a asla girmemelidir; ajan, görevin sınırının ötesinde geliştirici olarak davranamamalıdır.
Bu maddeyi uygulamak genellikle en zorudur çünkü dar, kısa ömürlü yetkiler verebilen bir kimlik sistemi gerektirir. Böyle bir sistem yoksa geri dönüş, ajanı hiç kimlik bilgisi olmadan çalıştırmak ve ayrıcalıklı her işlemi ayrı, insan onaylı bir adıma yönlendirmektir.

Tespit ve müdahale
Bir sözleşme sınırı tanımlar. Tespit, bir şeyin ona baskı yaptığını size söyler ve müdahale sonra ne olacağını belirler.
Anormal syscall desenlerini birincil sinyal olarak ele alın
Prompt incelemesi güvenilmezdir. Aynı talimat bir bağlamda zararsız, diğerinde bir injection'ın parçası olabilir ve modelin kendi niyetini anlatması davranışının kanıtı değildir. Güvenilir sinyal, sürecin gerçekte ne yaptığıdır: okunabilir küme dışında beklenmedik open çağrıları, izin listesinde olmayan adreslere connect denemeleri, görevin profilinde olmayan kabukların veya yorumlayıcıların execve'si, olağandışı dosya tanımlayıcı hareketliliği.
Bunlar, modelin akıl yürütmesini incelemeden runtime katmanında gözlemlenebilir. Syscall seviyesinde bir izleyici, bir görevin temel profilinden sapmayı alarm olarak bildirebilir ve ajanın ne yaptığı konusunda doğruyu söylemesine bağlı değildir.
Diff'i ve komut geçmişini birlikte kaydedin
Sonradan inceleme, her iki yapıtı tek bir yerde gerektirir. Onu üreten komutlar olmadan bir diff'i ilişkilendirmek zordur; ortaya çıkan diff olmadan bir komut geçmişini değerlendirmek zordur. Bunları birlikte — komut, zaman damgası, çıkış durumu, ortaya çıkan diff — saklamak, sonradan incelemeyi mümkün kılar ve günler sonra bir test başarısız olduğunda bir ajanın ne yaptığını yeniden oluşturmayı mümkün kılar.
Bu bir model meselesi değil, günlükleme meselesidir ve mount ve çıkış kurallarıyla birlikte sözleşmede belirtilmelidir.
Sandbox dışındaki geri alınamaz işlemler için insan onayı gerektirin
Bazı işlemler çalışma ağacını geri alarak geri alınamaz: bir remote'a push etmek, bir paket yayımlamak, bir bulut kaynağını silmek, e-posta göndermek, bir pull request'i birleştirmek. Bunlar kapılı olmalıdır. Kapı, "push etmeden önce sor" şeklinde bir prompt talimatı değil; bir insan belirli bir eylem için izin verene kadar işlem için gereken kimlik bilgisini veya ağ yolunu kaldıran bir politikadır.
Belirtim sırası
Pratik sonuç, iş sırasında bir değişikliktir. Ajanın araçlarını, belleğini, planlama döngüsünü veya otonomi seviyesini belirtmeden önce, içinde çalıştığı ortamı belirtin: yazılabilir küme, okunabilir küme, çıkış izin listesi, kimlik bilgisi kapsamı, syscall izleyicisi, birleşik diff-ve-komut günlüğü ve sandbox dışındaki geri alınamaz işlemler için onay kapısı.
Ajan daha sonra bilinen bir sınıra göre tasarlanır. Yetenekleri, modelin yapabildikleri ile sandbox'ın izin verdiklerinin kesişimidir; bu, bir sistem prompt'undaki uyarı etiketinden daha küçük ve daha dürüst bir yüzeydir.
Ödünleşim, sıkı bir sözleşmenin zaman zaman meşru bir görevi engelleyeceği ve ekibin onu bilinçli olarak genişletmek zorunda kalacağıdır. Mesele de budur. Hiç test edilmeyen bir sınır sınır değildir; inceleme yoluyla genişletilen bir sınır, anlaşılan bir sınırdır.
