Bu projede değişiklik yaparken uyulacak kurallar.
MY_WORKER adresine gönderilir; üçüncü taraf servislere asla./ ve /auth/login dışındaki her yeni uç nokta kimlik kapısının (oturumKullanici) arkasında olmalıdır. Kullanıcı verisine dokunan her sorgu user_id = ben.id ile sınırlanır; istemciden gelen kullanıcı kimliğine asla güvenilmez. Yönetim uçları ayrıca role = 'admin' kontrol eder.allowed listesine yalnızca gerçekten gereken adresler girer.encodeURIComponent ile kodlanır.allorigins, corsproxy, codetabs) yalnızca herkese açık piyasa/haber verisi geçer; kullanıcı verisi, oturum anahtarı veya yapay zekâ istekleri asla bu proxy’lere gönderilmez.wrangler dev (geçici .dev.vars, commit edilmez) ile test edilir; canlı sunucuya yanlış giriş denemesi gönderilmez (IP kilidi).SIFRE_ITER); artırmadan önce istek süresi ölçülür.DESTEK_EPOSTA); kılavuz örnekleri genel adlarla yazılır (“Ev”, “ihtiyaç kredisi”). Yeni kullanıcı boş hesapla başlar.oturumKaydet); veriler hesaplar arasında asla birleştirilmez.
13b. Kullanıcıdan gelen profil alanları sunucuda doğrulanır: ad kırpılır ve 80 karakterle sınırlanır, fotoğraf yalnız data:image/(jpeg|png|webp);base64 ve 120 KB’a kadar, tercihler yalnız izinli anahtarlar. Fotoğraf sayfaya yalnız bu biçimde doğrulandıktan sonra <img src> olarak konur.
13c. Kurum raporları yalnız sahibine görünür. Aracı kurum raporları alıcısına özeldir (dağıtım yasağı); raporlar tablosundaki her sorgu user_id = ben.id ile sınırlıdır, raporlar ya da özetleri başka kullanıcılara, herkese açık sayfalara veya Bay Piyasa’nın başka kullanıcıya verdiği cevaplara asla taşınmaz. /rapor-al oturum yerine kişisel rapor anahtarıyla (X-Rapor-Anahtar, D1’de SHA-256 özeti) çalışan tek uçtur; anahtar yalnız üretildiği cevapta düz görünür, yenisi eskisini geçersiz kılar.
13d. Biyometrik giriş (WebAuthn / passkey): sunucu yalnız açık anahtar saklar (biyometrik veri hiç gelmez). Giriş doğrulamasında şunların hiçbiri atlanmaz: tek kullanımlık ve süreli sınama, izinli origin, rpIdHash, UP + UV bayrakları, imza ve imza sayacı; başarısız denemeler şifre girişiyle aynı kilide sayılır. Anahtarlar alan adına bağlıdır (rpId = sayfanın alan adı): panel başka bir alan adına taşınırsa kullanıcıların cihazlarını yeniden eklemesi gerekir. Giriş uçları canlı sunucuda denenmez; yerel wrangler dev + sanal doğrulayıcıyla test edilir.
13e. Telefon bildirimleri (Web Push): VAPID özel anahtarı yalnız Cloudflare Secret’ta (VAPID_PRIVATE); repoda, dosyada ya da ekranda tutulmaz. Abonelik adresi yalnız bilinen push servislerinden olabilir (sunucu başka adreslere istek atmaya zorlanamaz); yerel test kancası PUSH_TEST_ADRES canlıda tanımlanmaz. Bildirim içeriği şifreli gider; VAPID iletişim alanında kişisel e-posta değil site adresi kullanılır. Yerel Worker testlerinde --persist-to kısa bir yol olmalı (Windows 260 karakter sınırı yerel D1’i “internal error” ile düşürür).// ---------- Başlık ---------- ile ayrılır.@media (max-width:640px) kuralı yazılır..ozet-kart (kenar rengi anlam taşır: yeşil iyi/varlık, sarı orta/süren, kırmızı zayıf/borç/gider), bölüm için .bolum + bolumFormAc (başlığın sağında toplam ya da puan), liste için satirHtml(), tablo için .ist-tablo, dağılım için istHbar, başlıkta seçim için .bolum-secim. Sayfanın en üstüne ayrı filtre satırı konmaz. Açıklama metinleri sayfa sonundaki tek Not satırına yazılır.
6b. Kesme işaretli Türkçe metinler (Yatırımlarım’da, web’de, API’sine…) JavaScript’te tek tırnak içine yazılmaz; çift tırnak ya da ` kullanılır. Her yayından önce sayfa betikleri sözdizimi denetiminden geçirilir (<script> içeriği ayrı dosyaya yazılıp node --check): tek bir sözdizimi hatası panelin tamamını durdurur.
6c. Satırlardaki işlem düğmeleri aksBtn(tur, etiket, başlık, onclick) ile üretilir (tur: duzen mavi · sil kırmızı · onay yeşil “Kapattım” · ayar/kaynak gri · ekle sarı): her zaman görünür renkli dolgu, masaüstünde 22 px yükseklik ve 10,5 px yazı, telefonda 22 px ikon (dokunma alanı görünmez kenarla ~34 px). Yalın ✎ ✕ ✓ ⚙ işaretli ikon-btn yeni satır işlemlerinde kullanılmaz (yalnız Vazgeç ve küçük yönetim araçları). Metinlerde düğmeye adıyla atıf yapılır (“Güncelle”, “Kapattım”, “Faiz”). Düğmeler sabit genişlikli bir ızgara sütunundaysa (ör. Bütçe satırı) sütun, yazılı düğmelerin toplamına göre verilir (Güncelle + Kaldır ≈ 140 px → 142 px); yoksa düğmeler soldaki sütunun (yüzde) üstüne biner.
6d. Tarayıcının şifre / otomatik doldurma önerisi yalnız giriş ekranında ve şifre değiştirme penceresinde olur: type="password" kutusu her zaman kendi <form>‘unun içinde olmalı (form dışındaki bir şifre kutusu, Chrome’un sayfadaki bütün form dışı kutulara şifre önermesine yol açar); diğer kutular otoDoldurmaKapat ile autocomplete="off" alır (sonradan çizilenler dahil).
6e. Her sekmenin başlık altı açıklaması TAB_BASLIKLARI‘nda iki hallidir: masaüstü/tablet için tam açıklama, telefon (≤640 px) için tek satıra sığan kısa açıklama (3. öğe; ~40 karakteri geçmez, tire ve parantez yok, 11,5 px). Yeni sekme eklenirken kısa açıklama da yazılır; 320 px genişlikte tek satırda kalmalı.
6f. Üst çubuğun sağ sütunu (durum + Yenile + tema + mesaj + zil) içeriği kadar geniştir (minmax(max-content,1fr)); daralan başlık sütunudur. 901–1279 px’te durum yalnız saat, Yenile ve Kartları düzenle yalnız ikon; 901–1023 px’te başlık üst satırda. Durum metni en fazla 260 px (uzun hata metni “…” ile kısalır, tamamı ipucunda). Üst çubuğa yeni öğe eklenince 901–1920 px aralığı taşma için ölçülür.
6g. Yatırımlarda ortalama maliyet (maliyet) her zaman birim başına ve kullanıcının alırken baktığı para birimindedir: ABD hisse/ETF ve kripto $, BİST ₺, altın/gümüş ₺/gram. Dolar bazlı kalemlerde kâr / zarar dolar üzerinden hesaplanır; TL toplamda bugünkü kurla çevrilir (alış günündeki kur farkı yok sayılır; metinlerde “dolar bazında” denir). Satır içi düzenlemede boş bırakılan kutu değişmez.
6h. Kart borcu = son elle güncellenen tutar (kart.tarih) + o andan sonra karta yazılan harcamalar. Kartın tarih alanı yalnız elle güncellemede değişir; harcama karta yazılırken değişmez. Karta yazılmış bir harcama ancak kart o harcamadan sonra güncellenmediyse düzeltme / silmede karttan düşülür (aksi hâlde banka rakamı onu zaten içerir). Kart seçimi yalnız içinde bulunulan ayda; düzenli ödeme yalnız ödeme günü geldiğinde, kart seçildikten sonra ve kart o günden sonra güncellenmediyse karta yazılır.
6i. Düzenli ödemenin bir aydaki tutarı ve günü her yerde odemeAyBilgi(o, ay) ile okunur (aya özel aylik[ay] varsa o, yoksa düzenli tutar / gun); o.tutar / o.gun doğrudan kullanılmaz (yalnız yıllık / aylık sabit gider tahmini hariç). Kartla ödenen düzenli ödeme yalnız ödeme günü (o ayın günü) geldiyse karta yazılı ve “ödendi” olabilir; gün ileri alınırsa karta yazılan geri alınır. Sabit ödeme kaydında kart hangi ekrandan seçilirse seçilsin ödemenin ayarıdır; hiçbir yol tarihi gelmemiş sabit ödemeyi karta yazamaz.
6j. Erken ödeme yalnız elle işaretlenir: kredi taksiti (loan.erken, sırayla) ödenmiş sayılır ve kalan borcu düşürür; kart ödemesi (o.odendi[ay]) ödenen tutarı kart borcundan düşer, geri almada düşülen tutar (dusulen) geri eklenir. Günü gelmemiş bir ödeme yalnız bu yolla “ödendi” olabilir.
6k. Alacaklar (gelen para) Ödeme Takvimi’nde ödemelerden ayrı tutulur (alacakOlaylari, odemeOlaylari‘na girmez): ödeme toplamlarına, “kalan”a ve ödendi hesaplarına karışmaz. Yeni senkron anahtarı eklenirken panelde SENKRON_ANAHTARLARI ve Worker’da IZINLI_ANAHTARLAR birlikte güncellenir ve Worker yeniden yüklenir.
6a. Renkler yalnız değişkenden (açık/koyu tema): yeni bir renk koda doğrudan yazılmaz; temel değişkenler (--text, --muted, --panel, --border, --up, --down, --amber…), zemin/dolgu için --amber-dolgu, kategori renkleri için --p-… kullanılır. Gerekirse yeni değişken iki temada da tanımlanır. Açık temada küçük yazının kontrastı en az 4,5 olmalı; değişiklikten sonra açık temada da ekran görüntüsüyle bakılır..bolum.cerceve-varlik (yeşil sol çizgi), borç listeleri .bolum.cerceve-borc (kırmızı sol çizgi) ile çerçevelenir; çerçevenin tamamı renklendirilmez. Çerçeve başlığında toplamın yanında ne olduğunu anlatan soluk açıklama bulunur (“N kalem · %…”; .bolum-bas.aciklamali + .baslik-aciklama, telefonda başlığın altına iner); toplam etiketsiz bırakılmaz: çerçeve başlığı ince bir ayraçla listeden ayrılır ve tutarın önünde küçük “TOPLAM” etiketi durur (başlık toplamı beyazdır — Varlıklarım, Portföyüm ve yatırım türleri, borçlar; renk satırlarda kalır); telefonda uzun başlık kesilmez, iki satıra kayar.
7a’. Kullanıcıya gösterilen hazır listeler (BİST, kripto) uydurulmaz: her kod canlı kaynakta (Yahoo/Binance) doğrulanır ve doğrulama tarihi kodda yazılır. Türkçe arama asciiNormal ile karakterden bağımsızdır.
7a. Hisse/kripto seçimi sabit listeyle sınırlanmaz ve kullanıcıdan kod bilmesi beklenmez: ABD hisse/ETF’ler şirket adıyla aranır (Yahoo arama, yedek Finnhub /fh-ara); boş ya da başarısız arama sonucu önbelleğe alınmaz; yeni sembol eklenmeden önce fiyatı bir kez çekilerek doğrulanır (ozelKartHazirla). Finnhub’ın borsa adları kullanıcıya ham gösterilmez (adDuzelt).
7b. Piyasa Özeti’ne yeni hazır kart CARDS‘a eklenir; kimsenin görünümünü kendiliğinden değiştirmez (kayıtlı seçimi olan kullanıcıda “Hazır kartlardan ekle”de çıkar). Varsayılan set (VARSAYILAN_KARTLAR) kısa tutulur; fiyat isteği yalnız gereken kartlar için yapılır (kartGerekliSet).
7c. Kenar menüsüne öğe eklerken 1440×900’de menünün tamamının kaydırmadan görünmesi korunur (öğe yüksekliği ve grup aralıkları büyütülmez); kısa ekran için ayrı kural (max-height:880px) ve menü içi kaydırma vardır.data-alt işaretli 6 sayfa durur, diğerleri kendiliğinden Diğer menüsüne düşer (alt çubuğa yeni sayfa eklenmez).
8b. Service worker (sw.js) yalnız panelin kendi adresindeki dosyalara dokunur ve önce ağ çalışır; Worker API’si ya da dış servis isteklerini önbelleğe almaz, araya girmez (oturum ve veri her zaman canlı). Yeni bir statik dosya çevrimdışı da gerekiyorsa KABUK listesine eklenir ve ONBELLEK sürümü artırılır (ft-kabuk-v2…).confirm/alert yerine panelin kendi pencereleri kullanılır: showConfirmModal (onay) ve showAlertModal (uyarı).SENKRON_ANAHTARLARI hem Worker’daki IZINLI_ANAHTARLAR güncellenir.ft_<ad>_v<sürüm> biçimindedir (istisna: yalnızca yerelde tutulan ft_erisim, ft_kullanici, ft_senkron_meta ve görünüm tercihleri ft_rapor_yorum_kapali, ft_bildirim_durum, ft_araclar, ft_kurulum_gizli, ft_tema, ft_kap_durum, ft_kurum_rapor, ft_yatirim_kapali ve ft_borc_kapali, ft_harcama_tablo_kapali). Veri yapısı geriye uyumsuz değişirse sürüm artırılır (_v2) ve eski veriden taşıma yazılır.ENFLASYON_VERI: TÜİK aylık TÜFE ve TCMB Piyasa Katılımcıları Anketi) her yeni açıklamada kaynağıyla birlikte güncellenir; değerler uydurulmaz, derleme ayı ve kaynak yorumda yazılır.deger alanı da yalnız bu anlarda, o anki fiyatla yazılan bir yedektir; görünen değer her zaman canlı hesaplanır.) İstisnalar (sonradan yeniden hesaplanamayan kayıtlar): kart kayıtlarındaki dönem tutarları ft_odemeler_v1 › donem (sıradaki son ödemeye kadar kart borcuyla güncellenir, tarih geçince donar; son 24 dönem) ve ft_net_gecmis_v1: günlük net varlık kaydı sonradan yeniden hesaplanamayan bir geçmiştir; günde bir kayıt, gün içinde en fazla yarım saatte bir ve yalnızca anlamlı değişimde güncellenir, senkron bitmeden ve yatırım değeri hesaplanmadan yazılmaz. Geçmiş geriye dönük tahmin edilip doldurulmaz; tek istisna ay sonu tamamlama (ayTamamlaGecmis): ilk kayıttan sonraki bir ayın son günü kayıt yoksa, yatırımlar o günün gerçek kapanış fiyatları ve kuruyla, varlık/borç son gerçek kayıttan hesaplanıp tamam: <taban kayıt günü> işaretiyle eklenir; gerçek kayıt değiştirilmez, fiyatı bulunamayan ay atlanır./kap → kap.org.tr açık uçları); haber sitelerindeki KAP kopyaları (Google Haberler’deki “KAP *** …” başlıkları) kullanılmaz. Google Haberler bazı Cloudflare çıkışlarını 503 ile engeller; Google’a bağlı her özellik Google olmadan da çalışmalı (sessizce atlanır, hata gösterilmez).ALLOWED_MODELS ile ön yüzdeki model listesinde aynı olmalıdır.max_tokens) varsayılan olarak kapalı veya sınırlıdır.bp.ayar.limit) uyar; limit dolduysa istek gönderilmez (haber çevirisindeki bpBugunHarcama() kontrolü gibi).
4c. Periyodik istekler (fiyat, haber, senkron) yalnız sekme görünürken çalışır (document.visibilityState); yeni bir periyodik iş eklerken de bu kural uygulanır.
4b. Kotalı dış servisler (ör. MetalCharts: ayda 200 istek) Worker’da D1 onbellek tablosuyla önbelleklenir ve hata durumu da önbelleklenir; istemci isteği sayısı kotayı belirlemez. Ücretsiz katmanın atıf şartı (görünür kaynak bağlantısı) kaldırılmaz.
4d. Yapay zekâya verilen her analiz görevi kendi uzmanlık talimatıyla (“skill”: ör. RAPOR_SISTEM) ve yapılandırılmış veri dosyasıyla gönderilir: veri dosyası eksikleri açıkça yazar (“GİRİLMEMİŞ”, “hesaplanamaz”), sıfırla eksik veri karıştırılmaz; talimat rakam uydurmayı yasaklar ve çıktı biçimini sabitler. Uzun çıktı isteyen görevlerde max_tokens geniş tutulur (modeller yazmadan önce düşünür, düşünme de bu bütçeden harcar); stop_reason: max_tokens gelirse yanıt sessizce yarım bırakılmaz: devam istenir ya da kesildiği yazılır.
4f. Bay Piyasa’nın kişiliği (BP_SISTEM › “KİŞİLİK VE ÖZGÜN YORUM”, en öncelikli bölüm): haber aktarıcısı değil, kendi görüşü olan deneyimli bir piyasa insanıdır. Haber, panel verisi ve arama sonucu hammaddedir; cevap kendi değerlendirmesiyle (“Bence…”) başlar, gerekçelidir, kanaat derecesini ve görüşünü neyin değiştireceğini söyler, gerekiyorsa konsensüse karşı çıkar ve insan gibi akıcı konuşur. Talimata eklenen her yeni kural (kaynak, biçim, yönlendirme) bu kişiliği bastırmayacak şekilde yazılır; kişiye özel kesin al/sat emri sınırı korunur.
4e. Panelin kendi ürettiği özet cümleleri (ör. Aylık Rapor › “Öne Çıkan Gelişmeler”) tam ve düz cümledir: konu → karşılaştırılan değer ve tutarı → değişim → sonuç (“Harcaman, son 6 ayın ortalaması olan ₺84.000 tutarının %12 üstüne çıkarak ₺93.000 oldu.”). Devrik ya da parantezli kısaltma cümle kurulmaz; rakamdan sonra ek getirilmez (“tutarı”, “bütçe” gibi bir isimle bağlanır); veri yoksa madde hiç gösterilmez. Yeni madde eklenince birkaç senaryoyla üretilip okunarak denenir.
4g. Kurum raporu özetleri sunucuda zamanlanmış görevle (cron, 5 dk) üretilir; panelin günlük harcama limiti burada uygulanamadığı için sınır Worker’dadır: kullanıcı başına günde en fazla RAPOR_GUNLUK_SINIR (30) rapor kabul edilir, her rapor bir kez özetlenir (en fazla 3 deneme), elle “Yeniden özetle” kullanıcının isteğiyle olur. Model varsayılan RAPOR_MODEL (Sonnet); kullanıcı Kurum Raporları’nda Haiku / Opus / Fable seçebilir (users.ayar.raporModel, yalnız RAPOR_MODELLER listesindekiler; seçim değişince maliyet ve kalite uyarısı gösterilir; kendi e-posta raporlarına uygulanır, ortak raporlarda yöneticinin seçimi). Haiku 4.5’e effort ve sunucu tarafı yedek model gönderilmez (raporIstekGovdesi). Çıktı JSON şemasıyla (output_config.format) istenir; şema reddedilirse talimatla JSON’a düşülür. Özet yalnız raporda yazanı aktarır, rakam ve tavsiye uydurmaz.git pull --rebase yapılır: GitHub web arayüzünden de dosya yüklendiği için uzak dal önde olabilir.npx.cmd wrangler deploy ile yayınlanır; önce --dry-run ile kontrol edilebilir. Windows PowerShell’de npx yerine npx.cmd kullanılır.keep_vars = true ve D1 bağlantısı (DB) kaldırılmaz; kaldırılırsa deploy panelden eklenen ayarları siler..wrangler/ klasörü (yerel önbellek) commit edilmez.wrangler d1 export … --remote) → yerelde yedekle test → önce Worker (geriye uyumlu) → sonra ön yüz. Eski kv tablosu silinmez.#tab-kilavuz) ve Sık Sorulan Sorular (#tab-sss) son duruma göre kontrol edilir ve aynı committe güncellenir: ilgili sayfa bölümü, adımlar, örnek rakamlar, menü adları/sırası, SSS ve Terimler. Kılavuz kullanıcıya yanlış adım tarif etmemelidir; bir soru iki yerde tekrarlanmaz (SSS’de olur, kılavuz yönlendirir).Her değişiklik veya eklentide ilgili dokümanlar aynı commit’te güncellenir: