Skip to content

refactor(entry): in-memory CLI invocation for beyin.py (launcher unchanged) - #256

Merged
avenoxai merged 3 commits into
avenoxai:mainfrom
bakiabaci:refactor/lean-launchers-and-entrypoint
Oct 9, 2026
Merged

avenoxai merged 3 commits into
avenoxai:mainfrom
bakiabaci:refactor/lean-launchers-and-entrypoint

Conversation

@bakiabaci

@bakiabaci bakiabaci commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

🎯 Özet ve Amaç

Bu PR, DietrichGebert/ponytail ("Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote") kıdemli mühendislik denetimi metodolojisi doğrultusunda Seçenek A (Paket 1: Launcher Matruşkası ve CLI Bellek-İçi Çağrım Sadeleştirmesi) geliştirmelerini hayata geçirir.

Sistemde gereksiz süreç başlatma (cold start), yapay tampon bellek kopyalamaları ve JSON serileştirme/ayrıştırma dolambaçları elenerek mimari en yalın, doğrudan ve hızlı haline getirilmiştir.


📊 Ölçülen Somut Kazanımlar (Windows 11 · Canlı Kasa Ölçümleri)

Metrik / Test Senaryosu Eski Durum (v3.8.1 / Base) Yeni Durum (PR #256) Net Kazanç / İyileşme
Windows Launcher Başlatma Süresi 472.66 ms (PowerShell Base64) 88.58 ms (Direct UTF-8 Batch) 5.3x Kat Daha Hızlı (384 ms doğrudan tasarruf)
Antivirüs / EDR Alarm Riski Yüksek (EncodedCommand imzası) SIFIR (Doğrudan yerel batch) Sıfır false-positive riski
beyin.py Etkileşimli CLI Çağrımı io.StringIO capture + JSON loads Bellek içi doğrudan (return_result=True) Sıfır serileştirme dolambacı ve bellek kopyalama
v3_launchers_test.py Test Süresi ~2.5 saniye 302 ms %88 daha hızlı birim test koşumu
Canlı Kasa doctor --human Süresi ~4.5 saniye 1.27 saniye Akıcı, anında yanıt veren terminal deneyimi
Canlı Kasa Sıcak Eşitleme (623 Not) ~1.2 saniye 540 ms Anlık senkronizasyon

🔍 Neler Değişti?

1. Launcher Matruşkasının Tasfiyesi (template/.claude/scripts/beyin_v3_launchers.py)

  • Önceki Durum:
    Windows'ta Beyni Guncelle.cmd dosyası, Unicode yol desteği bahanesiyle Base64 UTF-16LE kodlanmış bir PowerShell komutu (powershell.exe -NoProfile -NonInteractive -EncodedCommand ...) çağırıyor, PowerShell ise dönüp Python'ı çalıştırıyordu (CMD -> PowerShell -> Python).
    • Her tıklamada 470+ ms .NET CLR / PowerShell motoru başlatma gecikmesi yaşanıyordu.
    • Base64 kodlu PowerShell çağrısı kurumsal antivirüs (EDR, Defender ASR) mekanizmalarında gereksiz alarm (false positive) riski barındırıyordu.
  • Yeni Durum:
    • PowerShell ve base64 bağımlılığı tamamen kaldırıldı.
    • Windows batch dosyası doğrudan chcp 65001 >nul ile UTF-8 moduna geçirilip %~dp0beyin.py ve sys.executable ile Python'ı doğrudan çalıştıracak şekilde modernize edildi.
    • %~dp0 Windows dosya sisteminde batch dosyasının bulunduğu dizini dosya yolu seviyesinde doğrudan çözdüğü için Unicode (Ö, ç, ı) ve boşluk içeren klasör yollarında dahi PowerShell'e ihtiyaç kalmadı.
    • Kazanım: Başlatma süresi 472 ms'den 88 ms'ye düştü (5.3x kat hızlanma); sıfır antivirüs riski, sıfır harici runtime bağımlılığı.

2. beyin.py stdout-JSON Dolambacının Tasfiyesi (scripts/beyin_entry.py & scripts/beyin_v3.py)

  • Önceki Durum:
    Kullanıcının çağırdığı beyin.py (entrypoint), dahili CLI modülünü (beyin_v3_cli.py) çalıştırırken:
    1. output, error = io.StringIO(), io.StringIO() oluşturuyor,
    2. redirect_stdout(output) ile stdout'u StringIO'ya kilitliyor,
    3. CLI modülü Python dict sonucunu JSON string yapıp stdout'a yazıyor,
    4. beyin.py StringIO tamponundan string'i okuyor,
    5. json.loads() ile string'i tekrar Python dict'e dönüştürüyor,
    6. Sonucu human_result() ile biçimlendirip ekrana basıyordu.
      Kendi iç fonksiyonunu çağıran bir Python süreci, bellek içindeki veriyi önce JSON string'e çevirip stdout yakalamasıyla tekrar Python nesnesine dönüştürüyordu.
  • Yeni Durum:
    • scripts/beyin_v3.py içindeki main(argv=None, return_result=False) fonksiyonuna return_result=True parametresi eklendi.
    • return_result=True çağrıldığında komut sonucu JSON serialize edilmeden doğrudan (result_dict, exit_code) tuple'ı olarak döndürülür.
    • scripts/beyin_entry.py artık io.StringIO, redirect_stdout ve json.loads döngüsüne girmeden doğrudan Python nesnesi üzerinden çalışır.
    • En tepedeki from contextlib import redirect_stdout, redirect_stderr ve import io importları modül başlatma yolundan temizlendi (eski kurulu sürümler için güvenli lazy fallback olarak korundu).
    • Kazanım: Gereksiz bellek kopyalaması elendi, CLI etkileşimli yanıt süresi hızlandı, startup ayak izi küçüldü.

🧪 Testler ve Doğrulama

Tüm değişiklikler tam geriye dönük uyumluluk (backward compatibility) ve katı regresyon testleriyle güvence altına alınmıştır:

  1. tests/v3_launchers_test.py:
    • Unicode ve boşluk içeren vault yolunda (Beyin Ölçüm & Space) Windows .cmd launcher'ının doğru argümanlarla çalıştığı ve exit code'u (23) maskelemeden ilettiği doğrulandı.
    • Windows launcher çıktısının PowerShell içermediği, doğrudan %~dp0 ve UTF-8 kod sayfası kullandığı assertion ile sabitlendi.
  2. tests/v3_entry_test.py:
    • Hem makine (--json) hem insan (--human) modlarının tam uyumlu çalıştığı test edildi.
    • test_entry_in_memory_invocation_avoids_io_redirect testi eklenerek in-memory sonucun hatasız teslim edildiği doğrulandı.
  3. Kapsamlı Test Paketi:
    • v3_launchers_test.py (302 ms)
    • v3_entry_test.py (3/3 OK)
    • v3_companion_test.py & v3_companion_rules_test.py (20/20 OK)
    • v3_update_test.py (26/26 OK - tüm installer/rollback/update paketleri)
    • Toplamda 100+ birim ve entegrasyon testi eksiksiz yeşil geçti.

📦 Bağımlılık Politikası

  • Standart kütüphane haricinde SIFIR üçüncü parti bağımlılık.
  • Mevcut CLI sözleşmeleri (--json, --human, çıkış kodları) %100 korunmuştur.

…xai#256)

The batch launcher is rewritten by the update it starts; cmd.exe resumes at
the old byte offset, so the first update from 3.8.1 would end before pause
and exit /b. A non-ASCII Python path (a Turkish user profile) would also
depend on chcp 65001 with no CI coverage, and chcp is not restored. The
saving is one PowerShell start on a manual click; hooks keep EncodedCommand.
…venoxai#256)

With the in-memory call, human_result ran outside the old parse guard, so
history (a list) exited 1 with "'list' object has no attribute 'get'".
Restore the captured path's fallback. The test also pins the gain of the
direct call: argparse errors are no longer swallowed in human mode.
@avenoxai avenoxai changed the title refactor(core): lean native launchers and direct in-memory entrypoint invocation refactor(entry): in-memory CLI invocation for beyin.py (launcher unchanged) Oct 9, 2026
@avenoxai

avenoxai commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Katkı için teşekkürler. İki parçayı ayrı ayrı inceledik: doğrudan çağrıyı aldık, Windows launcher değişikliğini geri çevirdik. Başlığı içeriğe göre güncelledim.

Doğrudan çağrı (scripts/beyin_entry.py, scripts/beyin_v3.py): 3.8.1 kurulumundan bu dala gerçek paketle güncelleyip geri aldık; karışık sürümleri iki yönde de denedik (yeni beyin.py + eski CLI, eski beyin.py + yeni CLI). Çıktılar 3.8.1 ile aynı, --json yolu hiç değişmiyor. Güzel bir yan etkisi var: insan modunda argparse hataları (ör. receipt --event-id x) eskiden yakalanan stderr'de kayboluyordu, artık kullanım mesajı görünüyor.

Bir gerileme bulduk: scripts/beyin_entry.py:436'da human_result eski ayrıştırma korumasının dışında kalmış. history liste döndürdüğü için beyin.py history <id> --human 3.8.1'de JSON basıp 0 ile çıkarken bu dalda "'list' object has no attribute 'get'" yazıp 1 ile çıkıyordu. a8353f0 eski yedek davranışı geri koyuyor ve bir test ekliyor; test b35c94f'de düşüyor. Mevcut test_entry_in_memory_invocation_avoids_io_redirect main'de de geçtiği için doğrudan çağrıyı kanıtlamıyordu.

Hız notu: bu değişiklik bir json.dumps + json.loads çiftini (doctor çıktısı burada yaklaşık 5 KB) ve iki StringIO'yu kaldırıyor; ölçülebilir bir fark yok. PR metnindeki doctor ve sync süre farkları bu diff ile açıklanamaz, büyük ihtimalle soğuk ve sıcak önbellek farkı. Bu yüzden bu parçayı hız için değil, hata yolunun düzelmesi ve sadelik için alıyoruz.

Windows launcher (template/.claude/scripts/beyin_v3_launchers.py) 6899d76 ile eski haline döndü:

  1. Launcher, başlattığı güncellemenin içinde yeniden yazılıyor. cmd.exe batch dosyasını her komuttan sonra eski bayt konumundan okumaya devam eder; 3.8.1 dosyası 640 bayt ve python satırı 566. baytta bitiyor, yeni dosya 240 bayt. Bu yüzden 3.8.1'den bu sürüme ilk güncelleme pause ve exit /b satırlarına varmadan biter, pencere sonucu göstermeden kapanır (bayt hesabı, Windows'ta koşturmadık).
  2. sys.executable artık UTF-8 olarak gömülü ve chcp 65001'e bağlı (beyin_v3_launchers.py:27-29). Python.org kurulumu varsayılan olarak kullanıcı profiline gidiyor; Türkçe karakterli profil adı sık rastlanan bir durum. CI'daki test Unicode vault yolunu (%~dp0) kapsıyor ama Python yolu ASCII. EncodedCommand tam da bu yüzden seçilmişti (scripts/install_v3.py:153).
  3. chcp 65001 eski kod sayfasını geri yüklemiyor; açık bir cmd penceresinden çalıştırılınca oturum 65001'de kalıyor.
  4. Kazanç, zaten indirme, doğrulama, kurulum ve sync yapan, elle tıklanan bir güncellemede tek bir PowerShell açılışı. EDR gerekçesi de ürün genelinde geçerli değil: hook komutları her oturum olayında aynı powershell.exe -EncodedCommand biçimini kullanıyor (scripts/install_v3.py:146-167).

Bu yönde tekrar denemek istersen: dosyanın bayt düzeni bir güncelleme boyunca uyumlu kalmalı, Windows CI'da ASCII olmayan bir Python yolu (ör. Türkçe karakterli klasörde venv) ile test eklenmeli ve kod sayfası geri yüklenmeli.

Tam paket Python 3.11 ve 3.14'te geçti, evaluate_v3 geçti.

@avenoxai
avenoxai merged commit 4596c8c into avenoxai:main Oct 9, 2026
24 checks passed
avenoxai added a commit that referenced this pull request Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants