feat(etiket): görünen "Garanti" dilim adı site genelinde "Güvenli"

Yalnız kullanıcıya görünen etiket değişir; iç anahtar, tip, DB değeri, API
parametresi, mermaid classDef ve analitik değeri `garanti` olarak kalır
(veri göçü yok).

- risk.ts: tek kaynak DILIM_ETIKET + dilimdenFarkliRiskEtiketi; rapor
  listesi, yazdır tablosu, /sonuc sekmeleri, seçimlerim paneli ve
  meraklısına şeridi buradan okur
- "Güvenli · Güvenli" / "Güvenli (Güvenli)": satır detayında risk etiketi
  yalnız dilimin varsayılanından farklıysa, yazdır ve seçimlerimde yalnız
  kelime farklıysa yazılır
- LLM prompt'ları: `garanti` teknik anahtar, adaya "güvenli" denir sözlüğü
  (rapor, soru, tadımlık); liste özeti modele görünen dilim adıyla gider
- meraklısına şeması (SEMA düğümü, aria-label), 2. bölüm anlatımı ve
  AGENTS.md şema kuralı görünen adla eşitlendi
- "yerleşme garantisi vermez" türü vaat reddi cümleleri aynen kaldı

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 16:03:22 +03:00
parent d79758adc0
commit 5853b7d091
17 changed files with 103 additions and 51 deletions

View File

@@ -19,6 +19,7 @@ import {
} from "../rapor-havuzu";
import { secimOzeti } from "@/features/sihirbaz/sihirbaz-sabitler";
import {
DILIM_ETIKET,
RISK_ETIKET,
dilimdenRisk,
riskHesapla,
@@ -77,6 +78,11 @@ KURALLAR (kesin):
- METİN DİYETİ: aday ${toplam} satır okuyacak; gerekce TEK kısa cümle (en fazla ~15
kelime, Türkçe): bu programın bu aday için neden mantıklı olduğu. Dolgu söz
yok; ASLA "garanti", "kesin", "yüzde yüz" deme.
- SÖZLÜK: "garanti" yalnızca üçüncü listenin teknik JSON alan adı ve havuzdaki
"dilim" değeridir. Adaya dönük HİÇBİR metinde (gerekce, genelDegerlendirme,
uyarilar) "garanti" kelimesini kullanma; bu dilimi adaya "güvenli dilim" /
"güvenli tercihler" diye an. Aday ya da önceki liste özeti "güvenli dilim"
derse kastedilen "garanti" listesidir.
- Adayın notlarındaki şehir/bölüm tercihlerine saygı göster ama dengeyi bozma.
- genelDegerlendirme: listenin genel stratejisi, EN FAZLA 2 cümle. Uyarıları
buraya yazma.
@@ -209,12 +215,12 @@ function mockRapor(
tercihler,
genelDegerlendirme: `(Dev mock — Yapay Zeka anahtarı tanımlı değil, bu rapor gerçek Yapay Zeka çıktısı değildir.) ${params.sira.toLocaleString(
"tr-TR",
)}. sıra için hayal/dengeli/garanti dağılımlı ${toplamHedef} tercihlik örnek liste kuruldu.${
)}. sıra için hayal/dengeli/güvenli dağılımlı ${toplamHedef} tercihlik örnek liste kuruldu.${
revizyonNotu ? ` Revizyon isteğin not alındı: "${revizyonNotu}".` : ""
}`,
uyarilar: [
"(Dev mock) Tercih dönemi kapanmadan listeyi ÖSYM sistemine kendin gir.",
"(Dev mock) Garanti dilimindeki son tercihleri asla silme.",
"(Dev mock) Güvenli dilimindeki son tercihleri asla silme.",
],
programlar,
kapsam: kapsamUret(hedef),
@@ -406,7 +412,7 @@ export async function raporUret(
tercihler,
genelDegerlendirme:
genel.trim() ||
`Listen ${toplamHedef} tercihten oluşuyor; hayal, dengeli ve garanti dilimleri sıralamana göre dengelendi.`,
`Listen ${toplamHedef} tercihten oluşuyor; hayal, dengeli ve güvenli dilimleri sıralamana göre dengelendi.`,
uyarilar: uyarilar.length > 0 ? uyarilar : undefined,
programlar,
kapsam: kapsamUret(hedef),
@@ -424,7 +430,10 @@ export function listeOzetiCikar(rapor: RaporSonuc, adaySira?: number): string {
p?.efektifSira != null
? ` (taban sırası ~${p.efektifSira.toLocaleString("tr-TR")})`
: "";
return `${t.sira}. [${t.dilim} | ${RISK_ETIKET[risk]}] ${p?.isim ?? "?"} — ${p?.universite ?? "?"}${taban}`;
// Modele ham `garanti` anahtarı değil görünen dilim adı gider; yoksa
// sohbet cevaplarına "garanti dilimi" sızıyor. Dilim ve risk aynı kelime
// olabildiği için ("Güvenli") alanlar adlandırılır.
return `${t.sira}. [dilim: ${DILIM_ETIKET[t.dilim] ?? t.dilim} | risk: ${RISK_ETIKET[risk]}] ${p?.isim ?? "?"} — ${p?.universite ?? "?"}${taban}`;
})
.join("\n");
}

View File

@@ -12,6 +12,18 @@ export const RISK_ETIKET: Record<RiskSeviyesi, string> = {
riskli: "Riskli",
};
/**
* Dilimin kullanıcıya GÖRÜNEN adı — tek kaynak. Üçüncü dilimin iç anahtarı
* (tip, DB değeri, API parametresi, mermaid classDef, analitik) `garanti`
* olarak kalır; ekranda "Güvenli" yazar. Ham anahtarı kullanıcıya basma,
* buradan oku.
*/
export const DILIM_ETIKET: Record<Dilim, string> = {
hayal: "Hayal",
dengeli: "Dengeli",
garanti: "Güvenli",
};
/** Harita pinlerinin SVG dolgu renkleri — risk renk dilinin oklch karşılığı. */
export const RISK_PIN_RENK: Record<RiskSeviyesi, string> = {
guvenli: "oklch(0.696 0.17 162.5)", // emerald-500
@@ -43,6 +55,19 @@ export function dilimdenRisk(dilim: Dilim | string): RiskSeviyesi {
return "riskli";
}
/**
* Dilim başlığının yanına yazılacak risk etiketi. Yalnızca satırın riski
* dilimin varsayılanından FARKLIYSA döner; aynıysa null. Üçüncü dilimin adı
* risk etiketiyle aynı kelime olduğu için aksi hâlde "Güvenli · Güvenli"
* görünürdü.
*/
export function dilimdenFarkliRiskEtiketi(
dilim: Dilim | string,
risk: RiskSeviyesi,
): string | null {
return dilimdenRisk(dilim) === risk ? null : RISK_ETIKET[risk];
}
/**
* Risk seviyesinin tek cümlelik açıklaması (rapor satırları + tadımlık).
* Ürün yerleşme olasılığı HESAPLAMAZ; yalnızca son taban sıralamasını adayın

View File

@@ -1,5 +1,5 @@
import { kategoriEslesir } from "./kategoriler";
import { riskHesapla, type RiskSeviyesi } from "./risk";
import { DILIM_ETIKET, riskHesapla, type RiskSeviyesi } from "./risk";
import type { TercihProfili } from "@/features/sihirbaz/sihirbaz-sabitler";
export type DegerlendirilecekProgram = {
@@ -11,7 +11,8 @@ export type DegerlendirilecekProgram = {
export type TercihDegerlendirmesi = {
risk: RiskSeviyesi | null;
riskEtiketi: "Hayal" | "Dengeli" | "Daha güvenli" | "Veri yetersiz";
/** Görünen dilim adı (DILIM_ETIKET) ya da "Veri yetersiz". */
riskEtiketi: string;
riskMetni: string;
olumlu: string[];
celiskiler: string[];
@@ -65,11 +66,11 @@ export function tercihDegerlendir(
const riskEtiketi =
risk === "riskli"
? "Hayal"
? DILIM_ETIKET.hayal
: risk === "az-riskli"
? "Dengeli"
? DILIM_ETIKET.dengeli
: risk === "guvenli"
? "Daha güvenli"
? DILIM_ETIKET.garanti
: "Veri yetersiz";
const riskMetni =
risk === "riskli"