docs(ekip): 7–10 Ekim raporları, eval sonuçları, seslendirme betiği

- docs/ekip-raporlari/2026-10-07, 2026-10-09, 2026-10-10 raporları ve ekran görüntüleri
  (ses/ altındaki mp3 dosyaları depoya alınmadı, 38 MB)
- BACKLOG #38: rehber yazılarına "Dinle" düğmesi adayı
- scripts/seslendir.py (Türkçe TTS) ve .gitignore'a .venv-tts/
- scripts/eval/sonuc: 8–10 Ekim revizyon eval çıktıları

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-10-11 00:33:39 +03:00
parent e9dfa354f8
commit da0e9dff7a
81 changed files with 18396 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
# Deneyim dili, 1. dalga (9 Eki 2026, dal v2)
Bilal'in isteği: landing bir deneyim versin, site "web uygulaması" gibi hissettirsin; zevki belgelere
ve ajanlara işlensin. Commit atılmadı; hepsi çalışma ağacında.
## Yapılan
**Kurallar**
- `docs/tasarim/DESIGN.md`: yeni §11 (referans vakalar, ilkeler, dışarıdan parça alma, kontrol listesi),
§4.34 logo biçimleri, §4.35 adım göstergesi, §4.36 baloncuk menü, §4.37 uçuş ve rozet; §4.1, §6, §10.2 güncel.
- `AGENTS.md` "Deneyim dili" bölümü; `.claude/agents/tasarimci.md` ve `kolaytercih-tasarim` skill'i §11'e bağlı,
bayat yerleri düzeltildi; `evals.md`'ye E4.
- `scripts/tasarim-denetim.ts`: `yabanci-hareket-paketi` (hata), `elle-cta`, `elle-yay` (uyarı).
- `components.json`: `@react-bits` kaydı.
**Ortak parçalar**
- `Button` `variant="cta"` ve `"ikincil"`; landing, sihirbaz ve profil kapısı bunlara geçti.
- `AdimGostergesi` (`src/components/ui/adim-gostergesi.tsx`): sihirbazda eski çubuğun yerinde, iskeleti eşlendi.
- `hareket.ts`: `YAY.adim`, `EGRI.gucluCikis`, `EGRI.yerlesme`; CSS'te `--egri-*`.
- Logo morph'u `v1-beta-tema`'dan taşındı (tema geçişi, `D` kısayolu); üstüne `logoTepkisi("sira" | "ekle" | "tamam")`.
- Sayfa geçişi (`sayfa-gecisi.tsx`, `experimental.viewTransition`), `manifest.ts` + iki SVG ikon.
**Navbar**
- Telefonda tek satır: logo · sıralama hapı · baloncuk menü (`mobil-menu.tsx`).
- Listem düğmesi boşken de görünür, 24'lük halka taşır; `+` ile eklemede kare rozete uçar, tik çizilir.
**Landing**
- Hero girişi sıralı (harita → başlık → form); harita telefonda da görünür.
- Profilli hero'da kupa + sıra ve liste durumu hapı; gönderirken "Hazırlanıyor…".
- "Nasıl çalışır" çizgisi maviyle dolar, üç sayı ekrana girince döner; "Meraklısına" ikincil bağlantıya indi.
## Ekranda bakılan (yerel dev sunucusu, koyu tema ağırlıklı)
- 375 px: tek satır üst çubuk, baloncuk menü açık/kapalı, sihirbaz 1. ve 2. adım (tik + çizgi dolumu), hero + harita.
- 1280 px: üst çubuk ve halka, `/sonuc`'ta iki ekleme (tik, rozet 2), tema açığa geçiş ve logonun güneş biçimi,
`/sonuc` → `/` geçişi (konsol temiz), "Nasıl çalışır" dolu çizgiler (açık tema).
- Düzeltilen: gösterge kapatma çarpısının altına giriyordu → `pr-12`.
## Bakılmayan / yapılmayan
- Bakılmadı: 768 ve 1024 px; hareketi azalt; klavye gezinmesi; uçan karenin havadaki hâli; kürsü ve deste biçimleri;
sayfa geçişinin Safari'deki görünüşü.
- Plandan kalan: telefonda arama ve sıralama kapısının alt sayfaya taşınması; aramada ok tuşları, sonuç sıralı girişi,
piksel dilli boş durum; profil kapısına ve soru formuna yeni gösterge (kapıda iç içe iki gösterge olurdu);
karşılaştırma satırlarının sıralı girişi; hero başlığında yazı dönüşümü.
- `pnpm build` ve `pnpm lint` geçti (denetim 0 hata, 51 uyarı; 30'u yeni `elle-cta`/`elle-yay`, 2. dalganın listesi).
- Var olan sorun (bu işten değil): ana sayfada `VeriAkisi` hydration uyarısı (ondalık yuvarlama farkı).
- Test izi: `localhost:3000`'de tema açığa alındı ve listeye iki program eklendi (girişli oturumda yerel DB'ye de yazılmış olabilir).

View File

@@ -0,0 +1,87 @@
# QA - Liste revizyonu koda bağlı (v2, HEAD e9dfa35)
Lokal dev sunucusu (gerçek OpenRouter modeli), 9 Eki 2026 gece. Tarayıcı: Browser pane. Kod değiştirilmedi.
## Özet
- **Paketli hesapta revizyon çalışıyor.** 4 ardışık istek ("ilk 5 Ankara olsun", "vakıfları çıkar", "daha güvenli olsun", "İzmir'i de ekle") listeyi gerçekten değiştirdi (DB'de 4 ayrı `report_revision`), her birinde hap + sunucu şablon cevabı + toast geldi, "YENİDEN KURULMADI" notu hiç çıkmadı, kredi her istekte tam 1 düştü.
- **Form çalışıyor:** "listemi yeniden düzenlemek istiyorum" formu açtı, form cevabı (bedelsiz) listeyi kurdu. **Ama "listemi değiştir" formu açmadı** (B1).
- **Paketsizde kaldı (B2, en önemli):** "ilk 5 Ankara olsun" paket uyarısı vermedi; model soru formu açtı, form cevabı "listen yeniden kurulacak" dedi, liste hiç değişmedi.
- **Gecikme (B3):** niyet çağrısı 3 koşuda 12-14 sn sürdü, 5 koşuda 1,4-2,8 sn. 15 sn sınırı aşılmadı ama 12 sn'lik beklemede kullanıcı yalnızca "yazıyor" görüyor.
- Mekanik: `akis-denetim` 13/13, `revizyon-denetim` 5/5. Konsol/sunucu logunda uygulama hatası yok (aşağıda hidrasyon uyarısı).
## Sonuç tablosu
| # | Senaryo | Sonuç |
|---|---|---|
| 1a | ilk 5 Ankara olsun | GEÇTİ. İlk 5 = Ankara 5, rev 3→4, kredi 33→32, şablon cevap (ilk 5 listesi + "Ekrandaki liste yenilendi"), hap "Listeni yeniden kurdum" |
| 1b | vakıfları çıkar | GEÇTİ. Vakıf 3→0 (24 devlet), ilk 5 Ankara korundu, kredi -1 |
| 1c | daha güvenli olsun | GEÇTİ. 5/13/6 → 4/12/8, cevap "iskelet: güvenli ağırlıklı (4/12/8)", kredi -1 |
| 1d | İzmir'i de ekle | GEÇTİ. "iller: İzmir eklendi", 4/12/8 korundu, kredi -1 (İzmir zaten listedeydi, değişiklik görünmez) |
| 2 | listemi değiştir | KALDI. Niyet "diger" → normal sohbet cevabı, form yok, 1 kredi gitti |
| 2b | listemi yeniden düzenlemek istiyorum | GEÇTİ. Form (6 seçenek + serbest metin) açıldı; serbest metin "vakıf üniversiteleri de olsun, devlet ve vakıf karışık" → liste yeniden kuruldu (vakıf 5), cevap "üniversite tipi: fark etmez", form cevabı kredi düşürmedi |
| 3 | listemdeki 3. programa not ekle, ne düşünüyorsun? | GEÇTİ. Niyet "diger" (2,8 sn), normal sohbet (program_detay aracı, 3. program doğru: Hacettepe Gıda Müh.), liste aynı, kredi -1 |
| 4 | Paketsiz: ilk 5 Ankara olsun | KALDI. Liste değişmedi, kredi -1, ama paket uyarısı yok (B2) |
| 6 | akis 13/13, revizyon 5/5 | GEÇTİ |
Not: "Düzeltme: listen YENİDEN KURULMADI" yalnız eski (önceki turlardan kalan) mesajda görüldü; bu koşunun hiçbir mesajında yok (DB'de 0 kayıt).
## Gecikmeler (5. madde)
Ölçüm: istemciye fetch sarmalayıcısı (başlık gelene kadar geçen süre = niyet çağrısı, çünkü yanıt akışı niyet bitince açılıyor) ve sunucu logundaki `[soru] revizyon niyeti` satırı.
| İstek | Niyet çağrısı | İlk hap | Toplam |
|---|---|---|---|
| ilk 5 Ankara olsun | 14,0 sn | ~14 sn | 22,6 sn (sunucu) |
| vakıfları çıkar | 12,3 sn | - | ~25 sn (kayıttan) |
| daha güvenli olsun | 12,8 sn | 13,1 sn | 21,4 sn |
| İzmir'i de ekle | 1,4 sn | - | ~12 sn (DB'de rev artışı) |
| listemi değiştir (diger) | 12,2 sn | - | ~19 sn |
| listemi yeniden düzenlemek istiyorum (form) | 1,9 sn | - | - |
| form cevabı | 2,0 sn | - | ~25 sn |
| not ekle (diger) | 2,8 sn | - | ~9 sn |
15 sn'den uzun niyet bekleyen yok; en kötü 14,0 sn. Dağılım iki kümeli: ~1,4-2,8 sn ya da ~12-14 sn. Mühendis raporundaki "OpenInference yavaş" teşhisi tek bir sağlayıcıyı dışlamakla çözülmemiş görünüyor: 12-14 sn'lik kümeye 3 farklı istekte rastlandı (hangi sağlayıcı olduğu logda yok).
## Hatalar
**B1 (Orta) "listemi değiştir" form açmıyor.** Adımlar: paketli hesap, sohbete "listemi değiştir". Beklenen: soru formu. Gerçekleşen: niyet çıkarımı `"diger"` (12,2 sn) → normal sohbet; model da formu açmadı, "İstanbul da eklenmesini istemiştin" gibi geçmişten (eski form cevabından) bir şey önerdi. Aynı anlama gelen "listemi yeniden düzenlemek istiyorum" formu açtı (niyet `revizyon`, `form (eksik: istek)`, 1,9 sn). Kanıt: sunucu logu `[soru] revizyon niyeti: "diger" "" "12219 ms"`. Şüpheli: `src/lib/ai/revizyon-niyeti.ts` niyet prompt'u; kısa/belirsiz istek "diger"e düşüyor. Tek seferde iki mesaj denendi, tekrar sayısı yetersiz; "ara sıra" olabilir. 1 kredi harcandı.
**B2 (Yüksek) Paketsiz hesapta revizyon isteği yanlış yönleniyor ve sahte vaat veriyor.** Adımlar: paketsiz hesap (5 kredi deneme, listesi var), "ilk 5 Ankara olsun". Beklenen: paket uyarısı, liste aynı. Gerçekleşen: liste aynı, kredi -1, ama niyet çağrısı yok (`araç: soru_sor`), model "Listenin revizyonu için netleştirmemiz gereken birkaç şey var" deyip 2 sorulu form açtı ("cevaplayınca listeni hemen güncelleyeceğim"). Formu cevaplayınca (bedelsiz, API ile gönderdim, `anketId b11ead8e…`, `{adet:5,dilim:hayal}`) model "Listen yeniden kurulacak, birazdan güncel halini göreceksin" dedi; liste değişmedi, hiçbir revizyon çağrısı olmadı. Kanıt: `reports.revision_count` 0 kaldı, `p3.txt` liste aynı. Şüpheli: `src/app/api/soru/route.ts` paketsiz dalı niyet çıkarımını atlıyor ama `soru_sor` aracı modele açık kalıyor; `danisman-prompt.ts:81` "paket YOK, /paket'e yönlendir" talimatını model dinlemedi. Kullanıcı açısından: ödemeye değil boş bir forma yönleniyor. Öneri (yazılımcıya): paketsizde `soru_sor`'u kapat ya da regex tetiklenince koddan sabit paket uyarısı ver (koda bağlı ilkeyle aynı).
**B3 (Orta) Niyet çağrısı bimodal gecikme.** Bkz. gecikme tablosu; 3/8 çağrı 12-14 sn. Bu sürede ekranda yalnızca bekleme göstergesi var, "Listeni yeniden kuruyorum" hapı ancak niyet bitince gelir. Öneri: `OPENROUTER_NIYET_MODEL` için ayrı ölçüm ya da niyet çağrısında sağlayıcı sıralaması/zaman aşımı (mevcut 20 sn).
**B4 (Düşük, gözlem) Kesilen istek kredisi.** Dev sunucusu istek sırasında öldüğünde (aşağıdaki ortam notu) "vakıfları çıkar" mesajı kaydedilmiş, cevap yazılmamış, kredi düşmüştü; tekrar gönderince ikinci kez düştü (kullanıcı 2 kredi ödedi). Bu ortam kaynaklı ama sunucu çökmesinde iade yok demektir.
**B5 (Düşük) Hidrasyon uyarısı.** Dev konsolunda `A tree hydrated but some attributes of the server rendered HTML didn't match` (her /listem açılışında 2-4 kez) ve motion `'lab(...)' is not an animatable color` uyarısı. Bu dalın işi mi bilinmiyor, kaynağı araştırılmadı.
## Test ortamı notları (ürün hatası değil)
- Dev sunucusu iki kez benim dışımda öldü (kod 143; `next dev` aynı dizinde ikinci sunucuyu kabul etmiyor, başka bir oturum 3000'de sunucu açtı, sonra o da kapandı). 3100'de kendi sunucumu yeniden açtım ve işim bitince kapattım. Port 3000'deki sunucuya dokunmadım.
- İlk denemede sayfanın tekrar tekrar yenilenmesi benim fetch sarmalayıcımın hatasıydı (RSC isteğini bozuyordu), düzelttim. Sarmalayıcı olmadan da revizyon sonrası belge yeniden yükleniyor ("navigate type: reload"); nedeni bulunamadı. Şüphe: dev'de `data/app.db` proje klasöründe olduğu için dosya izleyicisi tetikleniyor olabilir. Üretimde beklenmez; doğrulanmadı.
- Giriş: `qa-gb1791491465@maxxspace.com` mail.tm şifresi `Qa-<ts>!` desenindeydi; magic link'i mail.tm'den aldım, 3000 adresini 3100'e çevirdim. Paketsiz hesaba geçmek için uygulamanın kendi Dev panelindeki "Anında gir" (yalnız lokal) ile `qa-6eki-b@example.com` hesabına geçtim; bu, tarayıcıdaki `localhost` oturum çerezini değiştirdi (Bilal'in v1 oturumunu etkilemiş olabilir).
- Kodla gelen `listeSenkronla({items: []})` çağrısı /listem ilk açılışında görüldü; `saved_lists` kaydı `[]`. Önceden dolu muydu bilinmiyor, kontrol edilmedi.
## Test edilemeyenler
- Son hâlin gerçek modelle toplu eval'i (QA kapsamı dışı).
- 375 px görünüm ve form UI'ının dar ekran davranışı: pencere 800 px idi; formun "Cevapları gönder" düğmesi yatay kaydırma içinde ekran dışında kaldı (x=874) ve tıklanamadı, bu yüzden form cevabını API ile gönderdim (paketsiz). Bu görünüm sorunu olabilir ya da pencere darlığı; ayrıca bakılmalı.
- Zaman aşımı yolu (niyet 20 sn'yi aşarsa "okuyamadım" + iade): tetiklenmedi.
## Hesaplar ve veri (silme için)
- `qa-gb1791491465@maxxspace.com` (paketli; kredi 33→25, rapor rev 3→8, liste şu an 24 devlet+vakıf karışık, 4/12/8)
- `qa-6eki-b@example.com` (paketsiz; kredi 2→1, liste aynı)
- Yeni hesap açılmadı. Kredi harcayan çağrılar: yukarıdaki 8 + 1 sohbet mesajı.
## Bilal'in elle yapacakları
1. B2'yi yazılımcıya ver (paketsiz revizyon yönlendirmesi): 10 dk.
2. B3 için niyet çağrısı sağlayıcı/model kararı.
3. Formu 375 px'te elle dene ("Cevapları gönder" görünüyor mu).
## Yeni hile
- Dev sunucusu başka oturumla çakışıp ölürse: `preview_start dev-3100` yeniden aç; `fetch` sarmalayıcıda `i.url` yerine `i.href||i.url||String(i)` kullan (URL nesnesi RSC'yi bozar).
- Paketsiz/paketli geçişi için Dev panelinin "Anında gir" alanına var olan hesabın e-postasını yaz (magic link atlanır).
- Anket cevabını UI olmadan göndermek: `POST /api/soru {clientMessageId, anketCevabi:{anketId, cevaplar}}` (anketId `chat_messages.meta`'dan).

View File

@@ -0,0 +1,85 @@
# Yapay zekâ — liste revizyonu koda bağlandı (QA B1 kökten çözüm)
Dal `v2`, taban `128c175`, commit'ler `cee4bf3` (kod), `bad5856` (meraklısına şeması), `e9dfa35` (eval) — push yok. Gerçek modelle ölçüm: `deepseek/deepseek-v4-flash @ openrouter.ai`, 9 Eki 2026 gecesi, **56 model çağrısı** (sınır 60), ≈0,0063 $. Başkalarının dirty dosyalarına (`.claude/settings.json`, `AGENTS.md`, `data/app.db`, `BACKLOG.md`, `layout.tsx`, `site-footer.tsx`, `2026-10-07/`, `21-19-51` json, `seslendir.py`) dokunulmadı. Tarayıcı açılmadı.
## Özet (5 madde)
1. **Revizyon artık sohbet modelinin kararına bağlı değil.** `liste_revize` aracı modelin listesinden çıktı. Adayın mesajı regex kapısından geçip aday paketliyse `src/lib/ai/revizyon-niyeti.ts` tek küçük yapılandırılmış çağrıyla (`yapilandirilmisUret`, json_schema, araçsız; eski aracın parametre şeması `LISTE_REVIZE_PARAMETRELERI` ve `revizyonKuraliKur` aynen kullanılır) `{niyet, kural | form}` çıkarır; route kural geçerliyse listeyi **koddan** kurar (`listeRevizeKoddan` → `listeRevizeCekirdek`, paket/kilit/kredi kapıları aynı), kural eksikse **formu koddan** açar, niyet "soru/diger" ise normal sohbete düşer (regex yanlış pozitifi zararsız).
2. **Cevap da koddan:** revizyon ve form turunda sohbet modeli **hiç çağrılmaz**; sayılar ve ilk 5 program adı sunucu sonucundan şablonla basılır (`sabitCevap`). Gerekçe ölçümden: sonuç önünde dururken model dağılım sayısını 8 cevabın 2'sinde yanlış yazdı (11/7/6 ↔ gerçek 7/12/5; 0/11/13 ↔ 4/12/8), adları eksik/sıra dışı aktardı; formda da "ne istediğini yaz" diye formu baltaladı. İlke 1 (deterministik olan LLM'e bırakılmaz).
3. **Ölçüm hedefi tuttu:** gerçek modelde koddan revizyon **8/8**, kural beklenen alanı taşıyor **8/8**, sahte beyan **0**, r09 form, r10 araçsız (10/10). Önce: 5/8, 3 sahte beyan. Revizyon turu artık 1 niyet çağrısı (ort. 1-3 sn, ≈0,00007 $) + liste üretimi; sohbet çağrısı yok (önce 1-4 çağrı, 3-32 sn).
4. **Güvenlik ağı güçlendi:** beyan regex'i kaldı; beyan var + revizyon yok → düzeltme notu **ve mesajın sohbet kredisi iade** (`grantCredits refund`, refId=mesajId, idempotent), not bunu söyler. Niyet çıkarımı başarısızsa (zaman aşımı/sağlayıcı) normal sohbete düşülmez — koddan "isteğini okuyamadım, tekrar yaz" + iade; çünkü ölçümde bu durumda model uydurma adlarla "kurdum" yazdı (r04, 23-07 koşusu; ağ yakaladı). Ayrıca `liste-revizyon.ts` iade refId'si `<mesajId>:revizyon` oldu: `(reason, refId)` tekilliği sohbet iadesiyle çakışıyordu (eski gizli hata).
5. **Sapmalar:** şartnamedeki "sonucu sohbet modeline araç sonucu olarak ver, model anlatsın" adımı denendi (iki koşu) ve **geri alındı** — nedeni 2. madde. Niyet çağrısında `OpenInference` üst sağlayıcısı yalnız bu çağrı için atlanıyor (3/3 ölçümde 11-12,5 sn; diğerleri 1-3 sn) — sağlayıcı ayarı sayılabilir, `[BİLAL]` görürse tek satır. Mekanik: `akis-denetim` 13/13 (9 eski + 4 yeni), `revizyon-denetim` 5/5; `typegen + tsc + lint` temiz.
## Tasarım (uygulanan)
```
mesaj ─► revizyonNiyetiVar (regex, sohbet-gecmisi.ts) ─ hayır ─► normal sohbet (model; liste_revize yok)
│ evet + paketli
▼
revizyonNiyetiCikar (revizyon-niyeti.ts; 1 json_schema çağrısı, 20 sn, OpenInference hariç)
├─ niyet soru/diger ──────────────► normal sohbet
├─ belirsiz (hata/zaman aşımı) ───► koddan "okuyamadım" cevabı + kredi iadesi
├─ revizyon + kural geçerli ──────► islem liste_revize: listeRevizeKoddan → sabitCevap (şablon)
└─ revizyon + kural eksik ────────► islem soru_sor: modelin formu (anketDogrula) ya da varsayilanForm → sabitCevap
"Form cevaplarım:" mesajı → aynı yol (önceki form dökümü çıkarıma verilir)
```
- `src/lib/ai/sohbet-akisi.ts:127` `sabitCevap`; `:205-247` koddan işlem: ekrana `tool-input-start/available` + `tool-output-available|error` (istemci `sohbet-client.tsx`/`arac-pilleri.tsx` değişmedi — liste yenileme, toast, form çizimi aynen), kayda `meta.revizyon`/`meta.anket` (route `onAracSonucu`). Başarısız revizyon artık ekranda **"Listeni yeniden kuramadım"** hapı (`output-error`; eskiden `{hata}` sonucu "kurdum" hapı gösteriyordu).
- `src/app/api/soru/route.ts:295-325` dallanma; `:349` `onRevizeBeyani` iadesi.
- `src/lib/ai/danisman-prompt.ts` revizyon bölümü: "listeyi sen değiştiremezsin; sunucu kurar ve cevabı yazar; çağrıldıysan liste değişmedi — kurdum deme, net istek iste ya da soru_sor".
- `src/lib/ai/sohbet-gecmisi.ts:37` pencere: `[Araç kaydı: …]` etiketi **geri alındı** (model etiketi kopyalayıp cevabı o biçimde yazdı, 22-59 koşusu r04-r07), yerine doğal tek cümle (`Listeni yeniden kurdum: 24 tercih (…). İlk 5: …`).
- `src/lib/ai/cagri.ts` `yapilandirilmisUret`: `wireJsonSema`, `model`, `zamanAsimiMs`, `dislanan` seçenekleri (varsayılanlar değişmedi). `src/lib/ai/client.ts` `niyetModeli()` = `OPENROUTER_NIYET_MODEL` yoksa rapor modeli.
- `/meraklisina` şeması: `huni-semasi.tsx:33` RV düğümü + aria-label + figcaption + 4. bölüm metni.
## Bulgular
- **B1 kök neden (koddan ve ölçümden):** `src/lib/ai/sohbet-akisi.ts` (eski, 128c175) araç seçimi modele aitti; örnek r03 ("İlk 5'i Bursa'ya göre güncelle.", 2 başarılı geçmiş) → araçsız "Liste yenilendi… Bursa Uludağ…" (uydurma). Şimdi aynı girdi → `{"ilkTercihler":{"adet":5,"iller":["BURSA"]}}` kural, koddan kurulum, şablon cevap (23-07 koşusu, 1,5 sn niyet).
- **Model sayı/ad güvenilmezliği (yeni, ölçüldü):** 23-02 koşusu r04: sunucu sonucu `7 hayal/12 dengeli/5 güvenli`, model "11 hayal / 7 dengeli / 6 güvenli" ve ilk 5'te sonuçta olmayan "İSTANBUL ÜNİVERSİTESİ-CERRAHPAŞA"; r07: sonuç 4/12/8, model "0 hayal / 11 dengeli / 13 güvenli". → şablon (`sabitCevap`).
- **Etiket taklidi (yeni):** 22-59 koşusu r04, r05, r06, r07 cevapları aynen `[Sunucu kaydı: bu cevapta liste sunucu tarafından yeniden kuruldu — …]` ile başladı. Asistan turuna konan her yapay işaret taklit ediliyor (7 Eki raporundaki gözlem doğrulandı). → doğal cümle.
- **Niyet çıkarımı başarısızken sohbete düşmek tehlikeli:** 23-07 r04 (form cevabı) niyet çağrısı 20 sn zaman aşımı → normal sohbet → model "Listeni yeniden kurdum: 24 tercih (9/12/3)… İSTANBUL AREL…" (uydurma; not + iade çalıştı). → `route.ts:310` koddan "okuyamadım" + iade (gerçek modelle koşulmadı; mekanik `koddan-revizyon-hata` senaryosu aynı yolu sınar).
- **Yavaş üst sağlayıcı:** niyet çağrısında OpenInference 11,1 / 12,5 sn (2 koşu), Wafer 10,2 sn (r09, 3 soruluk form çıktısı; sonraki koşuda 3,8 sn), diğerleri 1,1-3,3 sn. 23-07 koşusunda bir çağrı 20 sn'de kesildi (sağlayıcı bilinmiyor — abort).
- **r05 kural hatası (1 kez):** 22-59 koşusunda "ilk 3 tercih İzmir'de olsun" → `{"universiteTipi":"farketmez","iskelet":"standart"}`; prompt'a "yalnız istenen değişikliği yaz, farketmez/standart yalnız açıkça istenirse" eklendi, sonraki 2 koşuda doğru.
- **Kredi defteri çakışması (eski gizli hata):** `src/features/rapor/liste-revizyon.ts` iade satırı `refId=mesajId` yazıyordu; `ledger_reason_ref` tekilliği yüzünden aynı mesajın sohbet iadesi (yarım kalma) "tekrar" sayılıp düşmüyordu. Düzeltildi (`:51 iadeRefId`).
## Eval sonuçları (`pnpm eval:revizyon`, 10 senaryo, QA kaydından gerçek geçmişler)
| koşu | revizyon tetiklendi (8 beklenen) | kural doğru | sahte beyan | geçen | model çağrısı | maliyet | gecikme (niyet / cevap) |
|---|---|---|---|---|---|---|---|
| **önce** `128c175` (model araç seçer, 21-19-51) | 5/8 | — | **3** | 7/10 | 21 | 0,0032 $ | — / 3,3-32 sn |
| ara 1: koddan revizyon, model anlatıyor, `[Sunucu kaydı]` etiketi (22-59-20) | 8/8 | 7/8 | 0 | 9/10 | 20 | 0,0024 $ | 1,6-11,1 / 2,9-25 sn; 4 cevap etiketi kopyaladı |
| ara 2: doğal kayıt cümlesi, model anlatıyor (23-02-50) | 8/8 | 8/8 | 0 | 10/10 | 19 | 0,0025 $ | 1,1-12,5 / 2,6-7 sn; **2/8 cevapta sayı yanlış** |
| **son**: cevap şablondan, OpenInference hariç (23-07-25) | 7/8* | 7/8* | 1* | 9/10 | 12 | 0,0008 $ | 1,1-6,5 (+1 zaman aşımı 20 sn) / 0 sn (koddan) |
| son, r04 tekrar (23-08-21) | 1/1 | 1/1 | 0 | 1/1 | 1 | 0,0001 $ | 5,4 / 0 |
\* r04: niyet çağrısı zaman aşımı → normal sohbet → model uydurdu, güvenlik ağı yakaladı (not + iade). Bu yol sonradan koddan cevaba çevrildi (`route.ts:310`); tekrar koşuda r04 geçti. Son hâlin 8/8'i "ara 2 + şablon" ve "r04 tekrar" birleşiminden okunur; **tek koşuda 10/10 son kod ile koşulmadı** (bütçe: 56/60).
Mekanik: `akis-denetim` 13/13 (yeni: `koddan-revizyon` modelsiz şablon ve `tool-liste_revize` parçası; `niyet-diger-sahte-beyan` → not + iade; `koddan-form` model çağrısı 0; `koddan-revizyon-hata` → `output-error` + "kuramadım"), `revizyon-denetim` 5/5. Ham sonuçlar `scripts/eval/sonuc/2026-10-08T22-57-23 … 23-08-21-revizyon.json` (commit'te).
## Maliyet ve gecikme etkisi
- **Kullanıcı kredisi:** değişmedi — revizyon isteği 1 sohbet kredisi (form cevabı bedelsiz), liste üretimi paketliye 0. Yeni iade yolları: sahte beyan (model turunda) ve niyet çıkarımı başarısızlığı → 1 kredi iade, `refId=mesajId` (yarım kalma iadesiyle aynı anahtar, çift iade yok).
- **Bizim maliyet:** revizyon turu başına 1 niyet çağrısı ≈ 4,3 k girdi + 80 çıktı token ≈ **0,00007 $** (form üretiminde ≈0,0002 $); sohbet modeli o turda çağrılmıyor (önce 1-4 çağrı, 0,0002-0,001 $). Regex yanlış pozitifinde ("listeme not ekle") niyet çağrısı boşa gider (≈0,00007 $, 1-3 sn) ve sohbet normal sürer.
- **Gecikme:** cevap başlangıcı = niyet çağrısı (p50 ≈ 2 sn, en kötü 20 sn zaman aşımı) + liste üretimi (20-60 sn, değişmedi); şablon cevap anında. Önce: model 1-4 adım (3-32 sn) + üretim. "Listeni yeniden kuruyorum…" hapı niyet çağrısından sonra, üretim boyunca görünür.
- **Token:** sohbet sistem prompt'u ~120 token kısaldı (revizyon bölümü sadeleşti); pencerede revizyon turları ~1 cümle.
## Sapmalar / açık noktalar
- "Sonucu sohbet modeline araç sonucu olarak ver" **uygulanmadı** (iki koşuda ölçülüp geri alındı; sayı/ad hatası). Model artık revizyon turunda hiç konuşmuyor; yorum isteniyorsa şablona `kuralOzeti` ile tek cümle eklendi (`— ilk 5 tercih: il Bursa`).
- `OpenInference` yalnız niyet çağrısında atlanıyor (`revizyon-niyeti.ts:158`); rapor üretimi ve sohbet etkilenmez. Niyet zaman aşımı 20 sn; bir çağrı buna takıldı (sağlayıcı bilinmiyor).
- `OPENROUTER_NIYET_MODEL` yeni, **isteğe bağlı** env; tanımsızsa davranış değişmez (rapor modeli).
- Paketsiz adayda niyet çağrısı yapılmaz; model `/paket`'e yönlendirir (önceki davranış).
- Sürüm artırılmadı (`v2` dalı 2.0.0 geliştirmesi; önceki fix commit'leriyle tutarlı).
- UI'a bakılmadı (tarayıcı yasak): koddan `tool-*` parçaları istemcinin zaten tükettiği biçimde; `huni-semasi.tsx` düğümü mermaid'de yalnız metin ekledi, görsel kontrol Bilal'de.
## Önerilen değişiklikler
- `[KARAR]` uygulandı: koda bağlı revizyon, şablon cevap, iade ağı, refId düzeltmesi, eval güncellemesi, meraklısına şeması.
- `[BİLAL]` `OPENROUTER_NIYET_MODEL`: daha ucuz/hızlı küçük bir model (ör. `openai/gpt-4.1-nano` sınıfı) için ayrı ölçüm (~10 çağrı); mevcut maliyet zaten ≈0,00007 $/tur olduğu için acele değil.
- `[BİLAL]` Niyet çağrısında OpenInference'ın atlanması kalsın mı; istenirse `kaliciDislananSaglayicilar`'a (rapor+sohbet) taşımak ayrı ölçüm ister.
- `[KARAR]` sonraki tur: `pnpm eval:revizyon --tekrar 3` ile stokastik tutarlılık (≈33 çağrı, ≈0,003 $) ve regex yanlış pozitif seti ("listeme not ekle", "güncel takvim nedir") — niyet "diger" oranı.
## Bilal'den istenen
1. Son kodla izole tam koşu: `pnpm eval:revizyon` (≈11 çağrı, ≈0,001 $, ~1 dk); hedef 8/8 · sahte beyan 0 · 10/10 — 3 dk.
2. Lokalde paketli hesapla bir kez "ilk 5 Ankara olsun" + belirsiz "listemi değiştir" yazıp hap/form/toast'ın göründüğünü görmek (tarayıcı bende yasak) — 5 dk.
3. `OPENROUTER_NIYET_MODEL` ve OpenInference kararı (yukarıda) — 1 dk.