# Düzeltme planı — uygulama durumu 6 Eylül 2026. Temel sürüm: 909ebae. Çalışma dalı: codex/ihaleist-duzeltme-plani. Planın tamamı henüz bitmedi. Canlı yayın yapılmadı. ## Kanıtlanan ilk değişiklikler - Eski belgeler tablosunda ikn indeksi kolon migration'ından önce oluşuyordu. Transaction içinde kolonlar önce ekleniyor; eski belgeyi koruyan, tekrarlanabilir migration testi geçti. - Veri deposu hataları artık boş hesap veya başarılı yazma gibi yutulmuyor. - İhale başına kullanıcıya ait hazırlık durumu, snapshot ve sürüm saklanıyor. Yeni API sürüm çakışmasında 409 döndürüyor. İki kullanıcı ve beş kayıt testi geçti. - Arayüz görev/takip/atama/not işlemlerini sunucu onayıyla güncelliyor. İzole tarayıcı testinde beş sentetik ihale görevi yenilemeden sonra Kanban’da korundu; atama/not ve yeniden giriş kabulü ayrıca bekliyor. - ICS sabit tarih kullanmıyor. Beş tarih, yıl geçişi, artık gün, geçersiz tarih ve UTF-8 katlama testleri geçti. - Uydurma 150 TL fiyat/sürüklenen kaşe simülatörü gerçek hazırlık formuyla değiştirildi. Boş kalem, fiyat, süre ve firma kontrolleri eklendi. Bu alanlarda görsel/işlevsel test bekliyor. - Şehir filtresi mevcut 81 il tablosundan besleniyor. ## İkinci değişiklik paketi - Tam ilan metnindeki 4.000 karakter sınırı kaldırıldı; saat/teslimat gibi alanlar kaynak metinden çıkarılıyor. Sentetik uzun metin testi geçti; beş resmi metinle kabul bekliyor. - DT kayıtları kurum ve kimlik ile tekilleştiriliyor, kaynak kimlikleri korunuyor. Farklı sözleşme kısımları birleştirilmiyor. Mevcut kullanıcı referanslarının toplu dönüşümü hâlâ açık. - Cetvel miktar/birim ayrıştırması ve para yuvarlaması ortak yardımcıya taşındı. Eksik fiyat engeli, Türkçe sayı ve 100 satırlık yazdırılabilir HTML testi geçti. Gerçek PDF sayfalama testi yerine geçmez. - Firma, fiyatlar, süre ve teklif türü hazırlık taslağı olarak sunucuya kaydedilebiliyor. HTTP testinde kimlik doğrulama, hesap ayrımı, kalıcılık ve eski sürüme 409 yanıtı doğrulandı. Formun tarayıcıda yeniden yüklenmesi ayrıca test edilmeli. - Sabit kurlar kaldırıldı; TCMB döviz satış kuru bülten tarihi ve kaynakla gösteriliyor. Kaynak hatasında uydurma değer üretilmiyor. Kategori tutarından birim fiyat önerisi ve kesin eşleşme garantisi kaldırıldı. - Belge okuyucularının `metin`/`text` uyumsuzluğu giderildi. Bu, AI kaynak çelişkilerinin tamamının çözüldüğü anlamına gelmiyor; sürümlü ortak model açık. - Ürün arama sonuçları son çalıştırılan sorguya bağlı. Sonraki/önceki sayfa aynı sorguyu kullanıyor; düzenlenmiş alanlar için önceki sonuç uyarısı gösteriliyor. Kapanan aramanın geç yanıtı yok sayılıyor ve yüklenme durumu sıfırlanıyor. Etkileşimli regresyon testi bekliyor. - `tests/browser-qa.mjs` localhost üzerinde geçici hesap/veritabanı ve açıkça sentetik beş ilanla test ortamı sağlar. Üretim giriş mekanizmasına eklenmez. Tarayıcı kanıtı: [Yenileme sonrası beş kart](evidence/qa-kanban-after-reload.png), [ekran metni](evidence/qa-kanban-after-reload.txt). Bu kanıt gerçek beş ihale dokümanıyla başvuru kabulü değildir. ## Kaynak değişikliği ve fiyat koruması - Fiyatlar dizi sırasından bağımsız, kalem kimliği/içeriğine bağlı saklanır. Sıralama değişimi fiyatı başka ürüne taşımaz; miktar veya teknik özellik değişince eski fiyat yeni satıra uygulanmaz. - Kaynak ilan, tarih/saat, kalemler ve belge gereksinimleri için karşılaştırılabilir bir içerik kaydı tutulur. Kaynak değişince resmi dokümanla karşılaştırma onayı geçersiz olur, çıktı yeniden kontrol bekler. - Eski konumsal fiyatlar kaynak satırları olmadan güvenle eşlenemediği için otomatik taşınmaz; kullanıcıya yeniden giriş gerektiği gösterilir. Bu davranış yeni taslak kaydında da korunur. - Üç regresyon testi sıralama, içerik değişikliği ve eski taslak senaryolarını doğrular. Henüz gerçek belge yükleme/zeyilname ve tarayıcı form kabulü tamamlanmadı. Bu kontrol tüm belge/AI kaynak sürüm modelinin yerine geçmez. ## Belge ve sağlık ürünü kontrolleri - Hazırlık formunda kaynak maddeli belge gereksinimi ekleme/kaldırma, belge adı/sürümü ve geçerlilik kontrolü kaydı eklendi. Zorunlu belgeye uygulanmıyor denilerek çıktı engeli aşılamaz. - Kalem bazında ürün/model veya hizmet kapsamı, teknik uygunluk kaynağı, sorumlu, ÜTS, numune/demonstrasyon, servis/kurulum ve teslimat kontrolleri bulunur. Uygulanmıyor seçimi gerekçe ister; uygun olmayan ürün çıktıyı engeller. - Eksik kontrollerin listesi fiyatlandırma ekranında görünür. Bu alanlar kullanıcı beyanı/kontrol kaydıdır; belge deposundaki gerçek dosyaya otomatik bağlantı ve resmi yeterlik doğrulaması henüz yoktur. - Kontroller, elle eklenen belgeler ve analizden gelen kalem/belge listesi taslakla saklanır. HTTP testi bu alanların hesap içinde yazılıp geri okunmasını doğrular. Üç kural testi eksik kaynak, uygun olmayan ürün, zorunlu belgenin atlanması ve değişmiş gereksinimleri kapsar. - Tarayıcıda tüm bu alanları doldurma, yenileme ve çok kalemli kullanılabilirlik kabulü bekliyor. AI raporundaki eski yerel belge işaretleri kaldırıldı; rapor kalıcı hazırlık kaydını özetler ve kontrol formuna yönlendirir. D06/D07 tamamlanmış sayılmaz. ## Ekranlar arası kayıt tutarlılığı - Derin rapor belge listesi artık geçici tamamlandı işaretleri tutmaz; kayıtlı kullanıcı kontrollerini gösterir ve kaynaklı hazırlık formuna geçiş sağlar. - Yol haritası tamamlanma durumu ihale checklist kaydında sunucu onayıyla saklanır. Eylem veya kaynak değişince eski işaret tamamlanmış sayılmaz. Kaydetme hatası görünürdür. - Derin rapor ve hazırlık formu, açılışta seçilmiş eski nesne yerine ihale havuzundaki güncel kullanıcı kaydını okur. Böylece AI penceresinden tekrar açılan formda yeni kaydedilmiş taslağa erişilir. - HTTP testinde yol haritası kaynak/durum alanlarının yazma-okuma kontrolü eklendi. Arayüzde iki pencere arasında geçiş ve yeniden giriş senaryosu hâlâ ayrıca doğrulanmalıdır. ## Hesap ve oturum ayrımı - Firma profili, ekip, favoriler ve filtreler ortak localStorage kayıtlarından başlatılmıyor; yeni hesaba boş varsayılanlar ve ardından sunucudaki kendi kaydı yükleniyor. Önceki hesaba ait eksik alanlar yeni profille birleştirilmiyor. - Ortak ihale önbelleği yalnız kamuya açık ihale alanlarını tutar; not, checklist, takip ve teklif taslağı çıkarılır. Eski önbellek okunurken de bu alanlar temizlenir. Eski yerel kayıtlar otomatik başka hesaba aktarılmaz. - Oturum geri yükleme, kayıt/hata, plan, analiz, firma taraması ve bildirim yanıtları oturum değişmişse yeni hesaba uygulanmaz. Başka sekmedeki oturum değişikliği dinlenir. Ziyaret ve belge uyarısı anahtarları hesaba ayrılır. - İki regresyon testi eski oturum yanıtının yeni hesabı silememesini/değiştirememesini ve ortak ihale önbelleğinin özel hazırlık durumunu taşımamasını doğrular. Tarayıcıda iki gerçek test hesabı ve offline senaryosu ayrıca kabul edilmeli. Bu değişiklik, özel profil verisinin offline erişimini sunucu senkronu tamamlanana kadar sınırlar. ## Ortak tarih ve aylık takvim - Kanban ve yaklaşan tarihler aynı Türkiye saati/gün hesabını kullanır. Aynı günün geçmiş saatleri artık yaklaşan listesinde açık gibi görünmez; saati bilinmeyen kayıtta belirsizlik açıkça belirtilir. - Takvim ay seçimine açıldı; 22 Eylül gibi ilk yedi gün dışındaki adaylara erişilir. Ay uzunluğu/artık gün ve boş gün durumu ele alındı. Takvim kartı klavyeyle açılır. - Açık kalan Kanban, sağ panel ve takvim tarih etiketleri 30 saniyede bir güncellenir. Ürün aramasındaki geçmiş tarih filtresi aynı kaynak saatini kullanır; filtre etiketi bilinmeyen saati başvuruya açık garantisi gibi sunmaz. - Üç tarih testi gün farkını, Türkiye'de yıl/gece geçişini, tam kapanış anını, eksik saat ve artık günleri doğrular. Google/Outlook gerçek içe aktarımı, zeyilname güncellemesi ve bütün sunucu bildirim zamanlayıcıları henüz bu kapsamda doğrulanmadı. ## Tarayıcı doğrulaması ve virgüllü fiyat hatası - Geçici normal hesapla Giresun adlı sentetik kayıtta firma alanları, 120 gün, fiyat ve manuel belge gereksinimi dolduruldu; kaydetme/yenileme sonrası geri geldi. Eksik kontroller varken çıktı düğmeleri kapalı kaldı. - Ürün modeli, teknik kaynak, belge doğrulaması, sorumlu ve dört sağlık yükümlülüğü kontrolü kaydedilip yenilemeden sonra ekrandan doğrulandı. Resmi kaynak onayı verilmedi; gerçek başvuru veya resmi uygunluk iddiası yok. - Tarayıcı testi yeni P1 kusuru ortaya çıkardı: `125,50` girdisi virgül silinerek `12550` oluyordu. Girdi artık değiştirilmeden ortak fiyat ayrıştırıcısına gider; nokta/virgül ondalığı desteklenir, geçersiz metin reddedilir. PDF HTML'sinde de aynı ayrıştırıcı kullanılır, birim fiyat hassasiyeti korunur. - Düzeltme sonrasında tarayıcıda `125,50 × 2 = 251,00 TL` görüldü ve yeniden yüklemede korundu. Bir otomatik test ekran hesabı/PDF HTML tutarlılığı, geçersiz sayı ve aşırı tutarı kapsar. - Kanıtlar: [taslak yenilemesi](evidence/qa-draft-after-reload.txt), [virgüllü fiyat](evidence/qa-turkish-price-fixed.txt), [kontrol yenilemesi](evidence/qa-checks-after-reload.txt). ## Kısmi teklif hazırlığı - Kısmi teklif izninin doküman/madde kaydı, resmi kısım eşleştirmesi ve kısım seçimi eklendi. Bilinmeyen kısım otomatik tahmin edilmez; kaynakta kısım varsa kullanıcı üzerine yazamaz. - Aynı kısma ait tüm satırlar birlikte seçilir. Yalnız seçili satırlar fiyat, ürün uygunluğu ve cetvel çıktısına girer. Kısım değişince kaynak karşılaştırması yeniden gerekir; önceki fiyatlar kendi satırında korunur. - Seçim, eşleştirmeler ve izin kaynağı hazırlık taslağına kaydedilir. Eski seçili kısım güncel kaynakta yoksa çıktı engellenir. - İki test seçilmeyen 1.000 TL cihazın 80 TL'lik seçili cetvele karışmamasını, eksik kaynak/eşleştirme ve kaybolan kısım engellerini doğrular. Tarayıcıda tek sentetik satır için boş seçim engeli, kısım eşleştirmesi ve seçili fiyat gösterimi doğrulandı: [kanıt](evidence/qa-lot-selection.txt). - Aksaray'ın gerçek 34 kısmının resmi dokümanıyla karşılaştırma ve çok kısımlı tarayıcı kabulü henüz yoktur. Götürü bedel tutarı kullanıcı tarafından seçilen kapsam için ayrıca girilir. ## Belge deposu ile hazırlık bağlantısı - Belge gereksinimleri hesaba ait gerçek depo dosyasına bağlanır. Dosya kimliği ve oluşturma/boyut/son kullanma bilgileri kontrol kaydında tutulur; dosya değişikliği yeniden kontrol gerektirir. - Dosya listesi fiziksel dosyanın mevcut olup olmadığını bildirir; sunucu dosya yolu istemciye verilmez. Kayıp/erişilemeyen dosya veya ihale tarihinde geçersiz belge çıktı koşullarını karşılamaz. - Hazırlık formunda dosya seçimi, indirme, liste yenileme ve yüklenme/hata durumları bulunur. Çıktı isteğinde dosyalar tekrar sunucudan kontrol edilir. Dosya türüne göre içerik/ÜTS/mevzuat doğrulaması yapılmış sayılmaz. - Yeni HTTP testi gerçek baytlarla yükleme → listeleme → indirme → üst veri değiştirme → silme zincirini ve başka hesabın indirme isteğine 404'ü doğrular. Bir kural testi kayıp dosya, değişmiş bilgi, süresi dolmuş ve geçersiz tarih senaryolarını kapsar. - Tarayıcı üzerinden dosya seçme/indirme ve son kontrol sonrası yazdırma davranışı, özellikle yeni pencere engeli, henüz doğrulanmalı. Bu çalışma D01/D07 belge bağlantısını ilerletir; OCR ve beş gerçek dosya kabulünü kapatmaz. ## Doğrulama `npm test`: 46/46 geçti (son yeniden çalıştırma: 6 Eylül 2026). `npm run build`: geçti; mevcut büyük paket/dinamik import uyarıları sürüyor. `node --check server/index.js`, `node --check server/user-store.mjs`, `git diff --check`: geçti. ## Tamamlanacak işler (orijinal kapsam korunuyor) - D01: kontrollü test API ortamı; arayüz kalıcılığı, hesap geçişi/önbellek ayrımı, tüm checklist/inceleme yolları, eski takiplerin aktarımı, dosya yaşam döngüsü. Production şema ve yedek/geri yükleme henüz doğrulanmadı. - D02: tüm kart/saat/geri sayım/takvim alanlarını ortak tarih modeline geçirmek; gerçek takvim içe aktarımı ve zeyilname güncellemesi. - D03: cetvel/form kalıcılığı, ortak miktar/para hesaplaması, çok sayfalı Türkçe PDF/Excel testleri; eski kullanılmayan PDF üreticisinin kaldırılması veya düzeltilmesi. - D04: veri havuzunda kaynaklar arası tekilleştirme ve kullanıcı referanslarını koruyan dönüşüm. - D05: tam ilan, metadata, arama yarışları/sorgu etiketi ve kapsamlı filtre testleri. - D06: sürümlü ortak belge/AI modeli, kaynak atıfları, belgeye sor ve diğer AI yollarının birleştirilmesi, doğru süre/kalem/teklif türü aktarımı ve çelişki engelleri. Şu an süre için ilk yerel çıkarım var; kapsam tamamlanmadı. - D07: tek sağlık hazırlık ekranı, kalem uygunluğu/belge durumu/servis ve numune takibi, menü düzeni. - D08: sabit kurun kaldırılması, gerçek kaynak/zaman bilgisi; fiyat karşılaştırma ve eşleşme iddialarının düzeltilmesi. - D09: normal hesaplar, mobil/erişilebilirlik, PDF/OCR, ödeme test ortamı, API, uyarılar, PWA ve tüm diğer modüllerin kabul matrisi. - D10: beş resmi doküman ve uygun test firma verisiyle gerçek hazırlık kabulü; tarihleri geçmişse güncel beş adayla ayrıca kabul. - D11: küçük sürümlerle yayın, yedek/geri dönüş ve canlı ölçümler. Kod testleri bütün planın tamamlandığını kanıtlamaz. Tarayıcı kanıtı şu an yalnız sentetik görev kalıcılığı senaryosunu kapsar; kapsamlı uçtan uca ve canlı kabul henüz yoktur. ## Çıktı doğrulaması sırasındaki değişiklikler Dosya kontrolü sürerken form/kaynak veya oturum değişirse çıktı iptal edilir. Kontrol penceresi tıklama sırasında açılır; doğrulama hatasında kapatılır. Aynı anda ikinci çıktı başlatılmaz. Taslak kaydı sürerken yapılan yeni değişiklikler, önceki kaydın yanıtı geldiğinde kaydedilmiş sayılmaz. Mevcut 35 test ve derleme geçti; bu yarış senaryolarının gecikmeli tarayıcı kabulü ayrıca bekliyor. ## Excel teklif cetveli Hazırlık formuna gerçek XLSX çıktısı eklendi; aynı seçili satırlar ve fiyat ayrıştırıcısı kullanılır. Miktar/fiyatlar sayı hücresidir, satır tutarları yuvarlanan formüller ve önceden hesaplanmış sonuçlarla yazılır. Türkçe başlıklar, firma/İKN/kısım, tekrarlanan baskı başlıkları, filtre ve sabit başlık satırı bulunur. Götürü bedelde birim fiyat cetveli düğmeleri kapalıdır. İki XLSX testi dosyayı üretip yeniden okuyarak 100 satır, Türkçe, 125,50 fiyat ve 25.100 toplamını; ayrıca 0,335 hassasiyet ve 1,01 yuvarlamasını doğrular. Kullanıcı metni formüle çevrilmez. PDF birim fiyat gösterimi de sekiz ondalığa kadar hassasiyeti korur. Tarayıcı indirme ve masaüstü Excel baskı görünümü kabulü bekliyor. ExcelJS ayrı, ihtiyaç anında yüklenen pakettir. Node bağımlılığındaki UUID için uyumlu 11.1.1+ override ve mevcut nanoid yaması uygulandı; npm audit sıfır bulgu döndürdü. Bu sonuç paketlerin önceden derlenmiş tarayıcı içeriğinin bağımsız denetimi değildir. Mevcut büyük paket uyarıları sürer. ## Analiz bütünlüğü AI çıktısına kaynak içerik özeti (SHA-256 sürümü), kaynak/işlenen karakter sayısı, bölüm çıkarım durumu ve kısmi analiz gerekçeleri eklendi. Girdi sınırında kesilen metin, onarılan yarım JSON ve bilinen kaynak sayısından az kalem kısmi sayılır. Hazırlık formu bunu saklar ve çıktıyı engeller. Boş bölüm, şartın bulunmadığı olarak yorumlanmaz. Derin analizdeki 20 kalem kısıtı kaldırıldı; çıktı sınırını aşan analiz yine eksik işaretlenir. İki test kesilme, onarma, eksik kalem, boş bölüm ve kaynak değişimini doğrular. 39 test ve derleme geçti. Bu adım tam uzun doküman işleme değildir: parçalı analiz/birleştirme, OCR, sayfa/madde atıfları ve hukuki çelişki denetimi hâlâ açık. Kısmi analizi tamamlamak için gerekli uzun doküman akışı ayrıca geliştirilmeli; yalnız uyarı eklenmiş olması D06 tamamlanması değildir. ## Uzun doküman analiz akışı 24.000 karakter üzerindeki kaynak artık tamamı kapsanacak biçimde parçalara ayrılır; aynı anda en fazla iki bölüm işlenir. Kaynak aralıkları ve başarısız bölümler raporlanır. Kalemler kaynak bölümüyle korunur; birbirinin aynısı görünen farklı satırlar otomatik silinmez. Belgeler/şartlar birleştirilir; farklı miktarlar çelişki olarak işaretlenir. Parça bazlı fiyat önerileri küresel teklif önerisine taşınmaz. Üç kontrollü test metnin sonuna kadar kayıpsız kapsamayı, başarısız bölüm/çelişkiyi ve aynı görünen ayrı satırların korunmasını doğrular. Canlı AI sağlayıcısı ve üretim proxy zaman aşımı bu testlerde kullanılmadı. Uzun işlemleri sürdürülebilir iş kuyruğuna alma, kopma sonrası devam, gerçek kaynak sayfa/madde eşleştirmesi ve parçalar arasında bölünen tablo bağlamının doğrulanması açık. Önceki eksik analiz uyarısı tek başına çözüm değildi; bu akış işlemeyi ilerletir, D06'nın tümünü kapatmaz. ## Kaynak alıntıları Modelden bulguya bağlı birebir kaynak alıntısı istenir. Sunucu, bulgu indeksinin mevcut olduğunu ve alıntının gerçekten işlenen metinde yer aldığını denetler; tekil konum, tekrarlı alıntı ve bulunamayan alıntı ayrılır. Uzun analiz birleştirmesi bulgu indekslerini yeniden eşler. Raporda okunabilir bulgu başlığıyla alıntılar ve doğrulanamayan bulgu sayısı gösterilir. Modelin verdiği sayfa numarası doğrulanmış kabul edilmez. Bir test mevcut olmayan bulgu, yanlış kaynak, doğru alıntı ve tekrarlı konumu kapsar. Bu özellik anlamsal/hukuki çıkarımı doğrulamaz; belge görüntüsüne sayfa/madde bağlantısı ve gerçek sağlayıcı çıktılarıyla kabul ayrıca bekler. 43 test ve derleme geçti. ## İnceleme kaydı ve sayaçlar Detayda açık kullanıcı işlemiyle incelendi/yeniden aç durumu sunucuya kaydedilir. Sadece pencerenin açılması incelemenin tamamlandığı iddiasını oluşturmaz. Sağ panel Kanban durumundan inceleme sonucu çıkarmayı bıraktı; aynı incelendi alanını ve filtre ölçütünü kullanır. İncelenmiş kayıt güncel havuzdan düşerse kayıtlı snapshot korunur. Aynı ihalede süren kayıt nedeniyle reddedilen işlem artık sessiz kalmaz. İki test sayaç/filtre eşitliği ve havuz dışı kaydı kapsar. Tarayıcıda sentetik Giresun kaydı incelendi olarak işaretlenip yenilendi: incelenen1, incelenmemiş4 kaldı. [Kanıt](evidence/qa-reviewed-after-reload.txt). 45 test ve derleme geçti. ## Kullanıcı verisi yedek/geri yükleme aracı SQLite snapshot, referanslı belge kopyası, SHA-256 manifesti, bütünlük kontrolü ve yeni dizine geri yükleme eklendi. Çalışan yazıcıların durdurulması önkoşuldur; araç canlı üretim servisini kendisi durdurmaz. Bir test gerçek dosya ve hazırlık kaydının geri gelmesini, hedef üzerine yazmama ve bozuk yedek reddini doğrular. 46 test geçti. [Operasyon adımları ve kapsam sınırı](yedek-geri-yukleme.md). Üretim yedeği, tüm volume ve dağıtım geri dönüş provası hâlâ açık. ### D01 — Not kaydı sırasında yeni düzenlemenin korunması - Önceki `await mutateTender` sonrası koşulsuz metin temizleme kaldırıldı. Başarılı yanıt yalnız gönderilen taslak nesnesi hâlâ güncelse o taslağı temizliyor; aynı metne dönülmüş olsa bile yeni düzenleme korunuyor. - Kaydedilmemiş notlar bileşen oturumu içinde ihale bazında ayrılıyor. Hesap değişikliğinde temizleniyor; eski hesaptan/geçmiş oturumdan gelen yanıt başka taslağı temizleyemiyor. Bu geçici taslaklar sayfa yenilemesi için kalıcı kayıt değildir; Not Ekle ile sunucuya kaydedilen notlar mevcut kalıcı kayıt yolunu kullanıyor. - Not alanına erişilebilir ad eklendi, kayıt beklerken/boş metinde gönderim düğmesi devre dışı bırakıldı. Kullanılmayan eski kaşe sürükleme durumu kaldırıldı. - Doğrulama: 48/48 otomatik test ve üretim derlemesi geçti. İki yeni test gecikmiş yanıt, yeni düzenleme, aynı metne geri dönme, başka ihale ve hesap/oturum ayrımını kapsıyor. Gerçek tarayıcıda geciktirilmiş kayıt senaryosu bu adımda çalıştırılmadı. Mevcut paket boyutu uyarıları sürüyor. - Tam plan, resmi beş dosya kabulü ve canlı yayın hâlâ tamamlanmış sayılmıyor. ### D02 / D09 — Sunucu tarih hesabı ve takip tüketicileri - RSS/MCP açık ihale filtresi ve yaklaşan ihale API’si arayüzle aynı `deadlineInfo` hesabını kullanıyor. Bugün saati geçmiş kayıt yaklaşan listeden çıkarılıyor; bilinmeyen saat `saat_dogrulanmali` ile ayrılıyor. Geçersiz tarih yaklaşan listeye alınmıyor; genel aramada kaydı gizlemek yerine korunuyor. - Yaklaşan liste, haftalık özet, zeyilname takip haritası ve plan takip sayacı güncel tender_state kayıtlarını okuyor. Eski takip listesi uyumluluk için okunuyor ancak güncel açık takipten çıkarma kararı eski kopyaya üstün geliyor. Havuz dışında kalan takipli kayıtlar saklanan anlık görüntüden yaklaşan listeye katılıyor. - Haftalık özetin HTML/metin çıktısında saat ve Türkiye saati etiketi veya saat doğrulama uyarısı var. Pazartesi 08.00 zamanlama hesabı sunucu yerel saatinden bağımsız. İlan aciliyet günü de ortak tarih hesabını kullanıyor. - Kanıt: 51/51 otomatik test geçti. Yeni testler üç sunucu saat dilimi, İstanbul/UTC gün sınırı, geçersiz tarih, geçmiş saat, eksik saat, takipten çıkarma, havuz dışı kayıt, hesap ayrımı ve haftalık çalışma sınırını doğruluyor. Gerçek e-posta/Telegram/push gönderilmedi; teslim ve yeniden deneme senaryoları hâlâ açık. Resmi takvim içe aktarımı ve tüm zeyilname akışı tamamlanmış sayılmıyor. ### D06 — AI iç alan şeması ve bozuk parça yalıtımı - Analiz listelerinin iç elemanları, metin alanları, belge zorunluluğunun gerçek boolean olması, teknik özellik listeleri, parasal sayı alanları, olasılık sınırı, yol haritası adımı ve kaynak alıntısı nesneleri sunucuda doğrulanıyor. Yanlış türler kullanıcı arayüzüne aktarılmadan hata üretiyor. - Kalem adı/miktar veya belge adı/zorunluluk bilgisi eksikse kaynak incelemesi `partial` oluyor. Kaynakta bulunmayan miktar veya zorunluluk değeri uydurulmuyor. - Parçalı analizde şema doğrulaması birleştirmeden önce yapılıyor. Null kalem/alıntı gibi hatalı bir parça tüm birleştirmeyi çökertmiyor; başarısız kaynak aralığı olarak korunuyor. Hiçbir geçerli parça yoksa analiz başarısız oluyor. - Kanıt: 54/54 test geçti. Yeni regresyonlar hatalı nested alanlar, metin olarak false, eksik miktar/zorunluluk, bozuk parça ve tamamen başarısız belgeyi kapsıyor. Mevcut test örneklerinden iki olumlu fixture kaynak miktarı/zorunluluk bilgisi içerecek şekilde tamamlandı. - Sınır: Bu şema doğrulaması anlam veya mevzuat doğruluğunu kanıtlamaz. Gerçek sağlayıcı yanıtları, kaynak belgeyle semantik çelişki kontrolü ve uzun işlerin kalıcı devam ettirilmesi hâlâ açık. ### D09 — İhale detayında klavye erişimi - Ana listedeki ihale başlığı gerçek düğme oldu; Enter/Space ile detay açılabiliyor, görünür klavye odağı ve dialog işareti var. - Detay penceresine dialog rolü, başlığıyla erişilebilir ad, kapatma düğmesine ad, başlangıç odağı, Tab/Shift+Tab döngüsü ve Escape ile kapanış eklendi. Kapanışta hâlâ DOM’da bulunan açan kontrole odak dönüyor. İç içe başka dialogdan gelen olaylar alt pencereyi kapatmıyor. - Tarayıcı kanıtı: `evidence/qa-detail-keyboard.txt`. Yerel sentetik Giresun kaydı başlık düğmesinden Enter ile açıldı; ilk/son kontrol arasında ileri-geri döngü ve Escape sonrası başlık düğmesine dönüş doğrulandı. Sağdaki yaklaşan ihale düğmesinden açılış/dönüş de geçti. - Üretim derlemesi geçti; mevcut paket boyutu uyarıları sürüyor. Bu kontrol bütün modallerin erişilebilirliğini, ekran okuyucu deneyimini veya gerçek mobil genişlikleri doğrulamaz. Arka planın inert yönetimi ve üst üste farklı modallerin tüm kombinasyonları ayrıca ele alınmalı. ### D04 / D06 — Havuz ve analiz kalemlerinin farklı olması - Önceden havuzda en az bir kalem olduğunda analiz kalemleri sessizce kullanılmıyordu. Form artık iki dolu listenin ad/miktar/teknik özellik envanterini karşılaştırıyor; farklılık varsa kaynak seçilene kadar çıktı hazır sayılmıyor. - Kullanıcı resmi cetvelle karşılaştırarak ihale havuzu veya doküman analizi listesini seçebiliyor. Seçim taslakla kaydediliyor; liste içeriği ya da analiz belge sürümü değişirse yeniden seçim gerekiyor. Seçim, kaynak ve uygunluk incelemesi yerine geçmiyor. - Kaynak anlık görüntüsü kullanılmayan analiz listesini de içeriyor; analiz listesi değişimi önceki kaynak onayını geçersizleştiriyor. Fiyatlar seçilen gerçek satır kimlikleriyle eşleniyor. - Bekleyen taslak kaydı sonrasında kapatılmış bileşene hata yazılması da önlendi. - Kanıt: 55/55 test ve üretim derlemesi geçti. Testler iki farklı miktar listesi, açık seçim, sürüm/liste değişimi ve aynı satırların farklı sırada bulunmasını kapsıyor. Gerçek resmi cetvellerin semantik eşleştirmesi ve kaynak seçiminin tarayıcıda uçtan uca kabulü hâlâ açık; farklı isimlendirmeler kullanıcı karşılaştırması gerektirebilir. ### D01 / D09 — Belge tarihi ve yükleme doğrulaması - Son kullanma tarihini kaldırma artık eski tarihi korumuyor: PATCH alanının gönderilmemesi ile açık null gönderilmesi ayrıldı. Kategori değişikliği tarihi, tarih değişikliği kategoriyi koruyor. - Yükleme ve üst veri güncellemesinde gerçek takvim günü doğrulanıyor; 31 Şubat, artık yıl olmayan 29 Şubat, tarih sonuna eklenen metin ve yanlış türler reddediliyor. - Dosya aktarımının base64 kodlaması ve 10 MB dosya sınırı doğrulanıyor. Bozuk kodlamanın boş veya kısmen çözülmüş dosya olarak kaydedilmesi önlendi. Bu kontrol PDF/DOCX iç yapısının sağlam olduğunu kanıtlamaz; ayrıştırma/OCR hata senaryoları açık. - Kanıt: genişletilen HTTP testleriyle 55/55 test geçti; bozuk yükleme ve tarih isteği 400, diğer hesabın tarih silmesi 404, geçerli silme ve kategori koruma doğrulandı. 10 MB tam sınırı ve bir bayt fazlası ayrıca gerçek Buffer ile geçti. Gerçek dosya indirme ve bayt eşitliği regresyonu geçti. Tarayıcıda ardışık tarih güncelleme yarışı ayrıca incelenmeli. ### D01 — Dosya kaydı başarısızlığında temizlik - Yeni yükleme tek servis üzerinden benzersiz ad ve exclusive write ile yazılıyor; metadata INSERT başarısızsa yalnız bu yüklemenin baytları siliniyor. Temizlik de başarısızsa ayrı hata veriliyor. Önceden mevcut dosyalara dokunulmuyor; yeni dosyanın izinleri 0600. - Fiziksel silme sırasında yalnız ENOENT (zaten yok) tolere ediliyor. Erişim/tür/disk hataları artık bastırılmıyor; belge metadata kaydı silinmeden hata dönüyor. - Kanıt: 57/57 test geçti. SQLite trigger ile gerçek INSERT hatası üretildi; dosya listesi değişmedi ve önceden kayıtlı Türkçe belge baytları korundu. Dizin üzerinde unlink hatasıyla metadata koruması ve diğer hesabın silme reddi doğrulandı. Mevcut HTTP yükleme/indirme testi geçti. - Kalan sınır: süreç aniden kapanırken dosya/DB arasında tam atomiklik ve fiziksel silme sonrasındaki DB silme hatasının kurtarılması henüz çözülmüş değildir. Bunlar dosya yaşam döngüsü kapsamında açık tutuluyor; tam belge dayanıklılığı kabulü verilmedi. ### D09 — PWA önbelleği ve gerçek durum açıklaması - PWA ekranındaki çalışmayan aç/kapat benzeri düğme kaldırıldı; düğme gerçekten Cache API üzerinden İhaleist önbellek durumunu yeniden okuyor. Destek/hata/bekleme durumları gösteriliyor. Koşulsuz “Senkronize” yerine bağlantı durumu var; bağlantının sunucuya erişim garantisi olmadığı belirtiliyor. - Ürün metni mevcut davranışla hizalandı: uygulama kabuğu açılabilir, özel belge/hazırlık kaydı için bağlantı gerekir; çevrimdışı yazma kuyruğu varmış gibi sunulmuyor. - Service worker v3 yalnız bilinen kabuk ve varlık yollarını önbellekliyor. API, authorization başlıklı istekler ve rastgele GET yolları ağda kalıyor. Başarısız/yanlış MIME yanıtları sağlam kabuğu veya JS/CSS’yi bozamıyor; HTML yedeği varlık isteğine dönmüyor. Aktivasyon sadece eski İhaleist cache adlarını temizliyor. - Kanıt: gerçek sw.js kodunu VM içinde fetch/activate olaylarıyla çalıştıran iki regresyon eklendi; 59/59 test ve üretim derlemesi geçti. API/özel yol, authorization, sunucu 500, offline kabuk, offline asset, yanlış MIME ve başka uygulama cache’ini koruma kontrol edildi. - Sınır: VM testleri gerçek service worker kurulumu/güncellemesi veya cihazda offline kullanım kabulü değildir. Bunlar ve hesap değişiminin gerçek tarayıcıdaki tüm PWA senaryoları hâlâ açık. ### D02 / D05 — Ana liste tarih filtresi ve sıralaması - Acil/uzak sıralamada gg.aa.yyyy metninin alfabetik karşılaştırılması kaldırıldı; yıl/ay/gün ve aynı gün içinde saat karşılaştırılıyor. Tarihi bilinmeyenler iki yönde de sonda kalıyor. - Ana liste, özet kartları ve canlı üst sayacın açık ihale hesabı ortak deadlineInfo ile çalışıyor; 30 saniyelik saat güncellemesi sayfa açıkken süre dolmasını yansıtıyor. İptal/sonuç/sözleşme ve kazananı bilinen kayıtlar açık kabul edilmiyor. Tarih veya saat bilinmiyorsa uydurulmuyor. - Filtre etiketi ve açıklaması eksik tarihli kaydın kesin açık olduğu izlenimini azaltacak şekilde güncellendi; sıralama alanına erişilebilir ad eklendi. Bugün/önceki ziyaret gün anahtarı Türkiye saatine bağlandı. - Kanıt: 61/61 test ve build geçti. Ay/yıl geçişi, aynı gün saat sırası, bilinmeyen tarih, tam son teklif anı, eksik saatte Türkiye gece yarısı ve kapalı durumlar test edildi. Yeni eklenenler sıralamasının kayıt kimliği kullanımı, tüm kaynakların ilan zamanı doğrulaması ve tarayıcıda saat ilerletme kabulü hâlâ açık. ### D03 / D09 — İhale listesinde gerçek Excel çıktısı - Ana listedeki Excel düğmesinin CSV/data-URI çıktısı gerçek XLSX ile değiştirildi. Tıklama anındaki filtrelenmiş listenin tamamı, yalnız görünür ilk 20 kayıtla sınırlanmadan aktarılıyor; ihale saati ve kaynak bağlantısı da çıktı alanlarına eklendi. - Türkçe metin, virgül, satır sonu, #, & ve İKN metin olarak korunuyor. Kaynak metni Excel formülüne dönüştürülmüyor. Başlık sabitleme ve otomatik filtre var. - Çıktı hazırlanırken düğme bekleme gösteriyor; hata görünür. Ekran kapatılır veya oturum değişirse geç gelen dosya indirmesi iptal ediliyor. Boş liste dışa aktarımı engelleniyor. - Kanıt: 125 satırın gerçek XLSX yeniden okunması, ilk/son kayıt, saat, CPV, kaynak ve = ile başlayan metin hücresi testi geçti. 62/62 test ve build geçti. Tarayıcıdan dosya indirme ve masaüstü Excel açılışı bu adımda yapılmadı; tüm çıktı kabulü henüz tamamlanmış sayılmıyor. ### D05 — Yayın zamanına göre yeni ilan sıralaması - “En yeni” artık kayıt kimliğine göre değil doğrulanabilir yayın tarihi/zamanına göre sıralanıyor. Alan etiketi “Yayın Tarihi: En Yeni” olarak açıklandı. Tarihi bilinmeyenler sonda; aynı günde saati bilinmeyenler kesin saatli kayıtların ardından geliyor. - ISO/ofsetli zamanlar Türkiye gününe dönüştürülüyor; Türkçe kaynaklardaki ofsetsiz saatler İstanbul kabul ediliyor. Geçersiz takvim günü/saat reddediliyor; varsa ayrı ilan tarihi kullanılıyor. Süre metni veya keyfi kayıt kimliği yayın zamanı olarak yorumlanmıyor. - Bugün eklenenler hesabında bilinen yayın tarihi, eskimiş isYeni bayrağına üstün geliyor. Uyum puanı eşitliğinde de kimlik yerine yayın sırası kullanılıyor; sayısal id nedeniyle localeCompare hatası ortadan kalktı. - Kanıt: yayın zamanı regresyonuyla 63/63 test ve build geçti. UTC/Türkiye gün sınırı, ofsetsiz saat, farklı türde kimlik, geçersiz tarih ve eski isYeni bayrağı doğrulandı. Kaynakların gerçek saat dilimi sözleşmelerinin tek tek teyidi ve gerçek veriyle görsel kabul hâlâ açık. ### D05 — Türkçe arama ve sorguya bağlı kalem sonuçları - Başlık/kurum/İKN/kalem araması ortak normalizasyon kullanıyor: Türkçe büyük-küçük harf, birleşik Unicode karakterleri, noktasız ı ve fazla boşluklar aynı şekilde ele alınıyor. Metin ve nesne biçimindeki kalem özetleri destekleniyor. - Tam kalem havuzu eşleşmeleri artık üretildikleri sorgu ile saklanıyor. Kullanıcı yeni sorguya geçtiği render anında önceki sorgunun eşleşme haritası kullanılmıyor; debounce/ağ beklerken eski sonuçlar yeni aramaya karışmıyor. Mevcut geç yanıt iptal kontrolü korunuyor. - Kanıt: Türkçe alan eşleşmeleri ve hemogram → mikroskop sorgu geçişi regresyonlarıyla 65/65 test ve build geçti. Gerçek arama sağlayıcısının tüm eşanlamlı/tıbbi ürün kapsamı ve tarayıcıda geciktirilmiş ağ kabulü henüz doğrulanmadı. ### D01 / D05 — Detay yükleme hatası ve yeniden deneme - İlan detayını yüklerken boş kaynak metni artık sessiz başarı/boş ekran olarak bırakılmıyor. Yükleniyor, hata ve yeniden deneme durumları detay penceresinde gösteriliyor. - Detay isteğine 30 saniye zaman aşımı ve iptal sinyali eklendi; pencere kapatıldığında/ihale değiştiğinde istek durduruluyor ve geç yanıt önceki kayda uygulanmıyor. - Kaynak detayının kullanıcıya özel görev/not/taslak alanlarını ezmemesi için yanıt publicTender süzgecinden geçiriliyor. - Kanıt: boş başarılı yanıt, sonraki başarılı deneme, HTTP 503, zaman aşımı ve iptal regresyonuyla 66/66 test ve build geçti. Gerçek kaynakta hata→yeniden deneme tarayıcı kabulü ve tüm kaynak türlerinin detay akışları ayrıca açık. ### D06 — Teklif geçerlilik süresinin kaynaklı aktarımı - Analiz sonucunda procurementTerms.bidValidity alanı sunucuda tüketilen kaynak metinden üretiliyor: gün sayısı, bulunan/bulunamayan/çelişkili durumu, birebir alıntı ve karakter aralığı. Teslimat/garanti günleri teklif geçerliliği olarak seçilmiyor. - Form bu yapılandırılmış değeri ve ilan maddelerini birlikte kullanıyor; sonuç taslakla saklanıyor ve kaynak sürümü kontrolüne katılıyor. Bulunan kaynak alıntıları kullanıcıya gösteriliyor. Birden fazla farklı süre varsa ilkini sessizce seçmek yerine çıktı engelleniyor. - Süre alanında pozitif tam gün isteniyor. Mevcut kullanıcı düzenlemesi yeni analizle sessizce ezilmiyor; kaynak koşulundan kısa süre hazır kabul edilmiyor. - Kanıt: büyük harfli Türkçe madde, parantezli yazıyla sayı, 120 günün analiz/JSON saklama/form kaynağına aktarımı, tekrar aynı süre ve 120/60 çelişkisi testleriyle 68/68 test ve build geçti. - Sınır: Açıkça etiketlenmiş sayısal Türkçe maddeler destekleniyor; salt yazıyla ifade, OCR bozulması ve farklı madde biçimleri manuel kaynak kontrolü gerektirebilir. Bu, tüm ihale koşullarının ortak veri modeline taşındığı veya hukuki çelişki denetiminin tamamlandığı anlamına gelmez. ### D06 — Kaynaklı teklif türü aktarımı - Açık teklif türü etiketi veya teklif verileceğini belirten desteklenen maddelerden birim/götürü türü ve alıntı konumu çıkarılıyor; procurementTerms içinde analiz/taslak kaydına taşınıyor. - Kaynak türü bilinmeyen yeni form otomatik birim fiyat seçmiyor. Kullanıcı resmi dokümanla seçim yapıyor. Kaynakla ters seçim iki yönde de engelleniyor; ilan/analiz farklı türler içeriyorsa çözülmeden çıktı alınamıyor. - Sadece “birim fiyat” geçen örnek tablo veya “götürü bedel teklif verilemez” ifadesi pozitif tür tespiti sayılmıyor. Kalem bulunamaması türü değiştirmiyor. - Kanıt: açık birim/götürü maddesi, Türkçe büyük harf, negatif hüküm, eksik liste ve iki tür çelişkisi testleriyle 69/69 test ve build geçti. Kaynak metni biçimleri sınırlıdır; karma teklif türüne ayrı çıktı üretimi ve tüm mevzuat/sözleşme türleri bu adımda tamamlanmadı. ### Birleşik tarayıcı kontrolü — güncel form ve liste - Canlı olduğu lsof ile doğrulanan yerel QA sunucusu (127.0.0.1:5173, sentetik beş ihale) üzerinde güncel arayüz kontrol edildi. - Acil tarih sırası Aksaray 9 Eylül → Giresun 10 Eylül → Tepecik 11 Eylül → Akdeniz 22 Eylül 10.30 → Kayseri 22 Eylül 11.00 olarak geçti. “ GİRESUN ” araması tek Giresun kartına indi. - Yeniden açılan kayıtlı Giresun taslağında firma alanları, geçerlilik 120 gün, birim fiyat ham değeri 125,50, toplam 251,00 TL, kısım 1 ve belge kontrol notu korundu. Resmi kaynak onayı/bağlı belge eksik kaldığından gözlenen PDF çıktı düğmeleri devre dışıydı. Hiçbir gerçek uygunluk onayı veya teklif gönderimi yapılmadı. - Kanıtlar: `evidence/qa-integrated-search.txt`, `evidence/qa-integrated-form.txt` (yalnız yapay test firma verisi). - Excel düğmesi sonrası arayüz hata göstermedi; ancak download olayı 3 saniye ve yeniden denemede 15 saniye içinde gözlenemedi. İndirme GEÇTİ sayılmadı; tarayıcı olay izlemesi mi uygulama indirme yolu mu ayrıştırılmalı. Önceki dosya üretme/yeniden okuma testi bu uçtan uca açığı kapatmaz. - Bu kanıt resmi beş ihale dosyası kabulü değildir; sentetik yerel regresyondur. Gerçek mobil viewport, gerçek belge ve resmi gönderim doğrulaması açık. ### D03 / D09 — Görünür Excel indirme bağlantısı - Liste dışa aktarımı artık “Excel Hazırla” → dosya adı/kayıt sayısı/hazırlanma saati → doğrudan indirme bağlantısı akışını kullanıyor. Asenkron üretim sonrası görünmez programatik tıklamaya bağımlılık kaldırıldı; hazır dosya tekrar indirilebilir. - Oluşan blob bağlantısı yeni dosya hazırlanırken veya ekran kapanırken temizleniyor. Oturum değişince eski hazır dosya bağlantısı gösterilmiyor. Çıktı tıklama anındaki sonuç kümesini temsil ediyor; yeni filtre için yeniden hazırlama gerekiyor. - Tarayıcıda beş sentetik ihale için dosya hazır durumu ve `.xlsx` bağlantısı görüldü, doğrudan bağlantı tıklandı. Kanıt: `evidence/qa-excel-ready-link.txt`. Üretim derlemesi geçti; dosya içeriği için önceki XLSX roundtrip regresyonu geçerlidir. - İndirme geçmişini kontrol etmek üzere chrome://downloads erişimi tarayıcı URL güvenlik politikası tarafından engellendi; başka yoldan bu geçmişe erişilmedi. Diskte nihai dosya ve masaüstü Excel açılışı doğrulanmış sayılmıyor. Önceki indirme olayı zaman aşımının kesin kök nedeni henüz belirlenmedi. ### D01 / D06 — Firma belgesi ve ortak kalem havuzu ayrımı - Belgelerde kalıcı `tur` alanı (firma/ihale) ve idempotent migration eklendi. Eski belgeler firma türünde kalıyor; kategori adından yayın yetkisi türetilmiyor. Liste türü açıkça gösteriyor. - Genel belge yüklemesi firma olarak kaydediliyor ve otomatik kalem yayınlamıyor. İhale detayındaki doküman yükleme ve açık toplu ihale yükleme akışları ihale türünü belirtiyor. - /api/kalem/cikar artık belge kimliği, sahiplik, ihale türü ve aynı İKN bağı şartlarını kontrol ediyor. Başka hesaba ait dosya, farklı ihale, firma belgesi veya belgesiz metin ortak havuza yazılamıyor. PDF istemcileri yüklenen belge kimliğini iletiyor. - Kanıt: gerçek HTTP akışında firma ve ihale dosyası yükleme; kategori adını değiştirerek yükseltme girişimi; farklı hesap/İKN ve belgesiz çağrı reddi; doğru dokümanla boş cetvel ayrıştırma başarı yolu test edildi. Eski şema migration testinde varsayılan firma türü doğrulandı. 70/70 test ve build geçti. - Yayın notu: frontend ve backend birlikte yayımlanmalı; eski istemcinin belgesiz kalem POST’u artık reddedilir. Önceden yüklenmiş resmi dokümanlar otomatik ortak yayın yetkisi kazanmaz; kontrollü yeniden sınıflandırma akışı henüz yok. Geçmişte havuza yazılmış kayıtların köken denetimi ve gerçek PDF/OCR bütünlüğü ayrıca açık. ### Belge yükleme ve işleme sonuçlarının ayrılması D01 kapsamında `belgeler.isleme` sürümlü migration ile eklendi. Dosyanın kaydedilmesi artık kalem çıkarımının başarılı olduğu anlamına gelmiyor: bekleyen metin, kalemsiz sonuç, desteklenmeyen biçim, eksik İKN, firma belgesi ve işleme hatası ayrı saklanıp iki belge ekranında gösteriliyor. Yetkisi doğrulanmış çıkarım isteğinin hatası kalıcı kaydediliyor; sonraki başarılı yeniden deneme durumu değiştirebiliyor. Toplu yüklemede liste yenileme hatası kaydedilmiş dosyayı başarısız yükleme olarak etiketlemiyor. Doğrulama: 70 otomatik test ve üretim derlemesi geçti. Gerçek HTTP testinde özel firma belgesi, bekleyen ihale metni, yetkisiz istek, bozuk metin → hata → yeniden deneme → kalemsiz sonuç ve ayrı GET üzerinden kalıcı durum kontrol edildi. Mevcut bundle boyutu/import uyarıları sürüyor. Sınırlar: Bu paket tam belge yaşam döngüsü kabulü değildir. Tarayıcıda PDF okuma hatasının sunucuya kalıcı aktarımı, ekrandan mevcut belgeyi yeniden işleme, dosya/DB çökme atomikliği ve gerçek resmi dosyalarla uçtan uca kabul halen tamamlanmadı. Canlıya dağıtım yapılmadı. ### Kaydedilmiş ihale dokümanında yeniden kalem çıkarımı İhale detayında okunabilir, erişilebilir ihale dosyalarına yeniden kalem çıkarımı eklendi. Aynı dosya indirilip metni çıkarılıyor veya mevcut sunucu metin çıkarıcısı kullanılıyor; aynı documentId ile yetkili kalem aktarımı yeniden çağrılıyor. Yeni dosya yüklemesi gerekmiyor. İşlem sırasında silme engelleniyor; sonuç veya hata görünür, belge listesi yeniden okunuyor. Liste okuma hatası artık sessizce yutulmuyor; yükleniyor, hata ve yeniden yükle durumları var. Eski liste isteğinin yeni ihale listesini ezmesi istek numarasıyla önleniyor. Belge satırları dar alanda sarılabiliyor. Doğrulama: üretim derlemesi geçti; HTTP testi, başarısız çıkarım ve yeniden deneme sonrasında aynı belge kaydının ve orijinal dosya baytlarının korunduğunu kontrol ediyor. Bu düğmenin tarayıcı kabulü, genel Doküman Deposu'na aynı işlemin taşınması ve tarayıcı metin okuma hatasının sunucuda kalıcılaştırılması henüz tamamlanmadı. ### Tarayıcı metin okuma hatasının kalıcı aktarımı İhale detayındaki yükleme ve yeniden kalem çıkarımı, dosya metni okunamadığında sahiplik kontrollü read-error uç noktasına hata bildiriyor. Sunucu serbest hata metni veya başarı durumu kabul etmiyor; sabit, kullanıcıya yönelik okuma hatasını saklıyor. İstemcinin gördüğü önceki işleme durumu atomik UPDATE koşuluyla karşılaştırılıyor; gecikmiş hata bildirimi daha yeni sonucu ezemiyor (409). Bildirim kaydedilemezse arayüz bunu ayrıca belirtiyor. 70 test geçti. HTTP kapsamında oturumsuz/başka hesap/firma belgesi reddi, kalıcı hata ve eski durumla tekrar bildirimin 409 olması doğrulandı. Mevcut dosya ve baytları sonraki çıkarım denemelerinde korunuyor. Gerçek PDF ile tarayıcı kabulü ve genel depoya yeniden işleme entegrasyonu açık; bu değişiklik tam D01 kabulü sayılmıyor. ### Genel belge deposunda yeniden işleme Doküman Deposu'nda İKN bağlantılı, okunabilir ihale belgelerine yeniden kalem çıkarımı eklendi. İhale detayı ve depo artık aynı storedDocument servisiyle mevcut dosyayı okuyor, okuma hatasını kaydediyor ve sahiplik kontrollü kalem aktarımı yapıyor. Özel firma belgeleri bu işleme dahil değil. İşlem sonucu ve liste yenileme hatası ayrı gösteriliyor. Belge okuma sırasında oturum değişirse eski belge metninin yeni oturumla aktarımı veya hata bildirimi durduruluyor. 71 test geçti; üretim derlemesi geçti. Yeni servis testi mevcut dosya ID/İKN/metin aktarımını, okuma hatasının önceki durumla raporlanmasını ve hesap değişikliğinde ikinci isteğin gönderilmemesini doğruluyor. Gerçek tarayıcı PDF kabulü ve tüm depo işlemlerinin hesap değişiminde ekran durumlarını temizlemesi henüz açık. ### Depo oturum ayrımı ve dosya aktarımı Doküman Deposu hesap kimliğine göre yeniden oluşturuluyor; eski bileşenden veya değişmiş token'dan gelen sonuçlar durum güncellemesine uygulanmıyor. Toplu yüklemenin sonraki dosyası ve kalem aktarımı öncesinde oturum kontrolü var. Ortak yükleme servisi FileReader tamamlandığında token değişmişse istek göndermiyor; ortak indirme servisi blob tamamlandığında token değişmişse tarayıcı indirmesi başlatmıyor. Bu kontroller sunucunun sahiplik kontrollerine ek olarak istemcide eski oturum işinin devamını sınırlıyor. 72 test ve üretim derlemesi geçti. Yeni test, FileReader sırasında hesap değiştiğinde sıfır yükleme isteği gönderildiğini ve blob okuma sırasında hesap değiştiğinde indirmenin reddedildiğini doğruluyor. Gerçek tarayıcıda çok dosyalı yükleme/hesap değişimi kabulü, aynı hesapta eşzamanlı metadata yanıt sıralaması ve diğer modüllerin oturum denetimi halen açık. ### Gerçek tarayıcıda PDF yükleme/yeniden işleme kabulü Güncel backend için ayrı localhost:5174 QA örneği açıldı (önceki 5173 örneğine dokunulmadı). In-app tarayıcıda sentetik Giresun kaydına iki dosya yüklendi: okunabilir, cetvel içermeyen PDF ve kasıtlı bozuk PDF. Okunabilir PDF kalemsiz sonuç verdi; aynı dosyada yeniden çıkarım 0 kalem sonucunu gösterdi. Bozuk PDF kaydı korundu, okuma hatası kalıcı göründü. Genel depoya geçiş ve sayfa yenilemesi sonrasında iki dosya ve ayrı durumları korundu; depodaki yeniden çıkarım bozuk dosya hatasını gösterdi, belge sayısı 2 kaldı. Tarayıcı testinde bulunan İngilizce PDF istisnası kullanıcıya yönelik Türkçe mesaja dönüştürüldü; depodaki eski 8 MB metni sunucunun 10 MB sınırıyla eşitlendi. Türkçe hata tarayıcıda tekrar doğrulandı. 72 test ve üretim derlemesi geçti. Kanıt: evidence/qa-document-upload.txt (ilk hata metni dahil), evidence/qa-document-vault-retry.txt (düzeltme sonrası). Test dosyaları tests/fixtures/document-readable.pdf ve document-broken.pdf; resmi ihale belgesi değildir. Bu kabul OCR, 40 sayfayı aşan doküman, gerçek cetvel kalem doğruluğu veya beş resmi dosyanın tamamlanması anlamına gelmez. Bunlar halen açık. ### PDF sayfa bütünlüğü ve karma belge okuma Varsayılan 40 metin sayfası ve 8 OCR sayfası sınırı kaldırıldı; tüm sayfalar sırayla okunuyor. Karma PDF'de metni az olan sayfalar ayrı OCR'a gönderiliyor, metinli sayfalar korunuyor. OCR hatası artık başarılı metin okuma sonucuna çevrilmiyor; hata sayfa numarasıyla kullanıcıya dönüyor. Sonuç sayfa bazında metin/OCR yöntemini ve bütünlük durumunu taşıyor. Açık maxPages kullanan düşük seviye çağrı kısmi sonucu complete:false olarak işaretliyor; uygulamanın mevcut çağrılarında böyle bir sınır yok. Sayfa, canvas, OCR worker ve pdfjs yükleme görevi kaynakları serbest bırakılıyor. 76 test ve üretim derlemesi geçti. Testler 45 sayfalık gerçek PDF baytlarını pdfjs ile okuyarak son sayfa maddesinin korunduğunu; karma sayfa sırasını ve OCR hatasının başarısızlık olarak iletildiğini doğruluyor. Gerçek PDF testi kütüphanede DocumentProxy.destroy bulunmadığını ortaya çıkardı; kapatma LoadingTask.destroy üzerinden düzeltildi. Sınırlar: gerçek tarayıcıda uzun/taranmış karma PDF performansı ve OCR doğruluğu kabulü açık. Sayfa okunmuş olması OCR metninin anlamsal doğruluğunu kanıtlamaz. OCR varsayılanı metni 100 karakterden kısa sayfalarda çalışır; küçük metinli sayfalarda ek işlem maliyeti oluşabilir. Resmi dosya ve beş ihale kabulü tamamlanmadı. ### Karma PDF tarayıcı OCR kabulü ve kaynak önizlemesi Test dosyası document-mixed.pdf bir yerel metin sayfası ve Türkçe metin içeren görüntü sayfasından oluşuyor. Gerçek in-app tarayıcıda yükleme tamamlandı, kayıt korundu ve cetvel bulunmadığı gösterildi. Yeni “Metni incele” işlemi kaydedilmiş dosyayı okuyor; toplam/okunan sayfa sayısı, OCR uygulanan sayfalar ve tam çıkarılan metni AI çağrısı yapmadan gösteriyor. Önizleme ihale değişiminde temizleniyor; geç gelen başka ihale/oturum yanıtı uygulanmıyor. Tarayıcı kanıtı: evidence/qa-mixed-pdf-ocr.txt. 2/2 sayfa okundu, yalnız sayfa 2 OCR olarak işaretlendi. İKN doğru okundu; “için” ve “içerir” sözcüklerinde OCR hataları gözlendi. Dolayısıyla bu test OCR çalışmasını ve sayfa kapsamını doğrular, kusursuz metin veya resmi kalem doğruluğunu doğrulamaz. Önizlemede resmi dokümanla karşılaştırma uyarısı var. OCR doğruluğunu iyileştirme, insan kontrolünün sonraki hazırlık adımlarına zorunlu aktarımı ve uzun tarama performansı açık. 76 test ve üretim derlemesi geçti. Test dosyası sentetiktir; beş resmi ihale kabulü yerine geçmez. ### OCR ve kaynak kapsamının analiz sonucuna aktarımı Doğrudan dosya analizi, kayıtlı belge analizi ve toplu derin analiz; OCR, toplam/okunan sayfa ve eksik kaynak bilgisini API'ye taşıyor. Sunucudaki analiz nitelendirmesi bu bilgiyi modelin tamamlanma iddiasından bağımsız değerlendiriyor. OCR veya okunmayan kaynak varsa sourceReview.partial ve açık uyarı üretiliyor; uzun metin parçaları birleştirilirken bu bilgi korunuyor. Hazırlık formundaki mevcut partial engeli bu sonuçlara da uygulanıyor ve nedenler formda gösteriliyor. İstemcinin verified gibi alanları kabul edilmiyor. 78 test geçti; üretim derlemesi geçti (sonraki form uyarı metni değişikliği ayrıca diff kontrolünden geçti). Testler modelin complete iddiasının OCR/eksik sayfa uyarısını silemediğini ve atlanan dosyanın birleşik kaynak incelemesinde korunduğunu doğruluyor. Sınırlar: OCR metnini resmi kaynakla karşılaştırıp düzelterek sürümlü insan onayı verme akışı henüz yok; kontrolsüz bir onay kutusuyla engel kaldırılmadı. Eski kayıtların veya metadata göndermeyen eski istemcilerin OCR geçmişi geriye dönük çıkarılamaz. Gerçek AI sağlayıcısıyla uçtan uca kabul ve beş resmi dosya kabulü açık. ### Sürümlü düzeltilmiş belge metni — sunucu altyapısı Belge sahibinin OCR/metin incelemesini kaydetmesi için document_text_reviews tablosu ve migration eklendi. Kayıtlar kaynak dosyanın SHA256 özeti, düzeltilmiş metnin özeti, düzeltme metni, karşılaştırma notu, hesap kimliği, sunucu zamanı ve artan sürüm içeriyor. GET/POST text-review uç noktaları yalnız sahibinin ihale dokümanında çalışıyor. Beklenen dosya özeti ve önceki sürüm uyuşmazsa 409; tüm sayfaların karşılaştırıldığı beyanı, yeterli metin ve açıklama olmadan kayıt reddediliyor. Belge silinince özel inceleme geçmişi aynı DB işleminde siliniyor. Doğrulama: mevcut 78 test ve üretim derlemesi geçti; ek kaynak-dosyası-değişimi testi de geçti (toplam 79 ayrı test). HTTP testinde sahiplik, zorunlu karşılaştırma, kalıcı okuma ve eski sürüm reddi; ek testte gerçek dosya baytları değişince incelemenin stale olması ve belge silinince geçmişin kaldırılması doğrulandı. Bu yalnız sunucu altyapısıdır. Metin düzenleme arayüzü, bu kaydın analizde sunucu tarafından çözülmesi ve kontrollü hazırlık ilerlemesi henüz bağlanmadı; mevcut OCR engeli sürüyor. Kullanıcı beyanı hukuki veya otomatik doğruluk garantisi değildir. Gerçek resmi dosya kabulü açık. ### Metin inceleme formu İhale dokümanı “Metni incele” paneline DocumentTextReview eklendi. Kaynakla karşılaştırılmış düzeltme metni, sayfa/düzeltme açıklaması ve tüm sayfaları karşılaştırma beyanı alınır. Metin veya not değişince beyan sıfırlanır. Başarısız kayıt taslağı korur; sürüm uyuşmazlığında kullanıcıya taslağını kopyalayıp güncel kaydı yükleme seçeneği sunulur. Son kayıt sürümü/zamanı ve kaynak değişikliği açık gösterilir. Kayıt başarısı sunucu yanıtıyla gösterilir; bileşen kapanması/oturum değişiminden sonraki yanıtlar uygulanmaz. 79 test ve üretim derlemesi geçti. Formun gerçek tarayıcı kabulü ve kaydedilen incelemenin analizde sunucu tarafından çözülmesi henüz tamamlanmadı. Form, kayıt işleminin tek başına hazır teklif üretmediğini açıkça belirtiyor; mevcut OCR engeli devam ediyor. ### Kaydedilmiş inceleme üzerinden analiz İnceleme formunda kaydedilmiş metin/not değişmemişse “Kaydedilmiş incelemeyi analiz et” sunuluyor. İstemci belge ID ve inceleme sürümünü gönderir; sunucu kaynak dosya özeti, sahiplik, İKN ve son inceleme sürümünü kontrol ederek metni DB'den alır. İstemcinin gönderdiği alternatif metin veya OCR onay bayrağı bu yolda kullanılmaz. AI işi bittikten sonra sürüm tekrar doğrulanır; arada değişiklik varsa sonuç reddedilir. Sonuçta sunucu kaynaklı inceleyen hesap, zaman, sürüm, dosya/metin özeti ve not tutulur. Bu yol OCR uyarısını kullanıcı incelemesiyle açıklayabilir; diğer analiz kusurları ve hazırlık kontrolleri aynen uygulanır. Hazırlık formu inceleme kaynağını gösterir. İnceleme sürümü kaynak snapshot'ına katıldı; aynı kalemlerle yeni inceleme sonucu geldiğinde eski kaynak kontrolü geçersizleşir. 79 mevcut test ve ek snapshot testi geçti (80 ayrı test); üretim derlemesi geçti. Kaynak çözümleme testleri başka hesap/İKN, eski revizyon ve değişmiş dosyayı reddediyor. Gerçek AI sağlayıcısıyla tarayıcı kabulü ve çıktı anında sunucudan incelemenin hâlâ güncel olduğunun doğrulanması henüz açık. İnceleme kullanıcı beyanıdır, resmi doğruluk garantisi değildir. ### İnceleme güncelliğinin çıktı öncesi doğrulanması PDF/yazdırma akışı, canlı belge listesi kontrolüne ek olarak analizdeki humanReview kaydını sunucuda doğruluyor. İKN, sahiplik, son revizyon, gerçek dosya SHA256 ve düzeltilmiş metin SHA256 eşleşmeden çıktı ilerlemiyor. Excel oluşturma asenkron olduğu için dosya hazırlanırken oluşabilecek inceleme değişikliği indirmeden önce tekrar kontrol ediliyor. API yanıtı düzeltme metninin tamamını taşımıyor; ağ/sürüm hatasında çıktı penceresi kapanıyor ve hata gösteriliyor. 80 test ve üretim derlemesi geçti. HTTP doğrulama testinde güncel kayıt kabul edildi; başka hesap, yanlış İKN, yanlış metin özeti ve sonradan oluşturulan yeni revizyon karşısındaki eski kayıt reddedildi. Gerçek tarayıcıda çıktı sırasında inceleme değiştirme kabulü hâlâ açık. Bu kontrol çıktı anına aittir; çıktı alındıktan sonra resmi belge değişirse önceden indirilen dosya otomatik geri alınamaz. ### Metin incelemesinin gerçek tarayıcı kabulü Güncel backend ile localhost:5175 üzerinde izole test açıldı. Tek sayfalık sentetik document-readable.pdf yüklendi ve metin önizlemesi açıldı. Karşılaştırma beyanı yokken kaydetme düğmesi kapalı kaldı; açıklama ve beyanla sunucu sürüm 1'i kaydetti. Sayfa yenilemesinden sonra kaynak metin, not ve sürüm 1 korundu. İki ayrı tarayıcı sekmesi aynı sürüm 1'i açtı. İlk sekmede not güncellenip sürüm 2 kaydedildi. İkinci sekmede eski sürümle kayıt girişimi reddedildi, kullanıcı notu formda korundu ve açık sürüm hatası gösterildi. Güncel kaydı yükleme sonrasında sürüm 2 ve ilk sekmenin notu geri geldi; eski sekme kaydı ezmedi. Kanıt: evidence/qa-review-conflict.txt ve evidence/qa-review-reload.txt. Bu tur uygulama kodu değişmedi; daha önceki otomatik testlere ek gerçek UI kanıtı toplandı. Gerçek AI sağlayıcısı ile analiz sonucu ve çıktı sırasında inceleme değiştirme kabulü hâlâ açık. Sentetik tek sayfa karşılaştırması resmi ihale incelemesi değildir. ### Gerçek mobil/tablet genişlik kontrolü In-app tarayıcı viewport özelliğiyle 390×844, 768×1024 ve 1440×1000 denendi. İlk mobil görünümde 384 px kullanılabilir genişliğe karşı 513 px belge genişliği vardı; hesap düğmesi ve liste araçları kesiliyordu. Ana içerik ve listeye min-width:0/w-full, araçlara satır kaydırma, üst aramaya mobil/tablette ayrı satır eklendi. Özet kartları dar alanda sarılıyor. Hesap ve bildirim ikonlarına erişilebilir ad eklendi. Son ölçüm: mobil 384/384, tablet 762/762, masaüstü 1434/1434 (içerik/kullanılabilir genişlik; scrollbar 6 px). Mobil belge inceleme bölgesi 244/244, iki metin alanı ve kaydet/analiz düğmeleri viewport içinde. Normal viewport geri yüklendi. Kanıt: evidence/qa-responsive-widths.json. 80 test ve üretim derlemesi geçti. Bu test ana liste, üst çubuk ve belge inceleme formundaki taşmayı kapsar; tüm modüller, gerçek dokunmatik cihaz, ekran okuyucu ve bütün klavye akışları kabul edilmiş sayılmaz. ### Mobil filtre dialog ve odak davranışı Mobil filtre çekmecesi native dialog/showModal kullanıyor: adlandırılmış dialog, açılışta kapat düğmesine odak, Escape/kapat sonrası tetikleyiciye dönüş, arka sayfa kaydırma kilidi ve masaüstüne geçince otomatik kapanma eklendi. OKAS ürün arama penceresi açılırken drawer kapanıyor; native dialog üst katmanının diğer pencereyi örtmesi önleniyor. Gerçek 390 px tarayıcı testinde dialog 337/337 px genişlikle taşmadı, ilk odak “Filtreleri kapat” oldu. Escape sonrası açık dialog sayısı 0 ve odak “Filtreler & Hızlı Erişim” düğmesiydi. Açık çekmecede 1440 px'e geçiş 1 açık dialogdan 0'a geçti. Kanıt: evidence/qa-mobile-filter-keyboard.json. 80 test ve üretim derlemesi geçti. OKAS pencere geçişinin gerçek sonuçla tarayıcı kabulü, tüm filtre kombinasyonları ve ekran okuyucu testi açık. ### Ürün arama dialog erişilebilirliği Ürün arama native dialog, başlık bağlantısı, açılış odağı, açık Tab sınırları ve Escape/kapat sonrası odak dönüşü kullanıyor. Mobil iç boşluklar azaltıldı; 390 px dialog içerik genişliği taşmadı. Metin/OKAS seçimleri aria-pressed taşıyor. Tarayıcı testinde ilk uygulamada Shift+Tab BODY'ye çıktı; açık odak döngüsü eklendi. AutoFocus nedeniyle kapanış kontrolünün yanlışlıkla opener kaydedilmesi de düzeltildi; gerekli durumda header ürün arama düğmesi hedefleniyor. Son gerçek tarayıcı sonucu: ters Tab aktif INPUT ile dialog içinde; Escape sonrası 0 açık dialog ve data-product-search-trigger=true olan BUTTON odakta. Kanıt evidence/qa-product-dialog-keyboard.json. 80 test ve son üretim derlemesi geçti. Gerçek arama sonucu/ihale detay geçişi, OKAS çekmecesinden açılış ve diğer modallerin erişilebilirliği halen açık. ### Ana havuz dışı ürün arama sonucunun detayı Ürün arama sonuçlarında geçerli EKAP İKN varsa artık ana havuzda bulunmasa da detay açılır. Sonuç kararlı ekap-İKN kimliğiyle mevcut listeye eklenir; varsa sunucudan yüklenmiş kullanıcı durumu uygulanır. Böylece mevcut takip/hazırlık işlemleri aynı kayıt modeliyle çalışabilir. Detay metni İKN üzerinden ilan API'sinden alınır; yanıt başka İKN taşıyorsa reddedilir. İlan metni bulunmayıp yalnız temel bilgi dönmüşse belirgin kaynak uyarısı gösterilir. Hizmet/mal türü kaynaktan korunur; kalemler ve bilinmeyen tarih/saat uydurulmaz. 82 test ve üretim derlemesi geçti. Ek testler arama kaydının kararlı kimlik ve kaynak türüyle dönüşmesini, bilinmeyen alanları boş tutmasını, İKN endpoint seçimini, eksik resmi ilan uyarısını ve farklı İKN yanıtının reddini doğruluyor. Gerçek ürün arama yanıtından detay açma/takip kaydetme tarayıcı kabulü hâlâ açık. Ürün aramasının döndürdüğü her alanın resmi dokümanla teyidi ayrıca gereklidir. ### D05 — Gerçek ürün araması, takip kalıcılığı ve EKAP tablo alanları Yerel 5175 test hesabında gerçek `hemogram` araması 2.531 sonuç bildirdi. Ana havuzdaki beş sentetik kayıt arasında bulunmayan 2026/1431768 (İnönü Üniversitesi, Biyokimya Laboratuvarı 19 Kalem Tıbbi Sarf Malzeme Alımı) ürün aramasından açıldı. Kaynak ilan metni ve 08.09.2026 11:00 tarihi göründü. Hazırlık Görevi Aç işleminden sonra “Takipte” ve “✓ Görev açık · 08.09.2026 11:00” gösterildi. Sayfa yeniden yüklenip aynı ihale açıldığında iki durum da korundu; kaynak metni yeniden yükleniyordu. Gerçek teklif gönderilmedi. Bu test firma yeterliğini veya resmi doküman dosyasının tamamlandığını kanıtlamaz. Bu akışta kaynakta 3.3 teslim yeri ve 3.4 teslim süresi bulunurken özet alanların boş kaldığı gözlendi. `/api/documents/ilan` yanıtına mevcut kaynak alanı ayrıştırıcısı bağlandı. EKAP HTML tablolarının metne dönüşümündeki `| : |` ayraçları yalnız ayrıştırma kopyasında normalleştirildi; özgün ilan metni korunuyor. Gerçek yanıtta görülen tablo biçimiyle tarih/saat, teslim yeri ve tam teslim süresi için regresyon testi eklendi. Doğrulama: `npm test` ve `npm run build` başarılı. Mevcut büyük paket/statik-dinamik import uyarıları sürüyor. Çalışan eski test sunucusu yeni backend değişikliğini yüklemediğinden yeni özet alanlar için tarayıcı kabulü henüz tamamlanmadı. Son kanıt dosyası oluşturma denemesinde seçici zaman aşımı oluştu; dosya oluşturulduğu iddia edilmiyor. Yukarıdaki takip kalıcılığı bulgusu daha önce başarıyla dönen tarayıcı okumalarına dayanır. D01–D11 planının tümü tamamlanmış değildir. ### D06 / D09 — Teklif Asistanı işlem ve hesap ayrımı Kod incelemesinde Taslak Üret akışının belge listesini bekledikten sonra güncel token ile POST attığı doğrulandı. Hesap değişirse eski hesaptan gelen belge adları yeni hesap oturumunda gönderilebiliyordu. Belge listeleme hatası da boş diziye çevrilerek sessizce devam ediyordu. `requestOfferAssistant` tüm adımları başlangıç tokenına ve etkin görünüme bağlar. Belge listesi beklenirken hesap/ihale değişirse AI isteği gönderilmez; geç yanıtın oturumu değişmişse yanıt reddedilir. Gönderimde başlangıç tokenı kullanılır. Belge listesi yüklenememesi veya geçersiz liste kullanıcıya hata olarak döner. Envanter yalnız firma belgeleri ve mevcut İKN belgeleriyle sınırlandırılır. Teklif Asistanı durumu hesap, token oturumu veya İKN değiştiğinde yeniden oluşturulur. Bileşen kapanınca dosya okuma/AI sonucu işlenmez. Eşzamanlı düğme ve dosya işlemleri kilitlenir. Yeni kaynak dosyası yüklenince önceki yanıt/denetim temizlenir; kullanıcının düzenlediği taslak bölümleri korunur. Doğrulama: dört yeni test; belge listesi sırasında hesap değişiminde sıfır AI isteği, envanter hatasında sıfır AI isteği, doğru belge kapsamı ve başlangıç yetkilendirmesi, geç yanıtta hesap/görünüm değişimi. Tüm 87 test geçti. Üretim derlemesi başarılı; büyük paket uyarıları mevcut. Gerçek AI sağlayıcısı ve iki hesaplı tarayıcı kabulü bu turda yapılmadı. D01–D11 kapsamının tamamı halen açık. ### D06 — Teklif denetiminde kaynak kanıtı ve belirsizlik puanı Mevcut teklif denetimi model maddelerini dizi sırasıyla gerekliliklere atıyor, modelin `karsilaniyor` kararını taslak alıntısını doğrulamadan kabul ediyor ve belirsiz maddelere yarım puan veriyordu. Bunlar yüksek uygunluk oranının yanlış algılanmasına yol açabiliyordu. Yeni sunucu doğrulayıcısı gerekliliği tam metin eşleşmesiyle tekil olarak bulur; sırası değişmiş yanıtlar doğru maddeye bağlanır. Eksik, değiştirilmiş veya yinelenmiş kimlikler belirsizdir. Karşılanıyor kararında alıntı taslakta (Unicode/boşluk normalleştirmesi dışında değiştirilmeden) bulunmalıdır; yoksa karar belirsiz olur ve uydurma alıntı gösterilmez. Belirsiz satırlar yüzdeye puan eklemez. Özet modelin serbest iddiasından değil doğrulanmış satır sayılarından üretilir. Boş/bozuk üst yanıt hata verir. Ekran oranı yalnız listedeki alıntıyla desteklenen maddeler olarak açıklar; kontrol gereken madde sayısını ve resmi uygunluk/tüm doküman kabulü olmadığını gösterir. Alıntının taslakta bulunması, anlam bakımından şartın karşılandığını tek başına kanıtlamaz. Gereklilik toplamadaki mevcut örnekleme/satır sınırları ve tam doküman kapsamı hâlâ geliştirme gerektiriyor; bu değişiklik tam mevzuat/semantik doğrulama değildir. Doğrulama: uydurma kanıt, eksik madde, yeniden sıralanmış satır, yinelenmiş/değişmiş gereklilik ve bozuk yanıt için dört yeni test. Tüm 91 test ve üretim derlemesi geçti. Gerçek sağlayıcıyla uçtan uca denetim kabulü yapılmadı. Büyük paket uyarıları ve planın diğer açık işleri sürüyor. ### D06 — Belgeye Sor kaynak kaybı ve atıf doğrulaması Önceki `parcala` uygulamasında uzun tek satır tek parça olarak kalıyordu. Soru bağlamı her parçanın ilk 1.400 karakteriyle sınırlandığından sonda eşleşen şart modele ulaşmayabiliyordu. Son 40 karakterden kısa parça da atılabiliyordu. Yeni sınırlı parçalayıcı tüm karakterleri, kısa son maddeleri ve Unicode karakter bütünlüğünü korur. Modele seçilen parçalar tam gönderilir. Model yanıtında boş/geçersiz metin, hiç atıf olmaması veya modele sunulmayan kaynak numarası varsa istek hata verir. Atıf yokken rastgele ilk üç parçayı kaynak olarak iliştirme kaldırıldı. Gösterilen kaynaklar yalnız gerçekten atıf verilen parçaların tam metnidir. Yanıtta kaynak SHA-256, toplam ve seçilen parça sayısı taşınır. Ekran seçilmiş parçaların kapsamını açıklar; eşleşme yokluğu şartın belgede yokluğu olarak sunulmaz. “Model uydurmaz” garantisi kaldırıldı. Sınır: Atıf numarasının geçerliliği semantik doğruluk kanıtı değildir. Terim tabanlı ilk sekiz parçanın seçimi başka bölümdeki ek/çelişen koşulu kaçırabilir. Tam doküman/ortak kaynak modeli ve gerçek sağlayıcı kabulü halen açık. Doğrulama: uzun tek satır ve kısa son madde, Unicode sınırları, geçersiz boyut, sahte/eksik kaynak numarası ve yalnız gerçek atıfların tam içeriğini döndürme için dört test. Tüm 95 test ve üretim derlemesi başarılı. Mevcut büyük paket uyarıları sürüyor. Canlıya yayın yapılmadı. ### D06 — Üretilen taslağın bölüm bütünlüğü Taslak üretimi önceki kodda istenen bölüm sayısını kontrol etmiyor, tek geçerli bölüm varsa başarılı yanıt dönüyor ve her bölümün içeriğini 12.000 karakterde sessizce kesiyordu. Yeni `qualifyOfferDraft` istenen başlıkları tekil metin eşleşmesiyle sıralar. Eksik/boş başlıklar için açık DOLDURUN alanları ve `partial` durumu döndürür. Eşleşmeyen ek içerik kaybolmaz fakat istenen bölümün yerine sayılmaz. Yinelenen başlık ve nesne gibi geçersiz alan türleri hata verir. Uzun bölümün son koşulları korunur. Ekran, modele göre tamamlanmayan bölümleri ve eşleşmeyen ek bölümleri listeler. Tam bölüm kümesi bile yalnız `draft` durumudur; resmi hazır/onaylı durumu üretilmez. Kullanıcı düzenlediğinde ilk üretim kapsamı uyarısı otomatik doğrulanmış sayılmaz. Doğrulama: eksik bölüm, doğru sıra, 12.000 karakterden uzun içerik ve son koşul, fazladan başlık, yinelenen/bozuk bölüm için dört yeni test. Tam test ve build sonuçları aşağıdaki commit öncesi kontrolle doğrulandı. Gerçek sağlayıcı bölüm üretimi ve tarayıcı kabulü halen açık; ortak gereklilik kaynağının kapsam sınırları bu değişiklikle kapanmış sayılmaz. Sonuç: 99 test geçti; üretim derlemesi başarılı. Büyük paket uyarıları sürüyor. Canlı yayın yapılmadı. ### D06 / D09 — İstemci AI yanıt sözleşmesi ve bekleme sınırı İstemci JSON ayrıştırma hatasını `{}` yaparak başarılı HTTP yanıtını kabul ediyordu. Boş/HTML/null yanıtları ve bozuk iç alanlar artık hata verir. Belgeye Sor kaynakları, denetim durumları/sayısal oranları ve taslak bölümleri/inceleme bilgileri ekrana aktarılmadan doğrulanır. Bu kontrol render sırasında `.map`, `.split`, durum renk tablosu veya nesne metni nedeniyle ekranın çökmesini önler. Başarısız yanıt önceki kullanıcı çalışmasının yerine atanmaz. AI HTTP isteği ve yanıt okumasına 120 saniyelik istemci zaman aşımı eklendi; süre dolunca hata gösterilir ve çalışma düğmeleri yeniden kullanılabilir. Bu, sunucudaki sağlayıcı işini iptal ettiğini veya kalıcı iş kuyruğu sağladığını göstermez. Belge envanteri ve OCR işlemleri bu HTTP süresinin dışında; bunların ayrı süre/iptal denetimleri halen kapsam içindedir. Doğrulama: HTML/null/boş yanıt, geçersiz iç durum, askıda istek ve üç gerçek sunucu doğrulayıcısının ürettiği yanıtın istemci sözleşmesiyle uyumu test edildi. Tarayıcıdaki gerçek sağlayıcı arızası kabulü ayrıca açık. Sonuç: Tüm 103 test ve üretim derlemesi geçti. Büyük paket uyarıları devam ediyor. Canlı yayın yapılmadı; tüm plan tamamlanmış değildir. ### D09 — Sağlayıcı yokken gerçek tarayıcı hata kabulü Mevcut localhost:5175 QA sunucusunun canlı olduğu doğrulandı; yeniden başlatılmadı. Güncel ön yüz üzerinden QA Giresun → Teklif Asistanı → Taslağı Denetle akışında 200 karakterden uzun sentetik taslak girildi. Anahtarsız izole sunucunun gerçek başarısız yanıtı sonrasında taslağın korunduğu ve Denetle düğmesinin yeniden etkin olduğu DOM'dan doğrulandı. İlk mesaj normal kullanıcıya sunucu anahtarı eklemesini söylüyordu. Kullanıcıya yönelik hizmet kullanılamıyor/yeniden dene açıklaması eklendi; hata `role=alert` olarak duyurulur. Sunucu genel analiz ve teklif araçlarının yapılandırılmamış sağlayıcı mesajları da sadeleştirildi. Güncel istemci eski sunucu 503 mesajlarını da uygun açıklamaya dönüştürür. Değişiklikten sonra aynı tarayıcı akışı tekrarlandı: yeni alert, aynı taslak ve kullanılabilir Denetle düğmesi doğrulandı. Kanıtlar: `qa-offer-provider-error.json`, `qa-offer-provider-error-after.json`. Bu kayıtlar sağlayıcı yokluğu hata yolunu kanıtlar; gerçek AI üretimi, iki hesaplı tarayıcı geçişi, uzun analiz veya başarılı çıktı kabulü değildir. Yeni backend metni çalışan eski sunucuda ayrıca sınanmadı; tarayıcı yeni istemci dönüşümünü doğruladı. Tüm 104 test ve üretim derlemesi geçti. Büyük paket uyarıları sürüyor. Planın kalan kapsamı açık; canlı yayın yapılmadı. ### D05 / D09 — Kalem kaynakları ve boş/hata durumu ayrımı Tarayıcıda ihale kaydının bir kalemi görüntülenirken ortak havuz panelinde “kalem listesi henüz yok” mesajı görülmüştü. Panel artık ihale kaydında kalem varsa sayısını açıkça belirtir ve yalnız ortak doküman havuzunda ayrı cetvel bulunamadığını söyler. Kaynaklar sessizce birleştirilmedi; resmi dokümanla kontrol gereği korunur. Ortak liste doluyken başlık kaynağını belirtir. Ortak havuz istemcisi HTTP hata/bozuk yanıtı boş liste gibi sunmaz. Panel hata ve yeniden yükleme düğmesi gösterir. Otuz saniyelik bekleme sınırı, ihale değişiminde iptal ve İKN başına yeniden oluşturulan panel durumu eklendi; önceki ihalenin filtre/kalemleri yeni ihaleye taşınmaz. Gerçek tarayıcı kabulü: localhost:5175 QA Giresun detayında “İhale kaydında aşağıda gösterilen 1 kalem var” mesajı ve “Malzeme / Kalem Listesi (1 Kalem)” tablosu birlikte doğrulandı. Kanıt: `qa-items-source-message.json`. Bu sentetik veriyle kaynak gösterimi testidir; resmi cetvel doğruluğu veya tüm kaynak uyuşmazlıklarının çözümü değildir. Ağ hatası/iptal/zaman aşımı ise otomatik testlerde sınandı. Tüm 106 test ve üretim derlemesi geçti. Büyük paket uyarıları sürüyor. Planın tamamı ve canlı yayın açık. ### D01 / D07 — Hazırlık belgelerinde ihale kapsamı Hazırlık belge seçicisi bütün depo kayıtlarını sunuyor; son kontrolde dosya erişimi, sürümü ve son kullanımı denetlenirken İKN/tür kapsamı kontrol edilmiyordu. Böylece aynı hesaba ait başka ihalenin dokümanı mevcut hazırlığa bağlanabiliyordu. Yeni kapsam denetimi firma belgelerini yeniden kullanılabilir tutar; `ihale` türündeki dosyalar yalnız mevcut İKN ile eşleşince kullanılabilir. Türü bilinmeyen veya ihale bağlantısı olmayan kayıtlar açık hata verir. Seçici uygun dosyaları listeler; önceden bağlanmış uygunsuz dosyayı görünür bir “kullanılamıyor” seçeneğiyle korur, sessizce başka dosya seçmez. Genel hazır olma kontrolü ve çıktı öncesi güncel envanter kontrolü aynı İKN bağlamını kullanır. Belge kontrol sürümüne tür ve İKN eklendi. Bu alanların değişmesi yeniden inceleme gerektirir; eski sürüm biçimiyle kaydedilmiş bağlantılar da güvenli biçimde yeniden seçim/kontrol ister. Bu, belgelerin gerçek yeterlik içeriğini otomatik doğrulamaz. Testler: başka ihale belgesi reddi, aynı ihale kabulü, firma belgesinin yeniden kullanımı, tüm hazırlık kontrolüne kapsamın yansıması, tür/bağ değişiminde inceleme geçersizliği. Tarayıcıda yeni seçici kapsamı kabulü halen açık. Sonuç: Tüm 108 test ve üretim derlemesi geçti. Büyük paket uyarıları sürüyor. Planın tümü bitmedi; canlı yayın yapılmadı. ### D06 — Açıkça yüklenen kaynağın önceliği `ihaleMetni` 200 karakterden kısa yüklenmiş metni görmezden gelip EKAP dokümanı/ilanına geçiyordu. Kısa fakat önemli bir zeyilname veya şart böylece başka kaynaktan gelen yanıtla karışabiliyordu. Artık açıkça verilen, boş olmayan metin uzunluğundan bağımsız olarak aynen kullanılır. Boş/geçersiz açık metin hata verir. Denetim ve taslak üretiminin bu hatayı yakalayıp boş kaynakla devam etmesi de kaldırıldı. Ön yüzde seçilen dosya adı ve karakter sayısı görünür. Boş metin çıkarımı önceki kaynağı değiştirmez; aynı dosyayı tekrar seçmek mümkündür. İlan kaynağına dönüş açık bir kaldır düğmesiyle yapılır. Kaynak değiştirilince yanıt/denetim temizlenir; düzenlenmiş taslak bölümleri korunur ve eski kaynakla üretildikleri uyarısı gösterilir. Testler doğrudan `ihaleMetni`, `teklifDenetle` ve `teklifTaslak` üzerinden kısa 120 günlük kaynak ile farklı 60 günlük ilan önceliğini, boş/geçersiz metin reddini ve hata yutulmamasını doğrular; dış kaynak veya model çağrısı yapılmaz. Dosya seçici ve kaynak değiştirme tarayıcı kabulü açık. Tam kaynak sürümleme ve ortak analiz kapsamının tamamı kapanmış sayılmaz. Tüm 111 test ve üretim derlemesi geçti. Büyük paket uyarıları sürüyor. Canlı yayın yapılmadı. ### D06 — Çok kalemli ve uzun taslak denetimi Denetim için ilk 30 ihale kalemi/ilk 60 gereklilik sınırı kaldırıldı; açıkça verilen koşullar ve ihale kalemleri tam listeye alınır. Taslağın 60.000 karakterde kesilmesi kaldırıldı. Denetim, gereklilik grupları ile taslak bölümlerinin tüm kombinasyonlarını en fazla iki eşzamanlı çağrıyla çalıştırır. Her çağrı 8.000 karakterlik gereklilik grubu ve 10.000 karakterlik taslak bölümü sınırlarıyla hazırlanır; genel şartname analizinin farklı çıktı şemasına sahip birleştiricisine gönderilmez. Her parçadaki karar gerçek taslak alıntısı ve gereklilik eşleşmesiyle kontrol edilir. Bir gereklilik ancak tüm taslak bölümleri başarıyla incelenmişse ve bir bölümde gerçek alıntıyla karşılanmışsa karşılanıyor sayılır. Bütün bölümlerde eksikse eksik; başarısız bölüm varsa veya hiçbir bölümde doğrulanmış kanıt yokken belirsiz karar varsa belirsizdir. Hiç bölüm denetlenemezse hata döner. Ekran gereklilik grubu, taslak bölümü ve başarısız kontrol sayısını gösterir. Sınırlar: Bölümler arasına yayılan kanıt insan kontrolü gerektirebilir. İlan metninden anahtar sözcükle gereklilik seçimi halen sınırlıdır; bu değişiklik tüm resmi şartların çıkarıldığını kanıtlamaz. Taslak üretiminin ayrı gereklilik sınırları bu turda değiştirilmedi. Uzun denetimin sunucuda kalıcı iş/iptal ve istemci zaman aşımı sonrası izlenmesi halen açık. Tek bir 8.000 karakteri aşan gereklilik kesilmez; kullanıcıdan bölmesi istenir. Testler: gerçek toplama fonksiyonunda 100 kalem + 80 açık koşul; denetim yürütücüsünde 100 gereklilik, 60.000 karakter sonrasındaki kanıt, bounded çağrı boyutu ve başarısız bölümün belirsizliğe dönüşmesi. Model yanıtları bu testte sentetiktir; gerçek sağlayıcı ve uzun tarayıcı kabulü değildir. Sonuç: Tüm 114 test ve üretim derlemesi geçti. Büyük paket uyarıları sürüyor. Planın tamamı bitmedi; canlı yayın yapılmadı. ### D06 / D09 — Uzun AI denetiminde bağlantı iptali Önceden istemci zaman aşımına uğrasa veya teklif asistanı kapansa da sunucu kalan denetim bölümlerini ve sağlayıcı yedeklerini çalıştırabiliyordu. Teklif Asistanı bileşeni kapanınca kendi HTTP isteğini iptal eder. Sunucu teklif araçlarında yanıt bağlantısının erken kapanması bir iptal sinyali üretir; normal istek gövdesinin bitmesi iptal sayılmaz. Sinyal soru/denetim/taslak çağrılarından AI sağlayıcı fetch'lerine taşınır. İptal sonrasında yedek sağlayıcı denenmez; çok parçalı denetim ve genel analiz yeni gruplara devam etmez, iptal kısmi başarı gibi dönmez. Dinleyiciler ve zamanlayıcılar tamamlanmada temizlenir. Sağlayıcıya gönderilmiş işlemin sağlayıcı tarafında ücretlendirilmesinin/hesaplanmasının geri alınması garanti edilmez. Testler: gerçek yerel HTTP isteğinde gövde tamamlandıktan sonra bağlantıyı keserek iptal; sağlayıcı fetch'ini iptal edip tek çağrı ve sıfır yedek deneme; sonraki denetim gruplarının durması; görünüm iptalinde istemci fetch'inin sonlanması. Sağlayıcı yanıtları ağ dışına çıkmayan test taklididir. Tüm 118 test ve üretim derlemesi geçti. Sınırlar: İlan/doküman kaynak ediniminin kendi alt istekleri ve OCR bu iptal zincirinin tamamına henüz bağlı değil. Kalıcı iş kuyruğu, yeniden başlatmada sürdürme ve tarayıcıdan uzun başarılı denetim kabulü açık. Büyük paket uyarıları sürüyor. Canlı yayın yapılmadı. ### D06 — PDF / OCR iptal desteği Belge okuyucuya isteğe bağlı AbortSignal eklendi. İptal bekleyen dosya metni, PDF açılışı, sayfa edinimi/metni ve OCR sonucunu beklemeyi keser; sonraki sayfalara geçilmez. PDF yükleme görevi, etkin çizim ve OCR çalışanı iptal/sonlanma yolunda temizlenir. Çalışan oluşturulması veya sayfa edinimi iptalden sonra sonuçlanırsa geç gelen kaynak kapatılır. İptal hatası normal bozuk dosya/OCR hatasına çevrilmez. Teklif Asistanı dosya okuması görünümün yaşam süresi sinyalini kullanır. Böylece modal/sekme bileşeni kapanınca yalnız sonuç atılmakla kalmaz, okuyucu da iptal edilir. Diğer belge okuma girişlerinin tamamı henüz bu sinyali iletmiyor; uygulama genelinde OCR iptali tamamlandı sayılmaz. Testler: bekleyen OCR sırasında iptalde tek sayfa ve temizlik; geciken sayfa ediniminde temizlik; geç sonuçta iptal callback'inin ikinci kez çağrılmaması; normal tamamlanma sonrasında dinleyici temizliği. Mevcut gerçek 45 sayfalık PDF okuma testi de geçti. Gerçek tarayıcıda Tesseract çalışanı sırasında iptal kabulü bu turda yapılmadı. Sonuç: Tüm 122 test ve üretim derlemesi geçti. Büyük paket uyarıları sürüyor. Planın kalan kapsamı açık; canlı yayın yapılmadı.