# İlerleme — Iddia Hafızası (GOREV-HAFIZA.md)

Her faz bittikçe en üste yazılır. Durum: [ ] bekliyor, [~] sürüyor, [x] bitti.

## Durum özeti
- [x] Faz 1 — Özellik bayrakları (şirket + tool sistemi deaktif, UI'dan gizle)
- [x] Faz 2 — `claims` + `audit` koleksiyonları, repository, indeksler
- [x] Faz 3 — Yazma servisi (niyet, bölme, batch embedding, çakışma)
- [x] Faz 4 — Okuma servisi (soru/liste ayrımı, sunucu tarafı liste) — `claim.Reader` + ajan/WS bağlantısı (FIKO_CLAIMS_READ, varsayılan kapalı) tamam; gerçek hesapla WS uçtan uca denemesi yapılmadı
- [x] Faz 5 — Silme/değiştirme endpoint'leri + audit — `/api/claims` (liste, tek kayıt, düzenle, sil, geçmiş); yazar ya da patron; denetime yazılır; arayüz (UI) YOK
- [x] Faz 6 — Patron rolü, çelişki netleştirme, `gecersiz`, toplu giriş özeti — `/api/claims/conflicts` (herkes görür), `POST /api/claims/:id/resolve|invalidate|restore` (yalnızca patron); özet metnine nötr çelişki notu; arayüz (UI) YOK
- [x] Faz 7 — Test (140 firma, çelişki, silme + audit) — `internal/claim/faz7_test.go` zincirleme uçtan uca test (sahte LLM/embedding); gerçek Ollama ile 140 firma Faz 3/4'te yapıldı
- [x] Faz 8 — Tipli kayıt altyapısı (`kind` şemaları, tür bazlı görünürlük)
- [x] Faz 9 — Proje + görev modülü ve hazır raporlar — `claim.BuildReport` (gecikmis_gorev, proje_durumu, proje_ozet), ayırıcı + okuma hattına bağlı, gerçek Ollama ile doğrulandı; REST ucu ve arayüz (UI) YOK
- [ ] Faz 10 — Personel + PDKS modülü (CSV import, sunucu hesapları)
- [ ] Faz 11 — Zamanlayıcı (hatırlatma, haftalık özet, geciken iş uyarısı)

## Notlar
- 2026-10-05: Görev dosyası okundu, kod tabanı keşfi başladı (backend/cmd/server/main.go, internal/memory, internal/pdks, internal/tool/builtin/biz*.go mevcut).
- 2026-10-05 (Faz 1, backend tamam): `config.Legacy` (FIKO_LEGACY_COMPANY / FIKO_LEGACY_TOOLS, varsayılan false), main.go + tools.go kayıt kapıları, `/api/system` listesinde `legacy.tools`, `legacy.company` girdileri; `tools.biz` artık `BizEnabled && Legacy.Company` ile gerçek durumu yansıtır, ipucu `FIKO_LEGACY_COMPANY=true ve BIZ_ENABLED=true` der (eski ipucu yanlış `TOOLS_BIZ_ENABLED` yazıyordu). `TestLegacyFlagsDriveStatus` eklendi; `go build`, `go test ./cmd/server ./config` geçti. KALAN: Angular arayüzünde Tools ve Şirket menülerini `legacy.tools` / `legacy.company` anahtarına göre gizlemek.

- 2026-10-05 (Faz 1, ön yüz tamam → Faz 1 BİTTİ): `SidebarComponent` içinde `showCompany` / `showTools` girdileri ve Şirket + Tool'lar düğmeleri `@if` ile koşullu. `AuthStore.probe()` `/api/system` içindeki `legacy.company` / `legacy.tools` özelliklerinin `enabled` değerini `legacyCompany` / `legacyTools` sinyallerine yazar (anahtar yoksa true: eski sunucuda menü kaybolmaz). `app.html` bu sinyalleri sidebar'a bağladı. `auth.store.spec.ts`'e 4 test eklendi (varsayılan görünür, ikisi kapalı, biri açık, anahtar yok). `ng build` temiz, `auth.store.spec.ts` 25/25 geçti. NOT: Tam `ng test` koşusunda `memory-panel.spec.ts` ve `workflows-panel.spec.ts` içinde 24 test kırık; sebep bu faz değil: testler `/api/memories?limit=200&offset=0` bekliyor, `ApiService` `/api/memories/` çağırıyor (sondaki eğik çizgi). Ayrı düzeltme gerekir. Rotalar (`/sirket`, `/araclar`) doğrudan adresle hâlâ açılabilir; yalnızca menü gizlendi (görev dosyası "UI menüsü gizlenir" diyor, rota koruması istenirse ayrı iş).

- 2026-10-06 (Faz 2, KOD HAZIR — Mongo doğrulaması BEKLİYOR): Yeni paket `internal/claim` (memory'den ayrı: claim'ler ekip ortaktır, depo kullanıcıya göre süzmez). `model.go` (Claim, Status aktif/guncellendi/celiskili/gecersiz, NormalizeKey Türkçe katlama, Validate, IsListKind), `repository.go` (Repository + Filter), `audit.go` (AuditEntry, AuditRepository: YALNIZCA EKLEME, Update/Delete yok), `memstore.go` (bellek içi uygulamalar), `contract.go` + `contract_queries.go` (ortak sözleşme testleri, üretim dosyasında), `claim_test.go`. Mongo: `mongostore/claim_repo.go` (ClaimRepo, ClaimAuditRepo), `storage.go`'ya `claims` ve `audit` koleksiyonları + indeksler (claim_kind_status_key, claim_kind_key, claim_author_created, claim_status_updated, claim_supersedes[kısmi]; audit_claim_at, audit_by_at). Karar: benzersiz indeks YOK (aynı kind+key altında güncellenmiş/çelişkili kayıtlar birlikte yaşar); audit'te TTL YOK. Karar: filtrede `nil` = süzme yok, boş dilim = HİÇBİRİ izinli (Faz 8 yetki filtresi güvenli varsayılana dayanır; sözleşmede test edilir, Searchable dahil). Karar: vektör şimdilik kayıt içinde saklanır, Go tarafında skorlanır (memory paketi gibi); Atlas/mongot `$vectorSearch` indeksi kayıt sayısı büyürse Faz 4'te eklenecek bir hızlandırma. Durum: `go build ./...`, `go vet`, `go test ./...` yeşil; bellek içi depolar tüm sözleşmeyi geçiyor (140 kayıtlık sayfalama dahil). `mongostore` claim testleri `MONGO_TEST_URI` yokken ATLANIYOR; bu makinede Mongo (localhost:27017) kapalı, Docker motoru çalışmıyor. Faz 2 `[x]` olmadan önce: Mongo'yu aç, `MONGO_TEST_URI` ver, `go test -run Claim ./internal/storage/mongostore/` çalıştır.

- 2026-10-06 (Faz 2 BİTTİ): Mongo (docker `mongodb`, localhost:27017) açılınca `mongostore` claim testleri GERÇEK Mongo'da çalıştırıldı: ClaimRepo + ClaimAuditRepo sözleşmeleri (140 kayıtlık sayfalama, boş izin listesi = hiçbiri, ByKey, Searchable dahil), indeksler (benzersiz yok, audit'te TTL yok), eşzamanlı Create (tek kazanan), saklanan belge şekli (boş vektör/anahtar yazılmıyor), audit'e vektör girmiyor — hepsi PASS. `./internal/storage/...`, `./internal/claim`, `./cmd/server` tam koşusu yeşil (mevcut Mongo testleri yeni indekslerle bozulmadı). Test komutu: `MONGO_TEST_URI` = `.env`'deki `MONGO_URI`; testler geçici `fiko_test_claim_*` veritabanı açıp siler.

- 2026-10-06 (Faz 3, SÜRÜYOR — batch embedding katmanı tamam): `internal/llm/ollama/embed.go` içinde `EmbedBatch` (Ollama /api/embed dizi girdisi; sıra korunur, 32'lik istek parçalarına bölünür, boş metinde hiç istek atılmaz, vektör sayısı uyuşmazsa hata). `internal/llm/provider.go`'ya `BatchEmbedder` arayüzü ve `EmbedAll` yardımcısı eklendi (toplu destek yoksa tek tek `Embed`'e düşer; yazma servisi bunu çağıracak). `embed_test.go`'ya 5 test eklendi (140 metin sıra + parçalama, boş metin/model yok ağsız, sayı uyuşmazlığı, EmbedAll yedek yol + toplu tercih). `go build ./...`, `go vet`, `go test ./internal/llm/... ./cmd/server ./internal/claim` yeşil. KALAN (Faz 3): niyet çıkarma (küçük LLM çağrısı, JSON `{remember:[{text,kind,key}]}`), mesajı kayıtlara bölme, çakışma kontrolü (listelik tür = birebir `key`; diğerlerinde ~0.9 benzerlik + LLM kararı), arka planda yazma, `OLLAMA_EMBED_MODEL` varsayılanının `bge-m3` olup olmadığının kontrolü.

- 2026-10-06 (Faz 3, SÜRÜYOR — niyet çıkarma + bölme tamam): Yeni `internal/claim/extract.go` (`Extractor.Extract`: mesaj `SplitChunks` ile ≤2500 karakterlik, satır sınırlı parçalara bölünür; her parça için tek LLM çağrısı, Temperature 0, JSON `{"remember":[{text,kind,key}]}`; niyet yoksa model boş döner, ayrı regex/kapı YOK; mesaj `<<< >>>` çerçevesinde, içindeki `>>>` etkisizleştirilir) ve `extract_parse.go` (`ParseCandidates` toleranslı: ```json çiti, nesne ya da çıplak dizi; `Clean`: text normalleştirme, kind Türkçe katlama/geçersizse `genel`, key `NormalizeKey`; listelik türde adı olmayan aday `Incomplete`'e düşer = özetteki "eksik bilgi"). `Extraction` sonucu: Candidates, Incomplete, Duplicates (aynı mesajdaki tekrar), Chunks/FailedChunks (bir parça patlarsa diğerleri işlenir, `FailedChunks>0` sonuç EKSİK demektir; hepsi patlarsa hata). 50 bin karakter üstü mesaj sessizce kırpılmaz, `ErrMessageTooLong` döner. Testler (`extract_test.go`, sahte `llm.Provider` ile): 140 firma çok parçada sıra+anahtar korunuyor, kısmi/toplam hata, tekrar eleme, boş mesajda LLM çağrılmıyor, iptal, çerçeve kaçışı, Clean çıktısı `Claim.Validate`'ten geçiyor. `go build/vet`, `go test ./...` (tüm paketler) yeşil. DÜZELTME: bu notta ilk yazıldığında "claim `-race` dahil" denmişti; bu YANLIŞTI, `-race` bu makinede cgo/gcc yok diye hiç çalışmadı. KALAN (Faz 3): çakışma kontrolü (listelik tür = birebir `key`; diğerlerinde ~0.9 benzerlik + LLM kararı aynı/çelişkili/alakasız), Service.Write (Validate + `llm.EmbedAll` toplu vektör + Create + audit, arka planda), `OLLAMA_EMBED_MODEL` varsayılanının `bge-m3` olup olmadığı, sohbet akışına (WS/agent) bağlama.

- 2026-10-06 (Faz 3, SÜRÜYOR — çakışma kontrolü + Service.Write tamam, sohbete BAĞLANMADI): Yeni `internal/claim/service.go` + `resolve.go`. Akış: `Service.Write(ctx, actor, mesaj)` → `Extractor` → `llm.EmbedAll` ile toplu vektör → yazmalar tek kilitle SIRAYLA uygulanır (var mı bak + ekle yarışmasın) → her aday için: (1) aynı normalleştirilmiş metin zaten kayıtlıysa karar çağrısı OLMADAN `Unchanged` (yeniden yapıştırılan 140 firma 0 LLM çağrısı); (2) listelik türde YALNIZCA aynı `key`'li kayıtlar karşılaştırılır, farklı ama benzer (kosinüs ≥0.9) ad BİRLEŞTİRİLMEZ, `Similar` olarak işaretlenir; (3) diğer türlerde benzerliği ≥0.9 olan en çok 5 kayıt karara gider; (4) karar `Resolver` (LLM, sıcaklık 0, JSON `{verdict,targetId}`: `ayni|guncelleme|celiskili|alakasiz`, Türkçe harfli yazım kabul): ayni → eklenmez; guncelleme → yeni `aktif` + `Supersedes`, eskisi `guncellendi`; celiskili → ikisi de `celiskili` (eski kayıt silinmez); alakasiz → yeni aktif. Her create ve durum değişimi `audit`'e yazılır (kim/ne zaman/önce-sonra). Hata politikası: karar alınamazsa (LLM hatası, geçersiz yanıt, hedef id'si listede yok) bilgi KAYBOLMASIN diye kayıt aktif eklenir ve `Undecided` sayılır; embedding başarısızsa/kapalıysa kayıt vektörsüz yazılır (`Unembedded`), `Service.Reindex` sonradan doldurur. `WriteAsync` arka planda çalışır (10 dk üst sınır, `done` geri çağrısı), `Close` bekler. `WriteResult.Summary()` spec özetini üretir: "X kayıt eklendi, Y çelişki var, Z kayıtta eksik bilgi var" (+ yalnızca varsa güncelleme/zaten kayıtlı/benzer/denetlenemedi/işlenemeyen bölüm uyarıları). Kimliksiz (`Actor.ID` boş) yazma `ErrNoActor` ile reddedilir. ÇIKARICI DÜZELTMESİ: `Extractor` aynı mesajdaki tekrarı tür+ad ile arıyordu, bu aynı firmanın iki FARKLI bilgisini ("ACME müşteri", "ACME telefonu...") yanlışlıkla tekrar sayıp ikincisini atıyordu; anahtara normalleştirilmiş metin eklendi, test güncellendi. Testler (`service_test.go`, bellek içi depolar + sahte LLM/embedder/decider): 140 firma ekle→sayı/audit/vektör tutuyor→tekrar yapıştırınca 0 yeni, 0 karar; aynı key için 4 karar yolu (durumlar + audit Before/After + Supersedes); aynı mesajda aynı key; karar hataları bilgiyi kaybettirmiyor; benzerlik yalnız benzer kaydı karara götürüyor; benzer ad işaretleniyor, birleşmiyor; embedding hatası→Reindex; niyet yoksa hiçbir şey yazılmıyor; async+Close; eşzamanlı 20 yazma tek kayıt. `go build`, `go vet`, `gofmt` temiz; `./internal/claim` yeşil. NOT 1: `-race` bu makinede ÇALIŞMAZ (cgo/gcc yok), eşzamanlılık yalnızca mantık düzeyinde sınandı. NOT 2: `internal/api/ws` `TestSession_CancelOwnership` ARALIKLI kırılıyor (tam koşuda 1/3, aynı süreçte `-count=30`'da kırıldı; ayrı süreçlerde 30/30 geçti). `ws` paketi `claim`'i içe aktarmıyor, bu işten bağımsız; ayrı inceleme gerekir. NOT 3: embedding modeli: spec `bge-m3` diyor ama makinede `bge-m3` KURULU DEĞİL, `.env`'de `OLLAMA_EMBED_MODEL=qwen3-embedding` (skill'ler de bunu kullanıyor); servis modeli `Config.EmbedModel`'den alır, koda sabit değil. `bge-m3`'e geçmek `ollama pull bge-m3` + env + `Reindex` ister (vektörler modeller arası karşılaştırılamaz). KALAN (Faz 3): sunucuya bağlama (`main.go`'da servis kurulumu + kapanışta `Close`; sohbet akışında `WriteAsync` çağrısı ve özetin kullanıcıya iletilmesi) ve BUNUN ÖNCESİNDE gerçek auth kimliğinin (JWT/oturum) `Actor`'a nasıl geleceğinin netleştirilmesi; gerçek Ollama ile uçtan uca deneme (140 firmalık gerçek metin).



- 2026-10-06 (Faz 3, SÜRÜYOR — gerçek kimlik katmanı tamam, sohbete HÂLÂ BAĞLANMADI): Kimlik sorusu koddan çözüldü. BULGU: WS kimliği `api.resolveUserID` ile çözülüyor ve ajana yalnızca `userID` dizgesi ulaşıyor; bu dizgenin gerçek oturumdan mı, paylaşılan API anahtarından mı (hepsi `DEFAULT_USER_ID`="local" + admin rolüne düşer) geldiği ayırt edilemiyor. Üyelik kapalıyken ise `X-Fiko-User` başlığı kabul ediliyor (herkes herkes olabilir). Bu yüzden güven userID'nin kendisinden değil, HESAP DİZİNİNDE doğrulanmasından türetilir. Yeni: `internal/claim/identity.go` (`Role` patron/uye, `Actor.Role`, `Directory` arayüzü, `Identity.Actor`): üyelik kapalıysa `ErrAuthRequired` (yazma kapalı, kural 3); `DEFAULT_USER_ID` aynı adlı gerçek hesap olsa bile `ErrUnverified`; hesap yok / devre dışı / dizin kimliği uyuşmuyor → `ErrUnverified`; bilinmeyen rol yetki kazandırmaz (üye); depo hatasında actor üretilmez. `cmd/server/claims.go`: `claimDirectory` (user.Service → claim.Directory, `ByID` ile; admin→patron, diğerleri→üye) ve `newClaimIdentity(svc, cfg)` (`cfg.Users.Enabled && svc != nil`, engelli kimlik `cfg.Chat.DefaultUserID`). Testler: `identity_test.go` (9) ve `cmd/server/claims_test.go` (5, gerçek user.Service + bellek deposu). `go build ./...`, `go vet`, `go test ./internal/claim ./cmd/server ./config` yeşil. KALAN (Faz 3): (1) `stores`'a `claims`/`claimAudit` (bellek içi + `mongostore.ClaimRepo/ClaimAuditRepo`) ekleyip `claim.NewService`'i `main.go`'da `userSvc` SONRASINDA kurmak + kapanışta `Close`; (2) ajanda `a.learn` yanındaki yeni `ClaimWriter` kancası: tur `StatusComplete` olunca `Identity.Actor` ile kimlik doğrula, hata varsa SESSİZCE yazma (sohbet bozulmaz), başarılıysa `WriteAsync`; (3) özetin kullanıcıya iletimi (öneri: `hub.BroadcastToUser` ile yeni bir `claim.summary` olayı; ön yüzde sohbette küçük bir bilgi satırı; protokol + Angular değişikliği ister, ayrı karar); (4) gerçek Ollama ile 140 firmalık uçtan uca deneme. NOT: `Identity` yalnızca YAZMA yetkisini doğrular; Faz 5-6'daki silme/patron işlemleri Actor.Role'ü kullanacak. Üyelik sistemi açık ve en az bir gerçek (admin) hesap olmadan Faz 3 sohbet hattı devreye girmez.


- 2026-10-06 (Faz 3, SÜRÜYOR — sunucu bağlama + sohbet kancası tamam; özet iletimi ve gerçek Ollama denemesi KALDI): (1) `stores`'a `claims`/`claimAudit` eklendi (bellek içi + `mongostore.NewClaimRepo/NewClaimAuditRepo`); `main.go`'da `setupClaims`, `newUserService`'ten SONRA çağrılır, `defer closeClaims`. (2) Yeni bayrak `FIKO_CLAIMS_WRITE` (`config.Claims.Write`, varsayılan FALSE, `.env.example`'a eklendi): kapalıyken hiçbir şey bağlanmaz. Açık olsa bile yazma yalnızca gerçek oturum kimliğiyle çalışır; üyelik kapalıysa `Identity` her turu reddeder ve açılışta uyarı loglanır. (3) `internal/agent/claims.go`: `ClaimWriter` arayüzü, `Agent.SetClaims`, `captureClaims` (`a.learn` ile aynı yaşam döngüsü: tur `StatusComplete` ise arka planda, `wg` + `Close` iptali, panik yakalama, 15 sn yakalama süresi). Ajana yalnızca kullanıcı mesajı verilir, asistan cevabı verilmez. (4) `cmd/server/claims.go`: `claimCapturer.Capture`: önce `Identity.Actor`, başarısızsa SESSİZCE atlar (debug log), başarılıysa `Service.WriteAsync`. Mesaj içeriği log'a yazılmaz, yalnızca özet sayıları. Testler: `agent/claims_test.go` (5: tamamlanan turdan sonra yakalama, nil yazıcı, üretim hatasında yok, Close iptal+bekler, panik), `cmd/server/claims_test.go` (+3: doğrulanmış hesap gerçekten yazar ve yazar bilgisi kayıtta; üyelik kapalı / hesap yok / paylaşılan anahtar kimliği ile 0 kayıt; bayrak kapalıyken kurulum nil). `go build ./...`, `go vet`, `go test ./...` TÜM paketler yeşil (ws testi bu koşuda geçti, aralıklı kırılma durumu değişmedi). KALAN (Faz 3): (a) yazma özetinin kullanıcıya iletimi: şu an yalnızca log'a ("claim yazıldı" + Summary) gider; öneri `hub.BroadcastToUser` ile yeni `claim.summary` olayı + sohbette bilgi satırı (protokol + Angular, ayrı karar); (b) gerçek Ollama ile 140 firmalık uçtan uca deneme (üyelik açık, bir admin hesabı, `FIKO_CLAIMS_WRITE=true`); (c) maliyet notu: açıkken her tamamlanan tur için en az bir ek çıkarım LLM çağrısı yapılır (bellek öğrenmesine ek); gerekirse ayrı küçük model (`claim.Config.Model`) ya da kısa mesaj elemesi düşünülmeli. Faz 3 `[x]` olmadan önce (a) ve (b) gerekir.


- 2026-10-06 (Faz 3, SÜRÜYOR — özet iletimi sunucu + protokol tamam): `protocol.ClaimSummaryPayload`, `claimEmitter`/`claimSummaryOf` (cmd/server/claims.go), `main.go`'da `hub.BroadcastToUser(... ServerClaimSummary ...)`, `protocol.ts` tipleri (`claim.summary` + `ClaimSummaryPayload`). Parite testi artık yeşil (önceden `claim.summary` sabiti TS'siz eklendiği için kırıktı). Kimliksiz turda özet de gitmez. `go build`, `go test ./internal/protocol ./cmd/server ./internal/claim ./internal/agent` yeşil. KALAN: Angular bilgi satırı + spec + `ng build`, gerçek Ollama ile 140 firma denemesi, maliyet notu.

- 2026-10-06 (Faz 3, SÜRÜYOR — özet iletimi ön yüz tamam): `core/claim-summary.store.ts` (`ClaimSummaryStore`, `claimSummaryView`: `claim.summary` olayını dinler, yeni özet eskisinin yerini alır, çelişki/eksik/işlenemeyen parça varsa `attention`), `features/chat/claim-summary.ts` (`app-claim-summary`, kapatılabilir tek satır; cümle sunucudan OLDUĞU GİBİ), `app.ts`/`app.html`'de composer üstüne bağlandı. `claim-summary.store.spec.ts` 6/6 geçti, `ng build` temiz. Tam `ng test` koşulmadı (eski bilinen 24 kırık `memory-panel`/`workflows-panel` testi ayrı iş). KALAN (Faz 3): gerçek Ollama ile 140 firmalık uçtan uca deneme (üyelik açık + admin hesabı + `FIKO_CLAIMS_WRITE=true`), maliyet notu (her tamamlanan turda ek çıkarım çağrısı). Faz 3 `[x]` için yalnızca bu deneme kaldı.


- 2026-10-06 (Faz 3 BİTTİ — gerçek Ollama doğrulaması): `internal/claim/resolve.go` derlenmiyordu (`resolveMaxTokens` tanımsız: gemma4 gibi "düşünen" modeller 200 jetonda boş içerik döndürüyordu, düzeltme yarım kalmıştı); sabit eklendi (3000). `TestE2E_GercekOllama_140Firma` (CLAIM_E2E_OLLAMA=1, sohbet modeli `gemma4:latest`, embedding `qwen3-embedding`) GEÇTİ, 210 sn: 1. yapıştırma 140 kayıt / 0 çelişki / 0 eksik / 0 işlenemeyen parça (7 parça, 11 LLM çağrısı, 1m30s), 3 "benzer" işareti; aynı metni 2. yapıştırma 140 "zaten kayıtlı", kayıt sayısı değişmedi; aynı firmaya yeni telefon girilince yeni kayıt eklendi (142). `TestE2E_Cikarim140`: 140 aday, 140 farklı anahtar, ad/numara/telefon metinde korunuyor. GÖZLEM: tam testte 53 kayıtta test için eklenen yapay "(NNN)" son eki metinde yoktu (küçük model kısaltıyor); gerçek veri kaybı sayılmadı ama çıkarıcı kuralı "ayrıntıları AYNEN koru" zaten var, gerekirse daha büyük model denenir. NOT: test Service.Write'ı doğrudan çağırır; WS sohbet hattı + gerçek üyelik hesabı üzerinden uçtan uca deneme (FIKO_CLAIMS_WRITE=true) yapılmadı. Maliyet notu hâlâ geçerli: açıkken her tamamlanan turda ek çıkarım çağrısı.

- 2026-10-06 (Faz 4, SÜRÜYOR — okuma servisi çekirdeği tamam, sohbete BAĞLANMADI): Yeni `internal/claim/read.go` + `read_test.go`. `Reader.Classify` (LLM, sıcaklık 0, JSON `{"type":"liste|soru","kind":...}`, düşünen modeller için 3000 jeton payı; `ParseIntent` toleranslı: türsüz/geçersiz kind'li liste güvenli varsayılan olarak SORU sayılır). `Reader.List`: vektör YOK, `kind` + görünür durumlar (aktif, celiskili; `guncellendi` ve `gecersiz` gösterilmez) ile depo sayfalanarak TAMAMEN okunur, numaralı liste SUNUCUDA üretilir ("N. metin (yazan: Ad, tarih) [çelişkili]"), sonda "Toplam: N firma" (+ çelişkili sayısı). `Reader.Search`: soru embedding'i → `Searchable` → kosinüs, önce skora göre TopK (8), seçilenler "aktif önce, çelişkili sonra"; vektörsüz ya da başka embedding modeliyle yazılmış kayıtlar aranamaz (Reindex doldurur); sonuçta vektör taşınmaz. `KnownInfo`: "bilinen bilgiler" bloğu, çelişkide iki tarafı yazar adıyla ve nötr dille belirtme yönergesi. `Reader.Prepare`: ayırıcı hatasında bilgi sorusu varsayılır, embedding hatasında `Degraded` (sohbet düşmez), yalnızca depo hatası ve iptal hata döner; `Prepared.Prompt` sistem prompt'una eklenir, liste sorusunda `Prepared.Append` model cevabının ARDINA aynen eklenir (modelden yalnızca tek giriş cümlesi istenir). YETKİ: `allowed` parametresi (nil = hepsi, boş = hiçbiri) Filter.Kinds ile arama ÖNCESİ depoya iletilir; yetkisiz tür listede `Denied`, kayıt olup olmadığını bile söylemez. 10 yeni test (140+ kayıt 3 sayfa, durum süzme, yetkisiz tür sızmaması, TopK/durum sırası, bozuk ayırıcı/embedding, iptal); `go build ./...`, `go vet ./internal/claim ./cmd/server`, `go test ./...` yeşil. KALAN (Faz 4): (1) `main.go`'da `Reader` kurulumu (`FIKO_CLAIMS_READ` bayrağı önerisi, varsayılan kapalı) ve ajan/WS hattına bağlama: kullanıcı mesajı için `Prepare`, `Prompt`'u sistem prompt'una ekleme, liste sorusunda `Append`'i cevaba ekleme (akış/stream sonu); (2) okuma için de yalnızca doğrulanmış hesap kimliği (Identity) ve `allowed` türlerin Faz 8'e kadar nil (hepsi) mi yoksa rol bazlı mı olacağı kararı; (3) gerçek Ollama ile liste + bilgi sorusu denemesi; (4) her mesaja ek ayırıcı LLM çağrısı maliyeti (küçük model ya da kısa mesaj elemesi).

- 2026-10-06 (Faz 4 BİTTİ — okuma hattı bağlı ve gerçek Ollama ile doğrulandı): Bağlama başka bir oturumda (07:36-07:38) yapılmıştı, kaydı yazılmamıştı: `config.Claims.Read` (FIKO_CLAIMS_READ, varsayılan KAPALI), `internal/agent/claims_read.go` (`ClaimReader` arayüzü, `SetClaimReader`, `readClaimsAsync`: bellek/bilgi tabanıyla PARALEL, 45 sn üst sınır, panic'e dayanıklı, sıfır değer = hafızasız sohbet), `cmd/server/claims_read.go` (`setupClaimReader`: yazmayla aynı kural, yalnızca doğrulanmış oturum kimliği; üyelik kapalıysa ekip verisi hiç okunmaz; `allowed=nil` = Faz 8'e kadar doğrulanmış her üye tüm türleri görür), `main.go`, testler, `internal/claim/e2e_read_test.go`. Bu oturumda: `TestE2E_GercekOllama_Okuma` (CLAIM_E2E_OLLAMA=1, gemma4 + qwen3-embedding) ilk çalıştırmada HATA verdi: "Bütün müşterilerimizi tek tek say" için ayırıcı var olmayan `musteri` türünü uydurup boş liste döndürdü. Düzeltme iki katmanlı: ayırıcı prompt'una çekirdek türler + eş anlamlılar eklendi; `ParseIntent` artık `canonicalKind` ile takma adları ve çoğul ekini (-ler/-lar) çekirdek türe çeviriyor (musteri/musteriler/sirket/tedarikci/isletme/kurum → firma, calisan → personel, firmalar → firma); bilinmeyen tür olduğu gibi kalır (serbest etiket). Sonuç: PASS, 7.7 sn; liste soruları ~1 sn (ayırıcı), bilgi soruları ~1.2 sn (ayırıcı + embedding + arama). `ReadConfig.MinScore` eklendi (varsayılan 0 = kapalı, config'e/ortam değişkenine BAĞLANMADI). ÖLÇÜM (qwen3-embedding, yalnızca 3 firmalık örnek): alakalı isabetler 0.655 / 0.598; alakasız 0.35 / 0.29; "Merhaba, nasılsın?" için 4 isabetin hepsi ≤ 0.291 ama prompt'a 4 kayıt ekleniyor. MinScore ~0.4 bu örnekte ayırıyor, ama örnek küçük ve eşik modele özgü: açmadan önce gerçek veride (140 firma) ölç. Testler: `go build ./...`, `go vet`, `go test ./...` yeşil.
  KALAN / AÇIK: (1) WS sohbet hattı + gerçek üyelik hesabıyla uçtan uca deneme (FIKO_CLAIMS_WRITE=true, FIKO_CLAIMS_READ=true, FIKO_USERS_ENABLED=true); (2) MinScore'u ortam değişkenine bağlama kararı + 140 firmalık veride eşik ölçümü; (3) liste cevabı: model giriş cümlesi + `Append` birleştirmesi akışta (stream sonunda) gerçek istemcide görsel doğrulama; (4) her mesaja ek ayırıcı LLM çağrısı (~1 sn) maliyeti, ses gecikmesine etkisi; (5) Faz 5 — silme/değiştirme endpoint'leri + audit.

- 2026-10-06 (Faz 5 BİTTİ — yönetim uçları + denetim): `internal/claim/manage.go`: `Service.Get/List/Edit/Delete/History`, `CanModify(actor, claim)` (yazar ya da patron), `ErrForbidden`, `ErrKeyTaken`. DÜZENLE: yalnızca metin (+ isteğe bağlı anahtar); tür, yazar, durum, tarihçe değişmez; metin değişirse embedding yeniden üretilir, üretilemezse ESKİ vektör atılır (eski metne ait vektörle aranmasın; Reindex doldurur); listelik türde boş anahtar ve aynı türdeki başka geçerli kayıtla anahtar çakışması (409) reddedilir; değişiklik yoksa denetim yazılmaz. SİL: kayıt gider, silinen değer denetimde (`before`) yaşar; silinen kayıt bir öncekinin yerini almışsa eski kayıt OTOMATİK geri gelmez (hangisinin geçerli olacağı patron kararı, Faz 6). GEÇMİŞ: kayıt silinmiş olsa da çalışır; yalnızca patron ya da kaydın yazarı (yazar, denetimdeki anlık görüntülerden bulunur). KARAR: denetim kaydı değişiklikten ÖNCE yazılır (silinen/değişen değer hiçbir koşulda kaybolmasın); bedeli: depo hatasında "yapılmış" görünen ama yapılmamış bir denetim girdisi kalabilir (kayıt durduğu için fark görülür, zararsız). Yönetim işlemleri yazma kilidini BEKLEMEZ (Write çakışma kararında dakikalarca tutabilir); aynı kayda aynı anda Write'ın durum değişikliği gelirse son yazan kazanır. BULUNAN HATA: Windows'ta art arda iki işlem aynı `At` değerini alıyor, geçmiş sırası (yeni önce) rastgele kimliğe kalıyordu (test aralıklı düştü; Mongo da ms'ye yuvarlar). Düzeltme: düzenle/sil için `nextTick` (ms'ye kırpılmış, KESİN artan damga); 40 tekrarlı çalıştırma sabit. API: `internal/api/claims.go` + rotalar: `GET /api/claims?kind=&status=&q=&author=&limit=&offset=` (yanıt: items, total, limit, offset; vektör sızmaz), `GET /api/claims/:id`, `PUT /api/claims/:id` ({text, key?}), `DELETE /api/claims/:id` (204), `GET /api/claims/:id/history`. Kimlik YALNIZCA doğrulanmış hesaptan (claim.Identity): oturumsuz 401, üyelik kapalıyken 403 ("yalnızca gerçek hesapla yönetilir"), servis yoksa 503, yetkisiz düzenleme/silme/geçmiş 403, doğrulama 400 (alan listesiyle), anahtar çakışması 409, yok 404. `cmd/server/claims.go: setupClaimManager`: yönetim FIKO_CLAIMS_WRITE'a bağlı DEĞİL (silme spec gereği aktif); yazma servisi varsa aynı örnek paylaşılır; `api.Deps.Claims/ClaimIdentity`. Testler: claim 12 yeni (yetki, denetim içeriği, yeniden embedding, anahtar çakışması, vektör atma, sayfalama, geçmiş sırası, silinse de geçmiş), api 6 yeni uçtan uca (gerçek oturum, yazar/patron/başka üye, üyelik kapalı, 503); `go build ./...`, `go vet`, `go test ./...` yeşil.
  KALAN / AÇIK: (1) UI yok: kayıtlar yalnızca REST ile yönetiliyor (Angular ekranı ayrı iş); (2) liste/görüntüleme şimdilik TÜM türleri her doğrulanmış üyeye açıyor (Faz 8'de tür bazlı filtre `Service.List/Get/History` ve `Reader` içinde aynı `allowed` mantığıyla eklenecek); (3) sohbetten silme/düzenleme ("şu kaydı sil") YOK; (4) Mongo'da gerçek veritabanıyla yönetim denemesi yapılmadı (bellek deposu + sözleşme testleri); (5) Faz 6: patron rolü ile çelişki netleştirme, `gecersiz` işaretleme, toplu giriş özeti.


- 2026-10-06 (Faz 6, SÜRÜYOR — servis katmanı + testler tamam, API/özet KALDI): `internal/claim/conflicts.go` (başka bir oturumda yazılmış, kaydı tutulmamıştı) incelendi ve test altına alındı. `Service.Conflicts` (karar bekleyen kümeler; üye de görür), `Resolve(id, keep|keepAll)` (seçilen aktif, kümedeki diğerleri `gecersiz`; ya da hepsi aktif), `Invalidate` / `Restore` (geçersiz işaretle / geri al), hepsi YALNIZCA patron (`ErrPatronOnly`, kaydın yazarı bile üye ise yapamaz). Çelişki kümesi `ConflictsWith` bağından (ve listelik türde aynı anahtardan) çıkarılır; bağsız eski çelişkili kayıt tek başına kümedir. Kümeden bir kayıt çıkınca (geçersiz ya da silinmiş) karşısında kimse kalmayan kayıt otomatik `aktif` olur (3'lü kümede merkez çıkarsa kalan ikisi de aktif). Her durum değişikliği denetime yazılır (kim/önce/sonra). `conflicts_test.go`: 12 yeni test (kümeleme, listelik tür ortak anahtar, yetki, kötü girdi, keep/keepAll, idempotent Invalidate, 3'lü küme, Restore, Delete → yetim serbest, uçtan uca akış) ilk çalıştırmada PASS; `gofmt`, `go vet` temiz. KALAN (Faz 6): (1) REST uçları (`GET /api/claims/conflicts`, `POST /api/claims/:id/resolve|invalidate|restore`; patron değilse 403); (2) toplu giriş özetinde çelişki cümlesinin nötr dili ("İki farklı bilgi var, hangisi geçerli?") ve patrona yönlendirme; (3) okuma hattında çelişkili kayıtların nötr sunumu zaten var, `gecersiz` kayıtlar listede/aramada gösterilmiyor (doğrulanacak); (4) UI yok (ayrı iş).

- 2026-10-06 (Faz 6 BİTTİ — REST + özet notu + gerçek Mongo doğrulaması): (1) `internal/api/claims.go` + `api.go` rotaları: `GET /api/claims/conflicts` (her doğrulanmış üye görür; `/:id`'den ÖNCE kayıtlı), `POST /api/claims/:id/resolve` (`{"decision":"keep"|"keepAll"}`; keep = :id geçerli, kümedeki diğerleri `gecersiz`), `POST /api/claims/:id/invalidate`, `POST /api/claims/:id/restore`. Karar uçları yalnızca patron: üye (kaydın yazarı bile) 403; çelişkili olmayan kayda resolve / geçersiz olmayana restore 409; kötü karar değeri 400; olmayan kayıt 404; üyelik kapalıyken 403, servis yokken 503, oturumsuz 401 (Faz 5 ile aynı kimlik kuralı: yalnızca doğrulanmış hesap). (2) Özet: `WriteResult.Summary()` spec biçimini AYNEN korur; yeni `ConflictNote()` / `Message()` çelişki varsa ayrı nötr cümle ekler ("Aynı konuda iki farklı bilgi var; hangisinin geçerli olduğuna patron karar verecek."), kimin yazdığını söylemez; `cmd/server/claims.go` `claim.summary` olayında `Message()` kullanır (protokol/TS DEĞİŞMEDİ, metin sunucuda üretiliyor). (3) Okuma: `gecersiz` ve `guncellendi` kayıtlar liste ve aramada gösterilmiyor (read_test'te zaten kapsanıyor), çelişkili kayıtlar iki taraf da nötr dille sunuluyor. (4) Testler: `internal/claim/conflicts_test.go` 13 test (kümeleme, yetki, keep/keepAll, Invalidate/Restore, 3'lü küme, yetim serbest, Message notu), `internal/api/claims_test.go` +3 (üye görür/karar veremez, patron akışı + denetim, üyelik kapalı/503), `cmd/server/claims_test.go` +1, `internal/storage/mongostore/claim_conflicts_test.go` +2 GERÇEK Mongo'da (Resolve/Invalidate/Restore + denetim, Delete → yetim serbest) PASS; `go build ./...`, `go vet`, `go test ./...` TÜM paketler yeşil (Mongo testleri `MONGO_TEST_URI` = `.env` `MONGO_URI` ile çalıştırıldı, Mongo açık). KALAN / AÇIK: (a) UI yok: patronun çelişki ekranı (listele + "hangisi geçerli?" seç) ayrı iş; (b) sohbetten karar ("şunu geçerli say") YOK, yalnızca REST; (c) patrona "bekleyen çelişki var" bildirimi YOK (Faz 11 zamanlayıcıya uygun); (d) tür bazlı görünürlük Faz 8'de Conflicts/List/Get/History'ye eklenecek (şimdilik doğrulanmış her üye tüm türleri görür). SIRADA: Faz 7 (test: 140 firma + çelişki + silme/audit uçtan uca).

- 2026-10-06 (Faz 7 BİTTİ — zincirleme uçtan uca test): `internal/claim/faz7_test.go` `TestFaz7_140Firma_Celiski_Silme_Denetim` (sahte LLM/embedding/karar, bellek içi depolar; ilk çalıştırmada PASS). Akış: Ali 140 firmayı yazar → `Reader.List` 140, "Toplam: 140 firma", 140. satır var → Veli aynı firma için farklı bilgi girer → 1 çelişki, liste 141 / 2 işaretli / "patron belirler", özet metni nötr ve kimseyi anmıyor → üye (kaydın sahibi Ali dahil) `Resolve` edemez → patron Ali'nin kaydını geçerli sayar: liste 140'a döner, geçersiz bilgi görünmez ama kayıt silinmez (`gecersiz`) → Ali'nin kaydında denetim izi create(Ali) → celiskili(Veli) → aktif(patron) → başkasının kaydını silme ForbiddenError, yazar ve patron silebilir (liste 138) → silinen değer denetimde (`Before`), geçmişi yalnızca yazar/patron görür. `go build ./...` ve `go test ./...` TÜM paketler yeşil. NOT: bu test sahte LLM'le yapıldı; gerçek Ollama ile 140 firma Faz 3'te (yazma) ve Faz 4'te (okuma) ayrı ayrı doğrulanmıştı, çelişki akışı gerçek modelle denenmedi. SIRADA: Faz 8 (tipli kayıt altyapısı: `kind` şemaları, alan çıkarma, tür bazlı görünürlük; yetki filtresi aramadan ÖNCE).

- 2026-10-06 (Faz 8 + Faz 9 KAYDI — kod başka oturumda yazılmıştı, notu eksikti; bu oturumda doğrulandı): Faz 8: `internal/claim/kinds/` (kinds.go, date.go; şemalar firma, kisi, urun, genel, proje, gorev, personel, pdks; `Visibility` ekip/ozel: personel + pdks özel, diğerleri ekip), `access.go` (tür bazlı görünürlük; yetki filtresi aramadan ÖNCE), `extract_fields_test.go` (alan çıkarma). Faz 9: `internal/claim/reports.go` (gecikmis_gorev, proje_durumu, proje_ozet; gecikme günü, ilerleme yüzdesi, geciken sayı KODDA hesaplanır, "bugün" Türkiye saatiyle; proje-görev bağı normalleştirilmiş ad ile, bağsız görev "projesiz" sayılır; ekip raporu özel türü sızdırmaz), `Reader.Report`, ayırıcı `rapor` niyeti (`ParseIntent`, `Prepare` rapor metnini sunucuda üretip cevabın ardına ekler). DOĞRULAMA: `go build ./...`, `go vet ./internal/claim/...`, `go test ./internal/claim/... ./internal/api ./cmd/server` yeşil; `TestE2E_GercekOllama_Rapor` (gemma4 + qwen3-embedding) PASS, 22 sn: 9 mesajın 9'unda doğru niyet (gecikmiş görev ×2, proje durumu ×2 "B-12", proje özeti, liste ×2, soru ×2), liste/soru ayrımı bozulmadı; örnek B-12 raporu: %50 ilerleme, 1 gecikmiş görev (9775 gün). KALAN / AÇIK: (1) rapor REST ucu yok (`/api/claims/reports` gibi), yalnızca sohbetten; (2) UI yok (rapor, çelişki, kayıt yönetimi); (3) WS sohbet hattı + gerçek üyelik hesabıyla uçtan uca deneme hâlâ yapılmadı; (4) 24 eski bozuk Angular testi (`memory-panel`, `workflows-panel`) ayrı iş. SIRADA: Faz 10 (personel + PDKS: doğal dil girişi, CSV içe aktarma, sunucu tarafı hesaplamalar).
