---
{
  "id": "platform.workflow.branching-loops-and-sleep",
  "topic": "workflow",
  "title": "Workflow 分支、迴圈與 Sleep 節奏",
  "locale": "zh-TW",
  "version": "2026-08-09",
  "summary": "用有序 next 陣列做循序 fan-out，理解沒有 barrier 的 diamond，並以 Sleep 控制有上限輪詢迴圈的節奏。",
  "content": "Step 完成後，`next` 陣列中的每個目標會依陣列順序各加入 queue 一次。Phase 2 使用循序 BFS，分支不會平行。A → (B, C) → D 這種 diamond 沒有 join 或 barrier，因此 D 會跑兩次，分別來自 B 與 C 的 traversal。若重複 side effect 不安全，應拆成不同下游 step。Delivery step 失敗會使整個 run 失敗；若位於 loop，每個 iteration 都會各自 enqueue 並扣款。`notify` step 則是相反的 reliability boundary：持久化或 push 失敗絕不使 run 失敗。\n\nBack edge 與 self-loop 都合法。每次造訪都是新的 zero-based `iteration`，`{{steps.X.output}}` 永遠讀取 X 最新完成的 iteration。輪詢時，先經過 `seconds` 介於 1–3600 的 Sleep step，再回到 poll step。Sleep 會建立可見的 step run，至少每五秒檢查一次取消，也會在 workflow deadline 停止。刻意長跑的輪詢達到最長執行時間是中性的預期結果，不一定代表流程設計失敗。\n\n`maxVisitsPerStep` 可設 1–1000，預設 25。若某 step 已執行到上限，新的 incoming traversal 會被丟棄、run 留下 notice，其他已排隊分支仍繼續。Queue 清空後 run 會 completed，包括 visit fuse 丟棄 traversal 後的情況。`maxDurationSeconds` 與手動取消是彼此獨立的保險。`graph.layout` 是不透明的 UI metadata，請勿修改。欄位、狀態、iterations 與 notices 最終以 live Action schema 和 run detail 為準。\n",
  "aliases": [
    "workflow 分支",
    "fan-out 流程",
    "workflow 迴圈",
    "輪詢迴圈",
    "Sleep step",
    "每步最大造訪次數",
    "diamond workflow",
    "branching workflow"
  ],
  "tags": [
    "workflow",
    "branching",
    "loops",
    "sleep",
    "iterations"
  ],
  "relatedActions": [
    "arinova.workflow.create_workflow",
    "arinova.workflow.update_workflow",
    "arinova.workflow.run_workflow",
    "arinova.workflow.get_run",
    "arinova.workflow.cancel_run"
  ],
  "relatedActionPrefixes": [],
  "url": "https://docs.arinova.ai/zh-tw/kb/workflow/branching-loops-and-sleep/"
}
---

Step 完成後，`next` 陣列中的每個目標會依陣列順序各加入 queue 一次。Phase 2 使用循序 BFS，分支不會平行。A → (B, C) → D 這種 diamond 沒有 join 或 barrier，因此 D 會跑兩次，分別來自 B 與 C 的 traversal。若重複 side effect 不安全，應拆成不同下游 step。Delivery step 失敗會使整個 run 失敗；若位於 loop，每個 iteration 都會各自 enqueue 並扣款。`notify` step 則是相反的 reliability boundary：持久化或 push 失敗絕不使 run 失敗。

Back edge 與 self-loop 都合法。每次造訪都是新的 zero-based `iteration`，`{{steps.X.output}}` 永遠讀取 X 最新完成的 iteration。輪詢時，先經過 `seconds` 介於 1–3600 的 Sleep step，再回到 poll step。Sleep 會建立可見的 step run，至少每五秒檢查一次取消，也會在 workflow deadline 停止。刻意長跑的輪詢達到最長執行時間是中性的預期結果，不一定代表流程設計失敗。

`maxVisitsPerStep` 可設 1–1000，預設 25。若某 step 已執行到上限，新的 incoming traversal 會被丟棄、run 留下 notice，其他已排隊分支仍繼續。Queue 清空後 run 會 completed，包括 visit fuse 丟棄 traversal 後的情況。`maxDurationSeconds` 與手動取消是彼此獨立的保險。`graph.layout` 是不透明的 UI metadata，請勿修改。欄位、狀態、iterations 與 notices 最終以 live Action schema 和 run detail 為準。
