# error-retry

## 解決什麼問題
外部 API 偶發 500 / timeout 是常態。寫死「打一次就放棄」太脆弱。
這個 pattern 提供標準 retry chain：失敗 → 等 5 秒 → 重試一次 → 還失敗才通知人。

## 怎麼觸發
```bash
curl -X POST https://cypher.arcrun.dev/webhooks/named/error_retry/trigger \
  -d '{
    "api_key":"ak_xxx",
    "target_url":"https://flaky-api.example.com/endpoint",
    "payload":{"x":1},
    "workflow_name":"my_workflow"
  }'
```

## 改成你自己的
- `wait_a_bit.seconds` 改延遲（指數 backoff：5, 15, 45 秒）
- 串更多 retry 節點（generic 寫 3-4 次足夠）
- `final_fail_notify` 換 email / pagerduty / slack 等
- 加 `if_control` 判斷 error 類型（4xx 不重試、5xx 重試）

## 為什麼這 pattern 重要
- arcrun 的 `ON_FAIL` 邊是宣告式 error handling，比寫 try/catch 直觀
- `wait` 零件不消耗 CPU（cypher-executor 排程 sleep 後恢復），比 setTimeout 健康
- 失敗最終要通知人，不能默默吞 — 通知本身也是 workflow 的責任

## 變體
- **Circuit breaker**：3 次連續失敗 → 寫 KBDB `circuit:open` flag → 後續 trigger 直接跳過
- **Dead letter queue**：失敗的 input 寫 KBDB type=dlq-input，方便事後手動重跑
- **Idempotency key**：retry 時帶同樣的 request_id，避免下游重複處理

## 學到什麼
- `ON_FAIL` 邊：節點失敗時走哪條
- `wait` 零件：宣告式 delay，不阻塞 worker（推到 paused-resume）
- `{{node_id.error}}` 取得失敗節點的錯誤訊息
- 把「最終失敗通知」當 workflow 一部分，不靠系統外部 monitoring
