Yapay Zeka / AI

Context Mode: Ajanın Masasına Dosya Değil, Not Gelsin

context-mode, ajanın ham araç çıktısını bağlam penceresine sokmadan ayrı bir süreçte işleyip yalnızca sonucu getiriyor. 484 KB'lık bir PHP günlüğünde 809 bayt döndü; ama arama saymıyor, sayaç kendini abartıyor ve "sandbox" bir işletim sistemi sandbox'ı değil.

7 dk okuma

Bu yazının İngilizcesi de var →
Lamba ışığındaki neredeyse boş çalışma masasında tek bir not kartı ve pirinç anahtar, arkada klasörlerle dolu arşiv odası; bağlam penceresine dosya değil not geliyor.

Bir ajanın bağlam penceresini çalışma masası gibi düşünün. Masa ne kadar büyük olursa olsun, üstüne arşivdeki bütün klasörleri dökerseniz asıl işin kâğıdı altta kalır. İyi bir kâtip klasörü arşivde bırakır, masaya üç satırlık bir not getirir: "29 tane fatal var, hepsi aynı dosyanın 27. satırından."

PHP 8.5 yükseltmesini yazarken yarım saatte 568 satır deprecation birikmişti, hepsi aynı cümle. Bir ajana o günlüğü "oku bakalım" diye verseydim 568 satırın tamamı masaya gelecekti. Bu haftanın radarındaki context-mode tam bu kâtip işini üstlenmeye çalışıyor. Bu sefer gerçekten kurdum, PHP-FPM tarzı bir günlükle ölçtüm ve beklemediğim iki şey buldum.

Context Mode nedir?#

Tek cümleyle: Kodlama ajanının ham araç çıktısını (günlük, test sonucu, API yanıtı, web sayfası) bağlam penceresine sokmadan ayrı bir alt süreçte işleyen, modele yalnızca o sürecin yazdırdığını gönderen, büyük çıktıları da SQLite FTS5 ile aranabilir bir dizine koyan bir MCP sunucusu ve kanca (hook) paketi.

Araç belirli bir ajana bağlı değil. README'deki listeye göre Anthropic'in Claude Code'u, OpenAI'ın Codex CLI'ı, Google'ın Gemini CLI ve Antigravity'si, Cursor, GitHub Copilot, OpenCode ve Zed dahil on sekiz istemciyi destekliyor. Destek derinliği aynı değil, birazdan oraya geleceğiz.

Nasıl çalışıyor: çıktıyı değil sonucu getir#

Fikrin özü projenin "Think-in-Code" dediği şey: ajan 500 KB'lık dosyayı okuyup kafasında saymaz, dosyayı sayan kodu yazar ve yalnızca sonucu görür. Bunun için on bir MCP aracı var; işin yükünü üçü taşıyor:

  • ctx_execute: Verilen kodu (JavaScript, Python, PHP, shell ve başka dillerde) ayrı bir süreçte çalıştırır, yalnızca stdout döner.
  • ctx_execute_file: Dosyayı FILE_CONTENT değişkenine yükler, sizin kodunuz onun üstünde çalışır.
  • ctx_search: Dizine alınmış büyük çıktılarda BM25 ile arar.

Kancalar da ajan kendi araçlarıyla (shell komutu, web isteği) büyük çıktı çekmeye kalktığında araya girip onu bu araçlara yönlendiriyor.

Denedim: 484 KB'lık bir PHP günlüğü#

Kurulum Claude Code tarafında iki eğik çizgi komutu, Codex'te bir CLI satırı (README kancalar için ayrıca config.toml'a [features] altında plugin_hooks = true ve hooks = true eklenmesini istiyor):

Metin
# Claude Code içinde
/plugin marketplace add mksglu/context-mode
/plugin install context-mode@context-mode
/context-mode:ctx-doctor
Bash
# Codex CLI
codex plugin marketplace add mksglu/context-mode
​
# Yalnızca MCP, kancasız (Claude Code örneği)
claude mcp add context-mode -- npx -y context-mode

Ben ölçümü bir ajanın içinden yapmadım. npm'den v1.0.169'u kurdum (Node 22, PHP 8.3 CLI), MCP sunucusunu küçük bir JSON-RPC istemcisiyle doğrudan çağırdım. Yani araçların ne döndürdüğünü ölçtüm, kancaların bir ajanı ne kadar iyi yönlendirdiğini değil.

Test verisi sentetik: sabit tohumla ürettiğim 3.000 satırlık, 495.838 baytlık bir PHP-FPM hata günlüğü. İçinde PHP 8.5 yazısındaki o tanıdık "Using null as an array offset" satırı da var. Aynı soruyu dört yoldan sordum: "Burada ne var, fatal'lar nereden geliyor?"

Yol Modele dönen Ne gördü
Dosyayı doğrudan okutmak 495.838 bayt Her şeyi
ctx_execute_file + PHP özet kodu 809 bayt (203 ms) Beş kaynak, 29 fatal, tam sayılarla
ctx_execute + intent ("PHP Fatal error PDOException") 1.561 bayt 5 önizleme, ikisi fatal
ctx_execute, intent olmadan 268 bayt Yalnızca "dizine eklendi"

ctx_execute_file'a gönderdiğim gövde şu (FILE_CONTENT araç tarafından doldurulur; komut satırında denemek için başına <?php ve $FILE_CONTENT = file_get_contents($argv[1]); ekleyin, php -l'den geçti):

PHP
$satirlar = explode("\n", trim($FILE_CONTENT));
$say = [];
foreach ($satirlar as $s) {
    if (preg_match("/\] (PHP [A-Za-z ]+?):\s+(.+?) in (\S+?)(?: on line |:)(\d+)/", $s, $m)) {
        $anahtar = $m[1] . " | " . basename($m[3]) . ":" . $m[4];
        $say[$anahtar] = ($say[$anahtar] ?? 0) + 1;
    }
}
arsort($say);
echo count($satirlar), " satir, ", count($say), " farkli kaynak\n";
foreach ($say as $k => $n) { echo str_pad((string)$n, 6, " ", STR_PAD_LEFT), "  ", $k, "\n"; }

Masaya gelen not:

Metin
3000 satir, 5 farkli kaynak
  2065  PHP Deprecated | Memo.php:88
   548  PHP Warning | Liste.php:41
   281  PHP Notice | Csv.php:112
    77  PHP Warning | Servis.php:54
    29  PHP Fatal error | Baglanti.php:27

495.838 bayttan 809 bayta. Ama bu sayının asıl kahramanı araç değil, o on bir satırlık PHP. Kâtip notu ancak ona doğru soruyu sorduğunuzda doğru yazıyor.

Ne zaman işe yarar, ne zaman yaramaz?#

Gerçek: Uzun test çıktısı, büyük JSON yanıtları, sunucu günlükleri, dokümantasyon sayfaları. Oturum uzadıkça fark büyüyor, çünkü masaya gelmeyen her bayt sonraki adımlarda yer kaplamıyor. Lokal LLM bölümünde anlattığım 4.096 tokenlik pencereyle çalışıyorsanız bu fark daha da hissedilir.

Gerçek: Düzenleyeceğiniz dosyada işe yaramaz. Ajanın dosyayı değiştirmesi için tam metni görmesi gerekiyor; aracın kendi açıklaması da bunu söylüyor.

Acı Gerçek 1, arama saymaz: intent yolunda BM25 bana beş önizleme getirdi; ikisi fatal, ikisi deprecation, biri notice. Kaç fatal olduğunu söylemedi, söyleyemez de. Sayım, gruplama, toplam gibi işler kodla yapılmalı. Arama "nerede geçiyor" sorusuna cevap verir, "kaç tane" sorusuna değil.

Acı Gerçek 2, sessiz dizin: intent vermeden büyük çıktı üretirseniz model yalnızca "1 bölüm dizine eklendi, ctx_search ile sorgulayın" cümlesini görüyor. Ajan aramayı akıl etmezse bilgi masaya hiç gelmiyor.

Acı Gerçek 3, sayaç kendi mesaisini yazıyor: Dört çağrıdan sonra ctx_stats bana "974 KB tasarruf, %99,5 azalma, yaklaşık 1,24 dolar (Opus)" dedi. Ortada 484 KB'lık tek bir dosya vardı; sayaç her çağrıyı "bu araç olmasaydı ne gelirdi" diye ayrı ayrı topluyor. Rakamı kendi kanıtınız saymayın, kendi oturumunuzda ölçün. README'deki "315 KB'tan 5,4 KB'a, %98" de projenin kendi ölçümü.

Dikkat, "sandbox" kelimesi: README'nin güvenlik bölümü açıkça yazıyor: ctx_execute keyfi kod çalıştırır ve sürecin dosya sistemi erişimini devralır; bu tam bir işletim sistemi sandbox'ı değil. gh, aws gibi CLI'lar kimlik bilgilerini de devralıyor. ctx_execute_file proje kökünün dışına okuma yapmıyor, ama bu yalnızca dosya okuma aracı için geçerli. Çalıştırma onayını keyfi kod onayı gibi düşünün.

Kanca yoksa rica var: Cursor, Codex ve Claude Code'da kancalarla çalışıyor, ama derinlik farklı. Codex'in PreToolUse kancası şimdilik yalnızca reddetme kuralı destekliyor, girdiyi yeniden yazamıyor. Cursor'ın doğrulayıcısı sessionStart kancasını reddettiği için oturum geri yükleme orada yok. Zed ve Antigravity IDE'de kanca hiç yok; yönlendirme yalnızca AGENTS.md ya da GEMINI.md'deki talimata kalıyor ve README bunun için "yaklaşık %60 uyum" diyor. Vibe Coder #4.2'de "kural dosyası bağlamdır, kapıyı tutan kancadır" demiştim; bu yüzde o cümlenin sayıyla yazılmış hâli.

Bakım durumu ve emeğin sahibi#

Konu Durum (13 Ekim 2026)
Lisans Elastic License 2.0 (ELv2); OSI'nin onaylı lisans listesinde yok
Son sürüm v1.0.169 (npm, 29 Haziran 2026)
Geliştirme next dalında son commit 28 Eylül 2026; main'de yalnızca otomatik istatistik commit'leri
Yıldız yaklaşık 26,9 bin
Açık issue / PR 173 / 174
Gereksinim Node.js 22.5 ve üstü (ya da Bun); Linux'ta 22.5 altı desteklenmiyor
Veri README "telemetri yok" diyor; ekip panosu için platform.json yapılandırırsanız her olay o adrese gönderiliyor

Projeyi Mert Köseoğlu geliştiriyor ve sürdürüyor; LICENSE'taki telif de onun adına. ELv2 şunu söylüyor: kendi işinizde kullanmak, değiştirmek, dağıtmak serbest; yazılımı üçüncü kişilere barındırılan ya da yönetilen bir hizmet olarak sunmak yasak. Kaynak kodu açık ama "açık kaynak" tanımına girmiyor; müşteri projesine koyacaksanız bu ayrım önemli. Ekipler için ayrıca barındırılan bir analitik panosu (Insight) sunuluyor.

Alternatiflerle kısa karşılaştırma#

Araç Katman Lisans Son sürüm
context-mode MCP + kancalar, kodu ayrı süreçte çalıştırır, büyük çıktıyı dizine alır ELv2 v1.0.169 (29.06.2026)
RTK Shell komutunu yeniden yazan Rust CLI proxy'si, komut çıktısını süzer Apache-2.0 v0.51.0 (02.10.2026)
Headroom Kütüphane, proxy ve MCP; araç çıktısını sıkıştırır, orijinali yerelde saklar Apache-2.0 v0.40.0 (05.10.2026)
claude-mem Oturumlar arası hafıza (kancalar, SQLite, vektör arama) Apache-2.0 v13.37.0 (12.10.2026)

Net önerim: derdiniz git, composer, phpunit gibi komutların gürültüsüyse RTK daha dar kapsamlı ve tek bir ikili dosyadan ibaret. Derdiniz ajanın büyük veriyi okuyup kafadan hesap yapmasıysa context-mode'un "kodu yaz, sonucu getir" yaklaşımı tam o işe oturuyor. Lisans hassasiyetiniz varsa üç alternatifin üçü de Apache-2.0.

Sahada: benim işimde nereye oturur?#

Benim günlük malzemem tam bu aracın sevdiği türden: PHP-FPM günlükleri, MariaDB'nin ANALYZE FORMAT=JSON çıktıları, uzun PHPUnit koşuları. Deneyeceksem ilk sırada günlük okuma olurdu, çünkü orada yanlış özet en pahalısı. Ama iki şartla: çalıştırma araçlarını otomatik onaya almadan ve sayaca değil kendi ölçümüme bakarak.

Kâtibin değeri getirdiği notun doğruluğunda. Arşivin anahtarını da ona verdiğinizi unutmayın.

Yorumlar

0 yorum

Yorum yazın

kişisine yanıt

Yorumlar onaylandıktan sonra görünür. E-posta adresiniz kimseyle paylaşılmaz. Kişisel verileriniz nasıl işlenir?