Files
kolaytercih/docs/ekip-raporlari/2026-10-07/yazilimci-paket-B.md
bilalgursen da0e9dff7a 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>
2026-10-11 00:33:39 +03:00

86 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.