Yayın: 24 Mart 2026

Yaklaşık bir yıldır Claude Code ile kod yazıyorum. Japonya'daki ayı olaylarını takip eden Kumamap dahil birden fazla projede kullandım. Bir gün, veri pipeline'ı çalıştırırken Opus kontrolden çıktı. Yeni kayıtları mevcut verilerle birleştirmek yerine tüm veri dizisini baştan yazdı. Yerel veri gitti.

Neyse ki hasar sınırlı kaldı. Savunma sistemlerim prod'u korudu ve yerel veri kaybı kurtarılabilir durumdaydı. Bu yazı o savunma sistemleri hakkında: Claude Code'dan maksimum verim alırken başında oturup beklemeden nasıl çalıştırılır.
Dört katmana güveniyorum. Hiçbiri tek başına mükemmel değil ama birlikte çalıştıklarında bir şeyler ters gittiğinde hasarı kontrol altında tutuyorlar.
Projeye gömülü davranış talimatları
Mevcut konuşmada verilen anlık yönlendirmeler
Modelin geçersiz kılamayacağı katı araç izinleri
Prod kimlik bilgileri erişim dışında, yedekler, tek kullanımlık yerel veritabanları
CLAUDE.md, ajanın her oturumun başında okuduğu bir dosyadır. Ajana projenizde nasıl davranmasını beklediğinizi söyler. İşte Kumamap projemdeki Production Safety bölümü:
## Production Safety
Bu çoğu zaman iyi çalışır. Ajan bu kuralları okur ve yıkıcı bir şey yapmadan önce sorar. Ama CLAUDE.md bir öneri, bir duvar değil. Model bunu görmezden gelmeyi seçebilir. Bir diziyi baştan yazmayı "doğru" yaklaşım olarak gördüğünde, durup CLAUDE.md'yi tekrar okumaz.
Bunlar çalışırken ajana verdiğiniz konuşma içi talimatlar:
"don't touch the production database"
"only read, don't write anything"
"run the migration on local first, show me the result before touching prod"
"don't delete any files, just show me what you'd remove"
"check the logs before making any changes" Mevcut görev için faydalılar ama kalıcı değiller. Ajan bunları oturum ortasında unutabilir ve yeni konuşmalara taşınmazlar. Tek başına prompting güvenilir bir savunma değil.
İşler burada ciddileşiyor.
.claude/settings.json, ajanın sormadan
hangi araçları kullanabileceğini kontrol eder. CLAUDE.md ve prompting'in aksine bunlar modelin
geçersiz kılamayacağı katı sınırlardır.
Üç seviye var: allow (sessizce çalışır), ask (onayınızı gerektirir) ve deny (tamamen engellenir). Listede olmayan her şey varsayılan olarak sorar.
Tek kural: bir işlem geri alınabiliyorsa izin ver. Geri alınamıyorsa önce sor.
rm yıkıcı. Ask.Projelerimde kullandığım settings dosyasının tamamı:
{
"permissions": {
"deny": [],
"allow": [
// Reading & searching
"Read",
"Grep",
"Glob",
"WebSearch",
"WebFetch",
// Git — safe read/write operations
"Bash(git status *)",
"Bash(git log *)",
"Bash(git diff *)",
"Bash(git branch *)",
"Bash(git show *)",
"Bash(git stash *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git fetch *)",
"Bash(git pull *)",
"Bash(git merge *)",
"Bash(git rebase *)",
"Bash(git cherry-pick *)",
"Bash(git tag *)",
// GitHub CLI
"Bash(gh *)",
// ⚠️ Runtimes — can do anything
"Bash(node *)",
"Bash(python3 *)",
// npm — read-only & dev tools
"Bash(npm run *)",
"Bash(npm list *)",
"Bash(npm ls *)",
"Bash(npm show *)",
"Bash(npm view *)",
"Bash(npm outdated *)",
"Bash(npx prettier *)",
"Bash(npx eslint *)",
"Bash(npx tsc *)",
"Bash(npx vitest *)",
"Bash(npx svelte-check *)",
// pip — read-only
"Bash(pip show *)",
"Bash(pip list *)",
// Filesystem — read & navigate
"Bash(ls *)",
"Bash(cat *)",
"Bash(head *)",
"Bash(tail *)",
"Bash(wc *)",
"Bash(du *)",
"Bash(find *)",
"Bash(which *)",
"Bash(file *)",
"Bash(echo *)",
"Bash(date *)",
"Bash(pwd *)",
"Bash(diff *)",
// Text processing
"Bash(sort *)",
"Bash(uniq *)",
"Bash(jq *)",
"Bash(grep *)",
"Bash(rg *)",
"Bash(sed *)",
"Bash(awk *)",
"Bash(tr *)",
"Bash(cut *)",
"Bash(base64 *)",
// Filesystem — write (git tracked, so revertible)
"Bash(mkdir *)",
"Bash(touch *)",
"Bash(cp *)",
"Bash(mv *)",
// Misc tools
"Bash(open *)",
"Bash(cwebp *)",
"Bash(sips *)",
"Bash(gunzip *)",
"Bash(curl *)",
// Version/help — always safe
"Bash(* --version)",
"Bash(* --help)"
],
"ask": [
// Deployment — ask before shipping
"Bash(wrangler *)",
"Bash(npx wrangler *)",
// Git — destructive or irreversible operations
"Bash(git push *)",
"Bash(git reset --hard *)",
"Bash(git clean *)",
"Bash(git checkout .)",
"Bash(git checkout -- .)",
"Bash(git checkout * -- .)",
"Bash(git restore .)",
// Package management
"Bash(npm install *)",
"Bash(npm publish *)",
"Bash(pip install *)",
// Destructive
"Bash(rm *)",
"Bash(sudo *)",
"Bash(gh repo delete *)",
// Secrets — never read without asking
"Read(.dev.vars)",
"Read(.env)",
"Bash(cat *.env)",
"Bash(cat .env)"
]
}
} // ⚠️ Runtimes — can do anything: file writes,
// network requests, db operations.
// They bypass other restrictions.
"Bash(node *)",
"Bash(python3 *)" node ve
python3 her şeyi yapabilir: dosya
yazabilir, ağ istekleri gönderebilir, veritabanlarıyla etkileşime geçebilir. Settings
dosyasındaki diğer tüm kısıtlamaları atlarlar.
Bunları ask'e taşımak daha güvenli ama
iş akışınızı öldürür. Ajanın çalıştırmak istediği her script'i onaylamak zorunda kalırsınız.
Zamanla, yeni modeller daha akıllı hale geldikçe bunları
allow'da tutma konusunda rahatladım.
Bu kişisel bir risk toleransı kararı.
// Secrets — never read without asking
"Read(.dev.vars)",
"Read(.env)",
"Bash(cat *.env)",
"Bash(cat .env)" Bu gözden kaçırması kolay bir nokta.
wrangler deployment'larını engelleseniz
bile, ajan yine de .env veya
.dev.vars dosyalarınızı okuyup curl
ya da node fetch ile doğrudan HTTP istekleri yapabilir. API anahtarlarınızı alıp deploy
kısıtlamalarınızı tamamen atlayarak servisleri kendi başına çağırabilir.
Bu yüzden ortam değişkenleri her zaman
ask'te olmalı. Ajan, siz farkında
olmadan gizli bilgilerinizi asla görmemeli.
Yukarıdaki üç katmanın hepsi başarısız olsa bile mimariniz hasarı kontrol altında tutmalı:
Bu kısım biraz karmaşık. Çoğu zaman neler olduğunu anlamak için prod'u okumanız gerekir, dolayısıyla ajana SELECT erişimi vermek mantıklı.
İdeal kurulum, prod'un birebir yerel kopyasıyla çalışmaktır; böylece ajan gerçek veritabanı yerine onunla etkileşime girer. Ama bunları senkron tutmak her zaman pratik değil.
Ne karar verirseniz verin, prod veritabanınızda yedeklemeyi mutlaka etkinleştirin. Ajan geri alınamaz bir hasar verirse anında kurtarma yapabilmeniz gerekir.
Dürüst olmak gerekirse, hayır. Veri kaybı
python3 üzerinden gerçekleşti ve
python3,
allow'daydı. Hiçbir izin dosyası
bunu yakalayamazdı.
Ama hasar sadece yerel ortamda kaldı. Prod, Katman 4 sayesinde korunuyordu: prod veritabanı kimlik bilgileri geliştirme makinemde yoktu, bu yüzden ajan istese de oraya ulaşamazdı.
İşte bu yüzden dört katmanın hepsine ihtiyacınız var. Hiçbiri tek başına yeterli değil.
Kısıtlayıcı başlayın ve güven oluştukça gevşetin. Yukarıdaki settings dosyasını kopyalayın.
Temkinliyseniz node ve
python3'ü
ask'e taşıyın. Production safety
kuralları içeren bir CLAUDE.md yazın. Prod kimlik bilgilerini geliştirme makinenizden uzak
tutun. Yedeklemeyi etkinleştirin.
Amaç, ajanı kısıtlamalarla kullanılamaz hale getirmek değil. Güvenli olan yerde hızlı, önemli olan yerde dikkatli olmasını sağlamak.
Bu blog İngilizce'den LLM ile çevrilmiştir. Herhangi bir belirsizlik durumunda İletişim sayfasından bana ulaşabilirsiniz.
Yorum bırak
Yorumlar
Diğer bloglara bak
2025/07/07
Q-Learning: İnteraktif Pekiştirmeli Öğrenmenin Temeli
2025/07/06
Optimizasyon Algoritmaları: SGD, Momentum ve Adam
2025/07/05
Karakterlerden Kelimelere: Japonca BPE Tokenizer
2024/06/19
Svelte ve JavaScript ile Basit ve Dinamik Bir Tooltip Yaratma Yöntemi
2024/06/17
JavaScript ile Tokyo'nun İnteraktif Haritasını Oluşturun
2024/06/14
Matplotlib'de Japonca Karakter Sorununu Çözme Yöntemi
2024/06/13
Kitap İncelemesi | Ötekiyle Konuşmak by Malcolm Gladwell
2024/06/07
Japonca'da En Sık Kullanılan 3.000 Kanji
2024/06/07
VSCode'da Regex Kullanarak Replace Yapma Yöntemi
2024/06/06
Svelte'de Readable Store Kullanmayın
2024/06/05
Dosyaları Gzip ve Pako ile Sıkıştırarak Web Sitesinin Yükleme Hızını Artırın
2024/05/31
Web Sayfasında Farenin Uzerinde Oldugu Kelimeyi JavaScript ile Bulun
2024/05/29
Svelte ve SVG ile Interaktif Harita Oluşturun
2024/05/28
Kitap İncelemesi | Geleneklere Uymayanlar Dünyayı Nasıl İleri Taşıyor? by Adam Grant & Sheryl Sandberg
2024/05/27
Javascript Kullanarak Sudoku Nasıl Çözülür?
2024/05/26
Web Siteme Gelen Trafiği Bir Ayda Nasıl 10 Kat Artırdım?
2024/05/24
Hayat Bisiklet Sürmek Gibidir
2024/05/19
JavaScript'te Backtracking Algoritması ile Tamamlanmış Sudoku Oluşturun
2024/05/16
Tailwind Neden Harikadır ve Web Geliştirmeyi Nasıl Kolay Hale Getirir?
2024/05/15
Python ve Git Hooks ile Otomatik Olarak Site Haritası Oluşturma
2024/05/14
Kitap İncelemesi | Çok Yönlü - Başarı İçin Neden Çok Şeyle İlgilenmeliyiz? by David Epstein
2024/05/13
Svelte ve SvelteKit nedir?
2024/05/12
SvelteKit ile Internationalization (Çoklu Dil Desteği)
2024/05/11
Svelte'de Caching ile Deploy Süresini Azaltın
2024/05/10
Svelte ve Intersection Oberver ile Lazy-Load
2024/05/10
Genetik Algoritma İle Hisse Senedi Portföyü Optimizasyonu
2024/05/09
ShapeFile Formatini SVG Formatina Degistirme Yontemi
2024/05/08
Svelte'de Reaktivite: Variables, Binding, ve Key Fonksiyonu
2024/05/07
Kitap İncelemesi | Savaş Sanatı - Sun Tzu
2024/05/06
Specialistlik Bitti. Yaşasın Generalistlik!
2024/05/03
2018 Milletvekili Seçimlerinde Yaşa Göre Parti Eğilimi
2024/05/01
Python Selenium Ile Secmen Veritabani Olusturma
2024/04/30
Svelte ve Tailwind Ile Infinite Scroll Yapma Yontemi
2024/04/29
1 Yıl İçerisinde Japonca Konuşabilmek
2024/04/25
Svelte ve Tailwind ile Kullanıma Hazır Web Sitesi Şablonu
2024/01/29
Tembel Muhendisler Kotu Urunler Yapar
2024/01/28
Mukemmellik Uzerine
2024/01/28
MacBook'ta PDF'i PNG'ye Cevirme Yontemi
2023/12/31
2023'u Kapatiyoruz: Bu Yil Okunan 24 Kitap
2023/12/30
Python PIL Kullarak Foto Kolaji Yapma Yontemi
2024/01/09
Site Ziyaretcilerinin Alet ve Tarayicilarini Tespit Etme Yontemi
2024/01/19
ChatGPT Cevap Anatomisi