---
title: "10 - 實戰 B：Obsidian 醫學筆記庫"
type: note
specialty: Programming
tags: [herdr從0開始使用教學, 10-實戰, obsidian, note-orchestrator, worktree]
created: 2026-08-04
updated: "2026"
modified: 2026-08-04
---

# 10 - 實戰 B：Obsidian 醫學筆記庫

← [[09-實戰-刷題網站Taiwan-IM-board]] | [[00-Index]] | 下一篇 → [[11-遠端與手機工作流]]

---

## 這個 repo 的特殊性

這個 vault 跟刷題網站有三個關鍵差異，直接決定 Herdr 該怎麼用：

1. **它是「半人工半 AI」並行的。** 你在 Obsidian 念書時，obsidian-git 每 ~10 分鐘自動 commit/pull/push（`vault backup: <timestamp>`）。**遠端 main 隨時可能被推新 commit。**
2. **它已經有一套完整的 skill pipeline。** `note-orchestrator` → `note-writer` / `note-screenshot` / `note-review` → `wiki-maintain`，而且規定 **orchestrator 做唯一一次 commit**。
3. **醫學內容有「絕不捏造」的硬規則**，而且 `CLAUDE.md` §4 明文規定：**沒有 PubMed MCP 的環境不要猜 PMID**。

這三點合起來給出一個很明確的結論：

> 🔴 **Codex 在這個 repo 裡不能碰「醫學事實」，只能碰「格式、批次、機械性工作」。**
> 而且因為有 obsidian-git 在背景推 main，**多 worker 一定要用 worktree 隔離**。

---

## 職責分界線（最重要的一張表）

| 工作 | 誰做 | 為什麼 |
|---|---|---|
| 文獻搜尋、PMID 查證、guideline 比對 | **Claude only** | 只有 Claude 有 PubMed MCP；`CLAUDE.md` §4 禁止猜 PMID |
| 判斷「這段內容正不正確」 | **Claude only** | 「絕不捏造」是最高原則 |
| 判斷 `(inferred)` 該標在哪 | **Claude only** | 需要分辨「來源寫的」vs「AI 補的」|
| Pearl Card 格式套用、區塊順序整理 | Codex ✅ | 規格明確（`_template_pearl-card.md`）|
| frontmatter 修補（`modified` 日期戳、YAML 合法性）| Codex ✅ | 機械性，且可用 lint 驗證 |
| medical-in-English 語言格式稽核 | Codex ✅ | 規則明確：醫學實體一律英文、中文只當黏著劑 |
| 圖片壓縮 / PDF 截圖 SOP（ImageMagick）| Codex ✅ | 純技術操作 |
| `_wiki_meta/index.md` 表格插入、`log.md` 追加 | Codex ✅（草稿）| 格式固定；但**由 Claude 覆核後才 commit** |
| cross-link 雙向補齊 | Codex ✅（草稿）| 機械性；語意合理性由 Claude 覆核 |
| 理財區 `transactions.csv` 解析對帳單 | Codex ✅ | 純資料轉換；但**數字絕不捏造**要寫進 prompt |
| **commit / push** | **Claude only** | `CLAUDE.md` §3：orchestrator 做唯一一次 commit |

---

## 版面規劃

```
Workspace w2  "vault"   cwd=~/Obsidian-med-note
├── Tab w2:t1  "brain"
│   └── w2:p1   ★ claude — note-orchestrator 的大腦
├── Tab w2:t2  "workers"
│   ├── w2:p2   ○ codex — worktree A（格式稽核）
│   └── w2:p3   ○ codex — worktree B（圖片 / 理財）
└── Tab w2:t3  "ops"
    └── w2:p4   □ shell — python3 _wiki_meta/lint.py / site_check.py
```

---

## ⚠️ 必用：worktree 隔離

因為 obsidian-git 每 10 分鐘會動 main，**多個 Codex 直接在同一個 checkout 上改檔案是災難**。Herdr 內建 git worktree 支援：

```bash
# 為 worker A 開一個獨立 checkout + workspace
herdr worktree create --cwd ~/Obsidian-med-note \
  --branch codex/format-audit --no-focus

# 列出目前的 worktree
herdr worktree list --cwd ~/Obsidian-med-note
```

Herdr 的 worktree 行為：

- 它建立一個 **git worktree checkout**，開成一個 **Herdr workspace**，並**和母 repo 的 workspace 分在同一組**。
- `--branch` 是既有 local branch → checkout；否則從 `--base` 或 `HEAD` 建新 branch。
- 不給 `--path` 時，checkout 建在 `<worktrees.directory>/<repo>/<branch-slug>`。
- ⚠️ **`workspace close` 只關 Herdr 狀態**；真的要刪 checkout 要用 `herdr worktree remove`（它跑 `git worktree remove`，**從不刪 branch**，git 拒絕髒 checkout 時要 `--force`）。

設定 worktree 放哪：

```toml
[worktrees]
directory = "~/Projects/vault-worktrees"
```

### 收工流程（Claude 做）

```bash
# 1. 每個 worker 的 branch 分別檢查
git -C <worktree-path> diff --stat

# 2. 回到 main，先 rebase（CLAUDE.md §5 硬規則）
cd ~/Obsidian-med-note
git pull --rebase origin main

# 3. 逐一 merge worker branch
git merge --no-ff codex/format-audit

# 4. 跑 lint
python3 _wiki_meta/lint.py

# 5. 唯一一次 commit + push
git push origin main
```

> ⚠️ `CLAUDE.md` §5 明講：**rebase 出現衝突（= 跟使用者改到同一檔同一區）→ 停止、不要硬解、回報請使用者裁定。絕不可覆蓋掉使用者的筆記內容。**
> 這條規則在多 worker 情境下更重要——**寫進 Claude 的收工檢查清單裡**。

---

## 應用一：語言格式稽核（medical-in-English）

`CLAUDE.md` §1 是硬規則：**所有醫學相關用語一律英文，中文只是把英文術語串成句子的黏著劑。** §7 也把「過度中譯」列為已知雷區。

這是**規則明確、範圍大、純機械**的工作——Codex 的完美標的。

任務檔範例：

```markdown
# 任務：AIR 科筆記 medical-in-English 格式稽核

## 範圍
`Allergy-Immunology-Rheumatology(AIR)/` 底下所有 `*_overview.md`

## 規則（來自 repo CLAUDE.md §1，逐條遵守）
一律改回英文的類別：
- 疾病 / 症候群 / 病理實體
- 症狀 / 徵象 / 理學檢查所見
- 解剖 / 生理 / 病生理 / 機轉
- 藥名 / 藥物分類 / MOA / 劑量單位
- 檢驗 / 影像 / 術式 / 處置
- score / criteria / classification / staging / guideline / trial 名稱
- lab / biomarker / 電解質 / 單位

保留繁體中文的類別：描述性、連接性、情境與判讀敘述
（「這位病人…」「建議先…」「若…則考慮…」「臨床上常見於…」）

範例：
❌「鬱血性心衰竭」「呼吸困難」「心臟超音波」「腎絲球過濾率」
✅ congestive heart failure / dyspnea / echocardiography / eGFR

唯一例外：真的沒有對應英文的中文臨床慣用語（極罕見）；
藥物台灣商品名可中英並列（如 Lokelma）。

## 硬限制 ⚠️
1. **只改語言表述，絕對不要改動任何醫學內容、數字、劑量、cutoff、PMID。**
2. **不要新增或刪除任何臨床資訊。** 有疑慮就跳過並記錄。
3. 不要動 frontmatter 以外的 metadata；不要動 `.quartzsite/`。
4. **不要 git commit、不要 git push。**

## 輸出
- 直接改檔（你在獨立的 git worktree 裡，安全）
- 另外寫一份 `_audit/AIR-language-audit.md`：
  逐檔列出「改了什麼 → 為什麼」，以及「跳過了什麼 → 為什麼」
```

**Claude 收尾**：讀 `_audit/AIR-language-audit.md`，抽查 diff 有沒有誤改醫學內容，再 merge。

---

## 應用二：frontmatter / `modified` 日期戳批次修補

`CLAUDE.md` §2、§3 有兩條容易漏掉的規則：

- **`modified`（完整 YYYY-MM-DD）是網站首頁「🕘 最近更新」排序的依據**，每次改動任何一篇筆記就要更新成當天日期
- **frontmatter 必須是合法 YAML**——壞掉的 YAML 會讓 **Quartz build 失敗、整站該次不更新**

這兩件事適合寫成一個 Codex 常駐任務：

```bash
herdr agent prompt w-meta "
掃描整個 vault 的 *.md，檢查每篇的 YAML frontmatter：
1. 是否為合法 YAML（title 用雙引號包、日期格式正確）
2. 是否有 modified 欄位（沒有就插在 updated: 之後）
3. tags 是否放在 frontmatter（不是 footer 的 *Tags: #...*）

輸出 _audit/frontmatter-report.md，列出所有有問題的檔案與建議修法。
**這一輪只報告，不要改檔。** 我看過再決定。
"
```

> 💡 **「先報告、後改檔」是處理大範圍機械修改的安全做法**，特別是在一個你天天在用的 vault 上。

驗證：

```bash
herdr pane run w2:p4 "python3 _wiki_meta/lint.py"
herdr pane wait-output w2:p4 --regex "OK|ERROR|問題" --timeout 120000
```

---

## 應用三：PDF 截圖 SOP（§6 硬規則）

`CLAUDE.md` §6 有一條很嚴格的規則：

> **digest / 整合 PDF 進筆記時，「重要 figure / table 一律截 PDF 原圖嵌入」，不是只消化文字。**
> 「此規則不因『沒走 skill runtime』而免除……**漏截圖＝任務未完成，需補**。」

而且 §7 直接把「digest PDF 只補文字、忘了截圖」列為已知雷區。

截圖本身是**純技術操作**（ImageMagick：去頁眉頁腳 + 自動 trim、旋轉表、跨頁 append、多圖 montage、JPEG/PNG 降檔），非常適合外包：

```markdown
# 任務：從 PDF 截取 figure/table

## 輸入
`~/inbox/harrison-ch418.pdf`（28 頁）

## 需要截的圖（由 Claude 指定，你不需要判斷醫學重要性）
- p.4 Figure 418-1（診斷流程圖）
- p.11 Table 418-3（跨 p.11–12，需要 append）
- p.19 Figure 418-6（病理照片）

## SOP（完整規範見 .claude/skills/note-writer/SKILL.md §pdf-integrate 步驟 7）
1. render PDF 用 **150 dpi 就夠**（勿 300+）
2. 去頁眉頁腳 + 自動 trim，但 **title / caption / footnote 必須完整保留**
3. 臨床照片 / 病理圖 / 彩色示意圖 → **JPEG，quality ~84**
   表格 / 文字圖 / 線稿 → **PNG 但降色（灰階或 -colors 96~128）**
4. 單張目標 100–350 KB，**避免 > 500 KB**（過大會讓 Quartz 網頁載不出來）
5. 存到 `Endocrinology(ENDO)/<主題>/assets/`，檔名須**全 vault 唯一**

## 硬限制 ⚠️
- 不要「自己重畫」或用純文字描述取代原圖
- **不要切掉 title / caption / 整欄**（這是最常做壞的一步）
- 完成後逐張確認文字可讀、內容完整
- 不要 commit

## 輸出
截好的檔案 + 一份清單，列出每張的檔名、尺寸、KB 數
```

**Claude 收尾**：用 `![[檔名.png]]` 嵌入（⚠️ **不是** `![](assets/...)`——後者在 Obsidian 正常但 Quartz 會破圖），並補上繁中消化重點。

---

## 應用四：理財區自動化

`理財(FIN)/` 有自己的 pipeline 和守則。適合外包的部分：

```markdown
# 任務：解析對帳單 PDF → append transactions.csv

## 輸入
`~/inbox/對帳單-2026-08.pdf`

## 規範
先讀 `理財(FIN)/持倉/匯入指南.md`，完全照它的格式。

## 硬規則 ⚠️
1. **`transactions.csv` 是唯一真相**：只記買/賣/配息「事實」，
   報酬率由 compute.py 算，**不要手填**
2. DIV 現金流 = `shares × price − fee`（fee 欄放預扣稅）
3. **財務數字絕不捏造**：看不清楚的欄位標「需人工確認」，不要猜
4. **不要在本地跑 compute.py**（sandbox proxy 擋 Yahoo Finance，抓價會失敗）
   → push 後由 GitHub Actions 執行
5. 不要 commit

## 輸出
append 到 transactions.csv 的新行 + 一份逐筆對照表（PDF 哪一行 → CSV 哪一行）
```

---

## 應用五：note-review 的批次前置作業

`note-review` skill 的流程是「判斷每篇出身 → 用 PubMed/web 查最新 guideline 比對 → 修正」。

**查證那步不能外包**，但**前置盤點可以**：

```bash
herdr agent prompt w-inventory "
掃描 Nephrology(NEP)/ 底下所有 *_overview.md，產出一份盤點表：
| 檔案 | updated 年份 | modified 日期 | 引用的最新 guideline 年份 | 引用的 PMID 數量 |

只讀不改。輸出到 _audit/NEP-inventory.md。
guideline 年份請從內文的『⚡ 資料更新至：』行與 Key References 區抓，
**不要自己判斷哪個 guideline 比較新**（那是我的工作）。
"
```

Claude 拿到盤點表，就能**用最少的 token 決定「哪幾篇需要花 PubMed 額度去 review」**——這是很划算的分工。

---

## ⚠️ 這個 repo 特有的紅線（務必寫進每個任務檔）

| 紅線 | 出處 |
|---|---|
| **絕不捏造** 醫學內容、PMID、引用、trial 數據、dosing | §0.1 |
| AI 自己推論的內容要標 `(inferred)` | §0.1 |
| 沒有 PubMed 的環境**不要猜 PMID**，標「需查證」 | §4 |
| 圖片用 `![[檔名]]`，**不要**用 `![](assets/...)`（Quartz 會破圖）| §6 |
| frontmatter 必須合法 YAML（壞掉會讓整站 build 失敗）| §6 |
| **不要動 `.quartzsite/`** | §6 |
| 只引一手來源，**禁止二手懶人包** | §4 |
| 語言學習筆記（`語言/`）風格完全不同，**發音禁用注音符號** | §8 |
| 理財筆記要**中英並列**（與醫學筆記的「一律英文」相反）| §9 |

> 💡 **實務建議**：把這張表存成 `~/prompts/vault-redlines.md`，每個 Codex 任務檔開頭直接 `cat` 進去。Codex 沒有 `CLAUDE.md` 的自動載入機制，**你不貼它就不知道**。

---

## 一個完整的日常場景

**情境**：週末想把 NEP 科的筆記做一輪格式與時效整理。

```
09:00  在 w2:p1 跟 Claude 說：「幫我盤點 NEP 科筆記，然後把格式問題外包給 Codex」
09:02  Claude 開 worktree + 2 個 codex pane，派工，回報「預計 40 分鐘」
09:03  你按 ctrl+b q，detach，去吃早餐
       ↓ Codex 繼續跑，Herdr server 常駐
10:30  在 iPhone 上 SSH 進來，herdr，看 sidebar：
       - w-format  ✓ done
       - w-inventory ⚠ blocked（它在問某個檔案要不要處理）
10:31  手機上直接切過去回答它
       ↓
11:00  回到電腦，herdr 接回來
11:02  跟 Claude 說「收工」→ 它讀 audit 報告、抽查 diff、
       git pull --rebase、merge、跑 lint、wiki-maintain、
       唯一一次 commit + push main
11:15  Cloudflare Pages 自動重建，網站更新
```

**這個場景在沒有 Herdr 的時候是做不到的**——因為 subagent 綁在對話裡，你一關終端機就沒了。

---

## 🔗 相關筆記

- [[09-實戰-刷題網站Taiwan-IM-board]] — 上一步：另一個專案的用法
- [[11-遠端與手機工作流]] — 下一步：上面場景裡「iPhone 巡場」的做法
- [[08-Claude當大腦-Codex當雙手]] — 架構與腳本
- [[Programming/Git-GitHub/06-分支管理|Git 06 - 分支管理]] — worktree 背後的 branch 觀念
- [[Programming/Git-GitHub/09-實戰工作流範例|Git 09 - 實戰工作流範例]] — 這個 repo 的 rebase / reconcile 紀律

---

*最後更新：2026-08-04*
