回首頁 | 回文章列表 | English version
3KProject Engineering Notes
我如何使用 Harness Engineering 讓 3KProject 變得更穩定
這篇文章是我整理 3KProject 內部工程做法的一份筆記。專案裡本來就有 instructions、skills、任務卡、doc-id registry、context budget guard、UI 契約驗證、runtime smoke check 這些基礎設施,但真正讓 Agent 開始穩下來的,是我把工作流從「靠模型猜」慢慢改成「靠計算驗證」。
一個核心觀念
Harness 不是模型本身,而是模型周邊所有讓它更不容易犯錯、犯錯後更容易被拉回來的機制總和。
如果把 Coding Agent 想成一台能高速產出程式碼的引擎,那 Harness 就是方向盤、煞車、儀表板與保險絲。我在 3KProject 的實際感受很直接:沒有這層工程韁繩,模型偶爾會很亮眼,但穩定度很差;有了這層韁繩之後,規格摘要、任務卡、驗證器、handoff 才會真的串成一條能重複執行的生產線。
先看兩個最重要的座標軸
我在 3KProject 規劃這些工具時,最有幫助的一件事,就是先把控制手段拆成兩個簡單維度。第一個維度是「事前引導」對上「事後回饋」;第二個維度是「計算可判定」對上「需要語意推論」。這個拆法直接影響我該先投資哪種工具,而不是一直堆更多提示詞。
Feedforward
在 Agent 動手前先提供規格摘要、檔案範圍、任務契約與禁止事項。這些內容不是為了增加提示詞長度,而是為了減少無效嘗試。
Feedback
在修改後立刻回傳可執行驗證結果。只要失敗訊息夠短、夠具體,小模型也有機會靠局部修正快速收斂。
把韁繩分成三類,治理才不會失焦
我在 3KProject 早期也踩過同一個坑:只要覺得重要就先加規則,結果最後變成難以維護的規則堆。後來比較穩的做法,是把它拆成三個治理面向:維護性、架構適配與行為正確性。
這個拆法對 3KProject 很重要,因為它把「品質」從抽象概念拆回實際責任。維護性管的是日常可改性;架構適配管的是長期演化時不走樣;行為管的是輸出結果有沒有做對。三者混在一起時,規則會越堆越多,但閉環反而越來越弱。
3KProject 目前的強項與缺口
回頭看 3KProject 目前的內部流程,我覺得 Feedforward 其實做得不差:instructions、workflow skills、任務卡、共識文件、doc-id registry、context budget guard 都已經在運作。真正薄弱的地方,反而是 Computational Feedback 還沒有完全補齊。
3KProject 已經做對的事情
把經驗寫成 instructions、技能流程、任務卡、摘要卡與規格索引,是我把外部韁繩落到專案裡的第一步。這些機制確實讓 Agent 第一次就做對的機率提升很多。
我現在最想補的地方
如果沒有高頻率、低成本的計算型回饋,Agent 最後還是只能靠猜。表面上像是在做工程化,實際上只是把人工審查往後挪而已。
我想在 3KProject 裡落地的小模型工作流
這套方法對我來說最有價值的地方,是它不只服務最強的模型。3KProject 內部規格、UI、資料與工具鏈都很多,只要我把任務拆成原子步驟,並讓每一步都有明確的輸入、輸出與驗證命令,中型甚至小型模型也能穩定完成複雜功能。
把工作流設計成上圖之後,LLM 在 3KProject 裡的職責會變得非常單純:讀任務卡、修改局部、讀失敗訊息、修正局部。所有「這樣到底算不算正確」的判斷,我都盡量交給型別系統、規格驗證器、邊界檢查器與 fixtures 比對。
範例 1:任務原子化拆解器
node tools/task-decomposer.js \
--feature "UI 契約閘門整併" \
--spec "docs/ui/UI技術規格書.md" \
--output-dir "docs/tasks/"
範例 2:計算型閘門設定
{
"gates": [
{
"name": "syntax-check",
"cmd": "npx tsc --noEmit --project tsconfig.json",
"priority": 1
},
{
"name": "encoding-check",
"cmd": "node tools_node/check-encoding-touched.js",
"priority": 2
},
{
"name": "domain-data",
"cmd": "node tools_node/validate-generals-data.js",
"priority": 3
},
{
"name": "ui-contract",
"cmd": "node tools_node/validate-ui-specs.js",
"priority": 4
},
{
"name": "runtime-registry",
"cmd": "node tools_node/check-ui-runtime-state-registry.js",
"priority": 5
},
{
"name": "import-boundary",
"cmd": "node tools_node/check-import-boundaries.js",
"priority": 5
}
]
}
我接下來最想補的五個工具
3KProject 其實不缺流程文件,缺的是能天天跑、跑完還能直接回灌給 Agent 的 Feedback 閘門。所以對我來說,最有效率的做法不是再寫更多規範,而是補齊幾個會每天被用到的工具。
- compute-gate.js:把型別、編碼、資料驗證、契約驗證整合成單一入口。
- check-import-boundaries.js:用自動檢查把模組邊界從口頭約定變成工具守衛。
- approved-fixture-check.js:把「人類已核可的預期輸出」保存成可比對基準。
- task-decomposer.js:把大型需求切成可序列執行的原子任務卡。
- harness-health-report.js:用固定報表看目前哪些 Guide 與 Sensor 還是空洞。
這五個工具的共同特徵,是它們都在把抽象知識翻譯成可重複執行的流程。對 3KProject 來說,只要規則能執行,Agent 才會真正受控;只要結果能量測,我才能跟團隊討論提升,而不是只討論感覺。
實施順序:先補便宜、穩定、每天都會跑的感測器
我在 3KProject 排這個導入順序時,看的是哪一些東西最便宜、最穩定、而且每天都會跑。最有效的策略,是先做低成本高頻率檢查,再補行為與架構層的守衛,最後才處理昂貴的語意審查。
用一句話總結我在 3KProject 的優先順序:先讓機器做它擅長的確定性判定,再讓模型做它擅長的新內容生成與語意理解。
最後的判斷準則
回到 3KProject,我現在的判斷準則很簡單:如果某個品質判斷可以由腳本、型別系統、Schema、快照或 fixtures 決定,就不要把它留給 LLM 猜。模型最有價值的地方,是生成新東西、讀懂曖昧需求、補齊缺漏脈絡;而不是反覆充當一個昂貴又不穩定的 if/else 引擎。
適合交給模型
需求拆解、程式碼撰寫、重構建議、文件整合、語意差異判讀與高階設計取捨。
適合交給工具
型別正確性、命名規則、模組邊界、資料格式、固定輸出比對與編碼完整性。
在 3KProject,我現在的原則就是:把讓 LLM 做的「判斷」盡量改成腳本,把 LLM 留給真正需要理解與創造的地方。