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,63 @@
# Yazılımcı raporu — Paket D1 · Sohbet UI (shimmer, logo varyantı, soru geçişi)
Worktree: `/Users/bilalgursen/Desktop/kolaytercih/.claude/worktrees/agent-a8614479561696864`, dal `worktree-agent-a8614479561696864`. Worktree `a3cb058`'de başlıyordu (şartname tabanı `4d30dd1`'in 4 commit gerisi; `sohbet-anketi.tsx` yoktu); temiz olduğu için `git merge --ff-only 1760690` ile v2 ucuna ileri sarıldı, sonra iş yapıldı. `node_modules` ana checkout'tan `cp -Rc` ile klonlandı. Bu rapor worktree'ye yazıldı (ajan ana checkout'a yazamıyor); ana checkout'taki `docs/ekip-raporlari/2026-10-07/yazilimci-paket-D1.md`'ye orkestratör kopyalar. Rapor dosyası commit'lenmedi.
## Özet (5 madde)
1. **Madde 5 bitti.** `soru_sor` çalışırken (parça `output-available`/`output-error` değilken) gri iskelet yerine `TextShimmerLoader` ile "Soruları hazırlıyorum…" satırı (`role="status" aria-live="polite"`); form gelince kalkar. Avatar araçta `"zincir"` → `"rota"` (header logosuyla aynı).
2. **`loader.tsx`'e dokunuldu — ve gerekliydi:** prompt-kit `TextShimmerLoader` `animate-[shimmer_…]` yazıyor ama projede `shimmer` adlı keyframe **yok** (shadcn'inki `tw-shimmer`, `node_modules/shadcn/dist/tailwind.css:537`); yani hiç hareket etmiyordu. Ayrıca `--muted-foreground/--foreground` + `bg-clip-text text-transparent` (tasarım denetimi `gradyan-metin` kuralı; ui klasörü taranmadığı için yakalamıyordu). Bileşen sitenin tek parıltı kaynağı olan shadcn `shimmer` utility'sine geçti (`liste-uretici.tsx:474`, `tercih-degisti-modali.tsx:326` ile aynı; currentColor → karanlık mod token'dan).
3. **Madde 10 bitti.** `src/lib/adim-gecisi.ts` (yeni, saf): `adimGecisiVaryantlari` + `adimGecisi`. Sihirbaz bu ikisini kullanıyor (diff yalnız taşınma + aşağıdaki tek sapma). `SohbetAnketi` kontrollü (`item`/`onItemChange`), her soru `motion.div` içinde aynı varyant/yay ile kayıyor, aktif fieldset `useMeasure` ile ölçülüp boy yayla uzuyor.
4. **Çıkış animasyonu elde edildi** (`hidden` deneyi başarılı; ayrıntı aşağıda).
5. Doğrulama: `pnpm exec next typegen` ✔, `tsc --noEmit` ✔ (0 hata), `pnpm lint` ✔ (exit 0; tasarım denetimi 0 hata, 12 uyarı — hepsi başka dosyalarda, önceden vardı), eslint beşli dosya seti exit 0. Build koşulmadı (şartname). Tarayıcı açılmadı.
## Commit'ler
| Hash | Mesaj | Dosyalar |
|---|---|---|
| `f08a26a` | feat(sohbet): soru formu hazırlanırken shimmer; araçta avatar header logosuyla aynı rota koreografisi | `src/features/rapor/components/sohbet-client.tsx`, `src/components/ui/loader.tsx` |
| `3f4095e` | refactor(hareket): sihirbaz adım geçişi sabitleri lib/adim-gecisi.ts'e; soru formu aynı geçişle | `src/lib/adim-gecisi.ts` (Y), `src/features/sihirbaz/components/sihirbaz-adimlar.tsx`, `src/features/rapor/components/sohbet-anketi.tsx` |
`revizyonHakki` prop'una dokunulmadı (A paketi). Kod ağacı temiz (`git status` yalnız bu rapor dosyasını gösterir).
## Kabul kriterleri (D1-2)
| Kriter | Durum | Nasıl doğrulandı |
|---|---|---|
| `grep -n '"zincir"' sohbet-client.tsx` → 0 | ✔ | koşuldu: 0 |
| `grep -n "TextShimmerLoader" sohbet-client.tsx` ≥ 1 | ✔ | koşuldu: 2 (import + kullanım) |
| `grep -n "stiffness: 300" sihirbaz-adimlar.tsx sohbet-anketi.tsx` → 0 | ✔ | koşuldu: 0/0 |
| sabit tek kaynakta `adim-gecisi.ts` | ✔ (not) | koşuldu: **2** satır (x ve height ayrı yay nesnesi — sihirbazdaki özgün yapı aynen; şartnamedeki "1" sayımı gevşekti) |
| `sohbet-anketi.tsx` `item=` ve `onItemChange=` | ✔ | satır 111-112 |
| `sihirbaz-adimlar.tsx` `adimGecisiVaryantlari` import | ✔ | satır 17, kullanım 257 |
| typegen + tsc + lint temiz; `pnpm tasarim:denetim` 0 hata | ✔ | koşuldu (lint exit 0; denetim "0 hata, 12 uyarı") |
| Rapor: çıkış animasyonu bulgusu | ✔ | aşağıda |
## Çıkış animasyonu — `hidden` deneyi (koddan çıkarım, kaynak okundu)
- `@shadcn/react` `dist/chunk-HBS6WEDP.js` `b` = `d(...a)`: argümanlar sırayla birleşir, **sonraki kazanır**, yalnız `undefined` atlanır (`if(o===void 0)continue; … r[e]=o`). `className` birleştirilir, `style` yayılır, `on*` zincirlenir; `hidden`/`inert` düz üzerine yazılır.
- `dist/questionnaire/index.js` `et` (Item): `b({...B, children:i}, c)` — `B` ilkelin `itemProps`'u (`hidden:!_, inert:!_, tabIndex:-1, …`), `c` kullanıcının kalan prop'ları. Kullanıcı **sonra** geldiği için `hidden={false}` ilkelin `hidden:true`'sunu ezer. Sonuç: pasif fieldset DOM'da ve görünür kalır; `data-active` ilkelden gelir.
- Uygulanan: `hidden={false}` verildi, `inert` **ilkelde bırakıldı** (pasif/çıkan soru saydamken odak ve tıklama almasın; erişilebilirlik ağacından da düşer). Görünürlük `motion.div` varyantlarıyla: aktif `center` (relative, zIndex 1), pasifler `exit` (absolute, opacity 0, x ±%100). Yön `custom` ile sorunun sırasından türer: aktiften öncekiler `custom=1` → sola, sonrakiler `custom=-1` → sağa park eder; böylece ileri geçişte eski soru sola çıkarken yenisi sağdan gelir, geri dönüşte tersi — sihirbazla aynı. `initial={false}`: ilk çizimde animasyon yok.
- Form gönderimi: pasif item'lar DOM'da kaldığından `FormData` önceki cevapları toplar; `inert` `FormData`'yı etkilemez (`disabled` yalnız `gonderiliyor` anında tüm form için — eskisi gibi). Ölçüm ref'i yalnız aktif fieldset'e verilir; `react-use-measure` ref callback'i `null`u yok sayıp yeni elemana geçiyor (`dist/index.js`: `L=r=>{!r||r===e.current.element||(v(),…,b())}`).
- `legend` fieldset'in doğrudan çocuğu kalsın diye `motion.div` **item'ın dışına** sarıldı (şartname "içeriği sar" diyordu; `legend` div içine girince fieldset erişilebilir adını kaybederdi).
- Odak halkası (`ring-3`) `overflow-hidden`'da kırpılmasın diye kap `-m-1`, fieldset `p-1` (net yerleşim değişmez; mutlak konumlu çıkan soru da aynı hizada).
## Şartnameden sapmalar
1. `center` varyantına `position: "relative"` eklendi (`adim-gecisi.ts`). Sihirbazda etkisiz (enter zaten relative, çıkan panel unmount oluyor); ankette şart — mutlak park eden soru geri dönünce akışa girmeli. Yayı/süreyi değiştirmiyor.
2. `yon` state'i yok; yön index'ten türüyor (sonuç birebir aynı, fazladan state yok).
3. `motion.div` item içeriğini değil item'ı sarıyor (`legend` gerekçesi yukarıda).
4. `loader.tsx` değişti — şartnamedeki "yalnız gerekirse" koşulu sağlandı: keyframe tanımsızdı, token/gradyan tasarım diline aykırıydı. `TextShimmerLoader` API'si aynı; projede başka kullanıcısı yok (grep).
5. Shimmer satırına `text-slate-600` eklendi (`tercih-degisti-modali.tsx` ile aynı ton); şartname yalnız `px-0.5` demişti — `shimmer` currentColor'dan çalıştığı için bir renk sınıfı gerekli.
6. Worktree v2 ucuna (`1760690`) ileri sarıldı; şartname tabanı `4d30dd1` + yalnız header rozeti commit'i. Dosya kümem o commit'te değişmiyor.
## Merge sonrası doğrulanması gerekenler
- `tasarimci` (D1-4): 375/768 px'te soru geçişinde boy sıçraması; `overflow-hidden` + `-m-1/p-1` ile odak halkası tam görünüyor mu; `prefers-reduced-motion`'da yalnız solma. Koddan çıkarım: ilk geçişte yükseklik `"auto"` → ölçülen px'e yayla gider, sonrakiler px → px.
- Shimmer gerçekten akıyor mu (artık `tw-shimmer` keyframe'i; koddan çıkarım, tarayıcıda bakılmadı).
- A paketi entegrasyonunda `revizyonHakki` → `revizyonAcik` yeniden adlandırması (çakışma kararı 1) — D1 mesaj gövdesinde ~20 satır kaydırdı; orkestratör satır numarası yerine grep ile bulsun.
- DESIGN.md için not (D2'nin dosyası; orkestratör/tasarımcı işler): §4.20 "Araç hapları" maddesine "`soru_sor` hap çizmez; sorular üretilirken formun yerinde `TextShimmerLoader` ('Soruları hazırlıyorum…', `shimmer text-slate-600`) durur; araçta avatar header logosuyla aynı `rota`." §4.33'e "Sorular arası geçiş sihirbaz adımlarıyla aynı yay ve yoldan (`src/lib/adim-gecisi.ts`); pasif sorular DOM'da, mutlak konumda saydam, `inert`."
- Backlog önerisi: `loader.tsx`'teki öteki prompt-kit yükleyiciler de `--muted-foreground` token'ı taşıyor olabilir; `src/components/ui` tasarım denetiminden muaf — bir tur taranmalı.
## Bilal'den istenen
Yok.