WEB / WEB-20.04
Third-party services ve trust boundaries
Provider response’u geldiğinde iş bitmez. Veri biçimi ve amaç kontrolünü, yerel write ve commit’ten ayrı izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Kontrol ve commit
- Request hazır
Adapter public tea query’sini hazırlar. Provider henüz request’i almamış, local catalog değişmemiştir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- Provider request’i bilmiyor
- Yerel catalog
- Local draft committed
- Request provider’a ulaştı
Provider query’yi öğrenir. Adapter henüz response veya validation sonucu bilmiyor.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- Public tea query alındı
- Yerel catalog
- Local draft committed
- Provider response hazır
Seçilen örnek response hazırlanır. Schema drift ve error status ayrı fixture durumlarıdır; gerçek SaaS çağrısı yapılmaz.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- 200 / string title hazır
- Yerel catalog
- Local draft committed
- Response adapter’a ulaştı
Raw response alınır. Schema kabulü ve local mutation henüz yapılmamıştır; catalog eski state’tedir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Raw 200 bytes alındı
- Provider
- 200 / string title hazır
- Yerel catalog
- Local draft committed
- Contract kararı
Yerel kontrol status, beklenen public id ve string title koşullarını değerlendirir. Bu karar ağ mesajı değildir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Contract kabul edildi
- Provider
- 200 / string title hazır
- Yerel catalog
- Local draft committed
- Write henüz pending
Kabul edilen title SQLite transaction’da yazılır. Bağımsız reader hâlâ Local draft görür.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Contract kabul edildi
- Provider
- 200 / string title hazır
- Yerel catalog
- Tea note / commit bekliyor
- Commit görünür oldu
COMMIT sonrasında bağımsız connection Tea note okur. Yerel persistence sonucu provider’a başka karar yetkisi vermez.
- Caller
- Title sonucu committed
- Integration adapter
- Contract kabul edildi
- Provider
- 200 / string title hazır
- Yerel catalog
- Tea note committed
Schema uyuşmazlığı
- Request hazır
Adapter public tea query’sini hazırlar. Provider henüz request’i almamış, local catalog değişmemiştir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- Provider request’i bilmiyor
- Yerel catalog
- Local draft committed
- Request provider’a ulaştı
Provider query’yi öğrenir. Adapter henüz response veya validation sonucu bilmiyor.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- Public tea query alındı
- Yerel catalog
- Local draft committed
- Provider response hazır
Seçilen örnek response hazırlanır. Schema drift ve error status ayrı fixture durumlarıdır; gerçek SaaS çağrısı yapılmaz.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- 200 / numeric title hazır
- Yerel catalog
- Local draft committed
- Response adapter’a ulaştı
Raw response alınır. Schema kabulü ve local mutation henüz yapılmamıştır; catalog eski state’tedir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Raw 200 bytes alındı
- Provider
- 200 / numeric title hazır
- Yerel catalog
- Local draft committed
- Contract kararı
Yerel kontrol status, beklenen public id ve string title koşullarını değerlendirir. Bu karar ağ mesajı değildir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Contract uyuşmazlığı
- Provider
- 200 / numeric title hazır
- Yerel catalog
- Local draft committed
- Eski catalog korundu
Caller ilgili error category’yi öğrenir. Catalog’da commits=0 ve önceki Local draft korunur.
- Caller
- Hata / yeni başarı sonucu yok
- Integration adapter
- Contract uyuşmazlığı
- Provider
- 200 / numeric title hazır
- Yerel catalog
- Local draft committed
Provider hatası
- Request hazır
Adapter public tea query’sini hazırlar. Provider henüz request’i almamış, local catalog değişmemiştir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- Provider request’i bilmiyor
- Yerel catalog
- Local draft committed
- Request provider’a ulaştı
Provider query’yi öğrenir. Adapter henüz response veya validation sonucu bilmiyor.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- Public tea query alındı
- Yerel catalog
- Local draft committed
- Provider response hazır
Seçilen örnek response hazırlanır. Schema drift ve error status ayrı fixture durumlarıdır; gerçek SaaS çağrısı yapılmaz.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- 503 error hazır
- Yerel catalog
- Local draft committed
- Response adapter’a ulaştı
Raw response alınır. Schema kabulü ve local mutation henüz yapılmamıştır; catalog eski state’tedir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Raw 503 bytes alındı
- Provider
- 503 error hazır
- Yerel catalog
- Local draft committed
- Contract kararı
Yerel kontrol status, beklenen public id ve string title koşullarını değerlendirir. Bu karar ağ mesajı değildir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Provider kullanılamıyor
- Provider
- 503 error hazır
- Yerel catalog
- Local draft committed
- Eski catalog korundu
Caller ilgili error category’yi öğrenir. Catalog’da commits=0 ve önceki Local draft korunur.
- Caller
- Hata / yeni başarı sonucu yok
- Integration adapter
- Provider kullanılamıyor
- Provider
- 503 error hazır
- Yerel catalog
- Local draft committed
Yanıt bilinmiyor
- Unknown durumu başladı
Yerel unknown-response örneği başlar. Gerçek network send veya provider delivery gözlemi yoktur.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Public tea query hazır
- Provider
- Provider result bilgisi unknown
- Yerel catalog
- Local draft committed
- Adapter yanıt bekledi
Adapter bu örnekte TimeoutError durumuyla karşılaşır. Remote completion hakkında bilgi edinmez.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Yerel çağrı denendi
- Provider
- Provider result bilgisi unknown
- Yerel catalog
- Local draft committed
- Response gözlenmedi
Adapter’ın status ve body bilgisi yoktur. Buradaki exception gerçek network deadline ölçümü değildir.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- Response gözlenmedi
- Provider
- Provider result bilgisi unknown
- Yerel catalog
- Local draft committed
- Unknown ayrı tutuldu
Eksik response, 503 veya schema mismatch olarak sınıflandırılmaz. Automatic retry ve local mutation yapılmaz.
- Caller
- Public title sonucu bekleniyor
- Integration adapter
- response-unknown
- Provider
- Provider result bilgisi unknown
- Yerel catalog
- Local draft committed
- Caller unknown sonucunu biliyor
Local draft değişmez. Caller response’un bilinmediğini öğrenir; provider’ın işi tamamladığı söylenmez.
- Caller
- Unknown / yeni başarı sonucu yok
- Integration adapter
- response-unknown
- Provider
- Provider result bilgisi unknown
- Yerel catalog
- Local draft committed
ROLLER · STATE · VERİ AKIŞI
Provider’a hangi sorumluluğu veriyoruz?
Third-party service, dışarıda yönetilen bir capability’yi API, webhook, library veya browser integration üzerinden kullanmaktır. SaaS dependency’de availability, quota, değişim ve retention kararlarının bir kısmı provider sözleşmesine bağlıdır. Ürün adı veya başarılı demo her kullanım amacına uygunluğu kanıtlamaz. Hangi veri dışarı çıkıyor, hangi sonuç geri geliyor ve uygulama bu sonucu ne için kullanıyor?
Atlas yalnız public tea identifier’ını catalog-demo adlı sentetik provider’a gönderir. catalog.example.invalid örnek adresidir. Integration adapter, yerel catalog değişmeden önce status, media type, JSON biçimi ve beklenen identifier’ı kontrol eder. Provider title sağlayabilir; private user permission veya account state kararını veremez. Bu amaç sınırı authentication ve TLS güveninden ayrıdır.
API version seçimi provider’a göre account default, SDK veya endpoint configuration üzerinden yapılabilir. Stripe versioning kaynaklardaki bir ürün örneğidir; Atlas payment API kullanmaz. catalog-v1 öğretim contract’ının adıdır. Object revision=1, API version değildir. Title string beklenirken title=7 gelmesi, HTTP başarılı olsa bile uygulamanın kullanabileceği veri sağlamaz.
Response almak, kabul etmek ve commit etmek ayrı olaylardır
Adapter 200 application/json response’u parse edebilir ama veri türleri, hedef nesne ve kullanım amacı henüz kontrol edilmemiş olabilir. Normal dalda id=tea, title=Tea note ve integer revision=1 kabul edilir. Sonra yerel SQLite write ve COMMIT gelir. Bağımsız reader yeni title’ı ancak commit sonrasında görür. Sahne response arrival, validation ve commit’i ayrı adımlarda gösterir.
Schema drift dalında status yine 200’dür; title=7 string olmadığı için reddedilir ve commit yapılmaz. Provider-error dalı 503 ile geçici hata getirir; adapter bunu success verisi gibi kullanmaz. Uygulama kendi unavailable sonucunu üretir. Kullanıcıya raw diagnostics veya credentials aktarılmaz. Local draft title’ının korunması yeni provider verisinin geldiği anlamına gelmez.
Unknown dalında adapter hiç response gözlemez. Dolayısıyla status veya provider completion sonucu bilinmez; model bunu success’e çevirmez. Gerçek timeout davranışı bu sahnede ölçülmez. Dış işlemin side effect’i varsa belirsiz sonuç retry ve idempotency tasarımında ayrıca ele alınır. Bu örnek public read kullanır ve automatic retry yapmaz; WEB-19.S01’deki commit ile caller bilgisi ayrımı burada da geçerlidir.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
200, yanlış tür
- Contract önce belirli
İstenen public id tea; title bir string, revision integer olmalı. Contract yalnız status=200 kontrolünden ibaret değildir.
- Provider kaydı
- request.id=tea
- Contract / local state
- title:string / revision:integer
- Güven sınırı
- Acceptance kararı bekleniyor
- 200 ile body geldi
SchemaDrift.status=200. Body içindeki title=7 alanı ise contract’ın string koşulunu karşılamıyor.
- Provider kaydı
- status=200 / body.title=7
- Contract / local state
- Contract henüz değerlendirilmedi
- Güven sınırı
- Transport sonucu ve veri tipi ayrı
- Schema gate reddetti
Accepted=false ve reason=contract-mismatch. HTTP success, bu uygulamanın representation’ı kullanmayı kabul ettiği anlamına gelmez.
- Provider kaydı
- status=200 / body.title=7
- Contract / local state
- accepted=false / reason=contract-mismatch
- Güven sınırı
- Local effect henüz incelenmedi
- Local not değişmedi
LocalAfter=Local draft ve commits=0. Türü uymayan provider response, bu dalda note mutation’a dönüşmemiştir.
- Provider kaydı
- status=200 / body.title=7
- Contract / local state
- localAfter=Local draft / commits=0
- Güven sınırı
- Provider 200 != local COMMIT
- Ek alanları authority sayma
Contract unused extra fields’i saklamaz. Dış response’un daha fazla alan taşıması, uygulamaya yeni permission veya private user kararı vermez.
- Provider kaydı
- status=200 / body.title=7
- Contract / local state
- unusedExtraFields=ignored, not persisted
- Güven sınırı
- providerCanAuthorizePrivateUser=false
- Hatanın katmanını doğru adlandır
Bu dal HTTP ulaşımı değil schema kabulünde durdu. Status, kabul ve mutation ayrı raporlanır; 200 kaydı local başarı diye yeniden adlandırılmaz.
- Provider kaydı
- status=200 / body.title=7
- Contract / local state
- accepted=false / localAfter=Local draft / commits=0
- Güven sınırı
- Schema reddi
Kabul ve commit
- Normal body contract’a uyuyor
Normal body tea, Tea note ve revision=1 taşır. İstenen id ve türler bu seçilen contract ile uyuşur.
- Provider kaydı
- status=200 / title=Tea note / revision=1
- Contract / local state
- Local contract kararı bekleniyor
- Güven sınırı
- Local commit henüz incelenmedi
- Representation kabul edildi
Accepted=true, provider body’nin local işleme için kabul edildiğini kaydeder. Bu alan tek başına transaction’ın bittiğini söylemez.
- Provider kaydı
- status=200 / title=Tea note / revision=1
- Contract / local state
- accepted=true / localBefore=Local draft
- Güven sınırı
- Acceptance != commit
- İşlem sürerken bağımsız okuma
IndependentReaderDuring=Local draft. Local işleme başlaması, ayrı reader’ın yeni başlığı görmesiyle aynı olay değildir.
- Provider kaydı
- status=200 / title=Tea note / revision=1
- Contract / local state
- accepted=true / independentReaderDuring=Local draft
- Güven sınırı
- Eski committed değer görünür
- Commit sonucu ayrıca var
Commits=1 ve localAfter=Tea note. Başlığın local owner’da değişmesi provider cevabından sonra gelen ayrı bir transaction sonucudur.
- Provider kaydı
- status=200 / title=Tea note / revision=1
- Contract / local state
- commits=1 / localAfter=Tea note
- Güven sınırı
- Local state değişti
- Sonraki reader yeni başlığı gördü
IndependentReaderAfter=Tea note, diğer bağlantının da committed başlığı görebildiğine dair ayrı gözlemdir. Önceki read’i geriye dönük değiştirmez.
- Provider kaydı
- status=200 / title=Tea note / revision=1
- Contract / local state
- commits=1 / independentReaderAfter=Tea note
- Güven sınırı
- During=Local draft; after=Tea note
- Public enrichment’in yetki sınırı
Başlık enrichment’i başarıyla commit edilmiş olsa da provider private user’ı authorize edemez. Public data contract ile access-control authority ayrı sorumluluklardır.
- Provider kaydı
- status=200 / title=Tea note / revision=1
- Contract / local state
- commits=1 / localAfter=Tea note
- Güven sınırı
- providerCanAuthorizePrivateUser=false
VARSAYIM · SINIR · KONTROL
Güvenilir kanal, doğru uygulama verisi demek değildir
TLS, peer ve taşınan verinin bütünlüğü için güven sağlar; title’ın doğru türde, doğru note’a ait veya doğru amaç için kullanılabilir olduğunu belirlemez. Provider tanındığı için veri kontrolünü kaldırmak, sıradan version değişiminde bile storage ve UI koşullarını bozabilir. Örnekte numeric title, string contract’ını geçemediği için mutation öncesinde durdurulur.
Bir capability’yi başka bir kararın authority’sine dönüştürme. Public title sağlayan provider’ın user role veya private object authorization belirleme sorumluluğu yoktur. Örnek request yalnız public id taşır. Integration incelemesinde veri minimizasyonu, provider identity ve izin verilen kullanım amaçları birlikte değerlendirilir. Provider’ın retention ve account ayarları otomatik olarak uygulama sahibinin kontrolünde değildir.
Hata ile bilinmeyen sonucu birbirine karıştırma
200’ü schema validation saymak, error body’yi success body sanmak ve hiç response görmemek farklı durumlardır. Üçünde de eski title korunabilir, fakat nedenler aynı değildir. Kullanıcı aynı genel mesajı görse bile diagnostic category ayrılabilir. Contract mismatch, provider unavailable ve eksik gözlem ayrı değerlendirilerek mutation kararına bağlanır.
Raw provider error’ını kullanıcıya taşımak veya gereksiz body saklamak iç alanları ve hassas veriyi açığa çıkarabilir. Örnek kayıt yalnız karar nedeni, local title ve commit sayısını tutar. Body boyutu ve süre budget’ı gerçek integration’da ayrıca uygulanmalıdır; buradaki sonlu örnek ve unknown dalı production timeout kontrolünü ölçmez.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Gözlenen 503
- Yanıtın varlığı biliniyor
Status/body gözlemini sabit yerel provider adapter’ı, commit görünürlüğünü ayrı SQLite connection üretir. Bunlar remote provider’ın gerçekten çalıştığına dair log veya network capture değildir. ProviderError.status=503 ve error=temporary body’si kaydedilmiş. Bu dal yanıt alınmamasını değil, alınan hata yanıtını gösterir.
- Provider gözlemi
- status=503 / body.error=temporary
- Local kayıt
- Local state henüz incelenmedi
- Sonuç bilgisi
- Provider response gözlendi
- Local contract kabul etmedi
Accepted=false ve provider-unavailable nedeni seçilmiş. Hata body’si başarılı public note representation’ı gibi kullanılmıyor.
- Provider gözlemi
- status=503 / body.error=temporary
- Local kayıt
- accepted=false / reason=provider-unavailable
- Sonuç bilgisi
- Mutation henüz incelenmedi
- Local commit yok
Commits=0 ve localAfter=Local draft. Provider hata yanıtının varlığı local transaction’ın başarısız commit ettiğini söylemez; bu dalda commit yapılmamış.
- Provider gözlemi
- status=503 / body.error=temporary
- Local kayıt
- localAfter=Local draft / commits=0
- Sonuç bilgisi
- Local not korunmuş
- Diagnostics ayrıca sınırlı
RawDiagnosticsExposed=false, ham provider diagnostics’in bu örnekte kullanıcıya verilmediğini belirtir. Status’un kaydedilmesi ham mesajı paylaşmayı gerektirmez.
- Provider gözlemi
- status=503 / body.error=temporary
- Local kayıt
- localAfter=Local draft / commits=0
- Sonuç bilgisi
- rawDiagnosticsExposed=false
- 503 gözlemini kapsamından çıkarma
Bu response seçilen isteğin provider hata sonucudur. Diğer provider işlemlerinin durumu veya kalıcı availability sorunu bu tek status’tan bilinmez.
- Provider gözlemi
- status=503 / body.error=temporary
- Local kayıt
- localAfter=Local draft / commits=0
- Sonuç bilgisi
- Başka isteklerin sonucu bilinmiyor
- Ayrı sonuçları birlikte kaydet
Bu dalın özeti gözlenen 503, reddedilen representation ve sıfır local commit’tir. No-response dalının belirsizliğini bu kayda taşımaya gerek yoktur.
- Provider gözlemi
- status=503 / body.error=temporary
- Local kayıt
- accepted=false / localAfter=Local draft / commits=0
- Sonuç bilgisi
- Bilinen hata yanıtı
Yanıt bilinmiyor
- Yanıt gözlenmemiş
Status/body gözlemini sabit yerel provider adapter’ı, commit görünürlüğünü ayrı SQLite connection üretir. Bunlar remote provider’ın gerçekten çalıştığına dair log veya network capture değildir. Unknown.responseObserved=false ve status=null. Burada 503 veya 200 yok; status alanını başka dalın sonucuyla dolduramazsın.
- Provider gözlemi
- responseObserved=false / status=null
- Local kayıt
- Local state henüz incelenmedi
- Sonuç bilgisi
- Response outcome bilinmiyor
- Local state aynı kalmış
LocalAfter=Local draft ve commits=0, local owner’ın gözlenen sonucudur. Bu bilgi provider’ın hiç çalışmadığını söylemez.
- Provider gözlemi
- responseObserved=false / status=null
- Local kayıt
- localAfter=Local draft / commits=0
- Sonuç bilgisi
- Provider tamamlanması ayrı
- Provider completion bilinmiyor
ProviderCompletionKnown=false. Caller’ın response görmemesi ile provider’ın iş yapmaması aynı bilgi değildir.
- Provider gözlemi
- responseObserved=false / status=null
- Local kayıt
- localAfter=Local draft / commits=0
- Sonuç bilgisi
- providerCompletionKnown=false
- Deadline ölçülmemiş
TimeoutActuallyMeasured=false, bu dalın gerçek network süresi ölçmediğini belirtir. Status=null değerini ölçülmüş timeout diye yeniden adlandırma.
- Provider gözlemi
- responseObserved=false / status=null
- Local kayıt
- localAfter=Local draft / commits=0
- Sonuç bilgisi
- timeoutActuallyMeasured=false
- Otomatik retry üretilmiyor
AutomaticRetry=false verilmiş. Belirsiz provider completion, operation’ın retry-safe olduğunu kanıtlamaz; retry kararı için contract ve effect bilgisi gerekir.
- Provider gözlemi
- responseObserved=false / status=null
- Local kayıt
- localAfter=Local draft / commits=0
- Sonuç bilgisi
- providerCompletionKnown=false / automaticRetry=false
- UNKNOWN sonucu koru
Rapor local notun değişmediğini ve provider completion’ın bilinmediğini birlikte söyler. Birini diğerinin yerine geçirmek öğrenciyi yanlış failure sınırına götürür.
- Provider gözlemi
- responseObserved=false / status=null
- Local kayıt
- localAfter=Local draft / commits=0
- Sonuç bilgisi
- provider completion=UNKNOWN
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Integration contract’ını somut alanlarla tanımla
Status/body gözlemini sabit yerel provider adapter’ı, commit görünürlüğünü ayrı SQLite connection üretir. Bunlar remote provider’ın gerçekten çalıştığına dair log veya network capture değildir. Provider identity, capability amacı, request veri sınıfı, beklenen status/media type, schema version ve yerel karar sorumluluğunu beraber kaydet. Contract değişince yalnız başarılı örneği değil schema drift ve provider error durumlarını da incele. Atlas, istenen id ile response id’sini, string title’ı ve integer revision’ı kontrol eder. Kullanılmayan extra fields saklanmaz. Bu kontrol title’ı bütün output context’leri için otomatik güvenli yapmaz.
Kabul ile kalıcı write’ı ayrı izle. Yerel transaction sürerken bağımsız reader eski title’ı görür; COMMIT sonrasında Tea note görünür. Reddedilen response’larda commits=0 kalır. Bu gözlem yerel verinin görünürlüğünü anlatır; provider’ın gerçekten request alması, network deadline veya distributed commit hakkında sonuç vermez.
Karar nedenini kullanıcı etkisine bağla
Contract mismatch için success gösterme; unavailable için uygulamanın hata sonucunu üret; unknown durumda remote completion iddiası kurma. Eski local title gösterilecekse nereden geldiği ve güncelliği korunmalıdır. Stale fallback bir policy seçimi olarak açık olmalıdır. Genel kullanıcı hatası ile iç diagnostic category ayrılabilir; provider nesnesinin tamamını browser’a veya log’a kopyalamak gerekmez.
Selector, accepted=false iken localCommitted=true yazılmış tutarsız kaydı arar. Normal rejected kayıtta count=0, tutarsız örnekte count=1 bulunur; eksik event yeterli kanıt değildir. Response ulaşmadan schema sonucu, transaction tamamlanmadan commit sonucu yazılmaz. Provider status, contract kabulü ve yerel mutation aynı request için ayrı gözlemler olarak tutulur.
ŞİMDİ VAKAYA UYGULA
200 cevabı, schema kabulü ve local COMMIT aynı başarı mı?
Atlas public tea notunun başlığını catalog-demo’dan zenginleştirir. Provider cevabı önce contract ile değerlendirilir; local not ancak kendi transaction’ı tamamlanınca değişir.
Vakadaki response’a hangi component’ler katkıda bulunuyor? UI, service, platform ve dış provider sonuçlarının hangi hop’ta tamamlandığını ayrı göster.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Provider yanıtı ve local commit
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"contract": {
"providerAlias": "catalog-demo",
"endpointAlias": "https://catalog.example.invalid",
"apiVersionAlias": "catalog-v1",
"purpose": "public-title enrichment",
"request": {
"id": "tea"
},
"dataClassification": "public synthetic only",
"successStatus": 200,
"mediaType": "application/json",
"schema": {
"id": "requested public id",
"title": "string",
"revision": "integer, not boolean"
},
"unusedExtraFields": "ignored, not persisted",
"providerCanAuthorizePrivateUser": false
},
"normal": {
"status": 200,
"body": "{\"id\":\"tea\",\"title\":\"Tea note\",\"revision\":1}",
"accepted": true,
"localBefore": "Local draft",
"localAfter": "Tea note",
"commits": 1,
"independentReaderDuring": "Local draft",
"independentReaderAfter": "Tea note"
},
"schemaDrift": {
"status": 200,
"body": "{\"id\":\"tea\",\"title\":7,\"revision\":1}",
"accepted": false,
"reason": "contract-mismatch",
"localAfter": "Local draft",
"commits": 0
},
"providerError": {
"status": 503,
"body": "{\"error\":\"temporary\"}",
"accepted": false,
"reason": "provider-unavailable",
"localAfter": "Local draft",
"commits": 0,
"rawDiagnosticsExposed": false
},
"unknown": {
"responseObserved": false,
"status": null,
"reason": "response-unknown",
"accepted": false,
"localAfter": "Local draft",
"commits": 0,
"providerCompletionKnown": false,
"automaticRetry": false,
"timeoutActuallyMeasured": false
},
"limits": {
"native": "fixed direct adapter + own SQLite + independent response/schema parsing",
"realThirdPartyApiExecuted": false,
"browserExecuted": false,
"realTlsVerified": false,
"networkDeadlineMeasured": false
},
"selector": {
"language": "XPath",
"xml": "<audit><integration accepted=\"false\" localCommitted=\"false\"/></audit>",
"xpath": "count(/audit/integration[@accepted='false' and @localCommitted='true'])",
"expected": 0,
"positiveFixtureXml": "<audit><integration accepted=\"false\" localCommitted=\"true\"/></audit>",
"positiveExpected": 1,
"scope": "Authored inert decision ledger only; these are teaching fields, not product log or API field names.",
"missingFieldBehavior": "A missing observation is insufficient evidence; zero matches alone proves no runtime control."
}
}- contract
- Public title için versioned provider contract’ı tanımlar. Provider’ın private user permission kararı verme authority’si yoktur.
- normal/schemaDrift
- HTTP response, schema kabulü ve local commit ayrı sonuçlardır. 200 status ile title’ın doğru türde olması aynı koşul değildir.
- providerError/unknown
- Gözlenen 503 ile hiç response gözlenmemesi farklı bilgi durumlarıdır; local notun değişmemesi bu farkı silmez.
- selector/limits
- Yerel adapter, response parsing ve local SQL kapsamıdır. Gerçek SaaS çağrısı veya network deadline ölçümü değildir.
Actual direct fixed adapter and own SQLite only. Provider messages conceptual; no external call/TLS check/actual network timeout/browser run.
İki yanlış kanı
Well-known SaaS ve HTTP200 local data’yı güvenilir kılar.
Peer/channel, expected schema, object/purpose ve local authority ayrı gate’lerdir.
No response, provider503 ile aynı bilgidir ve success default edilebilir.
Unknown outcome’da observed status yoktur; completion uydurulmaz, selected local state korunur.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Provider 200 döndü, fakat title alanının değeri 7. Local persistence update yapılır mı?
- Evet. Provider’ın 200 cevabı bütün body alanlarını geçerli yapar.
- Hayır. contract-mismatch nedeniyle commits=0.
Gerekçeli cevabı oku
Hayır. contract-mismatch nedeniyle commits=0. — title alanının string olması gerekir. Bu koşul sağlanmadığı için accepted=false; yerel draft değişmeden kalır.
Response gözlenmedi. Provider işleminin tamamlanmadığını varsayarak otomatik retry yapmak bu kanıtla gerekçelendirilebilir mi?
Dersten seçilen artifact alanları; öğretim örneği
- unknown
- {"responseObserved":false,"status":null,"reason":"response-unknown","accepted":false,"localAfter":"Local draft","commits":0,"providerCompletionKnown":false,"automaticRetry":false,"timeoutActuallyMeasured":false}
- Hayır. providerCompletionKnown=false ve automaticRetry=false.
- Evet. Alınamayan her response, hiçbir effect oluşmadığını garanti eder.
Gerekçeli cevabı oku
Hayır. providerCompletionKnown=false ve automaticRetry=false. — Response’un kaybolması remote işlemin sonucunu bildirmez. Yeniden gönderimin güvenli olup olmadığı operation policy’siyle ayrıca belirlenmelidir.
Provider public title enrichment için kullanılıyor. Neden private kullanıcı iznini veya raw diagnostics’in paylaşılmasını belirleyemez?
Gerekçeli cevabı oku
Provider private kullanıcı izni veremez (providerCanAuthorizePrivateUser=false). Local application, doğrulanmış subject ve object policy’sini kendisi uygular. Provider hatası unavailable sonucuna dönüştürülür; raw diagnostics dışarı verilmez (rawDiagnosticsExposed=false). Yerel adapter ve SQLite sonuçları gerçek third-party API, TLS veya browser ölçümü değildir. Kullanılmayan ek alanlar persistence’a yazılmaz.
□ External data’yı private kullanıcı kimliği veya izni için authority saymadım.
□ Kullanıcıya verilen hata ile paylaşılmayan raw diagnostics’i ayırdım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- OWASP API10:2023 — Unsafe Consumption of APIsIs the API Vulnerable? · How To Prevent
- Stripe — VersioningVersioning: major releases and monthly API versions · Versioning: account, SDK and webhook version selection
- Stripe — ErrorsHTTP Status Code Summary · Error Types · Attributes
- AWS — Shared Responsibility ModelAWS responsibility “Security of the Cloud” · Customer responsibility “Security in the Cloud” · Shared Controls
- OWASP — REST Security Cheat SheetHTTPS · Access Control · Input validation · Error handling
- SQLite — Transaction2. Transactions · 2.3. Implicit versus explicit transactions
- SQLite — IsolationIsolation Between Database Connections