「對人類來說,Markdown 是優雅的排版文字;對 AI Agent 來說,沒有結構化 Metadata 的 Markdown 只是一串需要盲目猜測的字元流。」
上一篇我們建立了 Go + Claude Code + Obsidian + Graphify 的四位一體技術選型。然而,當你真正讓 Claude Code 或 Go 程式去解析一篇標準的 Markdown 筆記時,如果沒有事先定義好 Frontmatter 規範,AI Agent 常會遇到以下痛點:
標題與檔名不一致(Naming Discrepancy):
檔名寫 channel-bug.md,內文 H1 寫 # Go Channel 阻塞調優,Agent 難以判定哪一個才是雙向連結 [[Link]] 的唯一真理(SSOT)。
標籤混亂與語意爆炸(Tag Pollution):
人類習慣隨手寫 #golang/concurrency/bug 或 #go-channel,如果沒有限制格式,AI Agent 在做分類或搜尋時會被幾百個微小差異的 Tag 淹沒。
上下文時序丟失(Temporal Loss):
AI 無法得知這篇筆記是「兩年前的舊技術決策」還是「昨天才發生的除錯紀錄」,導致提問時拿舊架構回答新問題。
為了解決這個問題,我們必須在 Obsidian 筆記頂部設計一套 「人類看得懂、Go 程式好解析、AI Agent 懂語意」 的標準化 YAML Frontmatter。
我們為 obsidian-agent-brain 系統定義的標準 YAML Frontmatter 格式如下:
---
id: "20260815-103000"
title: "Go Channel Timeout Prevention"
date: "2026-08-15"
type: "atomic-note"
status: "evergreen"
tags:
- golang
- concurrency
- memory-leak
related:
- "[[Golang Concurrency Patterns]]"
- "[[Match Engine Performance]]"
aliases:
- "Channel 超時防禦"
- "Go Channel Timeout"
---
為什麼選擇這些欄位?每一個欄位都精準對應到了 Go 程式處理 或 Claude Code 推理 的需求:
id (絕對唯一識別碼)
title 與 aliases (唯一標題與別名庫)
type (筆記類型與結構路由)
明確定義筆記的生命週期型態,讓 Claude Code 知道該施加什麼樣的重構規則:
| type 值 | 說明 | 歸檔預設位置 |
|---|---|---|
| inbox-draft | 未經整理的原始草稿 | 00_Inbox/ |
| atomic-note | 單一核心觀念的原子筆記 | 20_Areas/ 或 30_Resources/ |
| adr | 系統架構決策紀錄 (Architecture Decision Record) | 10_Projects// |
| hub-note | 彙整特定主題的核心索引頁(MOC, Map of Content) | 20_Areas/ |
除了頂部的 YAML Frontmatter,Markdown 正文也需要遵循三個簡單的撰寫紀律:
善用 H2 (##) 作為語意區塊邊界
Go 語言的 Markdown AST 解析器(如 goldmark)在切分文章區塊時,是以 Header 階層作為節點邊界的。規範只使用 ## 作為二級主題,能讓 Go CLI 輕鬆抽取特定的「代碼範例區塊」或「排查步驟區塊」。
程式碼區塊標註語言(Fenced Code Blocks)
必須明確標註語言名稱(如 go 而非無名的 )。這樣 Go 解析器在遍歷 AST 的 KindCodeBlock 時,能自動判斷這是一段 Go 代碼還是 Bash 指令,避免把代碼裡面的 // [[comments]] 誤判為 Obsidian 雙向連結。
一張筆記只保留一個 H1 (#)
文章頂部只允許一個 # Title,且名稱必須與 Frontmatter 的 title 100% 相同。
為了讓 Claude Code 在執行 /refine-inbox 時嚴格執行這套規範,我們可以在專案根目錄的 CLAUDE.md 加上這一段 Prompt 規則:
## YAML Frontmatter Rules
When processing notes in `00_Inbox/`, you MUST ensure the final output contains a valid YAML Frontmatter at the very top:
1. `id` MUST be generated using timestamp format: `YYYYMMDD-HHMMSS`.
2. `title` MUST match the file name exactly.
3. `type` MUST be one of: [`atomic-note`, `adr`, `hub-note`].
4. `tags` MUST be lowercase, kebab-case array (e.g., `golang-concurrency`).
5. Scan existing vault note titles provided by `brain-cli`, and insert matching `[[Wikilinks]]` into the `related` field and body text.
有了這套 「人機共讀」 的 YAML Frontmatter 與筆記規範,我們的知識庫就不再是不可控的純文字,而是兼具 結構化資料庫(Structured DB) 與 非結構化文章(Markdown Text) 優點的強大知識體。
👉 明天 Day 05,我們將正式動手:「建立 obsidian-agent-brain Demo Repo 與開發環境搭建」。我們將把這個架構實體化,打造出第一個可運行的 Repository 骨架!我們明天見!