- 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>
54 lines
7.4 KiB
Markdown
54 lines
7.4 KiB
Markdown
# Yazılımcı raporu — Paket C · program varyant etiketi (madde 2-3)
|
||
|
||
Worktree: `.claude/worktrees/agent-a5bcd7331b2f3c5b2`, dal `worktree-agent-a5bcd7331b2f3c5b2`, taban `4d30dd1` (şartnamenin tabanı). Push yok.
|
||
|
||
## Özet (5 madde)
|
||
|
||
1. `Program.varyant` tek kaynaktan: `src/lib/program-varyant.ts` (saf `varyantEtiketi`), `db.ts` `SELECT_COLS` üç ilişkili alt sorguyla `program_ozellik`'ten okur, `programSatiri` etiketi üretir. Başkent Tıp 6 satırı artık "Ücretli / %50 İndirimli / Burslu / Ücretli · İngilizce / Burslu · İngilizce / %50 İndirimli · İngilizce" olarak ayrışıyor (test çıktısı).
|
||
2. UI: `/sonuc` tablosu, rapor listesi (`/listem`), üniversite ve bölüm katalog tabloları tür çipinin hemen ardından `SATIR_CIP` ile çip çiziyor; çekmece ikinci satırda `· {varyant}`. Null ise hiçbir şey çizilmiyor.
|
||
3. Manuel liste ve kayıtlı rapor: `ManuelTercih.varyant?` (eski localStorage kayıtları geçer), `programEkleIste` etiketi kopyalar; `kullanicininRaporu` okuma anında tek sorguyla 24 id'ye varyant yazar (eski raporlar da kazanır, app.db'ye yazılmaz).
|
||
4. Model: `havuzuKompaktJson` varyant alanını taşıyor. B'nin dosyasına dokunulmadı; entegrasyon satırı aşağıda.
|
||
5. Doğrulama: `scripts/eval/varyant-denetim.ts` 14/14 ✔ çıkış 0; `typegen + tsc + eslint` temiz; `pnpm tasarim:denetim` 0 hata / 12 uyarı (hepsi dokunulmayan dosyalarda, önceden var). `data/` git'te temiz.
|
||
|
||
## Commit listesi
|
||
|
||
- `5c583ac` feat(veri): Program.varyant — burs/dil/öğretim türü etiketi tek kaynaktan (program_ozellik) — `src/types/yokatlas.ts`, `src/lib/db.ts`, `src/lib/program-varyant.ts` (Y), `src/lib/rapor-havuzu.ts`, `scripts/eval/varyant-denetim.ts` (Y)
|
||
- `7c48f64` feat(liste): varyant çipi — sonuç tablosu, kendi listem çekmecesi, katalog tabloları — `liste-queries.ts`, `liste-dogrula.ts`, `use-tercih-profili.ts`, `program-ekle-butonu.tsx`, `program-tablosu.tsx`, `liste-cekmecesi.tsx`, `universite-program-tablosu.tsx`, `bolum-program-listesi.tsx`
|
||
- `10b3e5b` feat(listem): kayıtlı raporun satırlarına varyant (okuma anında zenginleştirme) — `rapor-queries.ts`, `types/rapor.ts`, `rapor-listesi.tsx`
|
||
|
||
Dokunulan dosyaların tamamı şartnamenin C satırındadır; liste dışı dosya yok.
|
||
|
||
## Kabul kriterleri
|
||
|
||
- ✔ Test 4/4 (14 alt denetim), çıkış 0 — `pnpm tsx scripts/eval/varyant-denetim.ts` koşuldu (react-server koşulu gerekmedi). `dilimAra(100000,"say","dengeli",{limit:50})` 50 satırın 50'sinde `varyant` tanımlı, 34'ü etiketli; `107210332` Marmara Hukuk → null.
|
||
- ✔ `pnpm exec next typegen && pnpm exec tsc --noEmit` temiz (çıktı yok); `pnpm exec eslint` temiz; `pnpm lint` → "Tasarım denetimi: 0 hata, 12 uyarı" (uyarılar `secimlerim-paneli.tsx`, `meraklisina-demo.tsx` — bu pakette dokunulmadı).
|
||
- ✔ `grep -c varyant`: rapor-listesi 3, program-tablosu 2, liste-cekmecesi 2, universite-program-tablosu 2, bolum-program-listesi 5.
|
||
- ✔ `data/yokatlas.db` değişmedi: `git status --short data` boş; test ve `getDb()` `readonly: true`.
|
||
- ✔ Çip `SATIR_CIP` sınıf dizisiyle birebir (sabit import edildi, elle sınıf yazılmadı); `dark:` yok.
|
||
|
||
## Şartnameden sapmalar / notlar
|
||
|
||
1. **Worktree tabanı:** verilen worktree `a3cb058`'deydi (şartname tabanı `4d30dd1`'in 3 commit gerisi; paketin dosyaları — `liste-cekmecesi`, `rapor-queries`, `types/rapor.ts`, `rapor-havuzu` — iki commit arasında farklıydı). Çalışma ağacı temiz olduğu için `git merge --ff-only 4d30dd1` ile ileri sarıldı; yıkıcı komut kullanılmadı. Dal `1760690` (v2 HEAD) ile değil `4d30dd1` ile başlıyor; v2'ye merge'de bir commit'lik fark var, paketin dosyalarıyla çakışması beklenmez (koddan çıkarım; `1760690` yalnız header rozeti + sürüm).
|
||
2. **`rapor.ts` satır numarası:** şartname `:779` diyor, `4d30dd1`'de ilgili satır **763**. Orkestratörün ekleyeceği tam hâl:
|
||
```ts
|
||
...metindekiSayilar(p.isim, p.universite, p.varyant ?? ""),
|
||
```
|
||
(`src/lib/ai/rapor.ts:763`, `ustSayilar` kümesinin içindeki `...metindekiSayilar(p.isim, p.universite),` satırının yerine.) Bu satır eklenmezse model gerekçede "%50" yazdığında sayı denetimi o cümleyi düşürebilir — işlev bozulmaz, yalnız gerekçe kırpılır.
|
||
3. **Veri gözlemi (şartnamedeki metinden fark):** `ogrenim_turu` DB'de "Açık Öğretim" (iki kelime) ve "UOLP"; "İkinci Öğretim" / "Açıköğretim" değeri DB'de yok (`SELECT DISTINCT ogrenim_turu`). Etiket DB'deki metni olduğu gibi yazar; birim testteki "İkinci Öğretim" girdisi saf fonksiyonu ölçer. `burs_orani` devlette NULL yanında boş string de geliyor; boş string null gibi davranır (5. birim vakası).
|
||
4. **DESIGN.md §4.15 ile tutarlılık:** §4.15'te "Program varyantı ('… (İngilizce) (Burslu)') adın altında ayrı satır `SATIR_ALT_AD`" cümlesi var — o kural `isim`in parantezli hâli için (bölüm sayfasındaki `bazAd` farkı, `bolum-program-listesi.tsx:218`, aynen duruyor). Bu paketteki burs/dil/öğretim türü etiketi şartname gereği **çip** (`SATIR_CIP`, tür çipinin yanı). Belgeye bir cümle eklenmesi gerekir (`docs/tasarim/DESIGN.md` §4.15, paket dosya listesinde olmadığı için dokunmadım): "Burs/dil/öğretim türü etiketi (`Program.varyant`) tür çipinin hemen ardından `SATIR_CIP` ile; null ise çizilmez."
|
||
5. **`programdanManuelTercih` (`liste-store.ts`)** paket listesinde yok; varyant `use-tercih-profili.ts` içinde spread ile ekleniyor. `liste-store`'u doğrudan çağıran başka ekleme yolu yok (`grep programEkleIste(` → yalnız `program-ekle-butonu.tsx`).
|
||
6. Çekmece satırında `· {varyant}` `shrink-0`; üniversite adı `min-w-0` link olduğu için uzun adlarda ad sarar, etiket kesilmez. **375 px notu (koddan çıkarım, tarayıcı açılmadı):** meta satırı `flex-wrap`, en uzun etiket "%50 İndirimli · İngilizce" (~25 karakter, text-xs) tür çipi + il ile sığmazsa alt satıra iner; dokunma hedefi yok (çip interaktif değil). Bölüm sayfasında satır zaten iki 44 px düğmeyle 129 px; bir çip satırı daha eklenirse yükseklik değişmez (düğmeler belirliyor, §4.15). `tasarimci` kontrolü şartname C-5'te zaten var.
|
||
7. **Rapor dosyasının yeri:** ana checkout'taki `docs/ekip-raporlari/2026-10-07/yazilimci-paket-C.md` yoluna yazma worktree izolasyonu yüzünden reddedildi; rapor worktree içinde aynı göreli yolda, commit'lenmemiş (untracked) duruyor. Orkestratör ana checkout'a kopyalar.
|
||
|
||
## Merge sonrası doğrulanması gerekenler
|
||
|
||
- Orkestratör `rapor.ts:763` satırını ekledikten sonra `pnpm tsx --conditions=react-server scripts/eval/akis-denetim.ts` ve B'nin `revizyon-denetim.ts`'i (varyantlı havuz JSON'u ile prompt boyutu az artar; şema değişmedi).
|
||
- Gerçek üretimde bir listede aynı bölümün 2+ varyantı görünürse gerekçenin "burslu/ücretli" ayrımını yazıp yazmadığı (`yapay-zeka-muhendisi` eval'i; kod değil model davranışı).
|
||
- `/listem` eski kayıtlı raporda çipin göründüğü (okuma anında zenginleştirme) — Bilal'in kendi hesabında 1 bakış.
|
||
- Docker imajında `program_ozellik` tablosunun seed'de geldiği (`Dockerfile`) — şartname doğruladı, ben koddan teyit etmedim; tablo yoksa alt sorgu SQL hatası verir (koruma bilinçli yok).
|
||
|
||
## Bilal'den istenen
|
||
|
||
1. `docs/tasarim/DESIGN.md` §4.15'e yukarıdaki tek cümlenin eklenmesine onay (ya da tasarımcıya verilmesi) — 2 dk.
|
||
2. Yok (para/giriş/kişisel veriye dokunulmadı; `guvenlik-uyum` denetimi gerekmiyor).
|