本系統的品質保證架構建立在一個核心信念上:AI 系統的輸出品質不能依賴事後人工校閱,必須在流程的每個環節內建機制性防線。
本章描述三道獨立且互補的品質防線:
這三道防線各有不同的時序、粒度與設計目的,共同構成一套可觀測、可稽核、可迭代的品質管控體系。
┌─────────────────────────────────────────────────────────────────────┐
│ 第一道防線:Hooks — 即時守門 │
│ 觸發點:PostToolUse(Write) │
│ 作用:在 AI 每次寫檔時,自動執行格式與認識論合規性檢查 │
│ 特性:同步執行(blocking 模式可阻擋寫入)、毫秒級回饋 │
├─────────────────────────────────────────────────────────────────────┤
│ 第二道防線:Cross-Review — 流程中對抗性審視 │
│ 觸發點:分析流程各關鍵階段(每個 skill 的 stage 之間) │
│ 作用:讓具有不同框架的 AI agent 對同一數據產生有效衝突 │
│ 特性:異步執行、質化、可發現系統性盲點 │
├─────────────────────────────────────────────────────────────────────┤
│ 第三道防線:Eval — 事後量化驗證 │
│ 觸發點:skill 結構級變更前後、baseline 建立期 │
│ 作用:以標準化案例對比 with_skill vs. without_skill 的輸出差異 │
│ 特性:可重現、可量化、驅動 skill 迭代決策 │
└─────────────────────────────────────────────────────────────────────┘
三道防線的設計原則是互補而非重疊:Hooks 捕捉格式與合規問題,Cross-Review 捕捉邏輯與視角盲點,Eval 捕捉整體輸出品質的系統性退化。沒有任何一層可以單獨承擔全部品質責任。
Hooks 是 Claude Code 原生提供的事件驅動機制,允許在 AI 執行特定操作時,自動觸發外部腳本。本系統目前掛載的 hooks 如下:
| 事件 | Hook | 執行模式 | 用途 |
|---|---|---|---|
| SessionStart | workspace-claude-sync.sh |
async | 確保 workspace 指令一致性 |
| InstructionsLoaded | runtime-event-log.sh |
async | Telemetry:指令載入記錄 |
| SubagentStart | runtime-event-log.sh |
async | Telemetry:子代理啟動記錄 |
| SubagentStop | runtime-event-log.sh |
async | Telemetry:子代理結束記錄 |
| ConfigChange | runtime-event-log.sh |
async | Telemetry:配置變更記錄 |
| PostToolUse:Write | quality-gate.sh |
sync, 10s | 認識論標記與格式合規性檢查 |
| PostToolUse:Write | debate-quality-judge.sh |
async, 10s | 辯論品質指標寫入月誌 |
注意:實際掛載狀態以
~/.claude/settings.json 為準;REGISTRY.md
是人可讀的 canonical reference,供審計使用。
檔案位置:/home/ubuntu/.claude/hooks/quality-gate.sh
觸發事件:PostToolUse:Write(AI 寫入任何
.md 檔案時) 執行模式:同步(sync),逾時
10 秒
研究與行銷分析系統的最大風險之一,是 AI
將推測性結論以確定語氣呈現,誤導決策者。quality-gate.sh
的核心任務是在分析文件落地的那一刻,自動檢查關鍵品質要件是否存在。
檢查一:分析檔案內容完整性
stage[0-9]/ 或 mkt-stage[0-9]/
目錄下的分析檔案檢查二:認識論標記(Epistemic Tags)
stage*/、mkt-stage*/、cross-review/、tournament/
目錄下的分析檔案[L1] 至 [L5]
的信心度標記檢查三:來源引用
stage*/、mkt-stage*/
下的分析檔案目前 quality-gate.sh 以 advisory
模式運行(所有路徑均以 exit 0
結束),即發現問題時輸出警告至
stderr,但不阻擋寫入操作。如需啟用強制阻擋模式,將最終
exit 0 改為 exit 2
即可,無需修改其他邏輯。
排除清單:SKILL.md、CLAUDE.md、README.md、REGISTRY.md、protocol、template、checklist、framework
等基礎設定檔不受檢查,避免誤殺非分析性寫入。
檔案位置:/home/ubuntu/.claude/hooks/debate-quality-judge.sh
觸發事件:PostToolUse:Write(寫入
cross-review/ 或 stage5/ 時)
執行模式:異步(async),逾時 10 秒
跨代理辯論(Cross-Review)是本系統發現分析盲點的核心機制,但辯論品質本身缺乏可觀測性。debate-quality-judge.sh
在每次辯論記錄寫入時自動觸發,以純文本統計指標(不呼叫
LLM)量化辯論品質,並將結果寫入既有月誌(~/.claude/logs/YYYY-MM.jsonl),供後續
review 使用。
| 指標 | 說明 | 意義 |
|---|---|---|
word_count |
辯論記錄總字數 | 辯論深度的粗略代理指標 |
epistemic_tags |
L1-L5 標記出現次數 | 辯論中信心度揭露程度 |
source_citations |
引用 URL 數量 | 辯論是否有事實錨點 |
joker_interventions |
「框架外」關鍵詞出現次數 | Joker agent 打破假共識的次數 |
debate_rounds |
辯論輪次估算 | 辯論的完整度 |
所有辯論品質指標寫入既有月誌,格式為:
{
"date": "2026-03-10",
"timestamp": "2026-03-10T14:00:00Z",
"type": "debate-quality",
"file": "/path/to/cross-review/cr1-topic.md",
"metrics": {
"word_count": 2847,
"epistemic_tags": 23,
"source_citations": 8,
"joker_interventions": 2,
"debate_rounds": 4
}
}設計決策:刻意不建立獨立的辯論日誌系統,而是寫回既有月誌。這符合「不新增平行記錄系統」的系統治理原則,避免日誌分散。
檔案位置:/home/ubuntu/.claude/hooks/runtime-event-log.sh
觸發事件:InstructionsLoaded、SubagentStart、SubagentStop、ConfigChange
執行模式:異步(async)
系統可觀測性的基礎。每次 skill 執行、子代理派遣與結束,都會在月誌中留下可追溯的結構化記錄,包含:
completed /
blocked)與阻擋原因(rate_limit / auth / unknown)runtime-event-log.sh 包含兩層進階能力:
Transcript 解析:從 Claude Code 的 transcript JSONL 中自動提取 skill 名稱、執行模式與模型資訊,確保即使 CLI 呼叫方式不同,telemetry 記錄也保持完整
結果分類(三層 Tier):
status/reason)判斷,最高信心,無偽陽性last_assistant_message 開頭 200
字元判斷,捕捉 provider 封鎖但 structured fields 為 null 的情境completed這三層結構確保封鎖事件不會被漏記,同時避免對正常 agent 輸出造成偽陽性分類。
檔案位置:/home/ubuntu/.claude/hooks/workspace-claude-sync.sh
觸發事件:SessionStart
執行模式:異步(async)
~/CLAUDE.md 是 workspace
層的核心指令檔,但當它是一個可被手動覆寫的普通檔案時,存在版本漂移的風險。workspace-claude-sync.sh
在每個 session 啟動時執行,確保 ~/CLAUDE.md 始終是
~/.claude/workspace.md(repo-tracked source)的
symlink,而非獨立複本。
如果偵測到 ~/CLAUDE.md 是普通檔案(非
symlink),腳本會先備份原檔(CLAUDE.md.bak.<timestamp>),再建立
symlink,確保不會靜默丟失資料。
品質意義:指令一致性是所有 AI 行為品質的前提。如果 workspace 指令在不同 session 之間不一致,所有 hook 和 skill 的行為都可能產生難以重現的差異。
Cross-Review 建立在一個重要的研究發現上:同一份數據,由具有不同專業框架的分析師解讀,會得出性質不同的結論。讓 Strategist(策略師)與 Consumer(消費者視角代理)對同一市場數據進行辯論,比任何單一視角的壓力測試都更能揭露分析盲點。
本系統使用 Claude Code 原生的 Agent Teams 機制執行 Cross-Review,確保每個參與辯論的 agent 真正持有獨立的上下文(context),而非在同一執行緒中模擬不同立場。
Cross-Review 的標準結構:
參與者:
├── 張力雙方(由主控依發現的分析張力動態選定)
│ ├── 例:Strategist(競爭優勢視角) vs Consumer(消費者體驗視角)
│ └── 例:Business Intel(競品數據視角) vs Skeptic(風險視角)
├── 碰撞者(中立立場,協助收斂)
└── Joker(框架外視角,在各方趨向假共識時強制介入)
輪次上限:2 輪
依據:S²-MAD 研究顯示同模型辯論超過 2 輪準確率不再提升
記錄:辯論完整記錄 → cross-review/cr[N]-[topic].md
辯論指標 → ~/.claude/logs/YYYY-MM.jsonl(由 debate-quality-judge.sh 自動記錄)
Cross-Review 的每項結論必須附帶 L1-L5 信心度標記,這是本系統最核心的事實紀律:
| 等級 | 定義 | 典型使用情境 |
|---|---|---|
| L1 已驗證 | 有直接可核實的一級資料 | 官方財報、政府公告 |
| L2 可靠推估 | 有多個獨立可信來源支持 | 產業報告交叉驗證 |
| L3 合理推論 | 有間接證據,推論邏輯清晰 | 市場行為模式推估 |
| L4 假設 | 缺乏直接證據,屬合理假設 | 消費者心理推測 |
| L5 未知 | 無法評估,資料缺口 | 未公開的內部數據 |
硬規則:[L4 假設] 與
[L5 未知]
標記的內容,不得作為核心結論、品牌診斷或策略建議的主要依據。違反此規則是
Cross-Review 的否決條件。
Joker agent 是 Cross-Review 中專門設計用來打破假共識的角色。當辯論雙方趨向收斂時,Joker 的職責是提出第三路徑或框架外的問題,確保辯論不會過早結束。
歷史教訓(Suzuki 專案):在 cr1 階段僅使用 Skeptic 單一視角壓力測試,未發現品質認知三層拆分、雙向因果鎖定等關鍵洞察。直到 cr2 導入多視角碰撞,這些洞察才浮現。這個案例確立了「Cross-Review 不可只用單一視角」的系統規則。
Hooks 和 Cross-Review 解決了流程中的品質問題,但無法回答一個更根本的問題:skill 本身是否真的比沒有 skill 時表現得更好? Eval Framework 的目的是建立可量化、可重現的答案。
每個核心 skill 都有一組標準化的評估案例,儲存在
~/.claude/skills/<skill-name>/evals/evals.json:
{
"skill_name": "brand-research",
"evals": [
{
"id": 1,
"prompt": "/brand-research 星巴克 台灣咖啡連鎖",
"expected_output": "描述完整輸出的預期結構",
"expectations": [
"具體、可程式化驗證的輸出要件(8 項)"
]
}
]
}設計原則:每個 expectation 必須是可程式化判斷的命題(true/false),而非主觀評分。這確保評估結果可重現,不受評估者主觀影響。
每個 eval 案例的評分基於 expectations 通過率:
scorecard = 通過的 expectations 數量 / 總 expectations 數量
例:brand-research BR-001
通過:8/8 expectations
scorecard = 10/10(滿分)
Eval Framework 的核心是對比實驗設計:
with_skill configuration:
使用完整 SKILL.md 指令 + 多 agent 流程 + 所有品質機制
→ 記錄 scorecard 分數與 pass/fail
without_skill configuration:
僅使用同等的 prompt,不載入 SKILL.md
→ 記錄 scorecard 分數與 pass/fail
delta = with_skill score - without_skill score
delta 是 skill 實際附加價值的量化指標。正值越大,代表
skill 的設計越有效。
以下三組 baseline 於 2026-03-09 完成,是系統品質保證的第一批量化錨點:
| 項目 | 數值 |
|---|---|
| Skill | brand-research |
| 測試案例 | 星巴克 台灣咖啡連鎖(evals.json ID:1) |
| with_skill scorecard | 10/10(8/8 expectations 全數通過) |
| without_skill pass rate | 25%(8 項 expectations 中,2 項通過) |
| delta | +0.75 |
| 通過率對比 | with_skill 100% vs without_skill 25% |
解讀:沒有 skill 時,輸出缺乏認識論標記、來源引用格式不符規範、研究限制聲明缺失等結構性要件。skill 的介入將合規率從 25% 提升至 100%。
| 項目 | 數值 |
|---|---|
| Skill | marketing |
| 測試案例 | foodpanda 台灣外送服務(evals.json ID:1) |
| with_skill scorecard | 9/10(8 項 expectations 中,7 項通過) |
| without_skill pass rate | 約 38% |
| delta | +0.62 |
| 通過率對比 | with_skill 90% vs without_skill ~38% |
解讀:marketing skill 的多階段 agent dispatch 機制(品質門、驗證層、來源品質閘門)對輸出結構合規性有顯著提升效果。扣分項目已記錄為後續版本改善目標。
成本注記:marketing skill 因涉及多階段 agent 派遣,token 消耗約為基準的 4.6 倍(相較 brand-research 的 2.3 倍、research 的 2.2 倍)。成本優化若涉及階段精簡,需重跑 MKT-001 驗證 delta 不退化。
| 項目 | 數值 |
|---|---|
| Skill | research |
| 測試案例 | AI Agent 最新發展 full(evals.json ID:1) |
| with_skill scorecard | 10/10(8/8 expectations 全數通過) |
| without_skill pass rate | 約 19% |
| delta | +0.81 |
| 通過率對比 | with_skill 100% vs without_skill ~19% |
解讀:research skill 的 delta 最高,反映 full 模式的多輪 cross-review、InsightCard 格式規範、來源品質閘門等機制,對無結構化指令的基礎 AI 輸出改善幅度最為顯著。
| Baseline ID | Skill | with_skill | without_skill | Delta |
|---|---|---|---|---|
| BR-001 | brand-research | 100% | 25% | +0.75 |
| MKT-001 | marketing | 90% | ~38% | +0.62 |
| RES-001 | research | 100% | ~19% | +0.81 |
三組 baseline 全部通過,建立了系統的初始品質錨點。
重要限制:目前每組 baseline 只有 1 次 run。依照 eval
protocol(skill-eval.md 第 113
行),涉及結構級變更的比較需要 3-run window
才能排除單次執行的隨機性。當前數據作為初始參考基準有效,但不應作為統計顯著性的依據。
┌─────────────────────────────────────────────────────────┐
│ 觸發條件 │
│ ├── 結構級變更(新增/移除階段、修改 agent 組合) │
│ ├── 成本優化(涉及 token 削減的設計調整) │
│ └── 定期品質審視(季度 review) │
├─────────────────────────────────────────────────────────┤
│ 執行步驟 │
│ 1. 在 new_skill 和 old_skill 兩種 config 下各跑 eval │
│ 2. 每種 config 至少跑 3 次(3-run window) │
│ 3. 比較兩組 delta 的均值與變異 │
│ 4. 若 new_skill delta 未退化 → 合併變更 │
│ 5. 若 new_skill delta 退化 → 回滾並記錄失敗原因 │
├─────────────────────────────────────────────────────────┤
│ 記錄要求 │
│ ├── Baseline ID 採版本化命名(BR-001 v1 / BR-002 v1) │
│ ├── 不覆寫舊 baseline,保留歷史數據供追溯 │
│ └── 變更決策記錄於 skill 的 DECISIONS.md │
└─────────────────────────────────────────────────────────┘
路線 B(已就緒,待觸發):結構級變更比較
new_skill/old_skill config pair + 3-run
window路線 A(需定案):Expectation 進化
路線 C(需設計):Description Trigger Lane
run_eval.py 只支援單 skill 二元判定)除了主動 eval,runtime-event-log.sh 累積的 telemetry
資料提供另一條品質信號路徑:
completed
vs blocked 的比率,若 blocked
比率上升,代表系統穩定性問題審視節奏規則:至少累積 10 次核心 skill run 後才做 monthly review;至少累積 30 天使用資料後才判定 agent merge/deprecate。用數據驅動決策,不憑感覺砍能力。
本品質保證機制遵循以下不可違背的治理原則:
1. 不建立平行系統 所有品質記錄(eval
結果、辯論指標、生命週期事件)寫回既有
~/.claude/logs/YYYY-MM.jsonl。禁止為品質保證另建獨立資料庫或日誌系統。
2. 可觀測性優先 任何未被記錄的品質事件等同於未發生。Hooks 的 telemetry 覆蓋、eval 的 scorecard 記錄、辯論品質的 JSONL 寫入,三者共同確保系統的完整可觀測性。
3. Baseline 不可被覆寫 已建立的 baseline(BR-001、MKT-001、RES-001)作為歷史錨點永久保存。新版本測試採版本化 ID(v2、v3),不覆蓋舊版。
4. 品質門可升級為阻擋 quality-gate.sh
目前以 advisory 模式運行。當系統成熟度足夠、已驗證誤殺率可接受時,可將
exit 0 改為
exit 2,在不修改任何其他邏輯的前提下,將建議層升級為強制阻擋層。
5. 數據驅動,非感覺驅動 所有 skill 結構調整、agent 合併/退役決策,必須有 telemetry 或 eval 數據支持。沒有數據的主觀判斷不得作為架構變更的理由。
| 防線 | 機制 | 覆蓋範圍 | 自動化程度 | 量化程度 |
|---|---|---|---|---|
| 第一道 | Hooks(quality-gate / debate-judge / telemetry) | 每次 AI 寫入操作 | 全自動 | 部分量化 |
| 第二道 | Cross-Review(Agent Teams 多視角辯論) | 每個 skill 的關鍵分析節點 | 流程觸發 | 質化為主 |
| 第三道 | Eval Framework(scorecard / baseline) | skill 結構級變更前後 | 半自動 | 全量化 |
本章描述的品質保證體系已通過三組 baseline(BR-001、MKT-001、RES-001)的初始驗證,確認 skill 機制相較於無結構化指令的 delta 在 +0.62 至 +0.81 之間。系統的設計使得品質標準可隨業務需求提升(收緊 expectations、啟用阻擋模式、增加 eval 案例),而不需要重構基礎架構。
文件屬於:ceo-high-level-insights
專案系統架構說明書 下一章:第六章 成本管控與 Token
效率