diff --git a/docs/quality/d09-entegrasyon-kabul-plani.md b/docs/quality/d09-entegrasyon-kabul-plani.md new file mode 100644 index 0000000..b54a5c6 --- /dev/null +++ b/docs/quality/d09-entegrasyon-kabul-plani.md @@ -0,0 +1,43 @@ +# D09 dış entegrasyon kabul planı + +Son salt okunur canlı tarama: 15 Eylül 2026, `https://ihaleist.com`. + +Bu plan, dış sistemlerde yan etki oluşturmayan kontrolleri tamamlananlardan ayırır. Ödeme, e-posta, Telegram mesajı ve resmi teklif gönderimi yalnız yetkili test verileri ve açık işlem yetkisiyle yapılır. EKAP güvenlik doğrulaması otomasyonla aşılmaz. + +## Mevcut durum + +| Entegrasyon | Canlı durum | Doğrulanan kanıt | Kapatma adımı | +| --- | --- | --- | --- | +| ilan.gov.tr / BİK | Geçti | HTTP 200, kaynak `ilan.gov.tr`, 3.258 kayıt | D10/D04 veri kalitesi izlemesi dışında D09 işi yok | +| TCMB | Geçti | HTTP 200, 15.09.2026 bülteni ve kaynak URL’si | D09 için kapalı | +| Google ile giriş | Yapılandırılmış | Public config `configured: true` | Test hesabıyla giriş, çıkış ve oturum yenileme | +| EKAP resmi doküman | İnsan doğrulaması | OKAS ve D10 belge isteği HTTP 428, `HUMAN_VERIFICATION_REQUIRED` | Yetkili kullanıcı CAPTCHA’yı tamamlayıp beş resmi paketi indirir; dosyalar uygulamaya yüklenir | +| KİK kurul kararları | İnsan doğrulaması | HTTP 428, doğru hata kodu ve kullanıcı yönlendirmesi | EKAP doğrulamasından sonra arama ve karar metni tekrar denenir | +| TED | Geçti | HTTP 200, zaman aşımı yok | Gerçek sonuçlu sorgu ve çeviri kontrollü AI test bütçesiyle doğrulanır | +| AI yardımcıları | Yapılandırılmış | 7 sağlayıcı hazır | Yetkili test hesabı ve incelenmiş test belgesiyle analiz, soru, taslak ve denetim zinciri | +| Stripe | Yapılandırılmış | Checkout ve webhook hazır, 3 plan | Stripe test modunda başarılı/başarısız ödeme, webhook tekrar teslimi ve iptal | +| E-posta | Kimlik doğrulamayla korumalı | Yetkisiz config isteği HTTP 401 | Yetkili hesapla config okuma; izinli test alıcısına tek gönderim | +| Telegram | Engelli | Public config `configured: false` | Bot/chat yapılandırması, bağlama kodu ve izinli test sohbetine tek mesaj | +| PWA / offline worker | Geçti | Manifest ve service worker HTTP 200 | Gerçek cihazda kurulum, offline düzenleme, yeniden bağlanma ve kuyruk boşalması | +| API / RSS / MCP | Kimlik doğrulamayla korumalı | API key ve RSS 401; MCP artık proxy üzerinden 401; public sonuç RSS 200 | Yetkili hesapla anahtar oluşturma, kullanma, iptal ve iptal sonrası 401 | +| Zeyilname/sonuç zamanlayıcısı | Gözlemlenebilir | Durum uç noktası 200; iki worker etkin | Kontrollü test kaydıyla olay üretme, tek teslim ve tekrar engeli | + +Canlı özet: 13 entegrasyonun 4’ü geçti, 3’ü yapılandırılmış, 2’si kimlik doğrulamayla korumalı, 1’i gözlemlenebilir, 2’si insan doğrulaması bekliyor ve 1’i yapılandırılmadığı için engelli. Korunan 14 uç noktanın 14’ü yetkisiz isteği reddetti. + +## Uygulama sırası + +1. **Hesap ve erişim kabulü:** Google oturumu ile API anahtarı oluşturma/kullanma/iptal zincirini aynı test hesabında doğrula. +2. **EKAP/KİK ve D10:** Yetkili kullanıcı doğrulamasından sonra beş resmi paketi yükle; her ihale için belge gereksinimi, ürün uygunluğu, firma dosyası, fiyat ve çıktı kapılarını kaydet. +3. **AI/TED:** Yalnız incelenmiş test belgesiyle gerçek sonuçlu TED araması, çeviri, analiz, belgeye soru, taslak ve denetim çıktısını kaynak atıflarıyla karşılaştır. +4. **Bildirimler:** E-posta yapılandırmasını oku; izinli test adresi ve Telegram sohbetinde tek gönderimi, hata kaydı ve tekrar engeliyle doğrula. +5. **Stripe:** Test modunda başarı, ret, iptal ve aynı webhook’un tekrar tesliminde tek abonelik değişikliği oluştuğunu doğrula. +6. **PWA ve zamanlayıcı:** Gerçek cihazı offline yap, bir düzenlemeyi kuyruğa al, yeniden bağlanınca tek kez uygulandığını doğrula; ardından kontrollü zeyilname/sonuç olayını çalıştır. + +Her adımda kabul kanıtı; zaman, test hesabı kimliği, kullanılan kayıt/İKN, HTTP sonucu, ekrandaki kullanıcı mesajı ve oluşan veri değişikliğini içermelidir. Başarısız veya yapılandırılmamış entegrasyon tamamlandı olarak işaretlenmez. + +## Bu sürümde düzeltilen iki hata + +- Nginx, `/mcp` POST isteğini statik dosya gibi ele alıp 405 döndürüyordu. İstek artık Node API’ye proxy ediliyor ve yetkisiz çağrı doğru biçimde 401 dönüyor. +- KİK, OKAS ve ürün aramalarındaki EKAP HTTP 428 yanıtı genel 502’ye çevriliyordu. Yanıt artık `HUMAN_VERIFICATION_REQUIRED`, `retryable: false` ve kullanıcıya uygulanabilir yönlendirme içeriyor. + +Makine tarafından üretilen kanıt: [`qa-live-d09-integrations.json`](evidence/qa-live-d09-integrations.json). diff --git a/docs/quality/evidence/qa-live-d09-integrations.json b/docs/quality/evidence/qa-live-d09-integrations.json new file mode 100644 index 0000000..7aeff1b --- /dev/null +++ b/docs/quality/evidence/qa-live-d09-integrations.json @@ -0,0 +1,224 @@ +{ + "checkedAt": "2026-09-15T14:58:12.437Z", + "base": "https://ihaleist.com", + "readOnly": true, + "scope": "Yapılandırma, public kaynak okuması ve kimlik doğrulama kapıları denetlendi; giriş, veri değişikliği, AI üretimi, ödeme, mesaj veya teklif gönderimi yapılmadı.", + "integrations": [ + { + "id": "BIK", + "label": "ilan.gov.tr ihale havuzu", + "status": "passed", + "evidence": { + "status": 200, + "source": "ilan.gov.tr", + "loaded": 3258 + }, + "remaining": "Güncel liste okuması doğrulandı; veri kalitesi D10/D04 kapsamında izlenir." + }, + { + "id": "TCMB", + "label": "TCMB döviz satış kurları", + "status": "passed", + "evidence": { + "status": 200, + "bulletinDate": "15.09.2026", + "source": "https://www.tcmb.gov.tr/kurlar/today.xml", + "cached": false + }, + "remaining": "Hata ve eski bülten UX testleri yerel otomasyonda kapsanıyor." + }, + { + "id": "GOOGLE", + "label": "Google ile giriş", + "status": "configured", + "evidence": { + "status": 200, + "configured": true + }, + "remaining": "Gerçek test hesabıyla giriş, çıkış ve oturum yenileme kabulü gerekli." + }, + { + "id": "EKAP", + "label": "EKAP arama ve resmi doküman", + "status": "manual-gate", + "evidence": { + "browserAvailable": true, + "okasStatus": 428, + "okasCode": "HUMAN_VERIFICATION_REQUIRED", + "d10DocumentCode": "HUMAN_VERIFICATION_REQUIRED" + }, + "remaining": "Yetkili kullanıcı güvenlik doğrulamasından sonra beş resmi paketi indirip yüklemeli." + }, + { + "id": "KIK", + "label": "KİK kurul kararları", + "status": "manual-gate", + "evidence": { + "status": 428, + "code": "HUMAN_VERIFICATION_REQUIRED", + "resultCount": null, + "error": "EKAP güvenlik doğrulaması gerekiyor. EKAP’ı kendi tarayıcınızda açıp doğrulamayı tamamlayın; ardından indirdiğiniz dokümanı bu ihaleye yükleyin." + }, + "remaining": "EKAP güvenlik doğrulamasından sonra arama ve karar metni tekrar denenmeli." + }, + { + "id": "TED", + "label": "TED Avrupa ihaleleri", + "status": "passed", + "evidence": { + "status": 200, + "totalCount": 0, + "timedOut": false, + "error": null + }, + "remaining": "Gerçek sonuçlu sorgu ve çeviri, kontrollü AI test bütçesiyle yapılmalı." + }, + { + "id": "AI", + "label": "AI analiz ve teklif yardımcıları", + "status": "configured", + "evidence": { + "status": 200, + "configured": true, + "providerCount": 7 + }, + "remaining": "Yetkili test hesabı ve incelemesi tamamlanmış test belgesiyle analiz, soru, taslak ve denetim zinciri gerekli." + }, + { + "id": "STRIPE", + "label": "Stripe plan, ödeme ve webhook", + "status": "configured", + "evidence": { + "status": 200, + "checkoutConfigured": true, + "webhookConfigured": true, + "planCount": 3 + }, + "remaining": "Yalnız Stripe test ortamında başarılı/başarısız ödeme, webhook tekrarı ve iptal senaryoları gerekli." + }, + { + "id": "EMAIL", + "label": "E-posta bildirimleri", + "status": "guarded", + "evidence": { + "unauthenticatedStatus": 401 + }, + "remaining": "Yetkili test hesabında yapılandırma okunmalı; izinli test alıcısına tek gönderim ayrıca onaylanmalı." + }, + { + "id": "TELEGRAM", + "label": "Telegram bağlantısı ve bildirim", + "status": "blocked", + "evidence": { + "status": 200, + "configured": false + }, + "remaining": "Test sohbetinde bağlama kodu ve tek test mesajı için açık gönderim yetkisi gerekli." + }, + { + "id": "PWA", + "label": "PWA manifest ve offline worker", + "status": "passed", + "evidence": { + "manifestStatus": 200, + "serviceWorkerStatus": 200 + }, + "remaining": "Gerçek cihazda kurulum, offline düzenleme ve yeniden bağlanma kabulü ayrıca izlenir." + }, + { + "id": "API", + "label": "API anahtarı, RSS ve MCP", + "status": "guarded", + "evidence": { + "apiKeyGuard": 401, + "rssGuard": 401, + "mcpGuard": 401, + "publicResultsRssStatus": 200 + }, + "remaining": "Yetkili test hesabında anahtar oluşturma, RSS/MCP kullanma ve iptal zinciri gerekli." + }, + { + "id": "SCHEDULER", + "label": "Zeyilname/sonuç zamanlayıcısı", + "status": "observable", + "evidence": { + "status": 200, + "browserAvailable": true, + "resultScanActive": true, + "resultScanRunning": false, + "directProcurementActive": true, + "directProcurementRunning": false + }, + "remaining": "Yetkili test kaydıyla zeyilname/sonuç olayı ve tekrar engeli doğrulanmalı." + } + ], + "guards": { + "authSession": { + "status": 401, + "passed": true + }, + "documents": { + "status": 401, + "passed": true + }, + "documentText": { + "status": 401, + "passed": true + }, + "apiKeys": { + "status": 401, + "passed": true + }, + "emailConfig": { + "status": 401, + "passed": true + }, + "plan": { + "status": 401, + "passed": true + }, + "subscriptions": { + "status": 401, + "passed": true + }, + "sourceHistory": { + "status": 401, + "passed": true + }, + "companyScan": { + "status": 401, + "passed": true + }, + "aiAnalyze": { + "status": 401, + "passed": true + }, + "checkout": { + "status": 401, + "passed": true + }, + "emailSend": { + "status": 401, + "passed": true + }, + "telegramMutation": { + "status": 401, + "passed": true + }, + "notificationRun": { + "status": 403, + "passed": true + } + }, + "summary": { + "total": 13, + "passed": 4, + "configured": 3, + "guarded": 2, + "observable": 1, + "manualGate": 2, + "blocked": 1, + "protectedGuardsPassed": 14, + "protectedGuardsTotal": 14 + } +} diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index f48ec9e..844237c 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -10,9 +10,21 @@ Bu aşamada D10 tamamlanmış değildir. Kapanış için yetkili kullanıcının EKAP güvenlik doğrulamasından sonra beş resmi doküman paketini indirip uygulamaya yüklemesi ve test firmasının gerçek ürün/belge kayıtlarıyla kalan dört kapıyı geçmesi gerekir. Resmi teklif gönderilmedi. -6 Eylül 2026. Temel sürüm: 909ebae. Çalışma dalı: codex/ihaleist-duzeltme-plani. +## 15 Eylül 2026 D09 dış entegrasyon kabulü -Planın tamamı henüz bitmedi. Canlı yayın yapılmadı. +- `6c32581` sürümü Coolify üzerinden üretime alındı. Canlı `/api/version` tam commit SHA’sını ve beklenen frontend asset SHA-256 özetini döndürdü; health, ready ve güvenlik başlıkları kabulü geçti. +- Salt okunur probda 13 entegrasyon denetlendi: 4 geçti, 3 yapılandırılmış, 2 kimlik doğrulamayla korumalı, 1 gözlemlenebilir, 2 insan doğrulaması bekliyor ve 1 engelli. Yetkisiz istek kapılarının 14/14’ü doğru şekilde reddedildi. +- BİK, TCMB, TED bağlantısı ve PWA assetleri geçti. Google, AI ve Stripe yapılandırılmış. E-posta ile API/RSS/MCP doğru kimlik doğrulama kapısında. Scheduler durumu okunuyor. EKAP/KİK güvenlik doğrulaması bekliyor. Telegram yapılandırılmamış tek engelli entegrasyondur. +- `/mcp` POST isteğinin Nginx’te 405’e düşmesi düzeltildi; canlıda artık Node kimlik doğrulama katmanından 401 dönüyor. KİK/OKAS/ürün aramasındaki HTTP 428 yanıtının genel 502’ye çevrilmesi de giderildi. +- Test, giriş yapmadı; AI üretimi, ödeme, e-posta/Telegram mesajı veya resmi teklif göndermedi. Yan etkili kapanış adımları yetkili test hesapları ve açık işlem yetkisiyle ayrı ayrı uygulanacaktır. + +Ayrıntılı sıra ve kabul ölçütleri: [`d09-entegrasyon-kabul-plani.md`](d09-entegrasyon-kabul-plani.md). Canlı kanıt: [`qa-live-d09-integrations.json`](evidence/qa-live-d09-integrations.json). + +## 6 Eylül 2026 başlangıç durumu + +Temel sürüm: 909ebae. Çalışma dalı: codex/ihaleist-duzeltme-plani. Bu bölüm tarihsel başlangıç kaydıdır. + +Planın tamamı o tarihte henüz bitmemişti ve canlı yayın yapılmamıştı. Canlı read-only probe (6 Eylül 2026) `/api/health` için 200 döndürürken `/api/ready` için 404 döndü; canlı API yanıtında yeni güvenlik başlıkları da yok. Bu, yerel dalın henüz `ihaleist.com` ortamına dağıtılmadığını doğruluyor. Kanıt: [`qa-live-runtime.json`](evidence/qa-live-runtime.json). Probe sırasında giriş, veri değişikliği, ödeme, mesaj veya ihale başvurusu yapılmadı.