Lewati ke isi

8. Escalation

Kapan agent berhenti dan minta bantuan user.

Agent autonomous bisa loop selamanya kalo ga ada exit condition. Escalation pilar nentuin kapan agent harus stop dan kasih kontrol balik ke user.

Yang harus ada

## ESCALATION

- Gagal 3x hal yang sama → bilang ke user, jangan loop terus.
- Output ga jelas (ambiguous) → tanya 1 pertanyaan spesifik, 
  jangan nebak.
- Task di luar capability (butuh GUI captcha, credential ga ada, 
  butuh approval user langsung) → bilang langsung.
- Kalo user minta sesuatu yang berisiko (transfer besar, delete 
  penting) → konfirmasi 1x, terus eksekusi.

4 trigger escalation

1. Retry limit reached

Setelah 3x gagal hal yang sama, stop:

def execute_with_retry(action, max_retries=3):
    for attempt in range(max_retries):
        result = action()
        if result.success:
            return result
        log_attempt(attempt, result.error)

    # Escalate
    return EscalationResult(
        message=f"Gagal {max_retries}x: {result.error}. "
                f"Lo perlu intervene manual.",
        last_error=result.error,
        attempts=max_retries
    )

2. Ambiguity

Kalo user request ambigu, tanya 1 pertanyaan spesifik:

❌ Bad:

User: bersihin folder
Agent: Saya ingin memastikan beberapa hal. Folder mana yang Anda 
maksud? Apa kriteria 'bersih'? Apakah Anda ingin backup terlebih 
dahulu? Apakah ada file yang harus dipertahankan? Apakah Anda 
ingin saya tampilkan dulu sebelum menghapus?

5 pertanyaan = annoying.

✅ Good:

User: bersihin folder
Agent: Folder mana? /tmp atau home? 
       (default: /tmp file lebih dari 7 hari, kalo bukan itu kasih tau)

1 pertanyaan + default = user bisa langsung jawab atau correct.

3. Capability gap

Saat agent ga punya tool/credential untuk task:

User: post ke Instagram

Agent (kalo creds belum ada):
"Belum ada credential Instagram. Lo perlu siapin file 
~/agent/credentials/instagram.env dengan format:
  IG_USERNAME=...
  IG_PASSWORD=... 
  IG_2FA_SECRET=... (kalo ada)
Setelah itu coba lagi."

Pattern: jelasin apa yang missing + cara user supply.

4. High-stakes confirmation

Ini overlap sama risk-gating, tapi worth nyebutin di Escalation:

User: transfer 1 ETH ke 0xabc...
Agent: 1 ETH = ~$2000. Address baru (belum pernah dipake).
       Sure? Balas "ya" untuk lanjut.

Bedanya risk-gating sama escalation:

  • Risk-gating: rule statis (rm = high). Konfirmasi sekali.
  • Escalation: dynamic context (3 attempts failed). Kasih kontrol back ke user.

Format escalation message

Escalation message harus punya:

  1. Status: apa yang udah dicoba
  2. Blocker: kenapa stuck
  3. Action needed: apa yang user harus lakuin

Contoh:

Stuck di step 3. 

Coba 3x git push, semua reject:
- Attempt 1: "non-fast-forward, remote ahead"
- Attempt 2: same (setelah git pull → conflict)
- Attempt 3: same

Lo perlu resolve conflict manual di file X dan Y. Setelah itu 
bilang "lanjut", gue retry push.

vs

Error: cannot push.

Yang pertama actionable. Yang kedua membingungkan.

Multi-step task escalation

Untuk task multi-step, jangan diem-diem stuck di tengah:

Task: deploy feature X

Step 1: git pull ✅
Step 2: pip install -r requirements ✅
Step 3: pytest ❌ (test_user.py:42 fail)

Stuck di step 3. Test fail karena assertion mismatch. 
Output test:
  AssertionError: expected 5 got 4

Mau lo investigate, atau gue skip test dan lanjut deploy 
(risk: bug bisa ke production)?

Beri opsi yang explicit, biar user pilih.

Escalation vs persistence

Kapan keep trying, kapan escalate?

Situasi Action
First failure, error transient (network) Retry 1x
First failure, error logic (missing arg) Fix dan retry
2nd failure, sama error Try different approach
3rd failure, sama error Escalate
Error type berubah tiap retry Mungkin loop, escalate
Errror "permission denied" Ga akan resolve dengan retry, escalate langsung
Error "not found" Tanya path yang benar, escalate semi-aware
Error "credential missing" Escalate langsung (capability gap)

Pattern: "I'm stuck, here's what I tried"

Format ini paling efektif:

Stuck. Yang udah gue coba:

1. [Approach A]: gagal karena X
2. [Approach B]: gagal karena Y  
3. [Approach C]: gagal karena Z

Kemungkinan root cause: [hypothesis]

Yang gue butuh dari lo:
- [Specific action 1]
- [Specific action 2]

Atau lo punya approach lain in mind?

User langsung tau context + bisa kasih guidance.

Anti-patterns

❌ Loop infinite

Agent: [try X] fail
Agent: [try X] fail
Agent: [try X] fail
Agent: [try X] fail
... (50x)

Cap retries di kode + check di SOUL.md:

MAX_AGENTIC_STEPS = 12
for step in range(MAX_AGENTIC_STEPS):
    # ...

❌ Silent fail

User: deploy
Agent: [run deploy, gagal]
Agent: Oke selesai.

Kalo gagal, bilang gagal. Jangan claim selesai.

❌ Escalation tanpa context

Agent: Tidak bisa diselesaikan. Mohon bantuan Anda.

User: "Bantuan apa?? Apa yang ga bisa??"

Selalu kasih: status + blocker + action needed.

❌ Tanya pertanyaan ganda

User: deploy
Agent: Branch mana? Environment apa? Pakai docker atau native? 
Backup dulu? Notify team? Run smoke test?

1 pertanyaan critical, atau pakai default + bilang asumsi:

Agent: Anggap branch main, env production, deploy via systemd. 
Salah satu? Balas "ya" atau correct yang salah.

SOUL.md template lengkap

## ESCALATION

Triggers:
- 3x retry failed dengan sama error → escalate
- User request ambigu → tanya 1 pertanyaan spesifik
- Capability gap (tool/credential missing) → bilang explicit
- High-stakes action (transfer besar, delete penting) → konfirmasi

Format escalation message:
- Status: apa yang udah dicoba
- Blocker: kenapa stuck
- Action needed: apa user harus lakuin

JANGAN:
- Loop tanpa cap (max 12 agentic steps)
- Silent fail (claim "done" padahal gagal)
- Pertanyaan ganda (1 critical max)
- Vague "mohon bantuan" tanpa konteks