4. Autonomy & Risk-Gating¶

Kapan agent auto-jalan, kapan konfirmasi dulu.
Ini pilar paling penting buat agent dengan akses penuh. Salah set → agent bisa rugiin lo dalam 1 prompt.
Konsep dasar: 3-tier autonomy¶
| Tier | Behavior | Contoh |
|---|---|---|
| Low (auto) | Langsung jalan, hasil dikasih balik ke model | ls, cat, df, git status |
| Medium (auto + log) | Langsung jalan, kabarin user setelah | apt install, git commit, post tweet |
| High (konfirmasi) | Stop, minta konfirmasi user dulu | rm, transfer wallet, drop database |
Implementasi: risk field di tool_use¶
Model wajib output risk di setiap tool_use:
<tool_use>{
"name": "run_in_terminal",
"arguments": {
"command": "rm -rf /tmp/cache",
"risk": "high",
"explanation": "Hapus cache folder"
}
}</tool_use>
Backend gating:
def execute_with_gating(call, chat_id):
cmd = call["arguments"]["command"]
risk = call["arguments"].get("risk", "high") # default high (safe-by-default)
if risk == "low":
return run_command(cmd) # silent auto
elif risk == "medium":
result = run_command(cmd)
log_action(chat_id, cmd, "auto-executed")
return result
elif risk == "high":
pending_commands[chat_id] = call
send_to_user(f"Mau jalanin: {cmd}\nBalas 'ya' untuk lanjut, 'no' untuk batal.")
return None # signal: butuh konfirmasi
else:
return f"Unknown risk level: {risk}"
Yang harus ada di SOUL.md¶
## AUTONOMY
Default: full control. Akun user = akun agent.
3 level otonomi per aksi:
Fully autonomous (langsung jalan):
- Read-only: ls, cat, df, ps, git status, git log, curl GET, baca file
- Write minor reversible: mkdir, touch, pip install, git clone,
git add/commit/push, post tweet, reply, like, kirim message
- Wallet read: cek balance, history, simulate transaction
Autonomous + kabarin user setelah:
- Deploy service, restart service, install package besar
- Create repo baru, create PR, merge PR
- Transfer wallet ke address yang udah pernah dipake sebelumnya
- Subscribe/follow akun baru di sosmed
- Big-ticket apt upgrade
Wajib konfirmasi DULU sebelum eksekusi:
- Transfer wallet ke address yang BELUM PERNAH dipake
- Sell/swap crypto dengan nilai >$50 equivalent
- Delete repo, force push ke main, rebase branch shared
- rm -rf, drop database, format disk, sudo reboot
- Unfollow/block massal di sosmed
- Delete email penting
- Apapun yang ga bisa di-undo
Risk field:
- "low" = read-only atau write yang gampang di-undo
- "medium" = write yang butuh effort buat undo, tapi reversible
- "high" = irreversible atau bisa rugi uang/akun
Sistem auto-run low/medium. High butuh user confirm.
Cara nentuin risk¶
Pertanyaan kunci: "Kalo command ini salah, gimana cara recoverynya?"
| Jawaban | Risk |
|---|---|
| Ga ada efek, cuma baca | Low |
Bisa di-undo dengan 1 command lawan (rm <file> → git restore) |
Medium |
| Butuh effort buat recover (restore backup, kontak admin) | High |
| Ga bisa recover sama sekali (data hilang, uang lewat) | High |
Contoh:
| Command | Risk | Alasan |
|---|---|---|
ls -la |
low | Read-only |
git log |
low | Read-only |
mkdir foo |
medium | Bisa di-rmdir |
git commit |
medium | Bisa di-revert |
git push origin feature |
medium | Bisa force-push lawan |
git push --force origin main |
high | Bisa lose history |
rm file.txt |
high | Hilang permanent |
rm -rf node_modules |
medium | Bisa di-npm install ulang |
rm -rf . |
high | Bencana |
sudo systemctl restart nginx |
medium | Bisa di-start lagi |
sudo systemctl stop kai-bot |
medium | Bisa di-start lagi |
dd if=/dev/zero of=/dev/sda |
high | Wipe disk |
kill -9 1234 |
medium | Tinggal restart |
kill -9 $(pidof postgres) |
high | Bisa data corruption |
Spesial: wallet/crypto¶
Wallet butuh aturan khusus karena uang nyata.
## AUTONOMY — WALLET
Auto-execute:
- Cek balance (read-only)
- Cek transaction history
- Simulate transaction (eth_call)
- Approve token untuk router yang udah whitelisted
Konfirmasi DULU:
- Transfer apapun ke alamat yang BELUM PERNAH dipake sebelumnya
- Transfer >$X (atur threshold sesuai comfort lo)
- Swap dengan slippage >2%
- Interact dengan contract baru yang belum di-audit
- Approve unlimited token amount
Verifikasi alamat tujuan:
# Pseudo
KNOWN_ADDRESSES = load_known_addresses() # alamat yang pernah dipake
def is_safe_transfer(to_addr, amount_usd):
if to_addr not in KNOWN_ADDRESSES:
return False, "Alamat baru, butuh konfirmasi"
if amount_usd > 50:
return False, "Amount > $50, butuh konfirmasi"
return True, "Auto-OK"
Spesial: sosial media¶
Sosial media post irreversible (bisa di-delete, tapi udah ke-cache di luar).
## AUTONOMY — SOSMED
Auto-execute:
- Reply ke mention/DM yang udah ada konteks dari user
- Like, retweet
- Follow akun yang user explicit minta
Konfirmasi DULU:
- Original post ke timeline publik
- Massal action (unfollow 100 akun, block list)
- Posting dengan konten sensitif (politik, finansial advice)
- DM ke akun yang user belum pernah interaksi
Pattern konfirmasi yang efektif¶
Saat agent dapet high-risk task, balasan harus:
- Sebutin command-nya verbatim (biar user bisa scan)
- Sebutin alasan kenapa high-risk
- Cara konfirmasi yang clear ("ya"/"no")
Contoh:
Mau jalanin: rm -rf /home/ubuntu/project-lama
Risk: high (irreversible). Folder ini punya 245 file, total 1.2GB.
Lanjut? Balas "ya" untuk hapus, atau apapun untuk batal.
Anti-patterns¶
❌ Konfirmasi untuk semua hal¶
Konfirmasi cuma untuk high-risk. Low-risk auto.
❌ Auto-execute high-risk¶
Itu disaster waiting to happen.
❌ Risk yang ga konsisten¶
Hari ini apt install = low. Besok apt install = high. Bikin user bingung.
Set rule yang stable di SOUL.md, jangan ubah tiap minggu.
❌ Konfirmasi multi-step yang ribet¶
Agent: Mau jalanin command ini?
User: ya
Agent: Sebelum saya jalankan, apakah Anda ingin backup dulu?
User: ya
Agent: Backup ke mana?
1 konfirmasi cukup. Pre-action: pake default yang masuk akal. Post-action: kasih hasil.
Audit logging¶
Untuk action yang medium/high, log:
def log_action(chat_id, command, result, risk):
with open("data/audit.log", "a") as f:
f.write(f"{datetime.now().isoformat()} | chat:{chat_id} | risk:{risk} | cmd:{command[:200]} | ok:{result[:100]}\n")
Audit log buat:
- Debugging kalo agent salah jalan
- Review periodik action agent
- Forensik kalo ada kejadian aneh
Test risk-gating¶
Sebelum production, test minimal:
ls /→ expect: low, auto-executegit commit -m "test"→ expect: medium, auto-execute + logrm -rf /tmp/test→ expect: high, konfirmasi- Custom command yang lo prediksi high-risk → expect: konfirmasi
Kalo agent salah klasifikasi risk, perketat instruksi di SOUL.md.