📊 Wiki 儀表板(Vault Health Dashboard)

一頁看 Vincent5588_Wiki 的健康狀態。KPI / 燈號 / 進度條 / 7 天異動——每天打開瞄 5 秒就知道 vault 在不在健康狀態。

index(找東西)跟 Claude 索引 等 domain MOC(深入鑽)不同——本檔聚焦狀態監控


🎯 核心 KPI

💡 更豐富的 KPI(含燈號自動判斷)需要開啟 dataviewjsSettings → 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 會誤報——詳見 vault CLAUDE.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) DESC

Mermaid 進度條視覺


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


🔗 跨層連結

← 回到 wiki