Production Abuse Eşik Analizi

Bu prompt'u production'daki Claude'a ver. SQL sorgularını çalıştırıp eşik değerlerini belirleyecek.

Production Claude'a Verilecek Prompt
Abuse Detection (Suistimal Tespit) sistemi için production veritabanından analiz yapıp HTML rapor oluşturmanı istiyorum.

## AMAÇ
B2B müzik platformumuzda (Muzibu) hesap paylaşımı tespiti yapıyoruz. 1 abonelik = 1 aktif stream kuralımız var. Eş zamanlı 2+ stream = suistimal şüphesi.

Şu anki eşikler çok agresif, normalin ne olduğunu belirlemek için GERÇEK VERİLERE bakmamız gerekiyor.

## ÇALIŞTIRMAN GEREKEN SQL'LER

Bunları sırasıyla çalıştır ve sonuçları HTML rapora yaz:

### 1. Günlük Toplam Dinleme (Son 30 Gün)
```sql
SELECT DATE(created_at) as tarih, COUNT(*) as dinleme,
    COUNT(DISTINCT user_id) as benzersiz_kullanici
FROM muzibu_song_plays
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DATE(created_at)
ORDER BY tarih DESC;
```

### 2. Kullanıcı Başına Günlük Dinleme Dağılımı (Son 14 Gün)
```sql
SELECT
    CASE
        WHEN daily_plays BETWEEN 1 AND 5 THEN '01-05'
        WHEN daily_plays BETWEEN 6 AND 15 THEN '06-15'
        WHEN daily_plays BETWEEN 16 AND 30 THEN '16-30'
        WHEN daily_plays BETWEEN 31 AND 50 THEN '31-50'
        WHEN daily_plays BETWEEN 51 AND 100 THEN '51-100'
        WHEN daily_plays BETWEEN 101 AND 200 THEN '101-200'
        WHEN daily_plays BETWEEN 201 AND 500 THEN '201-500'
        WHEN daily_plays > 500 THEN '500+'
    END as aralik,
    COUNT(*) as kullanici_gun_sayisi,
    COUNT(DISTINCT user_id) as benzersiz_kullanici
FROM (
    SELECT user_id, DATE(created_at) as d, COUNT(*) as daily_plays
    FROM muzibu_song_plays
    WHERE created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
    GROUP BY user_id, DATE(created_at)
) sub
GROUP BY aralik
ORDER BY FIELD(aralik, '01-05', '06-15', '16-30', '31-50', '51-100', '101-200', '201-500', '500+');
```

### 3. En Çok Dinleyen Top 30 Kullanıcı (Günlük Max)
```sql
SELECT
    sp.user_id,
    u.name,
    u.email,
    DATE(sp.created_at) as tarih,
    COUNT(*) as gunluk_dinleme,
    COUNT(DISTINCT sp.ip_address) as farkli_ip,
    COUNT(DISTINCT sp.browser) as farkli_browser,
    COUNT(DISTINCT CONCAT(COALESCE(sp.ip_address,''), '|', COALESCE(sp.browser,''), '|', COALESCE(sp.platform,''))) as farkli_fingerprint
FROM muzibu_song_plays sp
JOIN users u ON sp.user_id = u.id
WHERE sp.created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
GROUP BY sp.user_id, u.name, u.email, DATE(sp.created_at)
ORDER BY gunluk_dinleme DESC
LIMIT 30;
```

### 4. Eş Zamanlı Dinleme (Overlap) Analizi — Sadece Farklı Fingerprint
```sql
SELECT
    p1.user_id,
    u.name,
    DATE(p1.created_at) as tarih,
    COUNT(*) as overlap_sayisi
FROM muzibu_song_plays p1
JOIN muzibu_song_plays p2 ON p1.user_id = p2.user_id
    AND p1.id < p2.id
    AND p1.created_at < DATE_ADD(p2.created_at, INTERVAL COALESCE(p1.duration, 180) SECOND)
    AND p2.created_at < DATE_ADD(p1.created_at, INTERVAL COALESCE(p1.duration, 180) SECOND)
    AND CONCAT(COALESCE(p1.ip_address,''), '|', COALESCE(p1.browser,''), '|', COALESCE(p1.platform,''))
     != CONCAT(COALESCE(p2.ip_address,''), '|', COALESCE(p2.browser,''), '|', COALESCE(p2.platform,''))
JOIN users u ON p1.user_id = u.id
WHERE p1.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY p1.user_id, u.name, DATE(p1.created_at)
HAVING overlap_sayisi > 5
ORDER BY overlap_sayisi DESC
LIMIT 30;
```

### 5. Ortalama ve Percentile İstatistikleri
```sql
-- Genel ortalama
SELECT
    COUNT(DISTINCT user_id) as toplam_aktif_kullanici,
    ROUND(AVG(daily_plays), 1) as ortalama_gunluk_dinleme,
    MIN(daily_plays) as min_gunluk,
    MAX(daily_plays) as max_gunluk
FROM (
    SELECT user_id, DATE(created_at) as d, COUNT(*) as daily_plays
    FROM muzibu_song_plays
    WHERE created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
    GROUP BY user_id, DATE(created_at)
) sub;

-- Abonelik durumuna göre
SELECT
    CASE WHEN u.subscription_expires_at > NOW() THEN 'Aktif Abone' ELSE 'Abone Değil' END as durum,
    COUNT(DISTINCT sub.user_id) as kullanici,
    ROUND(AVG(sub.daily_plays), 1) as ort_gunluk
FROM (
    SELECT user_id, DATE(created_at) as d, COUNT(*) as daily_plays
    FROM muzibu_song_plays
    WHERE created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
    GROUP BY user_id, DATE(created_at)
) sub
JOIN users u ON sub.user_id = u.id
GROUP BY durum;
```

### 6. Aktif Abone Sayısı ve B2B Müşteri Bilgisi
```sql
SELECT COUNT(*) as aktif_abone FROM users WHERE subscription_expires_at > NOW();
SELECT COUNT(*) as toplam_kullanici FROM users;
```

## HTML RAPOR FORMAT

Sonuçları `public/readme/2026/02/28/abuse-esik-analiz/v1/index.html` konumuna Tailwind CDN dark mode ile yaz.

Raporda şunlar olsun:
1. **Günlük Dinleme Trendi** — Tablo + ortalama
2. **Kullanıcı Dağılım Histogramı** — Kaç kullanıcı hangi aralıkta
3. **Top 30 En Çok Dinleyen** — Günlük max, IP/browser çeşitliliği ile
4. **Overlap Analizi** — Gerçekten eş zamanlı farklı cihazdan dinleyenler
5. **İstatistikler** — Ortalama, median, percentile
6. **Eşik Önerisi** — Verilere dayanarak:
   - Günde X şarkı altı = kesinlikle normal (P75 gibi)
   - Günde Y şarkı üstü = şüpheli (P95 gibi)
   - Z overlap üstü = kesinlikle suistimal
   - Önerilen THRESHOLD_SUSPICIOUS ve THRESHOLD_ABUSE değerleri

## ÖNEMLİ NOTLAR
- Bu B2B müzik platformu — 1 hesap = 1 işletme (restoran, kafe, mağaza)
- 7/24 dinleme NORMAL (mağaza müziği)
- Yüksek hacim NORMAL (kalabalık mekan)
- Önemli olan FARKLI CİHAZDAN eş zamanlı dinleme
- Footer'da "Claude AI" yazma, sadece "28 Şubat 2026 • Muzibu.com.tr"
- Dosya izinleri: chown tuufi.com_:psaserv, chmod 644

Production Claude'a Nasıl Verilir?

  1. Yukarıdaki prompt'u kopyala
  2. Production sunucudaki Claude'a yapıştır
  3. SQL sonuçlarını HTML rapor olarak oluşturmasını bekle
  4. Rapor URL'ini bana ver → eşik değerlerini analiz edip sisteme uygulayacağım

Şu Anki vs Önerilen Eşikler

Pattern Eski Puan Yeni Puan (Önerilen) Max
Concurrent Different (Farklı Cihaz) overlap × 50 overlap × 5 500
Split Stream (Bölünmüş Akış) overlap × 30 overlap × 3 300
Ping-Pong döngü × 100 döngü × 20 200
Eşik Eski Yeni (Önerilen) Anlamı
THRESHOLD_SUSPICIOUS 100 200 ~40 CD overlap
THRESHOLD_ABUSE 300 500 ~100 CD overlap

* Bu değerler production analiz sonucuna göre güncellenecek