Retry → rollback → escalation zinciri (Domain 2 imza)
Retry → rollback → escalation chain (Domain 2 signature)
Bu derste neler öğreneceksin
- Doğru sıralamayı ezberlemek: error handling → retry → rollback → escalation → traceability
- Idempotency'nin retry için neden ön koşul olduğunu kavramak
- Partial state senaryosunda rollback'in nasıl uygulandığını görmek
- Escalation path'in 'sessiz fail değil, net bağlamlı insan' davranışını öğrenmek
Domain 2.4 — sınavın her turunda tekrar eden zincir. Sıralama ezberlenmeli; her halkanın ne yaptığını ve hangi durumda atlanacağını bilmek gerekir.
Zincir (sırayla ezbere)
Error
↓
[1] Error handling — error'u yakala, sınıflandır
↓
[2] Retry — idempotent ise tekrar dene (backoff ile)
↓
[3] Rollback — partial state varsa bilinen iyi state'e dön
↓
[4] Escalation — insana net bağlam ile bildir
↓
[5] Traceability — her adım kalıcı iz bırakır
Bu zincir Domain 2.4’ün 5 bullet’ının birebir sıralı uygulamasıdır.
[1] Error handling — sınıflandırma
Error geldiğinde önce sınıflandır:
| Sınıf | Örnek | Yaklaşım |
|---|---|---|
| Transient | HTTP 503, rate limit, network timeout | Retry uygun |
| Authentication | 401, expired token | Token rotate, retry |
| Authorization | 403, missing scope | Escalation (insan izin değişikliği gerek) |
| Validation | 400, bad input | Plan revize, retry değil |
| Server | 500 internal error | Retry dene, çözmezse escalation |
| Resource | 404 not found | Plan revize veya escalation |
| Idempotency conflict | 409 conflict | Rollback + retry |
Sınıf belirsizse default: retry sınırlı + rollback + escalation.
[2] Retry — idempotency ön koşulu
Idempotent ne demek?
Bir operasyonun birden çok kez çağrılmasının aynı sonucu üretmesi. Aynı state’i ürettiği sürece güvenle retry edilebilir.
| İşlem | Idempotent? | Notu |
|---|---|---|
| HTTP GET | ✅ Default idempotent | Veri okuma side-effect’siz |
| HTTP PUT | ✅ Idempotent | ”Bu kaynağı şu state yap” |
| HTTP DELETE | ✅ Idempotent | ”Bu kaynağı sil” — yoksa zaten yok |
| HTTP POST | ❌ Default non-idempotent | ”Yeni kaynak yarat” — iki POST = iki kaynak |
| Credit card charge | ❌ Non-idempotent | Çift charge tehlikesi |
git push | ⚠️ Conditional | Force push idempotent değil |
| Idempotency-Key header’lı POST | ✅ Idempotent | Sunucu key ile duplicate’i engeller |
Non-idempotent operasyonu retry etme — duplicate üretirsin. Bunun yerine rollback + plan revize + retry edilebilir hale getirme.
Retry stratejisi — exponential backoff
# Pseudo-code
delays = [1, 2, 4, 8, 16] # saniye, exponential
for attempt, delay in enumerate(delays):
try:
result = call_tool()
break
except TransientError:
sleep(delay)
continue
else:
# tüm retry'ler tükendi → rollback aşamasına
rollback()
Lineer retry (her 5 saniye) anti-pattern — DDOS gibi davranır. Sınav backoff’lu retry bekler.
[3] Rollback — bilinen iyi state’e dön
Retry çözmezse veya partial state varsa, rollback devreye girer.
GitHub native rollback yöntemleri
| Senaryo | Rollback |
|---|---|
| Bozuk commit | git revert <sha> (yeni commit oluşturur, geçmişi korur) |
| Bozuk PR | PR close (merge yapılmadıysa) veya merged PR için revert PR |
| Bozuk deployment | Önceki tag’i environment’a re-deploy |
| Bozuk veri (DB) | Backup’tan restore (HITL onayı genelde) |
Anti-pattern: git push --force
Geçmişi yeniden yazar, audit kaybı, başkasının çalışmasını ezer. Sınavda “rollback yöntemi” sorusunda asla doğru cevap değil.
Partial state pattern
Multi-step iş yarıda kaldı:
- Step 1 ✓ (DB’ye user yarattı)
- Step 2 ✓ (Stripe’a subscription yarattı)
- Step 3 ✗ (Email gönderme fail)
Doğru rollback:
- Step 2’yi geri al (Stripe subscription cancel)
- Step 1’i geri al (DB’den user sil)
- Sonra retry kararı (network düzeldi mi? plan revize gerekli mi?)
Sınavın “agent partial state bırakarak fail oldu” sorusunda cevap önce rollback — direkt retry değil (state inconsistent), direkt escalation değil (henüz çözüm denenmedi).
[4] Escalation path — sessiz fail yok
Retry + rollback çözmediğinde insana bildirim. Net bağlam şart:
Escalation mesajı içeriği
- Ne yapmak istendi (orijinal görev)
- Ne denendi (retry sayısı, rollback sonucu)
- Hangi hata + hangi sınıf
- Şu anki state ne (rollback sonrası)
- Önerilen sıradaki adım (varsa)
- Bağlantılar: PR, Actions run, issue
GitHub native escalation
- name: Escalate on failure
if: failure()
uses: actions/github-script@v7
with:
script: |
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `🚨 Agent escalation: ${context.workflow}`,
body: `Agent failed after retry + rollback.\n\n` +
`**Workflow:** ${context.workflow}\n` +
`**Run:** ${context.runId}\n` +
`**Error:** see logs`,
labels: ['agent-escalation', 'priority/high'],
assignees: ['oncall-handle']
});
Anti-pattern: sessiz kapatma
Agent fail oldu → log yaz → bitir. ❌ Sınavda traceability ihlali.
[5] Traceability — her adımda
Zincir’in her adımı log/artifact bırakır:
| Adım | Nerede izi var |
|---|---|
| Error sınıflandırma | Actions run logs |
| Retry attempts | Actions run logs + step summary |
| Rollback | Yeni commit/PR + audit log |
| Escalation | Issue + Slack notification + audit log |
| Final state | PR description + Actions artifact |
Sınav “6 ay sonra ‘agent ne yapmıştı’ sorusu için bakılacak yer?” sorusunun cevabı GitHub audit log + Actions + PR/issue geçmişi.
Sınav favorisi senaryolar
Senaryo 1: “Agent multi-step REST API task’ının 3. adımında bozuldu, partial state yazılı. İlk doğru aksiyon?” Doğru: Rollback (önceki adımları geri al) → sonra retry/escalation kararı. Yanlış: “Yeniden başlat” (partial state üzerine yazar).
Senaryo 2: “Agent 5 kez retry edip aynı hata. Sıradaki?” Doğru: Escalation (insana net bağlam). Yanlış: 6. retry, sessiz kapatma.
Senaryo 3: “503 transient error. İlk aksiyon?” Doğru: Exponential backoff ile retry. Yanlış: Direkt rollback veya escalation.
Mini quiz — Retry/rollback/escalation (3 soru)
Sırada ne var?
Bir sonraki ve Domain 2’nin son dersi — lab: bir remote MCP server + allow list + Actions trigger + escalation zincirini tek bir test repo’da kuracağız.