文章目錄

「一個代理做完,把結果交給下一個代理接著做」——這已經不是實驗室情境,代理編排(agent orchestration)是各大企業軟體正在出貨的產品能力。於是內控圈長出了一個新的隱藏假設:每個代理的權限都各自設好、各自合規,整體就合規。這篇要拆的就是這個假設——因為當代理開始互相觸發,職能分離(SoD)要掃的對象,就從「點」變成了「鏈」。
我們在 AI 代理的內控框架的支柱三留過一個伏筆:「代理鏈的複合檢視是全新的課題」。這篇把它展開成一套今天就能動手的方法——鏈式掃描三步:畫鏈 → 掃鏈 → 斷鏈。畫鏈:盤點誰觸發誰(含排程、事件、子代理),把觸發關係畫成鏈路圖;掃鏈:把人類 SoD 的不相容組合,在「鏈」的層級重掃一次;斷鏈:在高風險鏈上插入人類控制點。它的血統很清楚:就是我們在權限設計專文講過的 SoD 三步(建矩陣 → 掃衝突 → 分離優先/補償墊底)的鏈級延伸——人類版掃的是「一個人手上的權限組合」,鏈級版掃的是「一條路徑上的代理接力」。
先立這篇的定律,後面每一節都會回到它:單一代理的合規,加總不出一條鏈的合規——SoD 要掃的是路徑,不是節點。 供應商主檔代理的權限乾淨、下單代理的權限也乾淨,但 A 的輸出能觸發 B,兩個乾淨的點就接成了假供應商舞弊的無人化路徑。這正是人類 SoD 講的「不相容職務集中在一人」——只是那個「一人」,現在是一條鏈。
第一步:畫鏈——先承認你不知道公司裡有幾條鏈
平移的部分:權限盤點本來就是 SoD 的第一步,建矩陣之前要先知道誰有什麼權限。新增的部分:代理的「權限」不只寫在權限表裡,還藏在觸發關係裡——重點不是它能做什麼,是它能叫醒誰。三種觸發來源都要盤,漏一種就漏一批鏈:
- 事件觸發:單據狀態改變、系統事件、webhook——一張採購單核准,喚醒了哪個代理?
- 排程觸發:每天凌晨照表跑的批次串——排程串起來的代理接力,是最容易被忘記的鏈。
- 代理觸發:一個代理的輸出是另一個代理的輸入,包含母代理生成的子代理。
盤完之後落成這張表——代理鏈盤點表(本文第一個帶走工具):
| 鏈編號 | 起點事件 | 途經代理 | 終點動作 | 金額/財報影響 | 人類控制點位置 | 風險級 |
|---|---|---|---|---|---|---|
| C-01 | 銀行入帳通知 | 對帳代理 → 沖帳代理 | 應收沖帳過帳 | 直接影響應收餘額 | 無 | 高 |
| C-02 | 安全庫存跌破 | 補貨代理 → 下單代理 | 採購單送出 | 單筆上限內、累計可觀 | 下單前主管放行 | 中 |
| C-03 | 每日 06:00 排程 | 費用辨識代理 → 立帳代理 | 費用過帳 | 單筆小額、彙總影響損益 | 無 | 中 |
(以上為示意列。)鏈編號是給每條鏈一個「身分」——之後掃鏈、查核、回測都認這個編號,如同代理本身要有獨立身分一樣。判斷一條鏈要不要進表的規則只有一條:終點動作會動到主檔、過帳或付款的,整條鏈就進表——不管它中途經過幾個看起來無害的代理。
第二步:掃鏈——把整條鏈當成一個「虛擬使用者」去掃
平移的部分:不相容組合清單直接沿用人類版——供應商主檔 × 採購下單、開立發票 × 收款沖帳、系統權限管理 × 任何交易權限……建矩陣的方法我們在權限設計專文寫過完整版,這裡不重複。新增的部分是比對的對象換了:從「同一個身分的權限集合」,換成「同一條鏈途經的所有代理,其權限的聯集」。做法是把一條鏈上所有代理的權限加總起來,視同一個虛擬使用者,拿去對 SoD 矩陣掃——落在 ✖ 格上的鏈,就是危險鏈。
掃的時候,先對這四條——經典危險鏈清單(本文第二個帶走工具):
- 供應商主檔代理 → 下單代理:人類版 SoD 的頭號 ✖ 格(自己開供應商自己下單),鏈級版一樣是頭號——差別是這條路徑上連一個需要被收買的人都沒有。
- 訂單 → 出貨 → 開票 → 沖帳的全自動閉環:單看每一段都是合理的自動化,串起來是整條收入循環沒有人手碰過一次——收入認列的每個關鍵控制點,被代理接力跳過。
- 監控代理與被監控代理同源:負責回測、抓例外的代理,跟被它監控的代理出自同一套規則來源、或掛同一個設定者——這是自己查自己的帳,覆核形同虛設。設定者與覆核者分離的原則(pillar 支柱三),在代理身上也一體適用。
- 子代理繼承母代理權限鏈:母代理的權限乾淨,但它生成的子代理繼承母權限、再去觸發別的代理——這條鏈在權限表上根本看不到,只能靠畫鏈的時候盤出來。
第三步:斷鏈——人要放在對的那一節,不是每一節
掃出危險鏈之後的處置,跟人類版一樣有優先序。首選是拆鏈:讓不相容的代理彼此觸發不到——從各自的可觸發白名單中互相移除,鏈根本不成立,最乾淨。拆不動的,就斷鏈:在鏈上插入一個人類控制點。注意不是每一節都放人——那是退回純人工,自動化就白做了——而是放在風險集中的那一節:金額匯聚點(付款、過帳前)、主檔異動點、跨循環的交界點。
三個設計原則:
- 控制點的額度要看「鏈的累計」,不是「節的單筆」。鏈上每個代理各自的單筆上限,來自它在核決權限表裡的章節(我們在核決權限表專文講過怎麼設定單一代理的額度);但一條鏈一天能「接力」出去的累計金額,才是斷鏈點該管的數字——每節都在上限內,加總卻可觀,是鏈特有的漏法。
- L3 的硬要求就落在這裡:pillar 支柱三講過,鏈上是否至少有一個人類控制點,是 L3 場景的硬要求——所以全自動閉環(危險鏈 2)在 L3 不是設計瑕疵,是不允許存在的東西。
- 事後覆核只能墊底。有人會說:鏈先讓它全自動跑,我們每月覆核輸出就好。這就是補償控制,而那條定律一字不改地適用:補償控制是妥協,不是解法——它只是把「職務分不開」的風險,換成「每月覆核有沒有真的在跑」的風險。 高風險鏈請做真斷鏈,補償控制留給低風險鏈過渡。
這個題目特有的新課題:有些鏈,在你畫圖的當下還不存在
傳統 SoD 掃的對象是靜態的:角色、權限、人,畫完就是全貌。代理鏈最麻煩的一點是——支援子代理動態生成的架構,鏈是在運行時才長出來的。母代理視任務生成子代理、子代理再呼叫工具或別的代理:鏈的形狀由任務決定,不由設計文件決定。你上個月畫的鏈路圖,可能漏掉一條昨天才第一次成形的鏈。
兩條對策:
- 畫鏈要含「可能生成的鏈」。盤點表加一類「潛在鏈」:這個代理有沒有生成子代理的能力?子代理繼承什麼權限?理論上能觸發到誰?用能力邊界推演最壞鏈型——不是只記錄已經跑過的鏈,是把「有能力長出來的鏈」也放進掃描範圍。
- 白名單鎖死可觸發對象。每個代理能觸發誰、能被誰觸發,用白名單寫死;不在名單上的觸發一律阻擋並告警。白名單本身視同權限設定,異動要走簽核——這一步把「運行時才成形的鏈」重新拉回設計時可控的範圍,是動態生成場景裡唯一靠得住的邊界。
查核的視角:會計師抽到一筆全自動交易,會怎麼追
想像專審或財報查核時,會計師抽樣抽到一筆從頭到尾沒有人碰過的交易。他不會只看最後那筆分錄——他會往回追整條鏈:這筆過帳是哪個代理做的?它被誰觸發?觸發它的代理又被誰觸發?一路追到起點事件。然後問四件事:這條鏈在你的盤點表上嗎(拿得出鏈編號嗎)?鏈上每一節的授權依據呢(各代理在核決權限表的章節)?這條鏈掃過不相容組合嗎(掃鏈紀錄)?人類控制點在哪一節、當時真的有人核了嗎(控制點的核准紀錄)?
追不出來的鏈,每一節的紀錄再完整都沒用——老規矩:代理做的每個動作,在稽核眼中都是一筆需要授權依據和紀錄的交易,而一條鏈,就是一筆交易被切成好幾段來做。九大循環教了我們幾十年的那句話——職能分離的目的,是讓舞弊需要共謀——在這裡有了新版本:鏈級 SoD 要守住的,是別讓幾個「各自都合規」的代理,湊出一場不需要共謀的舞弊。
常見問題(FAQ)
我們的代理都還在 L1/L2,需要做鏈式掃描嗎?
需要,而且現在做最便宜。只要一個代理的輸出會觸發下一個代理,鏈就已經存在——L1 的「建議」被 L2 代理自動採用,本身就是一條鏈。畫鏈的成本在鏈少的時候最低,等鏈長滿了再回頭盤,就是在考古。
鏈式掃描要用什麼工具做?
起步不需要專門工具:把代理清單與觸發關係攤進試算表,照本文盤點表的七個欄位填,一週內填得完第一版。大型平台的編排介面多半有流程視圖可當畫鏈起點,但「這條鏈危不危險、人放哪一節」是內控判斷,不是系統功能——工具畫得出鏈,掃鏈斷鏈還是要人。
該先掃哪條鏈?
先掃碰錢和碰主檔的。行動順序:先畫鏈(最小版本:盤出所有「會觸發別人」的代理)→ 拿四條經典危險鏈自查 → 命中的高風險鏈先斷鏈 → 再回頭補完整盤點表與白名單。順序不要反過來——沒畫鏈就急著加控制點,加的位置多半是錯的。
本文的鏈式掃描三步(畫鏈 → 掃鏈 → 斷鏈)為本站提出之原創方法論,是「AI 代理內控五支柱」支柱三的展開篇,將隨各平台代理編排功能與查核實務的演進持續迭代(建議每半年回訪本文)。若需要協助盤點貴公司的代理觸發鏈、或設計高風險鏈的人類控制點,歡迎與我們聯繫。
