Ana içeriğe geç

Geliştirici Notları

Bu bölüm platformu geliştiren ve inceleyen kişiler içindir: neden bu teknolojileri seçtik, hangi kararları verdik, hangi fikirleri eledik, nerede duruyoruz. İş kullanıcıları bu bölümü atlayabilir. Kayıt altına alınmış resmi kararlar depodaki docs/adr/ altındadır; burası onların özeti ve arka planıdır.

Teknoloji seçimleri​

AlanSeçimNeden
BackendFastAPI + SQLModelAsync, otomatik OpenAPI, Pydantic doğrulaması; tek model hem ORM hem şema
VeritabanıPostgreSQL 16 + pgvector (dev: SQLite)Başlangıçta SQLite'tı (tek dosya, basit yedek); anlamsal arama ve çok işlemli çalışma için PostgreSQL'e geçildi
ArayüzSvelteKit 5 + TailwindKüçük paket, runes sistemi az kalıp kod gerektirir; temel bileşenler (Button, Badge, Input…) shadcn-svelte'in o dönemki Svelte 5 uyumsuzluğu yüzünden bize ait
ZamanlamaAPScheduler (işlem içi)Celery + Redis gibi ayrı servis gerektirmez; çok işlemde kilit dosyasıyla tek lider
GitPyGithub (GitHub Contents API)Sunucuda klon yönetmek yerine tek HTTP çağrısı; SHA yönetimi otomatik
Git kimlik doğrulamaKişisel erişim token'ı (PAT)MVP için yeterli; OAuth (callback, gizli anahtar yönetimi) ertelendi

Verilen mimari kararlar​

  • Değişiklik talepleri iki aşamalı: bölüm yöneticisi → yönetici. "Kurucu onaylasın" fikri ölçeklenmediği için bırakıldı. Bölüm yöneticisi teknik uygunluğa, yönetici kurumsal risk ve politikaya bakar. → Değişiklik Talepleri
  • Görev yönlendirmesi üst departman zincirinde yükselir. Önce aynı departmanda yetenek eşleşmesi aranır, bulunamazsa parent_id zinciri yukarı tırmanılır. Merkezi "genel ajan havuzu" yerine organik yönlendirme. → Görev Talepleri
  • Tek bir bildirim katmanı. Akış sonuçları, görev bildirimleri ve sistem mesajları aynı InboxMessage tablosuna düşer; source_type ayırt eder. Yeni olay türü eklemek gelen kutusu kodunu değiştirmez.
  • İnsan onayı ajan zincirinin içinde. Ajanlar arası devir iki insan onayı ister; ajanlar birbirini insansız çalıştıramaz. → Delegasyon
  • Geliştirici ve departman katmanı ayrı kapılar, ortak çekirdek. Aynı gateway, politika motoru ve denetim zinciri; yüzey kişinin işine göre değişir (opencode / fab / web).

Mimari karar kayıtları (ADR)​

ADRKonuDurum
0001Geliştirici istemcisi olarak opencodekabul edildi
0002Yürütme modeli: laptop + zorunlu yerel sandboxkabul edildi
0003Tehdit modeli ve zorlama sınırlarıönerildi
0004Merkezi LLM gateway (OpenAI uyumlu, kendi anahtarını getir)kabul edildi
0005Çalıştırılabilir politika motoru (hata durumunda reddeden)kabul edildi
0006Değiştirilemez (hash zincirli) denetimönerildi (uygulandı)
0007Ajan kimliği ve kısa ömürlü kimlik bilgilerikabul edildi
0008TUI stratejisikabul edildi; TUI teknolojisi ADR-0014 ile değişti
00093pa iş istasyonu CLI'ıkabul edildi
0010Prompt injection savunmasıkabul edildi
0011Yönetilen yapılandırma ve öncelikkabul edildi
0012Depo yapısı ve sürüm sürecikabul edildi
0013LLM ile denetim önem puanlamasıkabul edildi
0014Her departman için terminal çalışma alanı (fab)önerildi
0015Şirket belgelerini alma (Docling) ve sıralama (Jev)önerildi, kod yok
0016Kurulum kiti: organizasyon şeması, kimlik, modeller, şirket sistemleriönerildi
0017Politikalar kod olarak (sürümlü) ve günlük iş incelemesiönerildi, kod yok
0018Çalışma alanı yaşam döngüsü API'siönerildi
0019Kişi başına tek ajan ve iş incelemesiönerildi
0020Token bütçeli prompt ve niyet ayrıştırmaönerildi
0021Uygunluk rubriğiönerildi

0014 ve 0018–0021 büyük ölçüde uygulandı ama statüleri hâlâ proposed; kabul kararı bekliyor. Ayrıntı ve sıradaki işler: depodaki docs/ROADMAP.md.

Planlanan: politikaları yerel bir git sistemiyle yönetmek​

Bugün Git entegrasyonu GitHub'a bağlıdır (değişiklik talebi commit'i). Planlanan yön (ADR-0017): şirket politikalarının, rubriğin ve ajan yapılandırmalarının şirketin kendi yerel git sisteminde, bir kod kütüphanesi gibi sürümlenmesi; değişikliklerin değişiklik talebi akışından geçmesi; git'in "gerçeğin kaynağı", veritabanının ise bundan yeniden kurulabilen önbellek olması. Bu henüz yazılmadı.

Strateji notları (Eylül 2026 tartışmasının özeti)​

Politika belgelerini işletilebilir kılma (Docling + Jev). Büyük şirketlerin yüzlerce politika belgesini Docling ile içeri alıp, guardrail'leri bağlam penceresinin dışına taşımak ve TypeSafe AI "Jev" ile denetlemek fikri araştırıldı. Bulgular:

  • Jev, metin üretmeyen bir sınıflandırıcıdır (tipli sorulara olasılık verir). Net ihlal/uyum vakalarını çok iyi ayırdı; belirsiz vakalarda tutarsızdı. Bu yüzden tek başına karar verici değil, bir "hakem" olarak kullanılır ve insan gözetimiyle birlikte.
  • Docling, PDF'leri pypdf'ten çok daha temiz çıkarır ama başlık/alt bilgi tekrarları için bir temizleme katmanı gerekir.
  • Bir LLM'in ürettiği özetlerde "izin sınırı"nı "yükümlülük" diye yazması gibi anlamsal hatalar görüldü; sadece alıntı eşleştirmesi yetmez.
  • Bu sunucuda yerel model çalıştırmak mümkün değil (GPU yok); sağlayıcılar harici kalır.
  • Jev'in gizlilik/saklama koşulları doğrulanmadan gerçek şirket belgeleri ona gönderilmemelidir.

Araçların yerine geçmek yerine arasına girmek. Hedef, çalışanların kullandığı araçları (opencode, benzeri geliştirici araçları, ileride sohbet uygulamaları) değiştirmek değil, aralarına girip kullanım, maliyet ve uygunluğu görünür kılmak. İki kademe:

  • Kademe A: adresi (base URL) ayarlanabilen araçlar. Mevcut gateway'in doğal uzantısı; düşük risk. Önce bu.
  • Kademe B: SaaS sohbet uygulamaları (araya girme/MITM). AI-DLP/CASB pazarına girmek demektir: aylar süren, ayrı bir mühendislik ve hukuki ağırlık. Yol haritasında kalır, küçük bir pilotla sınırlı.

Cihaz kimliği olarak MAC adresi çalışmaz (taklit edilebilir, katman 2'dir ve bulut sunucu göremez, işletim sistemleri varsayılan olarak rastgeleleştirir). Doğrusu cihaz sertifikası + SSO. Hiyerarşik raporlama için CompanyMember.role/scope_id ve politika motorunun departman zinciri zaten hazırdır.

İnsan kullanımı sinyali ajan denetiminden ayrıdır. Ajanlar için denetim zinciri enjeksiyon savunmasının parçasıdır; insan çalışanlar için daha hafif, asenkron ve danışma amaçlı bir sinyal gerekir (engellemez). Web sohbet akışında, mesaj modele gitmeden hemen önce sunucu tarafında zaten bir kanca noktası vardır; Kademe B'ye gerek kalmadan buradan başlanabilir.

Sınıflandırma şeması sabit olmamalı ama tam otonom da olmamalı. Taksonomi ve Jev soruları her şirketin kendi belgelerinden üretilmeli, fakat devreye alma insan onaylı olmalı (draft → active). Ölçülen hatalar (yukarıdaki) tam otonomiyi savunulamaz kılıyor. Bu, mevcut dry_run → enforce ve değişiklik talebi desenleriyle aynı mantık. ADR-0021'deki rubrik tasarımı (taslak → gölge → canlı) bu ilkeyi uygular.

Geliştirme ve doğrulama​

# Backend (~6 dk)
cd backend && ruff check . && ruff format --check . && python -m pytest -q

# fab (Rust)
cd packages/tui && cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test

Dikkat edilecekler:

  • Yeni migration tablo ekliyorsa backend/tests/test_pg_smoke.py içindeki added_since listesine ekleyin; mevcut tabloya sütun ekliyorsa orada düşürülmeli. Aksi halde PostgreSQL CI kontrolü "relation already exists" ile kırılır.
  • Sıfırdan SQLite'ta tüm Alembic zinciri çalışmaz (eski bir geçiş yüzünden). Denemek için create_all + alembic stamp <önceki revizyon> + upgrade head.
  • Mimari açıdan önemli dosya değişiklikleri bir ADR ister (adr-guard iş akışı); gerekmiyorsa PR'a no-adr-needed etiketi konur.
  • Anahtarlar yalnızca ortam değişkeni olarak verilir; dosyaya ya da commit'e yazılmaz. Bir anahtar sohbete/kayda sızdıysa döndürülmüş sayın.