📊 Wiki 儀表板(Vault Health Dashboard)
一頁看 Vincent5588_Wiki 的健康狀態。KPI / 燈號 / 進度條 / 7 天異動——每天打開瞄 5 秒就知道 vault 在不在健康狀態。
🎯 核心 KPI
💡 更豐富的 KPI(含燈號自動判斷)需要開啟 dataviewjs:
Settings → Community plugins → Dataview → Enable JavaScript Queries。開啟後本檔下方會自動切到 dataviewjs 版本。下方是 SQL fallback 版。
📦 總 entity 數
TABLE WITHOUT ID length(rows) AS "總 entity"
FROM "wiki/entities"
GROUP BY ""🆕 今日新增(2026-05-02)
TABLE WITHOUT ID length(rows) AS "今日新建"
FROM "wiki/entities"
WHERE created = date("2026-05-02")
GROUP BY ""✏️ 今日更新(2026-05-02)
TABLE WITHOUT ID length(rows) AS "今日更新"
FROM "wiki/entities"
WHERE updated = date("2026-05-02")
GROUP BY ""📝 草稿(status: draft)
TABLE WITHOUT ID length(rows) AS "draft 數"
FROM "wiki/entities"
WHERE status = "draft"
GROUP BY ""🏝 孤兒頁
TABLE WITHOUT ID length(rows) AS "孤兒頁數"
FROM "wiki/entities"
WHERE length(file.inlinks) = 0
GROUP BY ""⏰ 90 天沒更新
TABLE WITHOUT ID length(rows) AS "stale 數"
FROM "wiki/entities"
WHERE date(today) - date(updated) > dur(90 days)
GROUP BY ""🚀 進階版(需開啟 dataviewjs)
開啟 JS 後這段會渲染為單一表(含燈號自動判斷);沒開就忽略:
const pages = dv.pages('"wiki/entities"');
const today = dv.date("today");
const draftCount = pages.filter(p => p.status === "draft").length;
const totalInlinks = pages.array().reduce((s, p) => s + p.file.inlinks.length, 0);
const avgInlinks = pages.length ? (totalInlinks / pages.length).toFixed(1) : 0;
const orphanCount = pages.filter(p => p.file.inlinks.length === 0).length;
const todayCreated = pages.filter(p => p.created && dv.date(p.created).hasSame(today, "day")).length;
const todayUpdated = pages.filter(p => p.updated && dv.date(p.updated).hasSame(today, "day")).length;
const staleCount = pages.filter(p => {
if (!p.updated) return false;
const daysSince = today.diff(dv.date(p.updated), "days").days;
return daysSince > 90;
}).length;
const draftPct = pages.length ? ((draftCount / pages.length) * 100).toFixed(1) : 0;
const stalePct = pages.length ? ((staleCount / pages.length) * 100).toFixed(1) : 0;
dv.table(["指標", "數值", "燈號"], [
["📦 總 entity", pages.length, "—"],
["🆕 今日新增", todayCreated, "—"],
["✏️ 今日更新", todayUpdated, "—"],
["📝 草稿(待審)", `${draftCount} (${draftPct}%)`, draftPct < 15 ? "🟢" : draftPct < 30 ? "🟡" : "🔴"],
["🏝 孤兒頁", orphanCount, orphanCount === 0 ? "🟢" : orphanCount < 4 ? "🟡" : "🔴"],
["⏰ 90 天 stale", `${staleCount} (${stalePct}%)`, stalePct < 20 ? "🟢" : stalePct < 40 ? "🟡" : "🔴"],
["🔗 平均 inlinks", avgInlinks, "—"],
]);🚦 健康度燈號
| 指標 | 安全閾值 | 燈號 | 數量 |
|---|---|---|---|
| 孤兒頁(沒任何 backlink) | = 0 | 🟢 = 0 / 🟡 1-3 / 🔴 ≥4 | 看下方查詢 |
| 跨 domain basename 衝突 | = 0 | 🟢 = 0 / 🔴 ≥1 | 跑 lint 確認 |
| 缺失概念(X 但沒檔) | ≤ 5(growth signals) | 🟢 ≤5 / 🟡 6-10 / 🔴 ≥11 | 跑 lint 確認 |
| 90 天沒更新 entity | < 20% | 🟢 <20% / 🟡 20-40% / 🔴 ≥40% | 看下方查詢 |
| 草稿 / 總比率 | < 15% | 🟢 <15% / 🟡 15-30% / 🔴 ≥30% | 看 KPI |
孤兒頁(即時偵測)
LIST
FROM "wiki/entities"
WHERE length(file.inlinks) = 0⚠️ macOS NFD filename 問題:上面 dataview 不會把
Sönke Ahrens等含變音符的 entity 誤判孤兒(dataview 對 inlinks 比對不依賴文字正規化)。但若用 plugin 版 lint.py 會誤報——詳見 vaultCLAUDE.md§14。
90 天沒更新(要不要重 distill / 升 stable?)
TABLE WITHOUT ID file.link AS "頁面", domain, status, updated AS "最後更新"
FROM "wiki/entities"
WHERE date(today) - date(updated) > dur(90 days)
SORT updated ASC
LIMIT 20📈 各 Domain 規模(進度條視覺)
TABLE WITHOUT ID
key AS "Domain",
length(rows) AS "Entity 數",
rows.file.link[0] AS "範例頁"
FROM "wiki/entities"
GROUP BY domain
SORT length(rows) DESCMermaid 進度條視覺
xychart-beta title "各 Domain Entity 數(2026-05-02)" x-axis ["pam", "claude", "productivity", "adventure", "wiki", "callit"] y-axis "Entity 數" 0 --> 75 bar [34, 67, 33, 20, 14, 6]
🧭 視覺速讀:claude 最大(67)→ pam 次之(34)→ productivity 第三(33)。callit 最小(6)但已 stable。
🆕 最近 7 天新增 entity
TABLE WITHOUT ID file.link AS "頁面", domain, type, created AS "建立日期"
FROM "wiki/entities"
WHERE date(today) - date(created) <= dur(7 days)
SORT created DESC✏️ 最近 7 天更新 entity
TABLE WITHOUT ID file.link AS "頁面", domain, type, updated AS "更新日期"
FROM "wiki/entities"
WHERE date(today) - date(updated) <= dur(7 days)
SORT updated DESC
LIMIT 30🏆 Top 10 Hubs(被引用最多)
TABLE WITHOUT ID file.link AS "頁面", domain, length(file.inlinks) AS "inlinks"
FROM "wiki/entities"
SORT length(file.inlinks) DESC
LIMIT 10🎯 hub 是 vault 的「重要知識節點」——這些頁變動會牽動其他多個 entity,內容質量必須最高。
📝 待審 Draft 清單
TABLE WITHOUT ID
file.link AS "頁面",
domain,
type,
date(today) - date(created) AS "存在天數"
FROM "wiki/entities"
WHERE status = "draft"
SORT date(today) - date(created) DESC💡 建議流程:每週看一次此清單,把已驗證沒問題的 draft 升 stable。超過 30 天還在 draft 表示內容沒被使用過——可能該 lint / 重新檢視。
🗺 主題地圖總覽
| 地圖 | 用途 |
|---|---|
| PAM 系統全貌 | PAM 全部流程 mermaid |
| Claude 4.6 全景 | 4.6 系列升級 |
| Claude 學習地圖 | Claude 學習路徑 |
| Boris Cherny 工作流地圖 | Boris 13+10 工作流視覺化 |
| PKM 系統演進史 | 70 年 PKM 演進 |
| Claude 索引 | Claude domain 二級目錄 |
| PAM 索引 | PAM domain 二級目錄 |
| CallIT 索引 | CallIT domain 二級目錄 |
| 戶外探險旅遊 索引 | Adventure domain 二級目錄 |
| PKM 索引 | PKM domain 二級目錄 |
| Wiki 索引 | Wiki Plugin domain 二級目錄 |
| Wiki 儀表板 | 本檔——健康度監控 |
🛠 Lint 行動建議
跑 lint 來深度檢查(dataview 抓不到的問題):
python3 wiki/tools/lint.py wiki/→ 抓 god-nodes、density 過低、跨 domain collision 等深層問題。lint 報告會寫到 wiki/reports/LINT_*.md。
下次該跑 lint 的時機:
- 連續 3 天有 ingest(內容變動大)
- 看到此儀表板任何指標亮 🟡 或 🔴
- 月度健康檢查(每月 1 號)
🔄 Promote 行動建議(v1.3.7 補)
看到上面「📝 草稿」KPI 偏高(🟡 或 🔴)就跑 wiki-status-promote
跑 promote 產出 review queue:
python3 wiki/_skill-staging/wiki-status-promote/promote.py wiki/ \
--mode triage --min-age 1 \
--output-format review-queue \
--output-file wiki/_review-queue/promote-$(date +%F).md或在 LLM 對話中說:「批次升 stable」/ 「審草稿」/ 「promote drafts」
產出的 queue 在 wiki/_review-queue/,逐個勾掉 task 處理。詳見 Review Queue 認領 SOP。
→ 詳細 skill 說明:wiki-status-promote
🔗 跨層連結
- 主目錄(landing page):index
- 變更日誌(每筆一行):log.md
- 每日異動詳細:今天
- vault 維護指南:CLAUDE
- 實戰手冊:Wiki 維護實戰手冊
← 回到 wiki