Session Log

每次 session 結束後在這裡寫那次做了什麼、跑過什麼、剩什麼沒做。 下次開新 session 第一步:「讀 SESSION_LOG.md 對齊狀態。」


2026-05-23|對標 photofanz/latticework 補 5 大段 + 全面再嚴審

起源

朋友的對照站 https://photofanz.github.io/latticework/ 65 模型 / 7 學科。經對照他用 D3 + 純 SPA 的 5 大特色,挑出 5 項做進我們站:

內容
C卡片底部加「▸ {主案例}」pin(學科色箭頭 + hairline 分隔 + sr-only a11y label「案例:」)
E新增 99_Templates/模型補卡_SOP.md — 13 常駐段 / 7 字典段;補 4 新段(為什麼商業上重要 / 實務啟示 / 常見陷阱 / 延伸思考),既有 35 卡不強制 retrofit,下次補卡(c19 / c20)才走新格式
Aassets/synergies.json 10 組招牌組合(Buffett 認知三柱 / 護城河三件套 / Cialdini 影響力四連擊 / 平台冷啟動三步 / 散戶虧錢四騎士 / 風險管理三防 / 產業破壞三劍客 / 激勵設計四件套 / 稀缺定價四連發 / Munger 認知校正三招),新增「招牌組合」view tab;舊 lollapalooza pairs view 改名「兩條聯動」;prep_for_quartz.py 加 model_titles 驗證腳本(typo 立刻擋)。26/35 模型覆蓋率 74%(未覆蓋 9 條:冪次法則 / 可得性捷思 / 地圖不等於領土 / 外部性 / 機會成本 / 稟賦效應 / 第一性原理 / 複利效應 / 賽局理論)
BAI 推薦 view 改名「✦ 智慧推薦」+ 加 mode toggle 2 模式:即時推薦(rule-based、debounced 250ms、純前端計分、免費無限)/ ✦ AI 推薦(既有 Llama 3.3 70B、每日 60 quota)。即時模式計分公式:scenario 6/學科 4/full-name 5/full-case 4/full-summary 3/bigram 0.5-3/network neighbor 1.5/scenario partial 1.5。5 種 reason chip(scenario gold / kw mute / disc blue / net purple / tier green)
D新「關係圖譜」view — D3 force-directed graph (CDN lazy load + memoize),35 節點 + 11 lollapalooza 連結,學科 7 色節點(6 在用),常駐 8 條金邊(#d4a05a),degree-based 大小,hover 高亮鄰居 + tooltip(學科·tier·case·one_liner),drag/zoom,legend 點擊 dim 過濾,重置按鈕,dot-grid 背景

tab bar 最終排列

卡片牆 / 表格 / 實證個案 / 兩條聯動 / 招牌組合 / 關係圖譜 / ✦ 智慧推薦 — 7 tab 桌面寬剩 680px。

全面再嚴審 5 輪(A~E 後)

  • R1 code dedupe / DRY ✅ 7 處「switch grid + select」一致 oneliner
  • R2 state 管理 ✅ aiMode 切換正確、instantResults 持久
  • R3 synergies 內容正確性 ✅ 10/10 組 model_titles 都在 why+case 文字中引用、build-time 驗證
  • R4 a11y / mobile ⚠️→✅ graph 節點原本無 tabindex/role/aria-label/keyboard handler → 補 tabindex=0 + role=button + aria-label=「{學科}·{tier}·{title},主案例 {case}」 + Enter/Space handler + focus-visible 樣式。Mobile 加 880/540 兩段 media query 縮 graph height (640→480→420)、syn-card 排版、ai-mode min-width=0
  • R5 failure 衛生 ⚠️→✅ /api/recommend 404 在 local dev 無 cache 導致 3 輪切 view 打 17 個 failed fetch → 加 60s _aiQuotaFailedAt failure cache,後續同情境只剩 1 個 fetch

改動檔案

路徑變動
assets/cards.js+600 行(renderSynergy / renderGraph / drawGraph / ensureD3 / computeInstantRecommendations / renderInstantResult / scheduleInstantCompute / instantTokenize / state.aiMode + state.synergies + state.instantResults + a11y 修補 + failure cache)
assets/cards.css+280 行(mm-card-case + arrow + a11y sr-only / mm-syn-* / mm-reason-chip / mm-ai-mode / mm-g-* graph + focus + media query)
assets/synergies.json新檔 10 組招牌組合
index.md加 graph + synergy + preload synergies tab、AI tab 改名「✦ 智慧推薦」
_scripts/prep_for_quartz.py加 synergies.json model_titles 驗證
99_Templates/模型補卡_SOP.md新檔 SOP

部署狀態

加碼:補 2 組 synergy 涵蓋 (a) 類缺口

10 組 → 12 組

  • 資源配置三件套 [機會成本 + 沉沒成本 + 二階思考],case Buffett 收掉紡織業務
  • Game Theory 多方博弈三招 [賽局理論 + 囚徒困境 + 公地悲劇],case Uber/Lyft/Didi 補貼大戰

涵蓋率 26→28/35(80%)。剩 7 條未覆蓋(多屬 meta-level 思維工具或 niche),不勉強塞。

已知待辦

  • 內容:剩 7 條未覆蓋(冪次法則 / 可得性捷思 / 地圖不等於領土 / 外部性 / 稟賦效應 / 第一性原理 / 複利效應),下次想擴可考慮但不急涵蓋它們
  • 內容:35 既有卡可在補卡 SOP 13 段標準下逐步 retrofit(不急)
  • 互動:graph view 鍵盤焦點目前是 Tab 一個個跳,沒做方向鍵 lattice 跳轉(next iter)
  • URL statestate.aiMode 沒進 URL,分享 ?view=ai 一律進 instant 模式(可接受)
  • mobile:graph 在 < 540 viewport 節點密度仍偏高,可考慮 default zoom-out 或 hide low-degree label
  • 內容:5/26 c19、5/29 c20 兩個 HBS 個案如果在 vault 補成完整 model(從 mental-models 角度),會增加 cross-vault 連動

2026-05-16|首版完工 + Quartz build script + 內容嚴格審查

完成

結構

  • 建立完整 vault:00_入口 / 01_常駐工具 / 02_字典 / 03_HBS個案 / 04_決策模板 / 05_個人日誌 / 99_Templates / _scripts / _build
  • README、DEPLOY、使用指南、Latticework 核心邏輯、字典總覽 全部到位

內容(總 35 條完整 mental model + 2 HBS case + 模板 / 日誌)

  • ✅ 8 條常駐工具(完整四件套 + 600-800 字白話例):逆向思考、能力圈、二階思考、確認偏誤、沉沒成本、機會成本、激勵機制、基礎機率
  • ✅ 27 條字典版(P0 11 + P1 16):見 02_字典總覽
  • ✅ 2 個 HBS 個案:Theranos(7 條 lollapalooza)、Kodak(6 條 lollapalooza)
  • ✅ 3 個決策模板:決策前 checklist、Post-mortem、踩雷/用對紀錄
  • ✅ 2 個 Templater 模板

技術設施

  • ✅ Obsidian 1.12.7 本地完整運作(Dataview + Templater + Excalidraw)
  • ✅ Quartz 預處理 script _scripts/prep_for_quartz.py:Dataview 靜態化(支援 TABLE/LIST/FROM/WHERE/SORT)
  • DEPLOY.md:CF Workers 完整部署指南
  • .gitignore、git repo init

Debug 戰役(3 層連環 bug)

  1. YAML inline 陣列 + CJK → Dataview 解析失敗 → 改 block style
  2. Python on Windows write_text 自動轉 CRLF → Dataview 不認 → 強制 LF(write_bytes
  3. source_pdf: HBS: Theranos(value 含冒號未引號)→ 整個 frontmatter 被丟棄 → 加雙引號

→ 細節寫進 frontmatter 約定 鐵律 3 條

內容嚴格審查(2 個審查 agent + WebSearch 驗證) 🔴 嚴重錯誤已修正:

  • 基礎機率:Sherlock Holmes 引言誤植給蒙格 → 改回 Conan Doyle
  • 沉沒成本:Iridium 「月費 USD 3,000」實為手機售價、重量 22 oz 非 16 oz
  • 過度自信:LTCM 槓桿 25 倍 → 實為 250+ 倍(USD 48 億權益 → USD 1.25 兆部位)
  • 稟賦效應:Kahneman 馬克杯買價 USD 3.50 → 實為 2.87
  • 冪次法則:a16z Facebook 經典例改為 Instagram(USD 25 萬 → 7,800 萬,312 倍)
  • 路徑依賴:Dvorak「快 30%」是被質疑的迷思(Liebowitz & Margolis 1990)
  • 公地悲劇:鱈魚 25 年未恢復 → 實為 32 年後(2024)才有限度解禁

🟡 中等問題已修正:

  • Nokia 賣 Microsoft 年份 2013 → 2014 完成交割
  • Wells Fargo 罰款數字混淆 → 分清 2016/2020/2022 各筆
  • 達爾文引言降為 paraphrase
  • 巴菲特 95% / 60 歲 → 99% / 50 歲後(Morgan Housel)
  • AMR 1992 全行業虧損 USD 38 億 → AMR 自身 9.35 億 + 1990-94 累積超過 100 億
  • 菸草廣告禁播後消費「沒顯著增長」 → 微增 3% 但廣告省下變利潤
  • Theranos:Ellison「領投」→「早期入股」;Isaacson 引言 → 改為媒體敘事
  • Salesforce 「churn < 5%」→ 改「企業級個位數」
  • 多處查無原文的蒙格引言改成 paraphrase 或刪除

已知待辦

字典版剩 30 條全 P2(場景較窄,按需要補):

  • 經濟學 13、物理學 7、生物學 4、統計學 3、工程學 2、哲學 1

部署

  • CF Workers 還沒實際部署,build script 已備
  • 步驟詳見 DEPLOY.md

個人累積(最重要)

  • 05_個人日誌/踩雷紀錄.md 還沒寫任何個人案例
  • 05_個人日誌/用對的紀錄.md 還沒寫任何個人案例
  • 這是 vault 真正長期增值的地方,下次 session 開始該逐步累積

數字快照

  • vault 內 .md 檔:49 個
  • Quartz build 輸出:47 個 + 10 dataview blocks 靜態化
  • 字典版進度:27/57(47%)
  • 常駐版進度:8/8(100%)

Frontmatter 鐵律(避免之後 Dataview 解析失敗)

# ✅ 對的寫法
scenarios:
  - 併購
  - 招募
source_pdf: "HBS: Theranos"   # 含冒號用引號
 
# ❌ 錯的寫法
scenarios: [併購, 招募]         # inline + CJK
source_pdf: Theranos      # 整個 frontmatter 會被丟棄

2026-05-16(晚場)|首次部署上線 CF Pages 🎉

完成

  • ✅ Quartz 4 專案建立mental-models-quartz/,跟 vault 同層)
    • clone jackyzha0/quartznpm installquartz create -X new -l shortest
    • quartz.config.ts:繁中、Noto Serif TC、棕金配色、zh-TW locale
    • 關鍵 fix:移除 Plugin.Latex({...}),因為 vault 內 NT$xxx 會被誤判為 LaTeX math
  • ✅ 建立 vault 首頁 index.md(Quartz 部署必需,根目錄一定要有)
  • ✅ CF Pages 部署完成
  • ✅ 認證走 API Token,非 OAuth
    • wrangler login OAuth 失敗(防火牆 / 網路問題常見)
    • 改用 API Token:CF dashboard → API Tokens → “Edit Cloudflare Workers” 模板
    • Token 存在 mental-models-quartz/_secrets/cf_token.txt(gitignored)
  • ✅ 一鍵部署腳本 mental-models-quartz/deploy.sh
    • 用法:bash deploy.sh(完整)/ bash deploy.sh --skip-vault / bash deploy.sh --preview
    • 自動跑 vault build → 同步 content → Quartz build → wrangler deploy

踩過的雷

  1. OAuth wrangler login 失敗 → 直接改 API Token,完全繞過 OAuth
  2. Project not found → 第一次部署前要先 wrangler pages project create <name> --production-branch=main
  3. LaTeX 誤判 → 文章內 NT$5,000 之類 dollar 符號會被 KaTeX 當 math,移除 plugin 解決
  4. port 8080 佔用 → 跑 taskkill /F /PID <pid> 殺舊 node process
  5. wrangler whoami 認 OAuth 失敗 / 認 token 成功 → token 從 _secrets/cf_token.txt 讀,用 export CLOUDFLARE_API_TOKEN=$(tr -d '[:space:]' < _secrets/cf_token.txt) 注入

部署後又抓到 3 個雷(晚場第二輪)

用戶反映打開正式 URL 是空頁面。逐層 debug 後抓到 3 個獨立的根因:

雷 1|index.html 是空 redirect(aliases 衝突)

  • 症狀:本地 public/index.html 只有 308 bytes,是 <meta refresh url="./"> 自我循環頁
  • 原因:README.md 的 frontmatter 寫了 aliases: [home, index]
  • Quartz 的 AliasRedirects emitter 看到 index alias → 在 public/index.html 寫 redirect 到 README → 蓋掉真正的 content/index.md
  • 教訓:任何頁面都不要把 indexhome 加進 aliases,會跟 root index.md 撞檔名

雷 2|.gitignore 殺死 globby

  • 症狀:跑 npx quartz build 顯示 Found 0 input files from \content“,本地明明有 49 個 md
  • 原因:我把 content/* 加進 mental-models-quartz/.gitignore 想讓 git 不追蹤 content
  • 但 Quartz 用 globby({ gitignore: true }) 會自動讀 .gitignore 排除檔案 → 整個 content/ 被 globby 跳過
  • 修法:規則從 .gitignore 移到 .git/info/exclude(git 本地 only,globby 不會讀)
  • 教訓:任何「build 工具讀資料夾」的場景,不能用 .gitignore 排除衍生物——要用 git local exclude

雷 3|CF Pages production URL 沒更新(branch mismatch)

  • 症狀:preview URL(v4.mental-models-dzp.pages.dev)顯示新版,正式 URL(mental-models-dzp.pages.dev)卻是舊版
  • 原因:CF Pages 建專案時設 --production-branch=main,但 quartz repo 預設 branch 是 v4(jackyzha0 upstream),所以每次 deploy 都推到 preview,從未推到 production
  • 修法wrangler pages deploy--branch=main 強制當 production
  • 教訓:CF Pages 的 production URL 只跟著 production branch;deploy 時要明確指定

這 3 個雷的順序:先發現 alias 衝突修了 → 部署後仍空 → 發現 globby 被殺修了 → 部署後 alias URL OK 但 production URL 還是舊版 → 發現 branch mismatch 修了 → 終於全部上線。

deploy.sh 已加 --branch=main,未來不會再撞這個。

新 session 接手必讀

  • 部署一鍵指令
    cd /c/Users/alber/Desktop/AI_Playground/mental-models-quartz
    bash deploy.sh
  • 正式 URLhttps://mental-models-dzp.pages.dev
  • 改 vault 後流程:在 Obsidian 編輯 → 跑 bash deploy.sh → 1-2 分鐘上線
  • rollback:CF 後台 → Pages → mental-models → Deployments → 點舊版的 ”…” → Rollback to this deployment
  • Token 在 mental-models-quartz/_secrets/cf_token.txt(gitignored、不要 commit)

Quartz config 重點(如果以後要改外觀)

  • quartz.config.tstheme.colors.lightMode 改顏色
  • theme.typography 改字型(用 Google Fonts)
  • Plugin.Latex 已禁用,不要重新打開(vault 內容會炸)
  • baseUrl: "mental-models-dzp.pages.dev"改網域時記得改這個

2026-05-17|首頁改卡片牆 v1→v5 + 23 項優化路線圖

完成

首頁從 Quartz 內頁改寫成卡片牆(仿 Charlie Munger latticework 原 artifact),35 張卡片 + click to expand detail panel。

  • mental-models-vault/assets/cards.css(純 CSS,~11.5 KB)
  • mental-models-vault/assets/cards.js(純 JS,~12 KB)
  • mental-models-vault/index.md(HTML 骨架 only)
  • mental-models-vault/_scripts/prep_for_quartz.py 新增 build_models_json():掃 vault 抽取 35 條模型 → _build/quartz-content/assets/models.json(45 KB)
  • 整體流程:vault → prep → assets/ 含 cards.css/js/models.json → Quartz Static plugin → public/assets/ → CF Pages

五輪自審優化(v1→v5):

  • v1:基礎卡片網格 + detail panel
  • v2:11 項(Quartz layout escape、配色對比、Lollapalooza 命名、CTA 簡化、6 大學科文案、prev/next 按過濾後、loading + 清除按鈕、keyboard a11y、卡片高度齊一、border radius、focus ring)
  • v3:12 項(stats 不可點、tier chip 取代編號、detail max-height、mobile 雙欄、CTA 強化、filter active accent 色、card flex 對齊、placeholder 縮短、disabled chip 待補提示、eyebrow letter-spacing、divider 喘息、stats 固定順序)
  • v4:JS/CSS 抽外部檔(解決 Quartz <script> 內容被 HTML escape 的 bug — escape 會把 "&quot; 整段 JS syntax error)
  • v5:13 項(CTA hint 文案、panel 寬度彈性、card title 放大、HBS 顯示「案例:xxx」、mobile backdrop + click outside、subtitle 改「35 條 · 哈佛實證案例」、search 改「概念」、Result count 強化、loading 改 6 張 shimmer skeleton、preload models.json、header spacing 壓縮、tagline 字級升、(待補)改 <small>

三個關鍵踩雷(路線圖內務必避開)

雷 1|Quartz markdown 把 <script> 內容全部 HTML escape

  • 症狀:fetch("...") 被 build 成 fetch(&quot;...&quot;) → 整段 JS syntax error → spinner 卡住
  • 原因:Quartz 對 markdown 內 inline <script> 走 markdown escape pipeline,跟 <style> 待遇不同
  • 修法:JS / CSS 一律外部檔,index.md 只放 <link> <script src> reference

雷 2|首頁 frontmatter 不能寫 aliases: index

  • 症狀:Quartz AliasRedirects 把 aliases: [index] 變成 public/index.html 的 self-redirect → 蓋掉真正的 index 內容
  • 修法:任何頁面 frontmatter 都不要加 indexhome 這類 alias

雷 3|CF Pages production URL 跟 deploy branch 綁定

  • 症狀:preview URL(v4.xxx)顯示新版,但正式 URL 永遠舊版
  • 原因:CF Pages 建 project 時 production-branch=main,但 quartz repo 預設 v4
  • 修法wrangler pages deploy 必須加 --branch=main(已寫進 deploy.sh)

部署狀態

URL內容
正式https://mental-models-dzp.pages.devv5(卡片牆)|2026-05-17
本地bash deploy.sh --previewv5

🗺️ 接下來的 23 項優化路線圖(6 session 拆分)

完整審視涵蓋 5 面向:好使用 / 好查詢 / 好理解 / 好連結 / 好對照

全部 23 項(依面向分組)

A. 好使用(4)

  • U1 URL deep linking — ?model=逆向思考 直接開該卡片
  • U2 URL state for filter/search — 過濾與搜尋進 query string
  • U3 鍵盤方向鍵在卡片間導航(←↑↓→)
  • U4 最近看過清單(localStorage)

B. 好查詢(5)

  • S1 搜尋擴大到 content(one_liner / scenarios / core_concept / hbs_text)
  • S2 搜尋結果命中關鍵字 highlight
  • S3 Tier 過濾(全部 / 常駐 / 字典)
  • S4 Category 二級過濾(學科底下的子類)
  • S5 Scenarios 過濾(招募 / 併購 / 產品轉型…)

C. 好理解(5)

  • C1 概念視覺對比(35 張 SVG 圖解)
  • C2 蒙格金句 pull-out(從 source markdown 抽 quote 高亮)
  • C3 適用情境結構化(從段落改條列)
  • C4 反例 / 不適用情境(要回去寫進 35 條 source)
  • C5 閱讀時間估計(panel 內顯示「約 3 分鐘」)

D. 好連結(4)

  • L1 反向 Lollapalooza — A 說「聯動 B」,B 自動顯示「也被 A 提及」
  • L2 同 HBS 案例反向索引 — panel 加「Theranos 也觸發:權威偏誤 / 確認偏誤 / 社會認同…」chips
  • L3 7 對 Lollapalooza 總覽區塊(header 下方固定區)
  • L4 同 category 鄰居(思維方法 3 條互通)

E. 好對照(5)

  • M1 多選對照 mode(Shift+click 加入比較區,最多 3 張並列 detail)
  • M2 View 切換(grid / table 兩種視圖)
  • M3 HBS 案例索引頁(獨立頁,列所有案例 + 每個觸發的模型)
  • M4 7 對 Lollapalooza 專屬視圖(跟 L3 不同角度,這是頁面/區塊)
  • M5 Sort options(A-Z / by tier / by discipline / by case)

拆 6 個 session

Session A:URL + 搜尋強化(純 JS,1-2 小時)

  • ✅ Tasks: U1, U2, S1, S2, S3
  • 影響檔案:assets/cards.jsindex.md(HTML 不變)
  • ROI ⭐⭐⭐⭐⭐ — 分享 / refresh / 搜尋直接從半殘變實用

Session B:反向連結(build 改)(Python + JS,1.5 小時)

  • ✅ Tasks: L1, L2
  • 影響檔案:_scripts/prep_for_quartz.py(build 雙向 lollapalooza + case reverse index)、assets/cards.js(render reverse panels)
  • 為什麼一起:兩個都是 build 時計算反向關係 + UI 顯示新 section

Session C:多維過濾 + 鍵盤 + 排序(純 JS,1.5 小時)

  • ✅ Tasks: S4, S5, M5, U3
  • 影響檔案:assets/cards.css(多 chip 樣式)、assets/cards.js(filter + sort UI)

Session D:對照與索引視圖(UI 重,2-3 小時)

  • ✅ Tasks: M1, M2, M3, M4, L3, L4
  • 影響檔案:assets/cards.cssassets/cards.js 大改;可能加 content/案例索引.md 獨立頁

Session E:內容深化 + 最近看過(要動 source markdown,2-3 小時)

  • ✅ Tasks: U4, C2, C3, C5
  • 影響檔案:35 條 source markdown 微調(金句、適用情境結構化)、prep_for_quartz.py(reading_time 計算 + quote extraction)

Session F:反例 + 視覺(最慢,3+ 小時,可能拖到第 7 session)

  • ✅ Tasks: C1, C4
  • 影響檔案:35 條 source 加「反例」段落(C4)、35 張 SVG 圖(C1)

推薦執行順序

Session A (基礎建設) → Session B (連結) → Session C (過濾) → Session D (對照) → Session E (內容) → Session F (視覺)
       ↑ 最高 ROI                                              ↑ 多週工程

新 session 接手指引

每個 session 開始時:

  1. 讀 SESSION_LOG.md 最後三段(這段路線圖踩雷紀錄
  2. 確認目前 Session 編號 → 對應 tasks → 動手
  3. 結束時:
    • 更新「✅ Tasks」打勾
    • 加上「實際遇到的問題」筆記
    • Commit + deploy
    • 寫下「下個 session 起點」

不變的 3 條鐵律(節省下次 debug 時間)

  1. 不要在 index.md 寫 inline <script>,會被 HTML escape
  2. 不要在 frontmatter 加 aliases: indexaliases: home
  3. deploy 必須帶 --branch=main(deploy.sh 已內建)

2026-05-17|Session A:URL + 搜尋強化 ✅

完成(5/5 tasks)

U1|URL deep linking

  • ?model=逆向思考 直接開該卡片 detail panel
  • 點卡片時把 model=<title> 寫進 URL(history.replaceState,不污染 history)

U2|URL state for filter/search

  • search、discipline filter、tier filter 全進 query string:?q=...&filter=...&tier=...&model=...
  • 冷載入 URL 會還原所有狀態(input value、active chip、開啟的 detail)
  • 加 popstate listener,瀏覽器上一頁/下一頁可回放狀態

S1|搜尋擴大到 content

  • 從只搜 title/english/discipline/hbs_case_company → 擴到 one_liner / core_concept / scenarios(陣列 join)/ scenarios_text / hbs_case_text / category / lollapalooza_with
  • 中文 raw + 英文 lowercase 同時匹配
  • 測試「招募」由 0 命中 → 11 命中(scenarios 內找到)

S2|搜尋命中關鍵字 highlight

  • 卡片標題/英文/摘要/案例公司 + detail panel 全欄位包 <mark class="mm-hl">
  • 實作走「escape 後 regex 包 mark」,零 XSS 風險
  • escapeRegex 防 regex meta 字元爆掉,try/catch 防破爛輸入

S3|Tier 過濾

  • 新加一排 chip:全部分級35 / 常駐8 / 字典27
  • 樣式走 pill 形(border-radius 14px)+ 數字 inline,跟 discipline filter 視覺區隔
  • 跟 discipline、search 三個 filter AND 串接

實際遇到的問題

  1. preview_start 認不同 worktree 的 launch.json — 必須改 .claude/worktrees/<wt>/.claude/launch.json,不是 AI_Playground/.claude/launch.json
  2. port 9101 跟 hbs-cardwall 撞 — 改用 9102
  3. preview_screenshot 偶發 timeout — 但 preview_eval 正常,DOM 狀態驗證 OK(console error 0 / 所有 DOM 操作回傳預期值),所以 skip 截圖
  4. 背景啟動 quartz serve 後忘了關npx quartz build --serve 預設 8080 必須先 taskkill 才能讓 preview_start 接管
  5. highlight 在 card 上看不到時別緊張 — 若搜尋字串只命中 scenarios_text 等 card 不顯示的欄位,card 上沒 mark 是正確的;點進去 detail 才會看到 highlight

驗證紀錄

  • ?q=招募 → 11 cards (從 scenarios 命中) ✅
  • ?q=決策 → 21 cards,12 個 mark 在卡片上 ✅
  • 點卡片 → URL 加 &model=機會成本,detail 開 ✅
  • 點 tier=常駐 → 35 → 8(再交叉 q=決策 = 7)✅
  • 直接訪問 ?q=...&filter=...&tier=...&model=... cold load → 全狀態還原 ✅

部署狀態

URL內容
正式https://mental-models-dzp.pages.devSession A 完工|2026-05-17

下個 session 起點

Session B|反向連結(build 改)

  • Tasks: L1(反向 Lollapalooza chip)、L2(同 HBS 案例反向索引)
  • 影響檔案:_scripts/prep_for_quartz.py(build 時計算反向 map)+ assets/cards.js(render 兩個新 section)
  • 時間估:1.5 小時

2026-05-17|Session B+C+D+E 連跑|21 項純 code 優化全綠 ✅

一口氣推進 4 個 session(中間沒 break),路線圖 23 + 漏掉 3 個新點子 = 26 項裡的 21 項純 code 都收完。剩 5 項是純內容工程(C1 35 張 SVG、C2 蒙格金句、C3 適用情境結構化、C4 35 條反例、+ 路線圖外的同義詞/手勢/搜尋歷史 3 條)。

Session B|反向連結(commit 7885fad

L1 反向 Lollapalooza — detail panel 加「也被這些模型疊加」section,掃 lollapalooza_with 邊建 reverse map。扣掉已在正向 Lolla 的避免重複顯示。

L2 HBS 案例反向索引prep_for_quartz.py 新增 build_hbs_cases()03_深度個案/*.md frontmatter 抽 models_triggered,寫進 models.jsoncases 陣列;detail panel 顯示「{案例名} 案例同時觸發」section(一個案例一段)。

實測沉沒成本 detail:Kodak 案例同時觸發 5 條 + Theranos 案例同時觸發 6 條 + Lolla 2 條 + 反向 Lolla 2 條,共 4 個 section。

Session C|過濾/排序/鍵盤/分享(commit 6e7b78f

S4 category 二級:選 discipline 後浮出該學科子類 chip row(學科只有 1 個 cat 不顯示);換 discipline 自動 reset category。 S5 場景過濾:頭部 chip 列,只列被 ≥2 個模型用到的 17 條場景;單選 AND filter。 M5 排序:預設/中文 A→Z(zh-Hant locale)/字典優先/有 HBS 案例優先。 U3 鍵盤:detail 開時 ←/→ 切上下張;detail 沒開時 ↑↓←→ 在 grid focus 間移動(自動偵測 columns)。 分享按鈕:detail panel CTA 加「⎘ 複製連結」,clipboard API + textarea fallback;點完 1.6s 顯示「✓ 已複製」。

Session D|對照 + 索引 + 連結 8 項(commit a1464e0

最重的一段。Body 區整個改造支援 5 種視圖:

  • M2 表格視圖:5 欄(學科/模型/分級/一句話/案例),共用 search/filter/sort,row 也支援 Shift+click 加入對照
  • M3 HBS 案例索引視圖:Theranos、Kodak 兩張卡,列觸發的模型 chip 可跳轉
  • M4+L3 Lollapalooza 對視圖:抽 lollapalooza_with 邊算唯一無向對(11 組),雙向展示(左 ↔ 右),點任一側打開該模型
  • 全局關係圖視圖:SVG 七學科群聚布局(中心 1 個 + 周圍 6 個),35 節點 + 11 邊;常駐 r=9、字典 r=6;節點點擊跳模型

Detail panel 新加 2 個 section:

  • L4 同子類其他模型(同 discipline+category)
  • 對立模型「常拿來對照」:靜態 mapping 7 對(逆向↔確認偏誤、沉沒↔機會、損失↔稟賦、能力圈↔過度自信、二階↔可得性、基礎機率↔代表性、逆向↔從眾)

M1 多選對照

  • Shift+click(card 或 table row)加/移出 compare set,最多 3
  • Sticky 黑底 bar 顯示 chip 列 + 並列按鈕 + 清空
  • 並列彈窗:3 panel 同欄位(一句話/核心/案例/Lollapalooza/出現於案例)橫向對照

URL 加 view= / cmp=(逗號分隔 title list),冷載入回讀。

Session E(裁版)|最近看過 + 閱讀時間(commit 827dd65

  • C5 閱讀時間prep_for_quartz.py 計算每篇 body 字元數 → body_chars;detail CTA hint 顯示「完整版約 N 分鐘」(420 字/分鐘)
  • U4 最近看過:localStorage 記最近 6 條看過的模型;標題下方一條 chip 列「最近看過:A B C [清除]」;點 chip 直接開該模型;chip 沿用 discipline 配色 left border

沒做的(不在 code-only 範圍)

  • C1:35 張 SVG 概念圖解(純內容/設計工程)
  • C2:35 條蒙格金句 pull-out(需逐條讀 source markdown 抽 quote)
  • C3:適用情境結構化(要動 35 條 source markdown 段落格式)
  • C4:35 條「反例 / 不適用情境」(要寫進 source markdown)
  • 漏的 4 條新點子:手勢、同義詞、搜尋歷史、跨案例連結(場景較窄,先擱)

部署狀態

URL內容
正式https://mental-models-dzp.pages.devB+C+D+E 全綠|2026-05-17

全部 6 個 URL 參數一覽(分享連結用)

?q=<搜尋>&filter=<學科>&tier=<常駐|字典>&cat=<子類>&scn=<場景>&sort=<排序>&view=<grid|table|cases|pairs|graph>&cmp=<A,B,C>&model=<開啟的模型>

下次 session 起點

如果要繼續,剩下都是內容工作:先挑 C2 蒙格金句最划算(每條 5-10 分鐘讀 source、抽 quote 加進 frontmatter,35 條約 4 小時),其次 C3 適用情境結構化(重排段落格式),最後才是 C1 35 SVG(這條投入產出比最低)。


2026-05-17(同日續)|3 輪嚴格自審 + 25 條 polish 全綠 ✅

承上四 session 連跑(B/C/D/E)之後,用戶連喊三次「在<好使用 / 好查詢 / 好理解 / 好連結 / 好對照>幾個面向,沒有可以優化的地方了嗎?」加上中途兩個小改名請求,總共出了 25 條 polish 都收完。目前 vault 是這個 session 的最終狀態

Polish 1 — 嚴格自審 13 條(commit a384568

格局 4

  • 視圖切換從第 6 條 strip 提到 stats 正下方;加分隔線把「卡片牆/表格」(瀏覽類)跟「HBS/同向疊加對/關係圖」(探索類)切兩組;每個 view 加 hover title
  • 結果計數從獨立 strip 收進 controls 右側 inline
  • 非 grid/table 視圖時自動隱藏 search/filter/sort(page 加 is-explore class)
  • Compare bar 從 sticky-top 改 fixed-bottom 圓角浮動 pill

排版 4

  • Detail 連結類 section 前加細「相關模型」分組 divider
  • Scenario chip 從一次展開 18 條改前 5 條 +「+ 更多 N 個」折疊
  • Recent 從帶背景 box 改 slim dotted-underline 風(43px → 21px)
  • CTA hint 縮短

文字 5

  • view tab「Lollapalooza 對」→「同向疊加對」
  • 對立 section「常拿來對照」→「反方向的對照組」(拿掉 AI 味 hint)
  • Compare bar「對照 (3/3) / 並列比較 / 清空」→「對照 3 個 / 並列看 / 清空」
  • Recent label「最近看過:」→「剛看過」
  • detail section「同向疊加組合(Lollapalooza)」→「同向疊加組合」(拿掉括號)

Polish 2 — 第二輪自審 7 條 + Mobile audit(commit fd2d721

格局

  • Stats 7 個學科改 button,可點 toggle discipline filter(雙向同步 .mm-filter
  • Compare bar 開啟時 page 加 has-compare class,padding-bottom 64px → 120px 避免擋卡

文字

  • subtitle「35 條心智模型 · 每張附哈佛實證案例」→「35 條 · 跨 7 學科 · 含 HBS 實證個案」(不再跟標題重複、不再誇大)
  • Sort options 縮:「預設(常駐優先)」→「常駐優先」/「中文 A→Z」→「按名稱」
  • Scenario 「全部」chip 拿掉,active 再點一次即取消
  • View tab hover hint 全部縮短

Mobile(≤880 + ≤540)

  • Compare bar 在 mobile 隱藏 chip 列,從 187px 高 → 48px
  • Controls strip 119px(原 171px)
  • View tabs ≤540 改橫向 scroll
  • Stats label 字級下調

Polish 3 — 第三輪嚴格自審 5 條 + Lolla 漏網最後統一(commit 99bf8c5

Lolla rename 漏網 6 處(用戶要求 同向疊加對 → 效用加乘組合 / Polish 中段 commit f783830):

  • Cases section label「完整 Lollapalooza 個案」→「完整 HBS 個案」
  • Graph hint「互列 Lollapalooza」→「兩條互列為加乘組合」
  • Compare overlay row label「Lollapalooza」→「加乘組合」
  • L1 hint「Lollapalooza 觸發條件」→「加乘組合的觸發條件」
  • L2 hint「個案的 Lollapalooza 共 N 條」→「個案的加乘組合共 N 條」
  • L1 section label「也被這些模型疊加」→「被這些模型反向引用」
  • 唯一保留 Munger 詞:pairs view hint 用「Munger 講的 Lollapalooza Effect」當概念溯源

5 條 strict fixes

  • F1 Graph label 5 對重疊 → 0 對:viewBox 880x620 → 1120x780、cluster 半徑 220 → 290、内圈半徑改用弧長公式(標籤平均 60px、需間距 70px → innerR = N*70/2π)
  • F3 Mobile 開 detail 時 compare bar 被 detail (z:1000) 蓋住 (z:900):renderDetail 加 has-detail class、CSS hide bar
  • F6 Tier filter 加 hover hint:常駐 = 詳細四件套(一句話/核心概念/適用情境/HBS 案例 600-800 字白話例)/ 字典 = 精簡卡片
  • F2+F5 Empty state 強化:標題置中、列 active filter chip、雙 CTA「清除所有條件」+「只清除搜尋」
  • F11 Compare set 存 localStorage:reload 後 URL 優先;無 URL 才 fallback localStorage

Polish 中段 — Lolla 改名 + HBS 案例頁兩段式(commit f783830

用戶問:「同向疊加對好難理解,有沒有更好的詞語?」+「為何 HBS 案例分頁只有 2 個案例?」

改名:同向疊加對 → 效用加乘組合(view tab + detail section + pairs hint)

HBS 案例頁從 2 個變兩段式

  • 第一段:完整 HBS 個案(2)— Theranos / Kodak(vault 03_深度個案/ 有獨立檔,含 outcome / models_triggered)
  • 第二段:卡片附帶的案例(35)— 每張模型卡片自己引用的小案例(hbs_case_company + hbs_case_text 預覽),grid 排版,點任一條跳該模型詳情

部署狀態(2026-05-17 最終)

全部 9 個 URL 參數一覽(分享連結用)

?q=<搜尋>&filter=<學科>&tier=<常駐|字典>&cat=<子類>&scn=<場景>&sort=<排序>&view=<grid|table|cases|pairs|graph>&cmp=<A,B,C>&model=<開啟的模型>

沒做的(不在 code-only 範圍)

  • C1:35 張 SVG 概念圖解(純內容/設計工程)
  • C2:35 條蒙格金句 pull-out(需逐條讀 source markdown 抽 quote)
  • C3:適用情境結構化(要動 35 條 source markdown 段落格式)
  • C4:35 條「反例 / 不適用情境」(要寫進 source markdown)
  • 漏的 3 條新點子:手勢、同義詞、搜尋歷史(場景較窄,先擱)

下次 session 啟動指引

啟動詞:「繼續 mental-models-vault,先讀 SESSION_LOG.md 最後段對齊狀態」

新 session 第一動作:

  1. 讀 SESSION_LOG.md 從本段起(2026-05-17 同日續)
  2. 看 commit log:最新 commit 應該是 99bf8c5 polish 3
  3. 確認部署網址:https://mental-models-dzp.pages.dev
  4. 如果要繼續,剩下都是內容工作 — 先挑 C2 蒙格金句最划算(每條 5-10 分鐘、35 條約 4 小時)

3 條鐵律繼續守

  1. 不在 index.md 寫 inline <script>(Quartz 會 HTML escape,整段 JS 炸)
  2. 不在 frontmatter 加 aliases: indexhome(蓋掉 root index.html)
  3. deploy.sh 必須帶 --branch=main(已寫進,CF Pages production URL 才會更新)

2026-05-17(同日加碼)|HBS 用詞誠實化 + Content 厚度 + AI 推薦上線

承上輪 3 輪自審後(commit dfeb6a9 為 log 斷點),這天又加碼 8 個 vault commits + 2 個 quartz commits。這段是今日最終終態

動的事(依時序)

1. 913238f 隱藏 Quartz 自動標題 + HBS 用詞誠實化

  • 用戶截圖:首頁頂部有 Quartz 自動 render 的「心智模型工具箱 / 2026年5月16日 / 閱讀時間 1 分鐘」跟下面 h1 重複
  • 既有 CSS rule article > .article-title 沒命中(實際 DOM 是 .popover-hint > .article-title)→ 直接加 body[data-slug="index"] .page-header / .content-meta { display:none }
  • 用戶質疑:完整 HBS 個案資料來源是哪?是付費 HBS 案例嗎?
  • 誠實答:vault 內 Theranos.md / Kodak.md 是基於公開來源(Bad Blood、Innovator’s Dilemma、HBO 紀錄片、WSJ 報導)的原創 Lollapalooza 分析,不是付費 HBS 案例擷取。HBS 字眼會誤導
  • UI 7 處改名:view tab「HBS 案例」→「實證個案」/ subtitle「含 HBS 實證個案」→「附真實實證個案」/ cases view「完整 HBS 個案」→「深度個案」+ hint 補來源說明(Bad Blood / Innovator’s Dilemma / WSJ;非 HBS 授權內容)/ sort option / compare overlay row label / L2 hint / detail section label / tier hint

2. eb46a5d 實證個案視圖合併 + Theranos / Kodak 數字校正

  • 用戶問:上面 2 個跟下面 35 個內容差不多,幹嘛分兩段?
  • 統一 grid 37 條,按觸發模型數 desc 排序:Theranos (7) / Kodak (6) 自然浮頂 + span 2 cols + 漸層底色
  • Theranos.md 數字校正:outcome 改「2018 年解散;Holmes 2022 年判 11 年 3 個月,2023 年入監」;body 補「2003 年創辦」「2013-2015 年估值高峰 USD 90 億」「2015 年 10 月 WSJ 揭露」「2018 年 9 月正式解散」;沉沒成本段「投了 5,000 萬」改「累計投入數千萬美元」(單一精確數字不可考)
  • Kodak.md 數字校正:賣專利「5.25 億美元」補時間 + 買家(2013 年破產期間 / Apple、Google、FB、MS 聯盟);Reed Hastings 直接引述拿掉改意譯(避免造引述)

3. 48b7eb2 實證個案 cards 可點 + 關係圖 tab 移除 + 第四輪自審

  • 用戶問:每張小卡點下去都沒反應、資料量少、無法理解跟模型怎麼扯
  • Multi 卡(Theranos / Kodak) click → 導去 /03_深度個案/{slug} 完整 Quartz 案例頁(vault 作者寫的 model × 案例對照表那邊內容豐富);Ctrl/⌘ + middle-click 新分頁;CTA 標明
  • Single 卡(35 條) click → 開該模型 detail panel;CTA「→ 開啟該模型詳情」
  • chip 點擊加 stopPropagation 避免雙觸發
  • 關係圖 tab 移除(用戶判斷沒用):移 button / VIEWS / renderGraph + computeGraphPositions / CSS .mm-graph-* 全刪
  • 自審 hint 改寫:「點 chip」→「前 2 條深度個案點卡開對照表 / 35 條 single 點卡開模型 detail」

4. 1188ae8 Detail panel 內容厚度大躍進

  • 用戶問:35 個小卡點開後資料量少的可憐
  • 真相:bug 在 build script 不在 source。prep_for_quartz.py 系統性截斷:HBS 個案 / 核心概念 都只抽 _first_paragraph;適用情境硬切 [:300];白話例(200-260 / 600-800 字)完全沒抽
  • 修:新 _clean_section_body() helper 保留 markdown 結構(bold / bullets / 子段),只移除 *Source:* 註記 + 「→ 個案網交叉」交叉指引行;hbs/core/scenarios 全改抽整段;新加 plain_example 欄位
  • cards.js 新加 renderRichText() 輕量 markdown renderer(段落 + bullet + 智慧分群「heading + list」並存)+ applyHL()(跳過 HTML tag 只 mark 文字)+ stripMd() 卡片預覽用
  • detail panel 加「白話例」section,全 4 section 改 rich render
  • 數字對照(沉沒成本):之前 ~50 chars / 1 段 → 現在 ~1900 chars / 4 rich section / 16 list / 25 paragraph / 35 strong

5. ae480d8 Markdown 表格 + ordered list + 函式名稱衝突 bug fix

  • 第五輪自審:白話例段內的 markdown 表格 | 方案 | 價格 | 被 render 成 <p>...<br>...</p> 一坨;1. X / 2. Y ordered list 也是
  • 修:renderRichText 加 table block 識別(全行 | 開頭 + 第二行 |---|---| 分隔線)+ ordered list 識別(全行 N. 開頭)
  • Bug 抓:新加的 renderTable(lines) 跟既有「表格 view」 renderTable(container) 同名 → JS function declaration shadow → markdown table 觸發 container.querySelectorAll is not a function → detail panel 整個炸不開;改名 renderMdTable 避衝突
  • CSS .mm-md-table 邊框/標頭、.mm-md-ol 縮排、mobile cell normal wrap

6. 41e182a ✦ AI 推薦視圖(CF Workers AI Llama 3.3 70B)

  • 用戶問:能不能加個質性輸入欄位,AI 推薦適合的模型?
  • 方案:Cloudflare Workers AI(免費 10K neurons/天 / 不用 API key / 用 env.AI binding)+ 第 5 個 view tab + 輕量防護
  • 後端:functions/api/recommend.js Pages Function POST / 從同 origin /assets/model-summaries.json 抓 35 條摘要(edge cache 300s)/ 呼叫 @cf/meta/llama-3.3-70b-instruct-fp8-fast / system prompt 鎖死「只能從清單挑 title + 繁中 reason + 嚴格 JSON 輸出」/ extractPayload 處理 CF AI 多種回傳格式(JSON mode object vs chat completion vs string)/ normalizeTitle 砍 LLM 可能加的「(學科・分級)」後綴 / validTitles Set validate 剔編造
  • 前端:第 5 個 view tab「✦ AI 推薦」(前置 divider) / state.aiQuery / aiLoading / aiResults / aiError / textarea 1000 char + 計數 + submit / 推薦結果卡片點開該模型 detail / 3 秒 debounce
  • 新加 prep_for_quartz.py 輸出 model-summaries.json(5KB 精簡版給 LLM context)
  • 實測:「團隊糾結要不要砍掉 2 年開發、月活 50 人的功能」→ 沉沒成本 / 機會成本 / 轉換成本;「面試陌生技術工程師怎麼判斷真厲害還是吹牛」→ 能力圈 / 錨定效應 / 權威偏誤

7. 78e5fc0 AI 推薦 quota 防爆量 + UI 禁用

  • 用戶要 sharing 給別人看,要防止額度爆量
  • CF KV namespace MM_QUOTA(id 7927a62b31424789bad92f5528339839)via wrangler kv namespace create
  • function 加 GET handler 回 quota 狀態 + POST 前 quota check
  • MAX_DAILY = 60(保守,假設每次 ~166 neurons × 60 = 10K cap)
  • KV key = quota:YYYY-MM-DD(UTC date),36h TTL;race 容忍(少給 ≠ 超用);KV 沒綁時 fail-open
  • 前端:進 AI view 自動 GET quota;用完顯示紅 banner「本日 AI 推薦額度已用完,明日再來」+ textarea disabled + button 改「明日再來」+ 顯示已用 N/max;UTC 0 時重置 ≈ 台灣早上 8 點

部署狀態(2026-05-17 最終 v2)

URLlatest vault commit
正式https://mental-models-dzp.pages.dev78e5fc0

URL 參數一覽(10 個維度)

?q=&filter=&tier=&cat=&scn=&sort=&view=<grid|table|cases|pairs|ai>&cmp=&model=

5 個 view tabs

視圖用途
Browse卡片牆35 張卡片瀏覽
Browse表格5 欄表格快速掃
Explore實證個案37 條 case grid(2 multi + 35 single)
Explore效用加乘組合Lollapalooza 模型對
AI✦ AI 推薦質性問題 → CF Workers AI Llama 3.3 70B 推薦 3 條

還沒做的(不在 code-only 範圍)

  • C1:35 張 SVG 概念圖解(純設計)
  • C2:35 條蒙格金句 pull-out
  • C3:適用情境結構化(要動 source markdown)
  • C4:35 條「反例 / 不適用情境」
  • 漏的 3 條新點子:手勢、同義詞、搜尋歷史

CF Pages 新增的 infra(重要)

用途設定點
Pages Function /api/recommendAI 推薦 endpoint(GET / POST)mental-models-quartz/functions/api/recommend.js
[ai] bindingenv.AI 呼叫 Workers AIwrangler.toml
KV namespace MM_QUOTAquota 計數器wrangler.toml [[kv_namespaces]] + CF dashboard
model-summaries.jsonLLM context(35 條精簡摘要)prep_for_quartz.py build emit

新 session 千萬注意:deploy.sh 部署時會把 wrangler.toml 的 AI binding 跟 KV binding 一起 push 上去;前提是 mental-models-quartz 目錄下要有完整 wrangler.toml。如果 binding 不見了 deploy 還是會成功但 endpoint 會壞。

4 條鐵律繼續守

  1. 不在 index.md 寫 inline <script> — Quartz HTML escape 會炸
  2. 不在 frontmatter 加 aliases: indexhome — 蓋掉 root
  3. deploy 必須帶 --branch=main(已寫進 deploy.sh)
  4. 新加:function 內定義 JS 函式名稱要避開既有名(renderTable 衝突教訓)

下次 session 啟動指引

啟動詞:「繼續 mental-models-vault,先讀 SESSION_LOG.md 最後段對齊狀態

  1. 讀本段「2026-05-17(同日加碼)」
  2. 最新 vault commit 應該是 78e5fc0 或更新
  3. 最新 quartz commit 應該是 ca2540a 或更新
  4. 部署網址 https://mental-models-dzp.pages.dev
  5. 如果要繼續,剩下都是內容工程 — 先挑 C2 蒙格金句最划算(4 hours for 35 條)
  6. AI 推薦功能要驗:打開 ✦ AI 推薦 tab → 看「今日剩餘 N / 60」是否正常顯示

2026-05-17(最後一筆)|HBS 字眼全面退場

承上「同日加碼」段(bc59884)後,用戶截圖指出 Quartz sidebar 還寫「03_HBS個案」、URL 還是 /03_HBS%E5%80%8B%E6%A1%88/Kodak — 之前 7 處 UI 改名沒覆蓋到目錄 / md 內部 section / frontmatter / wikilinks。一次清乾淨。

cce1532 HBS 字眼全清

8 大類 38 個檔案的清理

位置
目錄03_HBS個案/03_深度個案/
Quartz sidebar 顯示「03_HBS個案」「03_深度個案」
頁面 URL/03_HBS%E5%80%8B%E6%A1%88/.../03_%E6%B7%B1%E5%BA%A6%E5%80%8B%E6%A1%88/...
md section 標題(37 檔)## HBS 個案## 實證個案
frontmattersource_pdf: "HBS: X"source_pdf: "X"
wikilinks[[03_HBS個案/X]][[03_深度個案/X]]
prep_for_quartz.py_extract_section "HBS 個案""實證個案" + fallback
build console 訊息「N 個 HBS 案例」「N 個深度個案」

保留(內部識別用,不影響使用者看到的 UI)

  • models.json schema field hbs_case_company / hbs_case_text
  • Python 函式名 _extract_hbs_case / build_hbs_cases
  • AI 推薦頁的「非 HBS 授權內容」disclaimer(讀者誠實聲明,正面 framing)

動法

寫 Python 腳本 _scripts/rename_hbs_to_proof.py(per CLAUDE.md no-PowerShell rule)一次性執行:

  1. shutil.move() 改目錄名
  2. 走遍所有 .md(exclude _scripts / .obsidian / _build)做三類 replacement
  3. Windows cp950 console 不支援中文 → sys.stdout.reconfigure(encoding="utf-8")

實際結果:掃 51 個 md,改 41 個檔,62 處替換 + 2 個 md rename。

實測

  • Build pipeline OK:35 卡片 + 2 深度個案,沉沒成本 hbs_case_text 543 字、plain_example 1007 字
  • cases slugs 變 03_深度個案/Kodak / 03_深度個案/Theranos
  • 新 URL /03_深度個案/Kodak → HTTP 200
  • 舊 URL(cache bust 後)→ HTTP 404

部署狀態(2026-05-17 最最終)

URLlatest commit
正式https://mental-models-dzp.pages.devvault cce1532 / quartz ca2540a

教訓加進鐵律(共 6 條)

  1. 不在 index.md 寫 inline <script>
  2. 不在 frontmatter 加 aliases: indexhome
  3. deploy 必須帶 --branch=main
  4. JS 函式名要避開既有名(renderTable 衝突教訓)
  5. Python urllib 連 CF endpoint 要設 User-Agent
  6. 新加:terminology rename 時要連目錄名 + md section 標題 + frontmatter + wikilinks 一起改,UI 字串改完不夠(這次 HBS 漏 4 大類)

下次 session 啟動指引

啟動詞:「繼續 mental-models-vault,先讀 SESSION_LOG.md 最後段對齊狀態

最新狀態:

  • vault commit cce1532,quartz commit ca2540a
  • 部署網址 https://mental-models-dzp.pages.dev
  • 22 個 vault commits + 2 個 quartz commits 一天內推完
  • 5 view tabs:卡片牆 / 表格 / 實證個案 / 效用加乘組合 / ✦ AI 推薦
  • AI 推薦:CF Workers AI Llama 3.3 70B + KV namespace MM_QUOTA quota 60/天

繼續要做?剩 5 條內容工程(C1 SVG / C2 金句 / C3 結構化 / C4 反例 / 3 個漏點子)— 先挑 C2 蒙格金句最划算(4 小時 / 35 條)。


模板(下次 session 結束時填這格)

## YYYY-MM-DD|<chapter 名>

### 完成
- ...

### 已知待辦
- ...

### 數字快照
- ...