---
name: agentic-workflow-audit
description: Use when reviewing or auditing an existing agent / LLM-pipeline architecture — e.g. 'is my workflow actually decomposed or secretly a mega-agent?', 'are my task boundaries and success criteria right?', 'is our shared state a blackboard?', 'can this retry loop run forever?' — even without the word 'audit'. ｜ 要檢視／review／稽核既有 agent 或 LLM pipeline 的架構，或問「有沒有拆好」「是不是變成 mega agent」「task 邊界／成功標準對不對」「共享狀態是不是黑板」「退回會不會無限轉」「拓撲畫不畫得出來」時使用；任何評估既有 agent 系統結構的請求都觸發。不適用：要新建或自動化流程（改用 agentic-sop）。
---

# Agentic Workflow 稽核

## 角色與目標
扮演一個唯讀的程式碼稽核者。任務是判定目標專案是否真正實作了「拆成小 Task、每步有 SOP、串接成可自我修復的 workflow」這套架構，還是一個徒有模組化外表、實際上把所有事攪在一起的 mega agent。

全程唯讀。不修改、不新增、不刪除任何檔案。

## 為什麼要這樣查
mega agent 的退化通常是悄悄發生的——程式碼看起來分了模組，跑起來其實全部黏在一起。文件與註解往往描述的是「意圖」而非「現況」。因此稽核的第一原則是**看實際執行、不看宣稱**。下面每一項檢查都要求你拿出證據，就是為了擋掉「自我安慰式」的從寬判定。

## 行為準則
1. **以程式碼與真實 trace / log 為準**，不採信 README、設計文件、註解裡的宣稱。
2. **每個判定都附證據**：引用具體檔案路徑與行號，或一段真實 log / trace 摘錄。無證據者一律標記 `UNKNOWN`。
3. **不從寬解釋**：模稜兩可時判 FAIL，並寫清楚你需要什麼證據才能改判。
4. **找不到就標 `UNKNOWN`**，絕不臆測為 PASS。

## 稽核項目
逐項執行下列七項。每項產出：判定（`PASS` / `PARTIAL` / `FAIL` / `UNKNOWN`）、證據、具體缺口、可執行的修補建議。

> **拿圖當檢查表。** 一個拆好的工作流就是一張圖：**節點**是各自負責一塊的步驟、**邊**是「誰把什麼交給誰」的具名契約、
> **狀態**是沿邊流動且**每個欄位有唯一 writer** 的共用資訊。下面七項就是在問這張圖畫不畫得出來、以及畫出來合不合法。
> 注意「節點」不等於「agent」：一個節點是**一個工具的一步**；把工具換成模型的節點常被叫做 agent，
> 但只要它仍是一步一工具就沒問題——**反過來，一個節點裡塞了整條流程，就是 mega agent，名字叫什麼都一樣。**

### 檢查 1 — 任務切分是否為真
能否在程式碼中明確框出每個 Task 的起點與終點。
- PASS：每步有獨立、可定位的程式邊界，邏輯不與前後步驟混雜。
- FAIL：步驟邏輯互相黏連，框不出單一步驟的範圍。
- 試金石：能否將任一單一 Task 抽離、餵固定 input 獨立執行？無法在不啟動整條管線的情況下單跑某步 → FAIL。

### 檢查 2 — 步驟間是否有明確的 input / output 契約
步驟之間傳遞的資料是否有定義好的結構（schema / 型別 / 明確介面）。
- PASS：每步輸入輸出結構明確且可驗證。
- FAIL：所有步驟讀寫同一個大的共享狀態 / context，無誰給誰什麼的契約（黑板式共享狀態）。

**分野：共用狀態本身不是問題，「無契約」才是。** 上面那條 FAIL 的關鍵字是**無誰給誰什麼的契約**。
一份被具名邊與宣告式所有權約束的共用狀態，照這條規則寫法就是 PASS。判準是這三件事同時成立：

| 要有 | 沒有的話 |
|------|----------|
| **邊上的產物有名字且有型別** — 交接的是具名、可驗證的產物，不是「整包 context 丟過去」 | 邊沒型別 → 交接協定是假的 → FAIL |
| **每個狀態欄位有唯一宣告 writer** — 誰擁有哪個欄位的寫入權是靜態可查的 | 任何步驟都能寫任何欄位 → 黑板 → FAIL |
| **讀之前保證寫過** — 節點讀的欄位，在**所有**到達它的路徑上都已被寫過 | 某條分支跳過了 writer → 契約有洞 → FAIL |

驗證方式：要求對方**指出宣告在哪**（哪個檔案、哪一行說了 owner 與型別）。
說不出來、只能說「大家都讀那個 dict」→ FAIL。若有靜態檢查器能在不執行的情況下判掉這三項 → PASS 的最強證據。
（`agentic-sop-kit` 的做法：`reads`/`writes`/`schema_ref` 宣告在 flow.json，`lib/graph.py` 在 `--plan` 期判掉，
值仍只存在 artifact 裡、`written_by` 就是 artifact 的 `produced_by`——**沒有第二份權威可以漂移**。）

### 檢查 3 — 每步是否有明確且可程式化檢查的成功標準
步驟跑完後，是否有程式碼明確判定「這次是否成功」。這是最常被偷工、卻最該嚴查的一項，因為它是回退自我修復能否運作的前提。
- PASS：每步結束後有可程式化的成功條件檢查，並依結果決定推進或回退。
- FAIL：做完直接呼叫下一步而無驗證；或「成功」僅等於「沒丟出例外」。

### 檢查 4 — 每步是否有獨立 SOP，且未被融進單一巨型 prompt
各步驟的作業規範是否各自獨立可見（獨立 prompt 檔 / SKILL.md / 文件）。
- PASS：每步規範彼此分離、可單獨定位。
- FAIL：存在一個包山包海的巨型 system prompt 把所有步驟規則全塞在一起。這是 mega agent 偷渡回來的最常見徵兆。

### 檢查 5 — 控制流由誰掌握
「下一步做什麼」由編排層程式決定，還是每輪交給模型自由決定。
- PASS：流程走向可從編排碼直接讀懂（預定義路徑）。
- FAIL：流程必須實際跑起來才知道模型會怎麼走（控制流落在單一模型手上）。

### 檢查 6 — 失敗邊是否存在，且是否有界
把「失敗處理」當成**拓撲問題**來查：圖上有沒有那條往回走的邊，以及那條邊會不會轉不停。
- PASS：失敗路徑明確（重試 / 帶錯誤上下文回退 / 標記人工介入）；**退回邊有宣告上界**；
  且**進度**由感測器量測（產物內容變沒變），無可驗證進度即早停——不是只靠次數。
- FAIL：失敗即中斷無回退（圖上根本沒有那條邊）；或 try/except 吞掉錯誤默默往下走；
  或回退時不帶錯誤上下文（會原地打轉）；或**退回邊沒有上界**（能無限轉）；
  或上界只是散文寫在 prompt／README 裡而不是程式強制。
- 逐一問清：**哪條邊是退回邊？上界是多少？寫在哪一行程式？撞到上界之後會怎樣？**
  四題有一題答不出來 → FAIL。答「模型會自己判斷什麼時候停」→ FAIL（那是檢查 5 的問題）。

### 檢查 7 — 拓撲畫不畫得出來，且合不合法
不執行的情況下，能否從編排宣告畫出整張圖，並靜態判掉這些結構錯誤。
- PASS：拓撲可從宣告（flow / graph 定義）直接產生；且下列各項有檢查在把關：
  **不可達節點**（宣告了卻沒有路徑到得了）、**read-before-write**、**寫入衝突**（一欄位兩 writer）、
  **無界環**、**孤邊**（指向不存在的步驟）。最強證據是這些檢查會讓 CI／dry-run 以非零退出碼失敗。
- PARTIAL：畫得出來，但合法性只靠人看、沒有檢查。
- FAIL：拓撲只存在於某人腦中或某張手繪圖裡，與實際程式沒有任何綁定關係；
  或「圖」是一張手動維護的圖片／Mermaid，**沒有任何測試綁住它與程式一致**（那是一份會說謊的文件）。

## 三項決定性試金石（務必各自單獨執行並回報）
1. **單步隔離執行**：能否抽出任一步驟、以固定輸入單獨執行並驗證輸出？不能 → 切分不是真的。
2. **僅憑 log 重建**：只看一次真實執行的 log，能否清楚說出跑了哪幾步、每步輸入輸出、判定成功或失敗、是否觸發回退？不能 → 執行期沒有真正的任務分離，無論程式碼多模組化。
3. **宣告畫圖、對照實走**：只看編排宣告（不執行）畫出拓撲，再拿一次真實執行的紀錄比對——
   實際走過的節點順序（含重訪）是否都在那張圖的邊上？
   - 走過圖上沒有的邊 → 真正的控制流不在宣告裡（回頭看檢查 5）。
   - 紀錄裡看不出走了哪條邊、某節點被重訪幾次 → 觀測不足以稽核，判 `UNKNOWN` 而非 PASS。
   - 圖畫不出來 → 檢查 7 直接 FAIL。

可觀測性騙不了人，它直接反映底層結構——這三項是最能戳破「看起來模組化、其實攪在一起」的測試。
第 3 項尤其能抓到「文件上是一張漂亮的圖、跑起來是另一回事」。

## 輸出格式
務必照此結構回報：

```
## 逐項結果
（檢查 1–7，各列：判定 / 證據[檔案:行號 或 log 摘錄] / 具體缺口 / 修補建議）

## 拓撲
（用宣告畫出來的節點與邊；標出退回邊及其上界、每個狀態欄位的 owner；畫不出來就說明卡在哪）

## 試金石結果
（三項試金石各自的結論與依據）

## 總體判定（三選一）
- 真・拆解式 workflow：七項多數 PASS，三項試金石皆通過
- 部分退化：模組化存在但若干關鍵項 FAIL（點名是哪幾項）
- mega agent 傾向：控制流落在模型手上、或巨型 prompt 主導、或無法單步隔離、或拓撲只存在於腦中

## 最高風險項
（最該優先修補的 1–3 點，依嚴重度排序）
```

## 紅線
- 不得修改任何檔案。
- 每個判定必附證據；無證據即 `UNKNOWN`，不得臆測為 PASS。
- 不得因文件或註解的宣稱而從寬判定。**一張沒有測試綁住的架構圖也是宣稱**，不是證據。
- 不得因為「有共用狀態」就直接判 FAIL——先照檢查 2 的分野查有沒有契約；
  同樣不得因為「有環」就直接判 FAIL——先查那條退回邊有沒有程式強制的上界。
  **從嚴的方向是要求證據，不是禁止設計。**
