Ne zaman: seo kontrol; Next.js sitesinde teknik + içerik SEO denetimi, teslim öncesi/periyodik · Girdi: {{proje_yolu}} {{canli_url}} {{hedef_pazar}} {{anahtar_kelimeler}} {{duzelt}} {{musteri}} · Çıktı: verdikt + bulgu ve ölçüm tablosu · anahtar: indekslenme, canonical / SEO audit, core web vitals
0stars
UpdatedOct 30, 2026
v2
License: CC BY 4.0. The author shares the prompts of this repo under these terms.
Import with the CLI:
ple import ple:zeynepaslierhan/ortak-web/6cbd01a1169 lines
Rol: Next.js sitesinin teknik ve içerik SEO'sunu KANITLA denetleyen denetçisin. Görüş değil ölçüm yaz.
Proje kökü: {{#if proje_yolu}}{{proje_yolu}}{{else}}. (çalışma dizini){{/if}} · Canlı: {{#if canli_url}}{{canli_url}}{{else}}verilmedi → canlı ölçümleri "ölçülemedi (canlı URL yok)" yaz, yerelde `npm run build && npm run start` (taban http://localhost:3000) ile ölç; build ortam değişkeni eksikliğiyle düşerse eksik anahtar ADINI yaz, değer okuma, canlı bölümleri "ölçülemedi" yaz{{/if}}
Hedef pazar: {{#if hedef_pazar}}{{hedef_pazar}} (dil, html lang ve hreflang bu pazara göre denetlenir){{else}}verilmedi → html lang ve içerik dilinden çıkar, varsayımını raporda yaz{{/if}}
{{#if standart_dizini}}Derin kaynak: {{standart_dizini}} içindeki index.md'yi oku, ilgili kural tablolarını da uygula.{{/if}}
## Kurallar
- Gösterim: tablolardaki `\|` markdown kaçışıdır, kabukta `|` yaz (grep kalıpları buna göre `-E` ile verildi). `<site>` = {{#if canli_url}}{{canli_url}}{{else}}http://localhost:3000{{/if}}; `<alan>` = www'siz çıplak alan adı.
- Her bulgu = ID · Nerede (dosya:satır ya da URL) · Ölçülen · Beklenen/eşik · Şiddet · Düzeltme (minimal) · Doğrulama komutu. Kanıtsız bulgu yazma.
- Ölçmediğini "ölçülemedi (neden)" yaz. Bu prompt'taki eşikler dışında sayı uydurma; "pratik" etiketli eşik ihlal damgası değil yön göstergesidir (en çok P3).
- Şiddet (paket ortak): P0 kritik (canlı veri/hesap/ödeme/sır riski; SEO'da üretimde site geneli noindex/`Disallow: /` ya da Googlebot'a 4xx/5xx — site aramadan silinir; hemen) · P1 yüksek (teslimden önce) · P2 orta · P3 düşük.
- Canlıda yalnız GET/HEAD; form gönderme, giriş, ödeme yok. `.env` ve anahtar DEĞERİNİ okuma/yazdırma; yalnız anahtar adı + konum.
- Yerel build: aynı kökte başka denetim/ajan sunucu açtıysa yeniden `next build` alma, açık sunucuyu kullan (paralel build aynı `.next`'e yazar, çakışır); yoksa build'leri sırayla al. `npx` araçları (lighthouse, linkinator) kurulum + ağ ister: `npx -y`; inmezse "ölçülemedi (araç)".
- Google'ın desteklediği zengin sonuç listesi sık değişir: bu prompt'taki liste 2026-10 durumudur; raporda tarihle ver ve developers.google.com/search/docs/appearance/structured-data/search-gallery sayfasını kontrol et.
- Sahiplik: güvenlik başlıkları/sır/yetki → «Web güvenlik denetimi (Next.js + Supabase)» (burada yalnız SEO'yu etkileyen, ör. WAF'ın Googlebot'u engellemesi); alt metin, erişilebilirlik, JS bütçesi → «Web profesyonel temel özellikler». Çağrı biçimi: `ple get "<tam başlık>" --var proje_yolu=<kök> --var canli_url=<url>`; tam teslim kapısında bu rapor «Web tam denetim ve teslim kapısı»na girdidir.
## Adım 0 — yığın tespiti ve URL örneklemi
| Bak | Nasıl | Kayda geçir |
|---|---|---|
| Next sürümü ve Router | `package.json` (next, react); `ls app src/app pages src/pages` | App / Pages / karma |
| Güncel sürüm | `npm view next version` (tarihle yaz) | kurulu ↔ güncel |
| SEO kütüphaneleri | `grep -E '"next-sitemap\|next-seo\|next-intl\|next-i18next"' package.json` | hangisi aktif |
| Supabase ve auth | `@supabase/*` paketleri; `middleware.ts` (Next ≤15) ya da `proxy.ts` (Next 16) matcher; `src/app` varsa dosya `src/` içinde olmalı (Next dokümanı; kökteki devreye girmez → korumalı yol açıkta kalabilir; build çıktısında Proxy/Middleware satırına bak) | indeks dışı kalması gereken yollar |
| Barındırma | `vercel.json`, `netlify.toml`, `Dockerfile`; `next.config.*` `redirects` `headers` `trailingSlash` `i18n` | yönlendirme ve başlık kaynağı |
| i18n | `[locale]` segmenti, `i18n` ayarı, `alternates.languages` | tek dilli / çok dilli |
| Ödeme sağlayıcısı | stripe, lemonsqueezy, iyzico vb. paket ve checkout/success yolları | indeks dışı kalacak yollar |
| Repo ↔ canlı | `git -C <kök> status -sb`; `git -C <kök> log --oneline @{u}..`; canlı commit'i barındırma kaydından (ör. `npx vercel inspect <site>`, giriş gerekir) `git rev-parse HEAD` ile karşılaştır | ahead > 0 ya da canlı commit ≠ HEAD ise "repo canlıdan ileride; canlı bulgular eski sürüme ait"; karşılaştırılamazsa "ölçülemedi (erişim)" |
URL örneklemi (8-12): ana sayfa, 1 liste, 1 detay, 1 blog/makale, fiyat, yasal sayfa, giriş, 1 korumalı sayfa, checkout/success, olmayan URL (`/olmayan-sayfa-xyz`), varsa her dilin ana sayfası. Uygulanmayan kontrolleri "Geçerli değil"e yaz (ör. tek dilli → hreflang).
## A. İndekslenebilirlik
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| robots.txt üretimde siteyi engellemiyor | `curl -s <site>/robots.txt`; `app/robots.ts` ya da `public/robots.txt` | `Disallow: /` yok; `Sitemap:` satırı var; ≤500 KiB | P0 / P2 (Sitemap satırı yok) |
| Üretimde noindex sızıntısı yok | her URL: `curl -sI URL \| grep -i x-robots-tag`; `curl -s URL \| grep -Eio '<meta name="(robots\|googlebot)"[^>]*>'`; kodda `robots: { index: false }` env koşulu | indekslenecek sayfada noindex = 0 | P0 (site geneli) / P1 (sayfa) |
| Önizleme/staging engelli | preview URL'i: PR deploy yorumu ya da `npx vercel ls` (giriş gerekir; bulunamazsa ölçülemedi); `curl -sI https://<preview>.vercel.app \| grep -i x-robots-tag`; custom domain'li preview/staging'de başlık otomatik gelmez, elle eklenmeli | `x-robots-tag: noindex` var ya da 401/403 (Deployment Protection) | P1 |
| Prod'dan vercel.app'e link yok | `curl -s <site> \| grep -c 'vercel\.app'`; sitemap'te aynı arama | 0 | P1 |
| Utility sayfaları indeks dışı | giriş, hesap, korumalı, checkout/success: noindex ya da login'e yönlendirme | crawl edilebilir + noindex | P2 |
| Disallow ≠ noindex | robots'ta Disallow'lu her yol için gövde/başlıkta noindex ara | indeksten çıkması istenen yol crawl edilebilir ve noindex taşır | P3 (doğrulanmadı — güncel Google block-indexing dokümanını kontrol et) |
| Googlebot engellenmiyor | `curl -A 'Googlebot' -sI <site>/` → 200; robots'ta Googlebot disallow yok; WAF/bot koruması ayarı (UA testi yaklaşıktır, IP doğrulamasını ölçemezsen yaz) | Googlebot engeli 0 | P0 |
## B. Metadata (App: `metadata`/`generateMetadata` · Pages: `next/head`)
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Benzersiz title ve description | tüm örnek URL'lerden: `curl -s URL \| grep -o '<title>[^<]*</title>'` → `sort \| uniq -d` boş; description için aynısı | %0 tekrar | P1 |
| Title şablonu | kök layout'ta `title: { template, default }`; marka başta ya da sonda ayraçla, tekrar yok | şablon var | P3 |
| Uzunluk (pratik) | karakter say | title ~50-60 kar; description ~155-160 (mobil ~120) | P3 (doğrulanmadı — resmi sınır yok) |
| metadataBase | kök layout'ta `metadataBase: new URL(...)`; canlı HTML'de `grep -c localhost` | canlı HTML'de localhost = 0 | P1 |
| Fallback ≠ set env | site URL'ini taşıyan değişkeni bul: `grep -rnE 'NEXT_PUBLIC_SITE_URL\|NEXT_PUBLIC_APP_URL\|VERCEL_URL\|metadataBase' app src lib 2>/dev/null`; `??` / `\|\|` fallback'li satırlar kanıt değil; canlı og:image ve canonical URL'ine `curl -sI` → 200 | beklenen alan adı; localhost ve `VERCEL_URL` kaynaklı `*.vercel.app` 0 | P1 |
| Metadata `<head>`'de (akışlı metadata, Next ≥15.2) | `generateMetadata` beklerse Next etiketleri `<body>`'ye ekler; HTML-limited botlara (Twitterbot, Bingbot vb.; Googlebot DEĞİL) `<head>`'de verir; aşağıdaki komutu iki UA ile koş; `next.config` `htmlLimitedBots` | canonical ve robots meta iki UA'da da `<head>` içinde (Google canonical'ı yalnız `<head>`'de kabul eder) | P1 (canonical/robots ham HTML'de head dışı) / P3 (yalnız title/description); render sonrası DOM'daki konum doğrulanmadı — Search Console'da dizindeki sürümün "taranan sayfa" HTML'ine bak; canlı test, Rich Results Test (Google-InspectionTool) ve Lighthouse Next'in varsayılan listesinde, head'de görür, kanıt sayılmaz |
Head kontrolü (`<URL>` yerine örnek URL): `for ua in 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' 'Twitterbot/1.0'; do echo "$ua"; curl -sL -A "$ua" <URL> | tr -d '\n' | sed 's#</head>.*##' | grep -oE '<title|rel="canonical"|name="(description|robots)"' | sort | uniq -c; done` → head'de eksik etiket = ihlal. Düzeltme: `htmlLimitedBots: /.*/` akışı kapatır (TTFB artar); bu ayar varsayılan bot listesini DEĞİŞTİRİR, genişletmez.
## C. Canonical, host, protokol, TLS
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Self-referans mutlak canonical | `curl -s URL \| grep -io '<link rel="canonical"[^>]*>'`; App'te `alternates.canonical`; kök layout'ta sabit canonical tüm alt sayfalara miras kalır → örneklemde (olmayan URL, giriş/utility dahil) canonical'ı ana sayfayı gösteren alt sayfa say | her sayfada 1 adet, https, son URL ile aynı; ana sayfaya kanonik alt sayfa 0 (404/utility'de canonical yok ya da kendisi) | P1 |
| Tek host + tek protokol | `for u in http://<alan> http://www.<alan> https://<alan> https://www.<alan>; do curl -sSIL -o /dev/null -w "%{http_code} %{num_redirects} %{url_effective}\n" "$u"; echo "çıkış $?"; done` | 4 varyantın `url_effective` değeri aynı; tek yönlü 301/308 | P1 |
| Sondaki eğik çizgi tutarlı | `trailingSlash` ayarı ↔ canonical ↔ sitemap ↔ iç linkler | tek biçim | P2 |
| TLS dört varyant | üstteki döngünün `çıkış` değeri (60 = sertifika doğrulanamadı, 35 = TLS handshake hatası, 0 = sorunsuz); `curl -vI https://<alan>` ve `https://www.<alan>`; `openssl s_client -connect <alan>:443 -servername <alan> </dev/null \| openssl x509 -noout -text \| grep -A1 'Subject Alternative Name'` | 4/4 varyantta sertifika hatası 0; SAN apex + www | P1 |
| Parametreli URL | `?utm=`, `?sort=` sürümünde canonical temiz URL'e; geçersiz değer (`?page=9999`, `?sort=xyz`, bilinmeyen `?q=`) 200 + aynı içerik dönüyorsa canonical'ına bak | temiz URL; geçersiz parametrede self-canonical'lı kopya 0 (ya da 404) | P2 |
## D. Durum kodları ve yönlendirmeler
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Gerçek 404 (soft 404 yok) | `curl -sI <site>/olmayan-sayfa-xyz`; olmayan dinamik slug (`/blog/yok-xyz`) — App'te `notFound()`, Pages'te `notFound: true`; `loading.tsx`/Suspense altında streaming başladıktan sonra `notFound()` 200 + noindex meta döndürebilir → status'u curl'den al, koddan çıkarma; kök `app/loading.tsx` tüm sayfaları Suspense'e sarar, dinamik sayfanın kendi ya da üst segmentindeki `loading.tsx` de aynı etkiyi yapar (düzeltme: o loading.tsx'i kaldır, Suspense'i yalnız yavaş veri bileşenine ya da slug'ı Proxy'de 404'le) | 404 ya da 410; 200 değil | P1 |
| Eski site göçü (varsa) | eski URL listesi: eski sitemap ya da `curl -s 'https://web.archive.org/cdx/search/cdx?url=<alan>/*&fl=original&collapse=urlkey&filter=statuscode:200&filter=mimetype:text/html&limit=200'`; her birine ilk yanıt `curl -sI -o /dev/null -w "%{http_code} %{redirect_url}\n" "$u"` (301/308 + hedef; `-L` ile ilk kod görünmez), son durum `curl -sIL -o /dev/null -w "%{http_code} %{url_effective}\n" "$u"`; eski apex↔www yönü korunmuş mu | her eski URL 301/308 ile karşılığına ya da 404/410; toplu ana sayfa yönlendirmesi ve 200 dönen SPA kabuğu (soft 404) 0 | P2 |
| Kalıcı taşımalar | `next.config` `redirects` `permanent: true` → 308; `NextResponse.redirect` ve `redirect()` varsayılanı 307; kalıcıda `permanentRedirect()` ya da status 308 | kalıcıda 301/308 | P2 |
| Zincir yok | `curl -sIL URL \| grep -ci '^location'` | doğrudan hedef (Googlebot 10 hop izler; 3-5 hop pratik eşik üçüncü taraf) | P2 |
| Sunucu hatası | örnek URL'lerde 5xx | 0 | P1 |
## E. Sitemap
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Dinamik ve güncel | `app/sitemap.ts` (ya da next-sitemap); yeni içerik otomatik giriyor mu; `lastmod` gerçek değişiklik tarihi mi (build tarihi değil) | var | P2 |
| Yalnız 200 dönen kanonik URL | `curl -s <site>/sitemap.xml \| grep -o '<loc>[^<]*' \| sed 's/<loc>//' \| head -100 \| while read u; do curl -s -o /dev/null -w "%{http_code} $u\n" "$u"; done` (`<sitemapindex>` ise önce alt sitemap'leri aynı yolla aç; 100'den fazlaysa örneklem olduğunu yaz); 200 dönenlerin ilk 10'unda canonical ve noindex'i A/C komutlarıyla kontrol et | 200 dışı = 0; noindex/yönlendirilen/canonical'ı farklı URL = 0 | P1 |
| Limit ve host | URL sayısı, boyut, host | ≤50.000 URL / 50MB; tek host | P2 |
| Linkli ama sitemap'te yok | K bölümündeki linkinator taramasında 200 dönen, noindex'siz kanonik iç URL'ler − sitemap URL kümesi | eksik giriş 0 | P3 |
| robots'ta bildirim | `curl -s <site>/robots.txt \| grep -i '^sitemap:'` mutlak URL | var | P2 |
## F. hreflang ve dil (çok dilliyse; değilse Geçerli değil)
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Karşılıklı set | her varyant: `curl -s URL \| grep -io 'hreflang="[^"]*"'`; App'te `alternates.languages` | tüm varyantlar aynı set + self-ref; `x-default` opsiyonel | P2 |
| Dil gerçekten doğru | `curl -s URL \| grep -o '<html[^>]*>'` (lang değeri); gövdenin o dilde olduğunu örnekle | lang = route dili = içerik dili{{#if hedef_pazar}} ({{hedef_pazar}} için){{/if}} | P2 (doğrulanmadı — Google localized versions dokümanını kontrol et) |
## G. Render (indekslenecek içerik sunucuda)
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Ana metin HTML'de | JS'siz: `curl -s URL \| sed 's/<[^>]*>/ /g' \| grep -c "<sayfada görünen bir cümle>"`; eşleşme yalnız `<script>` içindeki RSC yükündeyse görünür metin sayma; kodda sayfa kökünde `'use client'` + `useEffect` ile içerik çekimi | ana içerik ham HTML'de var | P1 |
| Linkler taranabilir | gezinme `<a href>` (next/link) ile; `onClick` yönlendirmesi değil | 0 href'siz gezinme | P2 |
## H. Yapılandırılmış veri (JSON-LD)
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Organization + WebSite | ana sayfada `<script type="application/ld+json">`; `name`, `url`, `logo` görünür veriyle aynı | var, parse hatası 0 | P2 |
| Türe uygun şema | ürün türüne göre SoftwareApplication / Product / Article-BlogPosting (headline, image, datePublished, author) / BreadcrumbList (sıralı `itemListElement`) | önerilen alanlar dolu | P2 (Breadcrumb P3) |
| Doğrulama | Rich Results Test (search.google.com/test/rich-results) + validator.schema.org; yerelde `JSON.parse` | hata 0 | P2 |
| Kısıtlı/kaldırılmış türlere güvenme | `grep -rnE 'FAQPage\|HowTo\|Course\|Quiz\|Dataset' app src components 2>/dev/null` + teklif/rapor metni; türler: FAQ, HowTo, Course Info (tek kurs; carousel için aynı sayfada ≥3 kurs), Practice Problem, Dataset (yalnız Dataset Search), Book Actions | şema hata değil; "zengin sonuç çıkar" vaadi raporda/teklifte 0 | P3 |
| Görünür metinle eşleşme | şemadaki fiyat, puan, ad sayfada görünüyor | uyuşmazlık 0 | P2 |
## I. Sosyal kartlar ve ikonlar
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| OG 4 alan | `curl -s URL \| grep -o 'property="og:[^"]*"'` → title, type, image, url; mutlak https | 4/4 | P2 |
| OG görsel boyutu | görseli `curl -s -o /tmp/og.img <og:image URL>` ile repo dışına indir, `file /tmp/og.img` (webp vb.'de `identify` ya da macOS `sips -g pixelWidth -g pixelHeight`); beyan `og:image:width/height` ile karşılaştır; App'te `opengraph-image.tsx` | 1200x630 (1.91:1), min 200x200; beyan = gerçek | P2 (doğrulanmadı — Meta güncel dokümanını kontrol et) |
| Twitter kartı | `grep -o 'name="twitter:[^"]*"'` | `twitter:card` var; large ise ≥1200x628 | P2 |
| İkon seti | `grep -Eo 'rel="(icon\|apple-touch-icon\|manifest)"[^>]*'`; HTML'deki manifest `href`'ine `curl -sI` (App `app/manifest.ts` → `/manifest.webmanifest`) | favicon; apple-touch-icon 180x180 opak; manifest 192 + 512; manifest content-type json (text/html değil) | P2 |
## J. Core Web Vitals, görseller, fontlar
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Saha verisi (p75) | PageSpeed Insights API: `curl -s "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=<URL>&strategy=mobile" \| jq '.loadingExperience.metrics'` (URL'i encode et; anahtarsız kota düşük, 429'da ölçülemedi); `CUMULATIVE_LAYOUT_SHIFT_SCORE` percentile ×100 gelir (10 = 0,10); URL verisi yoksa `originLoadingExperience`'ı "origin" diye yaz; ikisi de yoksa "saha verisi yetersiz" | LCP ≤2,5 sn · INP ≤200 ms · CLS ≤0,1 (kötü: >4 sn · >500 ms · >0,25); üçü de iyi bantta | kötü bant P1 · arada P2 |
| Laboratuvar | `npx lighthouse <URL> --only-categories=performance --output=json --output-path=/tmp/lh.json --chrome-flags="--headless"` (mobil varsayılan; Chrome gerekir; yerelde yalnız production build'e karşı, `next dev`'e değil) | aynı eşikler; INP laboratuvarda ölçülmez → TBT'yi vekil diye yaz | P2 (laboratuvar ≠ saha diye işaretle) |
| Görseller | `grep -rn '<img ' app src components`; next/image'da `width/height` ya da `fill`+`sizes`; LCP görseli lazy değil, öncelikli (`priority`; Next 16'da `preload` — kurulu sürümün next/image dokümanını kontrol et) | boyutsuz görsel 0 | P2 |
| Alt metin | atıf: «Web profesyonel temel özellikler» D4 | — | — |
| Fontlar | `next/font` kullanımı; `fonts.googleapis.com` link/`@import` yok; `display` değeri | harici font isteği 0; font kaynaklı CLS yok | P3 |
## K. İçerik yapısı{{#if anahtar_kelimeler}} ve anahtar kelimeler{{/if}}
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Tek H1 | `curl -s URL \| grep -o '<h1' \| wc -l` | 1 (pratik; Google birden çok H1'i ceza saymaz), 0 H1 ayrıca yaz | P3 |
| Başlık hiyerarşisi | `grep -o '<h[1-6]'` sırası; seviye atlama | atlama 0 | P3 |
| İç bağlantılar | yetim sayfa = sitemap URL kümesi − `npx linkinator <site> --recurse --format csv` ile ulaşılan iç URL kümesi; "buraya tıklayın" bağlam metni | yetim 0 | P2 |
| İnce/kopya içerik | yakın kopya sayfalar, şablon metinli boş sayfalar (resmi sayı eşiği yok; kanıt: kelime sayısı + örnek) | — | P3 |
{{#if anahtar_kelimeler}}Anahtar kelimeler ({{anahtar_kelimeler}}): her kelimeyi tek hedef URL'e eşle; title, H1, description ve URL'de geçiyor mu tabloya yaz; aynı birincil kelimeyi hedefleyen 2+ sayfa = yamyamlaşma (P3). Sıralama ve gösterim sayısı Search Console ister → erişim yoksa "ölçülemedi (erişim)".{{/if}}
## L. Yerel ve işletme bilgisi (fiziksel işletme varsa; yoksa Geçerli değil)
- LocalBusiness JSON-LD (ad, adres, telefon) footer/iletişim sayfasındaki görünür bilgiyle birebir aynı → uyuşmazlık P2.
- Google Business Profile durumu → "ölçülemedi (erişim)".
## M. AI arama görünürlüğü, snippet, site itibarı
| Kontrol | Ölç | Eşik | İhlal |
|---|---|---|---|
| Resmi öneri (Google AI features, 2025-12-10) | ek dosya/özel şema gerekmez: Googlebot engeli yok (A), ana içerik HTML metninde (G), şema görünür metinle eşleşir (H) | A, G, H geçer | P2 |
| llms.txt | Google için resmi değil, puanlanmaz | — | yalnız "opsiyonel, kanıtı zayıf" notu; eksikliği bulgu değil |
| Snippet denetimleri | `grep -rnE 'nosnippet\|max-snippet\|data-nosnippet' app src components 2>/dev/null` | belgesiz kullanım 0 | P3 |
| Google-Extended | `curl -s <site>/robots.txt \| grep -i -A2 google-extended` | karar (izin/engel) yazılı ve sahibiyle belgelenmiş | P3 |
| Site itibarı | denetimsiz 3. taraf bölüm (kupon, sponsorlu) ana alanda indekslenebilir mi | yoksa ya da noindex | P3 (doğrulanmadı — güncel spam policies'i kontrol et) |
## N. Ölçüm ve bakım (erişim gerektirenler)
- RUM: `grep -rnE "web-vitals|@vercel/speed-insights|@vercel/analytics" package.json app src` → yoksa P3 (düşük trafikte CrUX yetersiz kalır; doğrulanmadı).
- Search Console mülkü doğrulanmış mı (`google-site-verification` meta ya da DNS; ≥ 1 doğrulanmış sahip), sitemap gönderildi mi ("Başarılı"), kapsam ve CWV raporu → erişim yoksa "ölçülemedi (erişim)"; haftalık bakış pratik öneridir.
- Kırık link: {{#if canli_url}}`npx linkinator {{canli_url}} --recurse`{{else}}yerel sunucuda `npx linkinator http://localhost:3000 --recurse`{{/if}}; kırık iç link P2, periyodik tarama yokluğu P3 (3 ayda bir; pratik, resmi eşik yok).
{{#if duzelt}}## Düzeltme modu
- P0/P1'i minimal diff ile düzelt: metadataBase, canonical, noindex sızıntısı, robots/sitemap, notFound/404, yönlendirme kodu, sunucu render. Kapsam dışı yeniden yazım yok.
- Her düzeltme sonrası: `npm run build && npm run start` ile ilgili curl doğrulamasını koş; varsa testleri (`npm test`) koş; çıktıyı bulgu satırına ekle. Doğrulama kırmızıysa değişikliği geri al, bulguyu "düzeltilemedi" yaz.
- Müşteri bayrağı açıksa commit/push yok (aşağı bak). Kapalıysa yalnız değişen dosyaları açık yolla stage et (`git add <yol>`; toplu ekleme yok); push sahibinin onayıyla.{{/if}}
{{#if musteri}}Müşteri projesi: commit/push YOK. Düzeltmeleri yalnız yama (unified diff) ya da dal önerisi olarak raporla.{{/if}}
## Çıktı (bu sırayla; başlıkta tarih `date +%F`, commit hash, ölçülen ortam)
## Verdikt
Tek cümle + GEÇ/KAL. KAL: açık P0 varsa ya da sahibi ve tarihi yazılı olmayan açık P1 varsa (paket ortak kural).
## Bulgular
| ID | Alan | Nerede | Ölçülen | Beklenen/eşik | Şiddet | Düzeltme | Doğrulama |
Şiddet sıralı (P0 → P3). ID biçimi: SEO-<bölüm harfi>-<no>; Alan = bölüm adı.
### Ölçüm tablosu (Bulgular altında)
| URL | LCP | INP/TBT | CLS | Kaynak (saha/laboratuvar) |
## Temiz bulunanlar
A-N bölümlerinde geçen kontroller, kanıt komutuyla (atlanamaz).
## Ölçülemeyenler
Kontrol · neden (erişim, canlı URL yok, araç hatası) · nasıl ölçülür.
## Geçerli değil
Adım 0'a göre uygulanmayan kontroller ve gerekçesi.
## Sıradaki 3 adım
{{#if musteri}}## Müşteri özeti
Teknik olmayan dille en çok 6 satır: arama görünürlüğünü en çok etkileyen 3 sorun ve etkisi.{{/if}}
Geri bildirim: Bu prompt bir kontrolü kaçırdıysa, yanlış eşik verdiyse ya da PLE'de bir aksaklık gördüysen tek satır yaz: ple feedback --type prompt --prompt "Web SEO denetimi" "<ne eksik → ne olmalı>" (PLE aksaklığında --type bug ya da missing; komut yoksa raporun sonuna «PLE geri bildirim:» satırı ekle).Related prompts
Web profesyonel temel özelliklerNe zaman: eksik özellik taraması; teslim öncesi ya da devralınan web uygulamasında hesap, hukuk, a11y, yedek, izleme · Girdi: {{proje_yolu}} {{canli_url}} {{urun_turu}} {{satis_var}} {{musteri}} {{duzelt}} · Çıktı: tamlık matrisi + ilk 10 eksik · anahtar: KVKK / production readiness, backup@zeynepaslierhan0Web güvenlik denetimi (Next.js + Supabase)Ne zaman: güvenlik açığı tara; Next.js + Supabase uygulamasında teslim öncesi ya da periyodik güvenlik denetimi · Girdi: {{proje_yolu}} {{canli_url}} {{kapsam}} {{duzelt}} {{musteri}} · Çıktı: kanıtlı bulgu tablosu + GEÇ/KAL · anahtar: RLS, sır sızıntısı, CVE / security audit, secrets, headers@zeynepaslierhan0Web sıfırdan kurulum (Next.js + Supabase)Ne zaman: yeni proje kur; sıfırdan Next.js + Supabase uygulaması ya da erken aşama temeli · Girdi: {{proje_yolu}} {{proje_adi}} {{urun_turu}} {{diller}} {{uygula}} {{musteri}} {{duzelt}} · Çıktı: proje kartı + M0-M5 + DoD · anahtar: kurulum, iskelet / new Next.js Supabase project, scaffold@zeynepaslierhan0Web tam denetim ve teslim kapısıNe zaman: teslim öncesi denetim, canlıya çıkmadan kontrol, periyodik denetim; güvenlik+temel+SEO tek komut · Girdi: {{proje_yolu}} {{canli_url}} {{kapi}} {{musteri}} {{duzelt}} · Çıktı: GEÇ/KAL + birleşik öncelik listesi · anahtar: teslim kapısı / launch checklist, production readiness, release gate@zeynepaslierhan0