# 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).