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,85 @@
# Yazılımcı raporu — Paket B · revizyon "ilk N" garantisi (madde 4)
Dal `v2`, ana checkout. Commit'ler HEAD `bed8397` üstüne; push yok.
## Özet (5 madde)
1. **Kök neden koddan doğrulandı ve kapatıldı:** `ilkTercihleriGarantile` (yeni saf fonksiyon, `src/lib/revizyon-kurali.ts`) model "ilk N" ölçütüne uyan satırı seçmemişse havuzdaki uyan programları aynı dilimdeki uymayan satırlarla takaslar; dilim adetleri değişmez. `rapor.ts` bunu nihai seçimden sonra uygular; `tani.ilkNEklenen` eklendi. Dev mock yolu da artık kuralı uyguluyor.
2. **Denetim betiği yazıldı ve koşuldu:** `scripts/eval/revizyon-denetim.ts` → **5/5 geçti, çıkış 0** (sahte model önceliği kasten atlar; gerçek model ölçülmedi).
3. **Şartnamedeki senaryo 1 params'ı ile "ilkNEklenen === 5" ölçülemez — önemli ürün bulgusu:** "ilk 5 İstanbul" istenince havuz kırpması (`rapor-havuzu.ts`, dilim başına 20, öncelikli önce) havuzu **60/60 İstanbul** yapıyor; model başka il seçemiyor, 24 satırın hepsi İstanbul çıkıyor. Bu Paket C'nin dosyasında (dokunmadım); ayrıntı "Sapmalar" ve "Backlog"da.
4. **Doğrulama:** `next typegen` + `tsc --noEmit` temiz; benim üç dosyamda ESLint hatası yok; `tasarim:denetim` 0 hata. `pnpm lint` tüm ağaçta **kırık**, ama tek kaynak `.claude/worktrees/*/.next/types/*` (paralel ajanların worktree typegen çıktısı) — bana ait değil.
5. Regresyon: `akis-denetim.ts` 7/7 geçti. `raporUretAyrintili` imzası değişmedi (4 parametre); `eval:robot` etkilenmez.
## Commit'ler
| Hash | Mesaj | Dosyalar |
|---|---|---|
| `62994d7` | fix(revizyon): "ilk N" ölçütü seçimde kodla garanti ediliyor; mock yolu da kuralı uyguluyor | `src/lib/revizyon-kurali.ts`, `src/lib/ai/rapor.ts` |
| `71294e1` | test(revizyon): mekanik ilk-N denetimi (sahte model önceliği atlar) | `scripts/eval/revizyon-denetim.ts` (yeni) |
Bu rapor commit'e dâhil değil. Başkalarının kirli dosyalarına (`.claude/settings.json`, `AGENTS.md`, `data/app.db`, `docs/ekip-raporlari/`) dokunulmadı.
## Değişiklik ayrıntısı
**`src/lib/revizyon-kurali.ts`**
- `ilkTercihleriGarantile<S>(secim, havuz, k, uyum, yeniSatir)` → `{ secim, eklenen }`. Şartnamedeki imza birebir. Takas kuralı: öncelikli adaylar `uyum` azalan sırada; her aday kendi diliminde, uymayan satırlar arasından önce kodla gelen (`kaynak !== "model"`), sonra en düşük `uyum`lu satırı çıkarır. Seçimi boş dilimde takas yok. Havuz yetmezse eldeki kadarı. Girdi dizileri kopyalanır (saf).
- Modül başlığı 2. madde güncellendi; `DILIMLER` sabiti ve `Dilim` tipi eklendi.
**`src/lib/ai/rapor.ts`**
- `RaporTani.ilkNEklenen: number` eklendi.
- `nihai`, `enIyi` üzerine garanti takası uygulanarak kuruluyor; `onarim.tamamlanan += eklenen`. **Küçük sapma:** `onarim.modelSecimi` nihai seçimden yeniden sayılıyor (`kaynak !== "tamamlandi"`), çünkü takas model satırı çıkarabiliyor ve sayı aksi hâlde yalan söylerdi. Şartname yalnız `tamamlanan`ı istemişti.
- `mockRapor(havuz, params, revizyonNotu, oncelikli)`: dilim içi sıralama öncelikliyi önce alır (eşitte taban sırası), sonunda `ilkTercihleriOneAl` uygulanır. Mock çağrısına `oncelikli` geçildi.
- Kullanıcı mesajındaki "EN AZ N tane seç" cümlesi olduğu gibi kaldı.
**`scripts/eval/revizyon-denetim.ts`** (yeni; `akis-denetim.ts` deseni)
- Sahte OpenAI ucu (`AI_BASE_URL`/`AI_API_KEY` sahte, `OPENROUTER_API_KEY`/`TYPESAFE_API_KEY` silinir), app.db gerekmez, `data/yokatlas.db` salt okunur. İstekten `response_format.json_schema.schema.properties.*.minItems` ve kullanıcı mesajındaki `ADAY HAVUZU … : {…}` JSON'u okunur; her liste **kasten** `oncelikli` olmayan id'lerle doldurulur (yetmezse öncelikliyle tamamlanır, atlanan sayısı loglanır).
- Senaryolar ve sonuç:
| Senaryo | Params | Beklenti | Sonuç |
|---|---|---|---|
| `ilk5-istanbul` | 100.000 say, ANKARA+İZMİR, ilk 5 İSTANBUL | ilk 5 İstanbul, 24 satır, dilim adetleri = `kapsam.dagilim` | ✔ (ilkNEklenen 0 — havuz 60/60 İstanbul, takas gerekmedi) |
| `ilk5-takas` | aynı, ilk 5 YALOVA | ilk 5 Yalova, **ilkNEklenen === 5** | ✔ (sahte uç 11 öncelikliyi atladı, kod 5 takasladı) |
| `ilk3-vakif` | 100.000 say, KAYSERİ, ilk 3 vakıf | ilk 3 vakıf, **ilkNEklenen === 3** | ✔ (havuz 41, hedef 7/8/9; 8 vakıf atlandı, 3 takaslandı) |
| `havuz-yetersiz` | ilk 10 ARDAHAN | hata yok, 24 satır, Ardahan'lar başta, ilkNEklenen ≤ 10 | ✔ (2 Ardahan, ilkNEklenen 2) |
| `mock-yolu` | `AI_API_KEY` silinmiş, ilk 5 YALOVA | ilk 5 Yalova, `tani === null`, `devMock` | ✔ |
## Kabul kriterleri (B-3)
- `pnpm tsx --conditions=react-server scripts/eval/revizyon-denetim.ts` → **✔ 5/5, çıkış 0** (koşuldu). Şartname "4/4" demişti; 5 senaryo var (gerekçe aşağıda).
- `pnpm tsx --conditions=react-server scripts/eval/akis-denetim.ts` → **✔ 7/7** (koşuldu).
- `pnpm exec next typegen && pnpm exec tsc --noEmit` → **✔ temiz** (koşuldu).
- `pnpm lint` → **✘ tüm ağaçta kırık, benim dosyalarımda ✔.** `pnpm exec eslint src/lib/revizyon-kurali.ts src/lib/ai/rapor.ts scripts/eval/revizyon-denetim.ts` sıfır hata; `pnpm tasarim:denetim` 0 hata / 12 uyarı (hepsi başka dosyalarda, önceden var). Tam `pnpm lint` 576 sorun (312 hata) gösteriyor; dosya listesi yalnız `.claude/worktrees/agent-*/.next/types/{validator.ts,routes.d.ts}` — paralel ajan worktree'lerinde typegen çıktısı, `eslint.config` bu klasörü ignore etmiyor. İlk denemede ayrıca `src/components/tema-kisayolu.tsx` için ENOENT çıktı (dosya glob anında vardı, okunurken yoktu; başka ajan taşımış/silmiş). İkisi de dışsal.
- `raporUretAyrintili` dört parametre, `eval:robot` çağrı imzası değişmedi → **✔ koddan çıkarım** (robot.ts:205 çağrısı aynı; `eval:robot` anahtar istediği için koşulmadı).
## Şartnameden sapmalar
1. **Senaryo 1 beklentisi (`ilkNEklenen === 5`) karşılanamaz ve senaryo sayısı 5.** Şartnamenin params'ıyla (`iller: ["Ankara","İzmir"]`, ilk 5 İstanbul) iki şey oluyor: (a) il adları DB'de büyük harf (`İSTANBUL`), `rapor-havuzu.ts:314 ilFiltre` tam eşleşme yapıyor; "Ankara" yazılırsa süzgeç boş kalıp havuz "il gevşet" ile tüm ülkeye açılıyor — gerçek akışta sorun değil (sihirbaz ve `liste_revize`'nin `ilAdiNormalize`'ı DB biçimini yazıyor; `scripts` içinde doğruladım), ama test params'ı büyük harf olmalı. (b) DB biçimiyle bile havuz kırpması (`PROMPT_LIMIT_DILIM = 20`, `kirpVe` önceliklileri öne alıyor) İstanbul'u 60/60 dolduruyor; sahte uç öncelikli olmayan satır bulamıyor, takas tetiklenmiyor. Bu yüzden şartnamenin senaryosu **aynen** kaldı (Bilal'in gerçek denemesi; ilk 5 İstanbul ✔) ve takası kesin tetikleyen ek senaryo (`ilk5-takas`, Yalova: havuza 0/3/8 öncelikli sokuyor, her dilimde sıradan satır hedefin üstünde) eklendi. Vakıf senaryosu da aynı nedenle tek il (KAYSERİ) ile kuruldu; ANKARA+İZMİR'de vakıf her dilimde 20/20 öncelikli çıkıyor.
2. `onarim.modelSecimi` nihai seçimden yeniden sayılıyor (yukarıda).
3. `mock-yolu` senaryosu İstanbul yerine Yalova params'ı kullanıyor: İstanbul'la mock'un öncelik sıralaması hiç sınanmazdı (havuz zaten tamamen İstanbul).
## Önemli bulgu — kapsam dışı, Paket C / CTO'ya
**"İlk 5'i İstanbul yap" → 24 satırın hepsi İstanbul oluyor.** `rapor-havuzu.ts:343-347` öncelikliyi kırpmada dilim başına 20 kotanın tamamına yayıyor; İstanbul gibi her dilimde 20+ programı olan il havuzu tek başına dolduruyor, model/kod başka il seçemiyor. Kullanıcı "ilk 5" istedi, geri kalan 19'un sihirbaz illerinden (Ankara/İzmir) gelmesini bekler. Önerilen düzeltme (C'nin dosyası, bu turda dokunmadım): kırpmada öncelikliye dilim başına `ilkTercihler.adet` (+ küçük pay) kadar yer ayır, kalanı sihirbaz sırasıyla doldur. Garanti takası (bu paket) bu düzeltmeyle birlikte asıl işini görür: havuz karışık olunca model öncelikliyi atlasa bile kod N'yi tamamlar. `efektifParams`'ın İstanbul'u süzgece eklemesi doğru; sorun yalnız kırpma kotası.
## Merge sonrası doğrulanması gerekenler
- Entegrasyonda `pnpm build` (bu turda koşulmadı, kural gereği).
- `scripts/eval/revizyon-denetim.ts` ve `akis-denetim.ts` entegrasyon dalında tekrar (C `rapor-havuzu.ts`'yi değiştirirse `ilk5-takas`/`ilk3-vakif` senaryolarının havuz dağılımı değişebilir; beklentiler `ilkNEklenen === 5/3` sabit — havuz yine karışıksa tutar).
- `pnpm lint` için `.claude/worktrees` klasörünün `eslint.config` ignore listesine alınması (orkestratör / bir satırlık iş).
- Gerçek modelle: `pnpm eval:sohbet`'e "ilk 5'i İstanbul'a göre güncelle" araç-argümanı senaryosu (B-5, yapay-zeka-muhendisi).
## Backlog önerileri
1. `rapor-havuzu.ts` kırpmada öncelikli kotası (yukarıdaki bulgu) — **yüksek**; aksi hâlde "ilk N" isteği tüm listeyi o ile çeviriyor.
2. `eslint.config`: `.claude/worktrees/**` ignore.
3. `revizyon-denetim.ts` senaryo seçimi havuz dağılımına bağlı; `rapor-havuzu` kotası değişince senaryo params'ı yeniden ölçülmeli (betiğin başındaki yorum anlatıyor).
## Notlar
- Next'e özgü API'ye dokunulmadı; `node_modules/next/dist/docs/` okunmadı (gerek yoktu).
- UI yok; DESIGN.md kapsam dışı. Para/giriş/kişisel veriye dokunulmadı.
- Yıkıcı git komutu kullanılmadı; `git add` yol vererek yapıldı.
## Bilal'den istenen
1. "İlk 5 İstanbul" dendiğinde kalan 19 satırın sihirbaz illerinden (Ankara/İzmir) gelmesi mi istenir, yoksa listenin tamamının İstanbul'a kayması kabul mü? (tek cümle, 1 dk) — cevap Paket C/CTO'nun kırpma kotası işini açar ya da kapatır.