Imported from yesdopepe/KEYSIS (
AGENTS.md). Install upstream withnpx skills add yesdopepe/KEYSIS. Copyright stays with the author.
KEYSİS (Kapsamlı Evrak Yönetim Sistemi) — MVP Görev Yol Haritası
Bu dosya, Teknofest KEYSİS (Kapsamlı Evrak Yönetim Sistemi) projesinin 2 haftalık MVP geliştirme yol haritasıdır. Antigravity bu dosyayı her konuşmada okur ve mevcut duruma göre sıradaki aşamadan devam eder. Kapsam dışı maddeleri (Bölüm 2) asla önerme veya implemente etme.
Durum Takibi
Tamamlanan aşamaları [x] ile işaretle, aktif olanı [/] ile:
- Aşama 1 — İskelet ve state tanımı ✅ (20/20 test geçiyor)
- Aşama 2 — Ingestion (AnyDoc, senkron) ✅ (32/32 test geçiyor)
- Aşama 3 — EBYS çekirdek: evrak kayıt + SDP modülü ✅ (41/41 test geçiyor)
- Aşama 4 — Router Agent
- Aşama 5 — Qdrant + mcp_mevzuat + Reader Agent
- Aşama 6 — HITL node #1 (anlamlandırma onayı)
- Aşama 7 — Writer Agent + resmi yazışma skill'i
- Aşama 8 — HITL node #2 + mcp_memory + onay zinciri
- Aşama 9 — Süre takibi + audit log + RBAC
- Aşama 10 — Frontend (HITL review + evrak listesi) ✅ (Next.js 15, UI/UX Pro Max)
- Aşama 11 — Multi-tenant config + metrikler
Kapsam Dışı — YAPMA (kesin sınır)
- E-imza (kriptografik imza altyapısı)
- EYP (e-Yazışma Paketi) üretimi
- KEP / DETSİS entegrasyonu
- Arşiv & imha planı (saklama süreleri, tasfiye süreçleri)
- Gizlilik derecesi yönetimi
- Kurumlar arası (dış) gönderim
- Kapsamı genişletme, "iyi olur" diye ekstra modül önerme
Bu maddeler için sadece TODO yorum satırı bırakmak yeterli.
Kodlama Kuralları (her aşamada uy)
- Hiçbir LangGraph node'u doğrudan LLM SDK import etmesin — hepsi
app/llm/client.pyüzerinden - Model adı
config/model_config.yaml'dan gelsin, hardcode yok - HITL noktaları asla bypass edilemesin
- Agent prompt'ları kod içinde hardcode değil, ayrı
.md/.txtdosyalarında - Her MCP server bağımsız çalıştırılabilir ve test edilebilir olmalı
- Türkçe metin: UTF-8 zorunlu
- AnyDoc yerel (offline) Rust kütüphanesidir (
anydoc/firecrawl-anydoc), veri dışarıya çıkmaz - Her aşama sonunda
docker-compose upile çalışır sistem olmalı - Takılırsan basitleştir, kapsamı genişletme
- Her aşama tamamlandığında frontend (Next.js) tarafı da güncellenmeli:
- Yeni backend endpoint'leri varsa ilgili UI bileşeni/sayfası eklenmeli veya güncellenmeli
- Yeni veri alanları frontend'de görüntülenmeli (tablo, kart, detay sayfası vb.)
- HITL akışları backend'e bağlandığında frontend'teki HITL review ekranları da fonksiyonel hale getirilmeli
npm run buildile hatasız derlenmeli
Aşama 2 — Ingestion (AnyDoc, yerel & senkron)
Dosyalar:
backend/app/ingestion/anydoc_client.py— yerel AnyDoc kütüphanesi entegrasyonu
Yapılacak:
anydoc_client.pyiçinde Firecrawl AnyDoc (anydocPython paketi / Rust engine) kütüphanesini yerel olarak çağıranydoc.to_markdown_bytes(data, format=...)ile belgeleri (PDF, DOCX, XLSX, PPTX, CSV vb.) Markdown'a dönüştür- Otomatik format tespiti yap (
anydoc.format_from_bytesveanydoc.format_from_extension) - Response'u
{"raw_text": str, "metadata": dict, "source": str}formatına dönüştür - Düz metin/UTF-8 için fallback çözümleme ekle
routes.pyiçindeki/evrak/uploadendpoint'ine ayrıştırma adımını entegre et- Parse edilen metni state'in
raw_textalanına yaz - Test yaz: AnyDoc ile yerel upload → raw_text Markdown formatında dolu mu?
Doğrulama:
pytest tests/ -v
curl -X POST http://localhost:8000/evrak/upload -F "file=@data/sample_evraklar/test_evrak.txt"
Aşama 3 — EBYS Çekirdek: Evrak Kayıt + SDP Modülü
Dosyalar:
backend/app/ebys/evrak_kayit.py— doldurmakbackend/app/ebys/sdp.py— doldurmakbackend/app/models/— SQLAlchemy modelleri eklemek
Yapılacak:
- SQLAlchemy modelleri tanımla:
Evrak,SDPKodu,AuditLogtabloları - Alembic migration oluştur ve
docker-composeile Postgres'e uygula sdp.py—sdp_belediye.json'u Postgres'e yükleyen seed fonksiyonu yazsdp.py— Embedding tabanlı benzerlik araması ekle (basit — TF-IDF veya sentence transformer)evrak_kayit.py— SDP formatlı sayı üretimi:haberleşme_kodu-sdp_kodu/kayit_nohaberleşme_kodu:kurum_config.py'densdp_kodu: henüz placeholder (Aşama 4'te Router kararı gelecek)kayit_no: Postgres sequence
- Evrak kaydını Postgres'e yaz
routes.py'yeGET /evrak/{id}veGET /evrak/endpoint'lerini Postgres'ten okuyacak şekilde güncelle- In-memory store'u kaldır, Postgres'e geç
- Test: evrak kaydet → DB'den oku → kayit_no formatını doğrula
Doğrulama:
docker-compose up --build
pytest tests/ -v
curl http://localhost:8000/evrak/
Aşama 4 — Router Agent
Dosyalar:
backend/app/graph/nodes/router_agent.py— doldurmakbackend/app/graph/orchestrator.py— LangGraph graph tanımı başlatbackend/skills/evrak-siniflandirma/SKILL.md— zaten var, referans olarak kullan
Yapılacak:
- Embedding tabanlı hafif sınıflandırıcı kur:
- SDP kodlarının konu açıklamalarını embed et
- Evrak metninin embedding'i ile cosine similarity hesapla
- En yüksek N eşleşmeyi döndür
- LLM destekli karar:
app/llm/client.pyüzerindenrouter_agentconfig'i ile çağır - Çıktı:
SiniflandirmaBilgisi(sdp_kodu, birim_kodu, confidence, aciklama) - Confidence eşiği:
< 0.7isehitl_reader_durumu = "bekliyor"olarak HITL'e düşür orchestrator.py'de LangGraphStateGraphbaşlat:ingestion → router → ...akışını tanımla- Şimdilik router'dan sonra end node
- Router agent prompt'unu ayrı dosyada tut:
skills/evrak-siniflandirma/veyaprompts/ - State'e sdp_kodu, birim, confidence yaz
- Test: örnek metin → doğru SDP kodu + birim eşleşmesi
Doğrulama:
pytest tests/ -v
# Manuel test: imar konulu bir metin yükle → SDP kodu 100-199 aralığında mı?
Aşama 5 — Qdrant + mcp_mevzuat + Reader Agent
Dosyalar:
backend/app/vectorstore/qdrant_client.py— doldurmakbackend/mcp_servers/mcp_mevzuat/— MCP server implemente etbackend/app/graph/nodes/reader_agent.py— doldurmakdata/mevzuat_corpus/— demo mevzuat metinleri ekle
Yapılacak:
qdrant_client.py—mevzuat_maddeleriveduzeltme_gecmisicollection'larını oluştur- Demo mevzuat metinleri hazırla: 5393 Belediye Kanunu, 3194 İmar Kanunu vb. (en az 20-30 madde)
- Mevzuat maddelerini Qdrant'a embed edip yükle
mcp_mevzuat/—search_mevzuat(query, kurum)tool'u olan MCP server- Reader agent: LiteLLM wrapper + mevzuat MCP tool ile:
- Evrak analizi yap
- İlgili mevzuat maddelerini bul (RAG)
- Yapılandırılmış çıktı üret:
{konu, ilgili_mevzuat[], aciliyet, onerilen_aksiyon}
- Reader prompt'u ayrı dosyada
orchestrator.py'ye reader node'u ekle:router → reader → ...- Test: örnek evrak → mevzuat eşleşmeleri listesi dolu mu?
Doğrulama:
docker-compose up --build # Qdrant ayağa kalksın
pytest tests/ -v
Aşama 6 — HITL Node #1 (Anlamlandırma Onayı)
Dosyalar:
backend/app/graph/nodes/hitl_nodes.py—hitl_reader_nodedoldurmakbackend/app/api/routes.py— HITL review endpoint'leri ekle
Yapılacak:
- LangGraph
interrupt()kullanarak Reader çıktısını insana göster - HITL review API endpoint'i:
POST /evrak/{id}/hitl/reader— onay/düzeltme/ret - İnsana gösterilecek bilgi: AI sınıflandırma kararı, mevzuat eşleşmeleri, önerilen aksiyon
- Onay → devam, düzeltme → state güncelle → devam, ret → pipeline dur
- HITL noktası asla bypass edilemesin — graph'ta zorunlu node
orchestrator.py'ye HITL node ekle:reader → hitl_reader → ...- Test: interrupt tetikleniyor mu? Onay sonrası devam ediyor mu?
Aşama 7 — Writer Agent + Resmi Yazışma Skill'i
Dosyalar:
backend/app/graph/nodes/writer_agent.py— doldurmakbackend/skills/resmi-yazisma-formati/SKILL.md— zaten var, Writer bu skill'i okuyacak
Yapılacak:
- Writer agent: LiteLLM wrapper ile taslak üret
resmi-yazisma-formati/SKILL.md'den format kurallarını prompt'a dahil et- Kolektif hafızadan (varsa) benzer düzeltmeleri few-shot olarak al
- Taslak formatı: başlık (T.C., kurum adı, sayı, konu, tarih) + gövde + imza bloğu + ekler
- SDP formatlı sayı numarasını başlığa yerleştir
- State'e
taslak_metinyaz orchestrator.py'ye writer node ekle:hitl_reader → writer → ...- Test: örnek evrak → taslak metin resmi format kurallarına uyuyor mu?
Aşama 8 — HITL Node #2 + mcp_memory + Onay Zinciri
Dosyalar:
backend/app/graph/nodes/hitl_nodes.py—hitl_writer_nodedoldurmakbackend/mcp_servers/mcp_memory/— MCP server implemente etbackend/app/memory/feedback_store.py— doldurmakbackend/app/ebys/onay_zinciri.py— pipeline'a entegre et
Yapılacak:
- İkinci HITL interrupt: Writer taslağını insana göster
POST /evrak/{id}/hitl/writer— düzenleme/onay endpoint'imcp_memory/MCP server:save_feedback,get_similar_feedbacktool'ları- Düzeltmeleri Qdrant'a yaz:
(orijinal_taslak, duzeltilmis_taslak, evrak_tipi, kurum_id) - Writer yeni taslaklarda bu düzeltmeleri few-shot örnek olarak kullansın
- Onay zinciri entegrasyonu: HITL onayı geldiğinde
taslak_hazirlandi → incelemede → onaylandi → gonderildi orchestrator.pytam pipeline:ingestion → router → reader → hitl_reader → writer → hitl_writer → onay → end- Test: tam pipeline akışı — evrak yükle → ... → taslak onaylandı → durum "gönderildi"
Aşama 9 — Süre Takibi + Audit Log + RBAC
Dosyalar:
backend/app/ebys/sure_takibi.py— pipeline'a entegre etbackend/app/ebys/audit_log.py— Postgres'e taşıbackend/app/ebys/rbac.py— middleware olarak entegre et
Yapılacak:
sure_takibi.py— evrak listesine uyarı rozeti ekle (3 gün sarı, 7 gün kırmızı)audit_log.py— her işlemi Postgresaudit_logtablosuna yaz (in-memory'den taşı)- Audit loglanacak işlemler: kayıt, sınıflandırma, HITL onayı, düzenleme, gönderim
rbac.py— FastAPI dependency olarak entegre et:memur: kendi evraklarını görürsube_muduru: birimindeki tüm evrakları görür
- Login/auth: basit token bazlı (JWT veya API key — karmaşık auth sistemi YAPMA)
- Test: yetki kontrollü evrak listeleme, audit log kaydı doğrulama
Aşama 10 — Frontend (HITL Review + Evrak Listesi)
Dosyalar:
frontend/— Next.js app oluştur
Yapılacak:
npx -y create-next-app@latest ./ile Next.js projesi oluştur (non-interactive)- Evrak listesi sayfası:
- SDP kodu, birim, durum, süre uyarısı görünür
- Filtreleme: duruma göre, birime göre
- Responsive tablo
- HITL review ekranı:
- Reader sonuçları: AI kararı, mevzuat eşleşmeleri — onay/düzeltme/ret butonları
- Writer taslağı: orijinal vs AI önerisi, diff view, düzenleme alanı
- Onay/reddet butonları
- Evrak detay sayfası: timeline/audit trail görünümü
- Basit login ekranı (memur / sube_muduru seçimi)
- Modern, premium tasarım — karanlık mod, glassmorphism, micro-animasyonlar
- Backend API'ye
fetch/axiosile bağlan (CORS zaten konfigüre)
Doğrulama:
docker-compose up --build
# localhost:3000 'da frontend çalışmalı
Aşama 11 — Multi-Tenant Config + Metrikler
Dosyalar:
backend/app/tenants/kurum_config.py— genişletbackend/app/api/routes.py— metrik endpoint'leri ekle
Yapılacak:
- İkinci kurum profili ekle (örn. "İl Özel İdaresi"):
- Farklı haberleşme kodu
- Farklı SDP alt kümesi (opsiyonel)
- Farklı birim yapısı
- Kurum seçimi: login veya URL parametresi ile
- Metrik endpoint'i
GET /metrikler:- Ortalama işlem süresi (evrak yaşı ortalaması)
- HITL'e düşme oranı (confidence < 0.7 olan evrakların yüzdesi)
- LiteLLM üzerinden dönen maliyet bilgisi (litellm.success_callback ile)
- Toplam evrak sayısı, duruma göre dağılım
- Demo senaryosu hazırla: 5-10 örnek evrak ile tam akış gösterimi
README.md'yi son haliyle güncelle
Doğrulama:
docker-compose up --build
curl http://localhost:8000/metrikler
# Demo: 2 farklı kurum profili ile evrak yükle ve işle
Mimari Referans
┌─────────────────────────────────────────────────┐
│ AI AJAN KATMANI (üst katman) │
│ Router · Reader · Writer · Kolektif Hafıza │
└─────────────────────┬─────────────────────────────┘
│ okur / yazar
┌─────────────────────▼─────────────────────────────┐
│ EBYS ÇEKİRDEK KATMANI (temel, MVP) │
│ ├─ Evrak Kayıt & Numaralandırma (SDP formatlı) │
│ ├─ Standart Dosya Planı (SDP) Modülü │
│ ├─ İç Gönderim / Routing │
│ ├─ Basit Onay/Durum Zinciri │
│ ├─ Süre Takibi (basit uyarı) │
│ ├─ Denetim/Audit Log │
│ └─ Basit Rol Bazlı Yetkilendirme (RBAC) │
└─────────────────────────────────────────────────────┘
Ana akış: Evrak girişi → AnyDoc OCR → Evrak Kayıt (SDP numaralandırma) → Router (birim + SDP sınıflandırma) → Reader (anlamlandırma + mevzuat RAG) → HITL #1 → Writer (taslak üretimi) → HITL #2 → Onay zinciri → Çıktı → Düzeltmeler kolektif hafızaya yazılır.
Tech Stack
- Backend: Python 3.11+, FastAPI
- Orchestration: LangGraph (supervisor pattern, HITL interrupt)
- LLM: LiteLLM (model_config.yaml'dan)
- OCR: Firecrawl AnyDoc
- Vektör DB: Qdrant
- Ana DB: PostgreSQL
- Frontend: Next.js + React
- Deployment: Docker Compose