diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md
index 4198e68..e485222 100644
--- a/docs/quality/uygulama-durumu.md
+++ b/docs/quality/uygulama-durumu.md
@@ -1124,3 +1124,10 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö
- Genel veri yazma API'siyle doğrudan Telegram chatId atama yolu kapatıldı. UI sunucudan yeni kod oluşturuyor, son geçerliliği gösteriyor, kod oluşmadan doğrulama sunmuyor. Mevcut bağlı hesaplar korunuyor; otomatik bağlantı-onay mesajı yerine uygulama sonucu gösteriliyor.
- Doğrulama: 266 test ve build başarılı. Gerçek kullanıcı deposunda hesap ayrımı, hash saklama, yenileme, süre sınırı, tüketim ve devam eden doğrulamanın iptali; sahte Telegram yanıtlarında özel/taze/tam eşleşme; HTTP üzerinden doğrudan yazma ve eski kod reddi test edildi. Gerçek Telegram ağına test mesajı gönderilmedi.
- Açık kabul: yeni kod ekranının tarayıcı testi, izinli gerçek hesapla bağlama; getUpdates son 100 güncelleme penceresinin yoğun botta yetersiz kalması; genel Telegram bağlantı sürüm/geri dönüş akışları. Genel plan henüz tamamlanmadı.
+
+### 2026-09-06 — Telegram kod yenileme ve kaldırma tarayıcı kabulü
+
+- İzole QA sunucusuna gerçek Telegram'a çıkmayan, üretimdeki createTelegramLinker ve geçici kullanıcı deposunu kullanan sağlayıcı taklidi eklendi. Görünür test kontrolleri son kodun sentetik sohbete ulaştığını ve sağlayıcı saatini yönetiyor; üretime dahil edilmiyor.
+- Tarayıcı testinde bağlantı kaldırıldıktan sonra tüketilmiş kodun ekranda kaldığı ve Doğrula düğmesinin açık olduğu bulundu. Bağlama/kaldırma tamamlandığında kod artık temizleniyor. Kod yenileme başlarken eski kod kaldırılıyor. Sunucunun geçersiz/süresi dolmuş kod hatası ayrı `TELEGRAM_CHALLENGE_INVALID` koduyla taşınıyor; istemci bu durumda eski kodu temizliyor.
+- Dokuz tarayıcı kontrolü geçti: koddan önce doğrulama kapalı, sunucu kodu görünür, süre açıklaması, farklı yeni kod, önceki mesajın reddi, başarılı sentetik bağlama, kaldırmada eski kodun temizlenmesi, doğrulamanın kapanması ve kaldırma onayı. Kanıt `rapor/qa-telegram-link-flow.json`. Test sekmeleri ve bu çalışmanın geçici sunucusu kapatıldı.
+- 266 test ve build başarılı; son hata-kodu doğrulaması için üç Telegram birim testi ayrıca geçti. Süre dolması sunucu testinde doğrulandı; süre hatası sonrası kod temizleme kolu bu tarayıcı koşusunda ayrıca tetiklenmedi. Gerçek sağlayıcıda bağlama/gönderim yapılmadı. Genel planın diğer kabul maddeleri açık.
diff --git a/server/index.js b/server/index.js
index fa78721..69746d9 100644
--- a/server/index.js
+++ b/server/index.js
@@ -921,7 +921,7 @@ const server = http.createServer(async (req, res) => {
}
const bulunan=await linker.link(user.email,body.kod,kodIleBagla);
return json(res, 200, { success: true, ad: bulunan.ad });
- } catch (e) { return json(res,e.kod==='VERSION_CONFLICT'?409:e.status||502,{success:false,error:e.message}); }
+ } catch (e) { return json(res,e.kod==='VERSION_CONFLICT'?409:e.status||502,{success:false,error:e.message,kod:e.kod}); }
}
return json(res,405,{success:false,error:'Desteklenmeyen metot.'});
}
diff --git a/server/telegram-link.mjs b/server/telegram-link.mjs
index dc219e1..ce04f6b 100644
--- a/server/telegram-link.mjs
+++ b/server/telegram-link.mjs
@@ -5,7 +5,7 @@ export function createTelegramLinker(store,clock=Date.now) {
const snapshot=store.getDataSnapshot(email),value=snapshot.veri.telegram;
if(typeof code!=='string'||!/^[a-f0-9]{48}$/.test(code)||value?.challengeHash!==digest(code)||
!Number.isFinite(value.expiresAt)||clock()>=value.expiresAt)
- throw Object.assign(new Error('Bağlama kodu geçersiz veya süresi dolmuş. Yeni kod oluşturun.'),{status:400});
+ throw Object.assign(new Error('Bağlama kodu geçersiz veya süresi dolmuş. Yeni kod oluşturun.'),{status:400,kod:'TELEGRAM_CHALLENGE_INVALID'});
return {value,revision:snapshot.revisions.telegram ?? null};
}
return {
diff --git a/src/components/tools/TelegramBaglanti.jsx b/src/components/tools/TelegramBaglanti.jsx
index f251e95..72ed16b 100644
--- a/src/components/tools/TelegramBaglanti.jsx
+++ b/src/components/tools/TelegramBaglanti.jsx
@@ -31,8 +31,8 @@ const TelegramPanel = ({isAdmin}) => {
const calistir = async (ad, fn, basari) => {
if(locked.current)return;locked.current=true;
setBusy(ad);setMesaj(null);
- try {await fn();if(!alive.current)return;if(ad!=='load')await yenile();if(alive.current&&basari)setMesaj({tur:'ok',metin:basari});}
- catch(e){if(alive.current)setMesaj({tur:'hata',metin:e.message});}
+ try {await fn();if(!alive.current)return;if(ad==='bagla'||ad==='sil')setChallenge(null);if(ad!=='load')await yenile();if(alive.current&&basari)setMesaj({tur:'ok',metin:basari});}
+ catch(e){if(alive.current){if(e.kod==='TELEGRAM_CHALLENGE_INVALID')setChallenge(null);setMesaj({tur:'hata',metin:e.message});}}
finally{locked.current=false;if(alive.current)setBusy(null);}
};
useEffect(()=>{alive.current=true;void calistir('load',yenile);return()=>{alive.current=false;};},[]);
@@ -95,6 +95,7 @@ const TelegramPanel = ({isAdmin}) => {