# v0.3.15 Stall Root Cause

v0.3.14 ilk çalışmada veri üretti ancak zor ürünlerde akış uzun süre sessiz kalabiliyordu.

## Kanıt
- v0.3.13 sonrası priced_sources 109 -> v0.3.14'te 119.
- price_rows 282 -> 359.
- missing_active_price 61 -> 51.
- Buna rağmen bootstrap_due=33, backoff=7, running=2 ve stale_running=1 görüldü.

Bu nedenle global scraper arızası yoktu; ilk kolay ürünler bitince kalan zor ürünler başarısız discovery/backoff döngüsüne giriyordu.

## Kod kök nedenleri
1. Bootstrap `running` kaydı yalnız `started_at > 4 dakika` watchdog'una güveniyordu. Worker/dispatcher anormal sonlanınca DB satırı bir süre sahipsiz kalabiliyordu.
2. Başarısız ürünler backoff'a giriyor; son başarılı fiyatın kaç dakika önce geldiğine göre katalog çapında bir "stall" alarmı yoktu.
3. Brave 402 / DDG 403 ve mağaza arama sayfası anti-bot olduğunda doğrudan ürün URL'sini bulmak için API bağımsız genel bir kanal yoktu.
4. Bootstrap timer 45 saniyede tek ürün işlediğinden zor kuyruk toparlaması yavaştı.

## v0.3.15
- Lease + heartbeat: `lease_until`, `heartbeat_at`.
- Her claim başlangıcında expired lease atomik olarak pending'e döner.
- 15 dakika yeni price observation yoksa 5 zor ürün priority 520 deep moda yükselir.
- Deep mod public robots.txt / sitemap kataloglarından exact ürün URL adayları üretir.
- Sitemap fiyat kaynağı değildir; URL adayının gerçek sayfası model + GB + renk + condition filtresinden geçmeden DB'ye fiyat yazılmaz.
- Sitemap URL katalogları 12 saat cache edilir.
- Bootstrap timer 20 saniye.
- Runtime health gerçek son fiyat zamanı ve son 15/60 dakika akışını gösterir.
