iT邦幫忙

2026 iThome 鐵人賽

DAY 30
1
AI Engineering

一天一個 PR,讓我告訴你嵌入式開發的殘酷:如何為 AI Agent 建立可信的工程閉環系列 第 30

Day 30 - 三十天後,我最後學到的不是怎麼讓 Agent 更聰明:是誰有資格說它做對了

  • 分享至 

  • xImage
  •  

系列說明 >> 本系列大部分 PR 來自私人或公司專案,部分程式碼、環境設定與實作細節不便公開。

我只能保證文中提到的 PR 與問題皆為真實案例,但會經過必要的匿名化與內容調整。

本系列主要分享問題如何被發現、背後的思考方式,以及解法如何形成,不會深入討論完整實作與部署細節,敬請見諒。


三十天前,我只是想讓 Agent 碰得到 UART

如果回到 Day 1,我真的沒想這麼多。

當時的問題很單純:

我能不能不要每次都自己開 Terminal、接 UART、下 Command,再把結果貼回去給 Agent?

先讓它碰得到設備再說。

結果 Day 2 Full Run 一放大,PASS 開始露餡。

有些 Command 根本沒跑完整。

有些 Readback 不對。

有些 RC 跟 Report 混在一起。

到了 Day 3,為了知道 Command 到底跑完沒有,我們甚至把 Marker 塞進 UART,然後再花一篇把自己塞進去的污染拔掉。

非常工程師。

先挖洞。

掉進去。

再開始討論洞為什麼不該存在。

後來 serialwrap 有 Transparent UART、WAL,Human monitor 跟 Agent probe 也能一起活著。

我那時才慢慢感受到:

Agent 能碰到硬體,只是第一關。

真正重要的是,它碰了什麼、什麼時候碰、結果從哪裡來,之後還有沒有東西可以重看。

不然 UART 從「只有人能操作」進化成「Agent 也能操作」,只是把不可追的手工操作換成不可追的自動操作。

速度比較快而已。

Target

第一幕走完,我開始發現 PASS 比 FAIL 還麻煩

FAIL 通常很誠實。

它至少會站在那裡告訴你:

我壞了。

PASS 比較麻煩。

它會讓你想下班。

Day 8 之後,問題從「Test 能不能跑」變成:

這個 PASS 到底是哪一份 Case、哪一列 Workbook、哪一份 YAML、哪段 Source、哪個 Before/Proposed 算出來的?

另一份 YAML 能不能冒充審過的版本?

Repo 拆過以後,Audit Pipeline 還是不是指著同一份 Cases?

四百多條 Case 跑到一半斷掉,明天是 Resume,還是從頭再燒一次 Bench?

這一幕做完後,我對 PASS 的看法變得很差。

不是不相信 PASS。

是開始要求它帶證件。

結果
+
Identity
+
Provenance
+
Evidence
+
可重播的 Progress

少一塊,都只能算:

有一個東西說它過了。

Test PASS 從答案變成了一個 Claim。


接著更煩:連「我查過了」都不能直接信

做到 Audit,我原本以為已經夠龜毛。

Criteria 要查。

Citation 要綁。

同一 API 在 Workbook 出現多列,要知道到底引用哪一列。

然後 Day 14 又發現:

正向跑三次都 PASS,也可能只是 Criteria 寫得太鬆。

所以補 Negative Control。

錯的值也要真的 Fail。

很好。

再往下一天,Auditor 跑完告訴我:

「Source 我有看。」

我忽然又卡住。

我要怎麼知道你真的看了?

於是連 Reviewer/Auditor 的 Read,都開始要求 Machine-observed Tool Calls。

這時我才真正接受一件事:

No Self-certification 不是用來防 Agent。

它是用來防所有工程角色。

Builder 不能自己說 Build 對了。

Verifier 不能自己說 Verify 過了。

Reviewer 也不能因為名字叫 Reviewer,就自動獲得可信度。

包括我自己。

只要某個角色同時擁有:

做事
+
定義成功
+
宣布自己成功

遲早會出事。

差別只是幾點下班。


Agent 一多,我才注意到從前有個 Runtime Agent 叫「我本人」

Day 16 開始,我本來以為故事會進入:

多 Agent 平行開工,效率起飛。

確實有起飛。

先飛走的是我的注意力。

誰在做哪個 Issue?

哪隻 Agent 結束了?

下一隻能不能開始?

誰卡住?

哪份 Plan 才是現在的?

Agent 說 Done 了,Workflow 為什麼沒往下?

我一邊回答、一邊切 tmux、一邊看 Branch、一邊把下一棒叫起來。

後來才發現:

原來我一直是那個沒有 Repo、沒有 Test、也沒有 Log 的 Scheduler。

所以才一路長出 Durable Job、Completion Lifecycle、Pinned Plan、Planning Artifact、Card/Combo/Deck、Coordinator、Control、Monitor。

名字很多。

但它們其實一直在拆同一件事:

以前偷偷放在人腦裡的責任,到底應該由誰正式持有?

D17 最關鍵的不是「Agent 做完」。

是:

poll
→ gate
→ handoff
→ release

真的走完,下一棒才有資格開始。

D18 不是多一份 Plan Parser。

是 Ready 跟 Fanout 不能各信各的。

D19 小pa不是來幫我寫比較漂亮的 Plan。

是 Plan 被退件時,終於有人對「這次到底要做什麼」負責,而且內容本身看得到、查得到。

D22 Cortex 正式拆出去時,我又踩到一次:

新 Repo 能跑,不代表舊家已經沒權力。

所以舊 Package、Import、Manager、Timer 沒退乾淨以前,都不能說 Cutover 完成。

到這裡,Agent 沒有變得比較聽話。

只是它們開始不能靠一句:

「Done。」

直接改變世界。

Target


然後另一隻 Agent 又問了我昨天才回答過的問題

Cortex 剛拆完沒多久,下一隻 Agent 看著舊 Package 問:

為什麼不能先留著相容?

我又開始解釋:

兩份 State Owner。

舊 Timer。

Authority Cutover。

打到一半,我忽然覺得很累。

不是因為這題很難。

是因為這題我昨天才付過學費。

前二十二天其實一直都有這種東西:

局部能跑
≠ 全鏈完成

同一個 Fact 有兩份 Authority
≠ 比較安全

沒有 Durable Artifact
→ 下一個人只能重新猜

所以 D23 才開始做 Memory。

但 Memory 這條線也沒比較客氣。

Transcript 全存,下一隻 Agent 還是讀不完。

切成 Atomic Slice,東西一多又找不到。

MOC/Search 有了,Session Start 的 Brief 又只是導覽,不是依 Task Recall。

Hook 有觸發、Brief 有內容,結果 Agent 根本沒真正開 Knowledge。

Memory 拆成 Hippo、Usage 能觀察之後,到了 D29 又出現更漂亮的一巴掌:

舊答案跟新答案一起被 Recall。

我一開始怕 Agent 忘記。

做到最後開始怕它記得太好。

所以 Knowledge 還得知道:

這是在哪個 Code State 學到的
這份是不是已被新版取代
這只是某次 Session 的狀態
這其實是一件還欠著的事

Memory 能提供的是 Prior Knowledge。

不是現在的 Truth。

這條線如果不守,所謂「越來越會學」,最後很可能只是:

越來越有自信地翻出以前的答案。


回頭看,三十天其實一直在修同一種 Bug

表面上,這三十天有 UART、TestPilot、Audit、Persona、Cortex、Hippo。

Repo 越來越多。

名詞也越來越多。

但如果把名字全部拿掉,剩下來的東西很像:

能跑
≠ 完成

PASS
≠ Proof

有人說看過
≠ 真的看過

Agent Done
≠ Workflow Transition 完成

Read
≠ Applied

Applied
≠ Outcome

記得以前
≠ 現在仍然正確

我後來常寫的那些原則,也不是一開始坐在桌前設計出來的。

什麼 One Authority per Fact。

Artifact before Transition。

Physical Reality Wins。

Bounded Autonomy。

No Self-certification。

比較像每踩一次坑,就多長一條疤。

因為只要責任沒有被外顯,最後一定會有人偷偷補。

通常是我。

只要 Authority 有兩份,最後一定會有人挑自己喜歡的那份。

通常也是我。

只要沒有 Artifact,下一次就只能靠記憶。

很不幸,還是我。

所以這三十天真正被自動化掉最多的,可能不是 Coding。

是:

我腦子裡那些原本沒有名字、沒有 Log、沒有 Contract 的工程責任。


最後一條線,我沒有打算在 Day 30 假裝接完

現在 Cortex 已經能發布 Canonical Engineering Outcome。

Hippo 也知道一則 Memory 有沒有被 Offered、Read、Applied。

看起來只差最後一條:

這次用了哪則經驗
+
最後工程結果到底怎樣

然後才能比較有資格討論:

這則經驗應該 Reinforce、Contradict,還是 Retire?

但這條 Outcome Binding 還沒完成。

Hippo 的 Issue #96 也還開著。

所以沒有「三十天完整 Autonomous Learning Loop 成功閉環」這種結尾。

沒有就是沒有。

如果我在最後一天為了漂亮,把 Open Issue 寫成架構已完成,那前面二十九天大概都白寫了。

這系列一路在講:

Completion 不能靠自己宣布。

Day 30 也一樣。


三十天後,我比較不在意 Agent 到底有多聰明了

剛開始用 Agent,我很容易把焦點放在:

它能不能寫?

它能不能修?

它能不能一次做更多?

現在我比較在意的是:

它做了以後,誰能證明真的發生?

它要改 State,誰有 Authority?

它說 Done,哪個 Artifact 支持 Transition?

它拿以前的經驗來用,那份經驗現在還成立嗎?

我沒有因此變得比較不相信 AI。

剛好相反。

正因為我準備讓它做更多,所以才不能把可信度建立在:

「它看起來很有把握。」

Agent 可以寫 Code。

可以操作 UART。

可以跑 Test。

可以 Review。

可以 Plan。

可以派工。

可以讀 Memory。

有一天,可能真的可以自己完成更長、更完整的工程閉環。

但有一件事我希望不要跟著自動化掉:

它不能只因為自己說做對了,就得到「做對了」的資格。

三十天前,我只是想讓 Agent 幫我多做一點事。

三十天後,我真正想留下來的,是一套即使 Agent 做得越來越多,現實還是有辦法對它說:

「等等,證據呢?」

這三十天的路很長,也很短,希望大家在這段旅程裡都能有所收穫。

Have a nice day.

Target


上一篇
Day 29 - Memory 越存越多不是好事嗎?直到 Agent 把舊答案跟新答案一起翻出來
系列文
一天一個 PR,讓我告訴你嵌入式開發的殘酷:如何為 AI Agent 建立可信的工程閉環30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言