# TD-060 · Onay ekranında komutu değil sonucu yaz

Onay kutusu ham komutu gösterince kullanıcı neyi onayladığını bilmeden evet diyor. Desen onay ekranının ilk satırına işin sonucunu yazar. Ne değişecek, kaç tane, nerede, geri alınabilir mi. Ham komut altta durur.

- Adres: https://tandem.komunite.com.tr/desen/onay-ekraninda-komutu-degil-sonucu-yaz
- Yer: Eylemde > Onay
- Seviye: Ajan. AI kullanıcı adına iş yapıyorsa gerekli.
- Son inceleme: 27 Ekim 2026, Komünite editörlüğü

## 30 saniyede dene

1. Ajanından bir klasördeki eski dosyaları silmesini ya da bir tablodaki birkaç satırı güncellemesini iste.
2. Açılan onay kutusunun ilk satırını oku. Ne değişeceğini, kaç nesnenin etkileneceğini ve nerede olduğunu söylüyor mu, yoksa ham komutu mu gösteriyor?
3. Kutuyu kod bilmeyen birine göster ve onaylarsa ne olacağını kendi sözleriyle anlatmasını iste.
4. Ajandan projedeki bir betiği çalıştırmasını iste, npm run ya da make gibi. Kutu betiğin içinde ne yazdığını gösteriyor mu?

## Sorun

Bir analist ajandan proje klasöründeki eski dışa aktarım dosyalarını temizlemesini istiyor. Ajan bir komut hazırlıyor ve onay kutusu açılıyor. Kutuda tek satır var: `rm -rf ./exports/2025-* ./tmp ~/Downloads/rapor-taslak`. Altında “Evet” ve “Hayır”. Analist `rm`'nin silmek olduğunu biliyor, istediği de silmek. Evet diyor. Satırın sonundaki yolun proje klasörünün dışında, kendi İndirilenler klasöründe durduğunu fark etmiyor.

Onay kutusu kararı kullanıcıya bırakıyor, ama kararın malzemesini makinenin diliyle veriyor: kabuk komutu, SQL sorgusu, bir API çağrısının JSON gövdesi. Bunları okuyabilen kullanıcı için bile asıl soru satırda yazmıyor. Ne değişecek, kaç tane, nerede, geri alınabilir mi? `npm run analyze` gibi masum görünen bir komutun ne yapacağı satırda hiç görünmüyor, proje dosyasındaki betiğin içinde duruyor.

Kullanıcının anlamadan verdiği onay hiçbir şeyi durdurmaz. Yalnız sorumluluğu kullanıcının üstüne yazar.

## Neden atlanıyor

Ham komutu göstermek dürüst ve ucuz görünür. Ajan ne çalıştıracaksa onu ekrana basmak bir satır kod. MCP belirtimi de istemcilerden sunucuyu çağırmadan önce [araç girdilerini kullanıcıya göstermelerini](https://modelcontextprotocol.io/specification/2025-06-18/server/tools) istiyor. Girdiyi göstermek gerekli, ama girdi sonucu söylemez. Ekipler bu adımı şeffaflık sayıp orada durur.

Özet yazmanın bir riski de var ve ekipleri haklı olarak tedirgin ediyor. Komutun açıklamasını model yazarsa açıklama da modelin bir iddiası olur. Anthropic otomatik mod sınıflandırıcısına ajanın yazdığı metni hiç göstermiyor, çünkü ajan [ikna edici gerekçeler üretebilir](https://www.anthropic.com/engineering/claude-code-auto-mode). Kullanıcıya gösterilen açıklama için de aynı tehlike geçerli. Bu yüzden özetin dayanağını sistem kurar, model en çok bir açıklama ekler.

Üçüncü neden ölçümde. Ekipler onayın verilip verilmediğini kaydeder, kullanıcının neyi onayladığını anlayıp anlamadığını kaydetmez. Scale X'in bir kodlama ajanının komutlarını onaylatan tarayıcı oyununda 409 bin karar toplandı. Oyuncular `npm run analyze` komutunu, betiğin veriyi dışarı gönderdiği hemen üstteki geçmişte yazmasına rağmen [%64,7 oranında onayladı](https://scalex.dev/blog/ai-agent-permissions-stats/). Komutun metni zararsızdı, zarar betiğin içindeydi.

## Desen

Onay ekranının ilk satırı işin sonucunu kullanıcının dilinde söyler. Ham komut kaybolmaz, altta açılabilir durur.

1. **Önce sonuç.** Ne değişecek, kaç tane, nerede: “Proje klasöründeki 38 dışa aktarım dosyasını kalıcı olarak siler.” Cümlenin fiili işin kendisidir, “komut çalıştırılsın mı” diye sormaz.
2. **Hedefleri sistem çıkarır.** Dosya yollarını, alan adlarını, alıcıları ve tabloları komutu ayrıştıran kod bulur ve mümkünse sayar. Model kendi açıklamasını yazabilir, ama ekranda sistemin bulduğu hedefler ayrıca durur. İkisi uyuşmazsa ekran bunu söyler.
3. **Görünmeyeni aç.** Betik adı, takma ad, kabuk sarmalayıcı ya da uzun bir satır asıl işi gizleyebilir. `npm run` için betiğin içeriği, zincirli komut için her parça ayrı gösterilir. Ekran hiçbir parçayı sessizce kesmez.
4. **Sınırı ve geri dönüşü işaretle.** Çalışma alanının dışına çıkan, ağa bağlanan ya da geri alınamayan her parça ayrı bir uyarıyla gelir.
5. **Düğme işi adlandırır.** “Evet” yerine “38 dosyayı sil”. Kullanıcı düğmeye basarken ne yaptığını bir kez daha okur.
6. **Sonuç çıkmıyorsa bunu yaz.** “Bu betiğin ne yapacağını çıkaramadım” da bir bilgi ve kullanıcıyı ham komutu okumaya çağırır.

Ekran iki okura birden hizmet eder. Komutu okuyamayan kullanıcı sonucu okur, okuyabilen kullanıcı satırı açıp doğrular.

## Önce ve sonra

Aynı temizlik işi, iki ayrı onay ekranıyla. Solda kutu ham komutu gösteriyor ve son yolun proje dışına uzandığını hiçbir şey söylemiyor. Sağda ekran önce neyin silineceğini sayısı ve yeriyle yazıyor, proje dışındaki hedefi ayrı işaretliyor ve düğmeler işi adlandırıyor.

Örnek ekran (kurgusal): Kullanıcı ajandan proje klasöründeki eski dışa aktarım dosyalarını temizlemesini istiyor. Ajan silme komutunu onaya sunuyor.

### Önce: Ajan · onay

- Kullanıcı: Proje klasöründeki eski dışa aktarım dosyalarını temizle.
- AI: Eski dosyaları temizliyorum.
- İçerik (Bu komut çalıştırılsın mı?): rm -rf ./exports/2025-* ./tmp ~/Downloads/rapor-taslak
- Düğmeler: Evet · Hayır
- Adım (tamam): Komut çalıştırıldı · çıkış kodu 0

1. Kutu kararın malzemesini kabuk diliyle veriyor. Neyin, kaç tane ve nerede silineceğini kullanıcı satırdan kendisi çıkarmak zorunda.
2. Son yol proje klasörünün dışında, İndirilenler'de duruyor. Kutu bunu söylemiyor, düğme yalnız “Evet” diyor.

### Sonra: Ajan · onay

- Kullanıcı: Proje klasöründeki eski dışa aktarım dosyalarını temizle.
- İçerik (Bu işlem ne yapacak?): Proje klasöründe 38 dışa aktarım dosyasını ve tmp klasörünü kalıcı olarak siler. Proje dışında, İndirilenler'deki rapor-taslak klasörünü de siler.
- Uyarı: Bir hedef proje klasörünün dışında. Silinen dosyalar çöp kutusuna gitmez, geri alınamaz.
- Bilgi: Komut: rm -rf ./exports/2025-* ./tmp ~/Downloads/rapor-taslak
- AI: İndirilenler'deki klasörü silmemi istemediysen yalnız proje içini silebilirim.
- Düğmeler: Yalnız proje içini sil · Üç hedefi de sil · Vazgeç

1. İlk satır sonucu söylüyor. Kaç dosya, hangi klasör, geri alınabilir mi. Hedefleri ve sayıyı komutu ayrıştıran kod çıkardı.
2. Proje dışındaki hedef ayrı uyarıyla geliyor. Ham komut altta duruyor, düğmeler işi adlandırıyor.

## Piyasada

Claude Code'un izin kutusu komutun üstünde kısa bir açıklama gösteriyor. Belgedeki örnekte kutu [“Run the test suite” açıklamasını ve altında `npm test` komutunu](https://code.claude.com/docs/en/permissions) birlikte veriyor. Kullanıcı önce amacı, sonra satırı okuyor.

Gemini CLI, Temmuz 2025'te bildirilen açıktan sonra onay ekranını değiştirdi. Google'ın düzeltmesiyle kabuk komutu onayı [çalışacak bütün kök komutları listeliyor](https://github.com/google-gemini/gemini-cli/pull/4795). Zincirin ikinci yarısı ilk komutun arkasına saklanamıyor.

Apple'ın arayüz kılavuzu Siri ve Kestirmeler'deki onay ekranları için birincil düğmeye açıklayıcı bir ad verilmesini istiyor. Kahve siparişi örneğinde düğmeye [“OK” ya da “Proceed” yerine “Order” yazmanın daha açık olduğunu](https://developer.apple.com/design/human-interface-guidelines/snippets) söylüyor.

MCP belirtimi ise asgariyi koyuyor. İstemci sunucuyu çağırmadan önce [araç girdilerini göstermeli](https://modelcontextprotocol.io/specification/2025-06-18/server/tools). Girdiyi gösterip sonucu söylemeyen bir ekran belirtime uyar, ama kullanıcıya yine ham veriyi bırakır.

## Kanıt

**Gemini CLI, Temmuz 2025.** Tracebit araştırmacıları bir kod deposunun README dosyasına gizledikleri talimatla Gemini CLI'a, kullanıcının izin listesine eklediği `grep` komutunun arkasına zararlı bir komut ekletti. Komutun içine çok sayıda boşluk karakteri koyunca boşluktan sonraki kısım [kullanıcıya gösterilmeden çalışıyordu](https://tracebit.com/blog/code-exec-deception-gemini-ai-cli-hijack). Kullanıcının ekranda gördüğü satır zararsız bir aramaydı, çalışan satır ortam değişkenlerini uzak bir sunucuya gönderiyordu. Google açığı 25 Temmuz'daki 0.1.14 sürümüyle kapattı. Düzeltilmiş sürümde aynı deneme zararlı komutu açıkça gösteriyor ve ek komutlar için onay istiyor.

Scale X'in oyununda üç ayrı `npm run` komutu, betikleri veriyi dışarı gönderdiği hâlde [%52,5 oranında gözden kaçtı, öteki veri sızdırma saldırılarında bu oran %28,4'tü](https://scalex.dev/blog/ai-agent-permissions-stats/). Tanıdık bir betik adı zararı komut satırının dışına taşıyordu. Oyun kontrollü bir çalışma sayılmaz. [Komutların yaklaşık üçte biri saldırıydı ve oyuncular süre baskısı altında oynuyordu](https://scalex.dev/blog/ai-agent-permissions-stats/). Yine de iki komut türü arasındaki fark aynı oyunun içinde ölçüldü.

Ham komut gösteren ekranla sonuç özeti gösteren ekranı karşılaştıran yayımlanmış bir ölçüm bulamadık. Bu desenin dayanağı ürünlerin yaptığı değişiklik ve iki örnekte görülen aynı mekanizma. Kullanıcının onayladığı metin ile çalışan iş birbirinden ayrılınca onay korumayı bırakıyor.

## Ölçüm

Onay oranı burada da yanıltır. Bakılacak yer, kullanıcının neyi onayladığını bilip bilmediği.

- **Anlama testi.** Beş kullanıcıya gerçek onay ekranlarını göster ve onaylarsa ne olacağını sor. Doğru cevap oranını desenden önce ve sonra karşılaştır.
- **Açıklama ile hedef uyumu.** Modelin açıklamasıyla sistemin çıkardığı hedeflerin uyuşmadığı onayları say. Her uyumsuzluğu tek tek incele.
- **Sonuçsuz onay.** Sistemin sonucu çıkaramadığı onayların payı. Yüksekse ajan çok fazla serbest betik çalıştırıyor.
- **Sınır dışı ret.** Proje dışına, ağa ya da geri dönüşsüz işe uzanan onaylarda ret oranı rutin onaylardakinden belirgin biçimde yüksek olmalı. Aynıysa kullanıcı farkı görmüyor.
- **Açılan ham satır.** Kullanıcıların ham komutu ne sıklıkla açtığı. Hiç açılmıyorsa ya özet yetiyor ya da kimse bakmıyor. Anlama testi hangisi olduğunu söyler.

## Ajanına ver

Üç metin var. Denetim promptu üründeki onay ekranlarını bulur, her birinin kullanıcıya ham girdiyi mi sonucu mu gösterdiğini ve açıklamanın nereden geldiğini raporlar, hiçbir dosyayı değiştirmez. Uygulama promptu onay ekranına sistemin çıkardığı bir sonuç satırı ekler. Önce planı gösterir, onayınla uygular ve proje dışına uzanan bir hedefin ekranda ayrı işaretlendiğini doğrulayan bir test ekler. Kural kodlama ajanının kendi çalışması için. Ajanın senden onay isterken önce ne olacağını söylesin.

## Sınır

Komut satırında yaşayan bir geliştirici çoğu zaman ham komutu özetten hızlı okur. Ona ham satırı üstte gösteren bir ayar bırak. Desen komutu kaldırmaz, sırayı değiştirir.

Özet de yanılabilir. Ayrıştırıcı her kabuk sözdizimini tanımaz ve bir betiğin ne yapacağını çalıştırmadan bilmek çoğu zaman mümkün olmaz. Böyle durumlarda özet uydurma, bilmediğini söyle. Özetin güvenilirliği sistemin çıkarabildiği hedeflerle sınırlı.

Bu desen kutuların sayısını azaltmaz. Kullanıcı saatte kırk kutu görüyorsa en iyi yazılmış özet de okunmaz. Onay sayısını düşürmek ve “her zaman izin ver”in kapsamını daraltmak ayrı desenlerin işi.

## Promptlar

### Denetim promptu

```
Bu depoda kullanıcıdan onay alarak komut, sorgu ya da araç çağrısı çalıştıran bir AI ajanı var. Görevin, onay ekranlarının kullanıcıya ham girdiyi mi, yoksa işin sonucunu mu gösterdiğini denetlemek. Hiçbir dosyayı değiştirme, yalnız rapor yaz.

1. Onay ekranlarını bul: onay diyaloğu bileşenleri, araç çağrısından önce kullanıcıya gösterilen metin, onay mesajını üreten fonksiyonlar.
2. Her ekran için bak: kullanıcı ilk satırda ne görüyor? Ham komut, SQL ya da JSON argümanları mı, yoksa ne değişeceğini, kaç nesnenin etkileneceğini ve nerede olduğunu söyleyen bir cümle mi?
3. Ekrandaki açıklamayı kim üretiyor? Model mi yazıyor, yoksa komutu ayrıştıran kod mu? Modelin açıklaması komutun gerçek hedefleriyle karşılaştırılıyor mu?
4. Görünmeyen kısımları ara: npm run, make, takma adlar, sh -c ve bash -c gibi sarmalayıcılar, uzun satırlar, art arda boşluklar ve görünmez karakterler. Ekran asıl çalışacak işi gösteriyor mu, yoksa satırı kesiyor mu?
5. Çalışma alanının dışına çıkan yollar, ağ adresleri, alıcılar ve geri dönüşü olmayan işlemler (kalıcı silme, gönderme, zorla push) ekranda ayrı işaretleniyor mu?
6. Onay düğmesinin metni ne diyor? "Evet" ya da "Tamam" mı, yoksa işi adlandırıyor mu?

Rapor biçimi: her onay ekranı için dosya ve satır, şu an ilk satırda gösterilen şey, eksik olan bilgi (hedef, sayı, proje dışı parça, geri dönüş), örnek bir ham komut ve o komut için önerdiğin sonuç cümlesi. Proje dışına ve ağa uzanan komutlardan başla.

```

### Uygulama promptu

```
Bu depodaki AI ajanının onay ekranlarına "komutu değil sonucu yaz" desenini uygula. Önce planı göster, onayımı aldıktan sonra kodu değiştir.

Hedef davranış:
1. Onay ekranının ilk satırı işin sonucunu kullanıcının dilinde söylesin: ne değişecek, kaç nesne, nerede. Ham komut altta, açılabilir bir bölümde dursun.
2. Hedefleri kod çıkarsın. Komutu ayrıştır, dosya yollarını, alan adlarını, alıcıları ve tabloları bul. Mümkünse etkilenecek nesneleri say (glob'u genişlet, sorgunun dokunacağı satırları kuru koşuyla say).
3. Modelin açıklaması varsa sistemin çıkardığı hedeflerle karşılaştır. Uyuşmazsa ekranda uyarı göster.
4. Görünmeyeni aç. npm run ve benzeri betik çalıştırıcılar için betiğin içeriğini, zincirli komutlar için her parçayı ayrı göster. Uzun satırı sessizce kesme, art arda boşlukları ve görünmez karakterleri görünür yap.
5. Çalışma alanının dışına çıkan, ağa bağlanan ve geri alınamayan parçaları ayrı bir uyarıyla işaretle.
6. Onay düğmesi işi adlandırsın ("38 dosyayı sil", "E-postayı gönder"). Sonuç çıkarılamıyorsa ekran bunu açıkça yazsın.

Uygularken:
- Sonuç cümlesini modelin serbest metnine bırakma, ayrıştırılan hedeflerden kur.
- İleri düzey kullanıcılar için ham komutu üstte gösteren bir ayar bırak.
- Bir test ekle: `rm -rf ./tmp ~/Downloads/x` komutu için onay ekranı üret ve ekranın proje dışındaki hedefi ayrı işaretlediğini, düğmenin "Evet" demediğini doğrula. İkinci test: `npm run analyze` için ekranın package.json'daki betiğin içeriğini gösterdiğini doğrula.

```

### AGENTS.md kuralı

```
## Onay isterken önce sonucu yaz
- Kullanıcıdan bir komut ya da araç çağrısı için onay isterken ilk cümlede ne olacağını yaz: ne değişecek, kaç tane, nerede.
- Komutun hedeflerini (yollar, adresler, alıcılar) komutun kendisinden çıkar, tahminle yazma.
- Proje dışına çıkan, ağa bağlanan ya da geri alınamayan bir parça varsa bunu ayrıca söyle.
- npm run, make ya da başka bir betik çalıştıracaksan önce betiğin içeriğini oku ve ne yaptığını yaz.
- Bir komutun ne yapacağını çıkaramıyorsan bunu açıkça söyle, açıklama uydurma.

```

## Kaynaklar

1. [Tools (Model Context Protocol Specification, 2025-06-18)](https://modelcontextprotocol.io/specification/2025-06-18/server/tools), Model Context Protocol, 18 Haziran 2025
2. [How we built Claude Code auto mode: a safer way to skip permissions](https://www.anthropic.com/engineering/claude-code-auto-mode), Anthropic, 25 Mart 2026
3. [Humans missed 1 in 3 threats approving AI agent commands across 40,000 plays](https://scalex.dev/blog/ai-agent-permissions-stats/), Alex Wauters, Scale X, 5 Ağustos 2026
4. [Configure permissions](https://code.claude.com/docs/en/permissions), Anthropic
5. [Safer Shell command Execution](https://github.com/google-gemini/gemini-cli/pull/4795), Google, GitHub, 25 Temmuz 2025
6. [Snippets (Human Interface Guidelines)](https://developer.apple.com/design/human-interface-guidelines/snippets), Apple Developer, 8 Haziran 2026
7. [Code Execution Through Deception: Gemini AI CLI Hijack](https://tracebit.com/blog/code-exec-deception-gemini-ai-cli-hijack), Tracebit, 28 Temmuz 2025

---

Kaynak: https://tandem.komunite.com.tr · Metin CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/deed.tr), promptlar ve kural MIT-0 (https://opensource.org/license/mit-0).
