chore(tasarim): denetim uyarıları kapatıldı, bulgu ajanları sonnet'e alındı, skill eval seti
All checks were successful
Deploy / deploy (push) Successful in 5m43s

- giris-form / odeme-sonuc-karti: emoji yerine lucide ikon ya da düz metin (DESIGN.md §4.7)
- tasarim-denetim: rehber kapak görseli hex kuralından muaf (OG ile ortak sabit palet)
- analitik, seo-geo, marka, rehber-editoru, qa-muhendisi: model: sonnet (kod yazmayan,
  bulgu üreten ajanlar); QA'da deneme bütçesi (en fazla iki e-posta servisi, üç deneme,
  yeniden üretim yalnızca şüpheli sonuçta)
- kolaytercih-tasarim/evals.md: skill kapalı/açık karşılaştırması için üç istek + kontrol listesi

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-23 16:49:22 +03:00
parent dc7861737b
commit ec002d7cfc
10 changed files with 74 additions and 6 deletions

View File

@@ -84,3 +84,7 @@ parlama gölgesi · `whileHover scale` · her elemanda fade-up · `dark:` · Int
## 6. Rapor
İş sonunda: kullanılan kanonik parçalar (liste) · `pnpm tasarim:denetim` çıktısı (hata/uyarı sayısı) · 375 px notu · DESIGN.md ile çelişen bir şey bulduysan dosya:satır ile yaz, kendi başına kuralı değiştirme.
## 7. Skill'i ölçme
Skill'in işe yarayıp yaramadığı `evals.md` içindeki üç istekle ölçülür (skill kapalı/açık karşılaştırması). Skill metnini ya da DESIGN.md'yi değiştirdikten sonra tekrar koşulur.

View File

@@ -0,0 +1,53 @@
# kolaytercih-tasarim — değerlendirme seti
Anthropic'in skill kılavuzu: önce eval, sonra skill. Bu üç istek, skill'in gerçekten
işe yaradığını ölçer. Her biri **iki kez** koşulur: (A) skill kapalı, (B) skill açık.
Puan = aşağıdaki kontrol listesinden geçen madde sayısı; `pnpm tasarim:denetim` her ikisinde koşulur.
Nasıl koşulur: yeni bir oturumda isteği aynen yapıştır; çıktı `src/` altına değil
`/tmp/eval-<n>.tsx` dosyasına yazdırılır, denetim betiği o dosyayı da tarayacak şekilde
geçici olarak `src/features/_eval/` altına kopyalanır, sonra silinir.
## E1 — Bölüm başlığı bloğu
**İstek:** "Üniversite sayfasına 'Kampüs hayatı' diye yeni bir bölüm başlığı ekle, altına kısa açıklama gelsin."
Kontrol:
- [ ] `SectionEyebrow` içe aktarılmış ve kullanılmış (elle pill yok, `Badge` yok)
- [ ] h2 sınıfı tam olarak `font-heading text-3xl font-bold sm:text-4xl`
- [ ] Açıklama `max-w-xl text-lg leading-relaxed text-slate-600`
- [ ] Kapsayıcı `flex flex-col items-center gap-4 text-center`
- [ ] Denetim: 0 hata
## E2 — Turuncu CTA
**İstek:** "Sonuç sayfasının altına 'Listemi kaydet' butonu ekle."
Kontrol:
- [ ] `Button` bileşeni, `rounded-full` (özel radius yok)
- [ ] `bg-orange-500 … hover:bg-orange-600 text-white`
- [ ] Metin önce, sonda `<ArrowRight className="size-4" aria-hidden />`
- [ ] Başta ikon yok, `Sparkles` yok, emoji yok, gradyan yok
- [ ] Yükseklik `h-11` ya da `h-12` (44 px dokunma hedefi)
- [ ] Denetim: 0 hata
## E3 — Bilgi kartı
**İstek:** "Bölüm sayfasına 'Mezun maaşı' kartı ekle; başlık, büyük sayı ve kaynak notu olsun."
Kontrol:
- [ ] Kutu `rounded-2xl border border-slate-200 bg-white` (ya da `Card` + `border-slate-200/70 shadow-sm`)
- [ ] Sağ üstte `PixelCorner` (`absolute right-4 top-4`)
- [ ] Sayı `font-heading … font-bold text-slate-900`; etiket `text-xs font-semibold text-slate-500`
- [ ] Nötr yalnızca slate; gölge yalnızca `shadow-sm`
- [ ] Kaynak notu için uydurma rakam/atıf yok ("kaynak: —" ya da prop)
- [ ] Denetim: 0 hata
## Sonuç tablosu
| Tarih | E1 A/B | E2 A/B | E3 A/B | Not |
|---|---|---|---|---|
| | | | | |
B sütunu A'dan belirgin yüksek değilse skill'in metni ya da DESIGN.md'nin ilgili bölümü
güçlendirilir (Anthropic: "Claude B nerede takıldı → Claude A'ya götür").

View File

@@ -1,6 +1,7 @@
---
name: analitik
description: Ürün analisti. Rybbit verisini (yalnızca okuma) inceleyip trafik, huni, olay ölçümü ve iç trafik kirliliğini kaynaklı rakamlarla raporlar; "şu değişiklik işe yaradı mı", "kullanıcı nerede düşüyor" gibi veri sorularını yanıtlar. Kod değiştirmez.
model: sonnet
---
Sen KolayTercih ekibinin **ürün analistisin**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar istisnasız bağlayıcıdır.

View File

@@ -2,6 +2,7 @@
name: marka
description: Marka ve pazarlama stratejisti. Sitenin kendi metinlerini (koddan, dosya:satır) ve rakiplerin söylemini inceleyip marka konumunu, güven açıklarını, mesaj mimarisini ve dağıtım kanalı girişimlerini (rehber öğretmen, veli, sosyal, bülten) raporlar; bir terimin/vaadin sitedeki tüm geçtiği yerlerin envanterini çıkarır. Kod değiştirmez.
tools: Read, Grep, Glob, Bash, Write, WebSearch, WebFetch
model: sonnet
---
Sen KolayTercih ekibinin **marka ve pazarlama stratejistisin**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar istisnasız bağlayıcıdır. Okuyucun: CEO (karar) ve CTO/ürün yöneticisi (iş tanımı).

View File

@@ -2,16 +2,17 @@
name: qa-muhendisi
description: QA mühendisi. Kritik akışları (sihirbaz, liste, danışman, giriş e-postası, ödeme, katalog, sitemap/robots) canlıda ya da lokalde uçtan uca test eder; geçici e-postayla kendi test hesabını açar, hataları yeniden üretme adımı ve ağ/konsol kanıtıyla raporlar, test planı ve otomatik test kodu yazar. Yayın öncesi/sonrası kontrol ve "bu gerçekten çalışıyor mu" sorusu için kullan.
disallowedTools: mcp__rybbit
model: sonnet
---
Sen KolayTercih ekibinin **QA mühendisisin**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar bağlayıcıdır. Repoda şu an **hiç otomatik test yok** — güvence sensin.
Temel ilke: **takılma, yolunu bul.** Bir adım seni engelliyorsa (giriş gerekiyor, CAPTCHA çıktı, servis çalışmıyor) aşağıdaki saha hilelerinden birini dene; üçünü de denedikten sonra hâlâ olmuyorsa "test edilemedi" diye raporla ve diğer senaryolara geç. Orkestratöre "nasıl yapayım" diye sorma.
Temel ilke: **takılma, yolunu bul — ama bütçeyle.** Her senaryo için en fazla üç deneme; üçüncüde olmuyorsa "test edilemedi" yazıp geç. Amaç kanıt toplamak, her yolu tüketmek değil. Bir adım seni engelliyorsa (giriş gerekiyor, CAPTCHA çıktı, servis çalışmıyor) aşağıdaki saha hilelerinden birini dene; üçünü de denedikten sonra hâlâ olmuyorsa "test edilemedi" diye raporla ve diğer senaryolara geç. Orkestratöre "nasıl yapayım" diye sorma.
## Saha hileleri (önce bunlara bak)
**Giriş gerektiren her test → kendi test hesabını aç.**
- Geçici e-posta servisleri, sırayla dene: `mail.tm` (tarayıcısız da çalışır, aşağıda), `temp-mail.org`, `guerrillamail.com`, `10minutemail.com`, `dropmail.me`, `maildrop.cc`, `tempmail.plus`. Biri CAPTCHA çıkarırsa çözmeye çalışma, sıradakine geç.
- Geçici e-posta: önce `mail.tm` (tarayıcısız API, aşağıda), olmazsa `temp-mail.org`. **En fazla iki servis**; ikisi de olmuyorsa "test edilemedi" yaz, üçüncüyü deneme. CAPTCHA çıkarsa çözmeye çalışma.
- **Tarayıcısız yol (en sağlamı):** mail.tm API'si anahtarsızdır.
```bash
D=$(curl -s https://api.mail.tm/domains | python3 -c 'import sys,json;print(json.load(sys.stdin)["hydra:member"][0]["domain"])')
@@ -36,7 +37,7 @@ Temel ilke: **takılma, yolunu bul.** Bir adım seni engelliyorsa (giriş gereki
- Tüm araçları tek ToolSearch çağrısıyla yükle. Her zaman **yeni sekme** aç, Bilal'in sekmelerine dokunma, işin bitince kendi sekmelerini kapat.
- Her senaryoda ekrana bakmakla kalma: `read_console_messages` (hata var mı) ve `read_network_requests` (hangi istek kaç ms sürdü, 4xx/5xx var mı, hiç dönmeyen var mı). "Yükleniyor"da kalma tipi hatalarda **süreyi ölç** ve bekleyen isteği yaz; 90 sn sonra sayfayı yenile ve farkı raporla.
- Mobil: `resize_window` ile 390 px; yatay kayma, görünmeyen buton, üst üste binen metin.
- Aynı hatayı **en az iki kez** yeniden üret; bir kez olan şeyi "ara sıra" diye işaretle.
- Bir hatayı **yalnızca sonucu şüpheliyse** ikinci kez yeniden üret (zaman aşımı, ağ, yarış durumu); net ve deterministik hata tek seferde raporlanır. Bir kez olup tekrarında olmayanı "ara sıra" diye işaretle.
- Formlarda uç değerler: boş, çok uzun, Türkçe karakter, 0 ve negatif sıra, 1.000.000 üstü sıra.
- Danışman/sohbet testinde soruları listedeki **somut program adları ve sıra numaralarıyla** sor; cevabı listeyle yan yana koyup doğru/yanlış işaretle.

View File

@@ -2,6 +2,7 @@
name: rehber-editoru
description: Rehber editörü. Rehber yazıları arasında iç link örer, ölü link tarar, kaynakla/kodla çelişen ya da eskimiş ifadeleri resmî kaynaktan teyit ederek düzeltir, yazılar arası sayı/terim tutarlılığını sağlar. Yeni yazılar bittikten sonra ya da dönemsel içerik bakımı için kullan; aynı anda tek kopya çalışmalı.
tools: Read, Grep, Glob, Bash, Write, Edit, WebSearch, WebFetch
model: sonnet
---
Sen KolayTercih ekibinin **rehber editörüsün**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar istisnasız bağlayıcıdır.

View File

@@ -1,6 +1,7 @@
---
name: seo-geo
description: SEO/GEO uzmanı. Sezon takvimine, rakip boşluğuna ve Search Console/GEO verisine bakarak rehber yazıları için konu planı çıkarır; katalog ve rehber sayfalarının teknik SEO'sunu (sunucu HTML'i, metadata, canonical, sitemap, yapılandırılmış veri, AI bot erişimi) koddan denetler. Plan ve bulgu üretir; yazı yazmaz, kod değiştirmez.
model: sonnet
---
Sen KolayTercih ekibinin **SEO/GEO uzmanısın**. İşe başlamadan önce `docs/ekip/PROTOKOL.md` dosyasını oku; oradaki kurallar istisnasız bağlayıcıdır. Trafiğin büyük çoğunluğu Google organik ve katalog sayfalarına iniyor; yapay zekâ yanıtlarında alıntılanmak (GEO) ikinci kanal.

View File

@@ -166,6 +166,9 @@ const KURALLAR: Kural[] = [
ad: "hex-renk",
seviye: "uyari",
mesaj: "Sınıf içinde hex renk; token ya da Tailwind tonu kullan (DESIGN.md §2)",
// Rehber kapak görseli OG görseliyle aynı sabit paleti paylaşır (satori
// tarafında Tailwind token'ı çözülmez); bilinçli istisna.
muaf: /src\/features\/rehber\/components\/rehber-kapak\.tsx$/,
bul: regexKurali(/\[#[0-9a-fA-F]{3,8}\]/),
},
{

View File

@@ -1,7 +1,7 @@
"use client";
import { useEffect, useRef, useState } from "react";
import { Mail } from "lucide-react";
import { Mail, MailCheck } from "lucide-react";
import { toast } from "sonner";
import { authClient } from "@/lib/auth-client";
import { olay } from "@/lib/analitik";
@@ -112,7 +112,10 @@ export function GirisForm({ callbackURL }: { callbackURL: string }) {
return (
<div className="mt-6 space-y-3">
<div className="rounded-xl border border-emerald-200 bg-emerald-50 p-4 text-sm text-emerald-800">
<p className="font-semibold">Bağlantı gönderildi 📬</p>
<p className="flex items-center gap-1.5 font-semibold">
<MailCheck className="size-4 shrink-0" aria-hidden />
Bağlantı gönderildi
</p>
<p className="mt-1">
<span className="font-medium">{email}</span> adresine bir giriş
bağlantısı gönderdik. Gelen kutunu (ve spam klasörünü) kontrol et —

View File

@@ -83,7 +83,7 @@ export async function OdemeSonucKarti({ siparis }: { siparis?: string }) {
aria-hidden
/>
<h1 className="mt-4 font-heading text-2xl font-bold">
Ödeme alındı 🎉
Ödeme alındı
</h1>
<p className="mt-2 text-sm text-slate-600">
<span className="font-semibold">