Theme / v1.2.3

Matt Pocock's Engineering Skills

可組合的 AI 工程工作流技能庫

指令詳解

/domain-modeling 指令詳解

主動建立並磨利專案的領域模型——挑戰術語對照詞彙表、用邊界情境壓力測試、並即時更新 CONTEXT.md 與 ADRs

指令用途

/domain-modeling 用來主動建立並磨利專案的領域模型。它不是把一次對話的詞彙倒進詞彙表就了事 —— 它持續地:

  • 挑戰術語:讓 terms 對照詞彙表被檢驗,揪出模糊、矛盾、還沒命名的概念。
  • 壓力測試:用邊界情境去逼問一個 term 是否經得起。
  • 即時更新:把 resolved 的 term 寫進 CONTEXT.md,把 resolved 的決策寫進 ADRs。

這些文件是延遲建立的 —— 當一個 term 或決策真的被解決時才寫,而非一開始就空建模。一個空白 repo 在設定後保持空白是預期狀態。


運作流程

  1. 讀取現有模型:先讀 CONTEXT.md(或多情境的 CONTEXT-MAP.md)與 docs/adr/,理解目前已記錄什麼。
  2. 挑戰 term:在當前對話中聽到的 term,對照詞彙表檢驗 —— 它清晰嗎?它與既有 term 矛盾嗎?它還沒被命名嗎?
  3. 壓力測試:用邊界情境去問這個 term 是否站得住 —— 「那 X 算不算這個 term?」「Y 和 Z 兩個 term 邊界在哪?」
  4. resolve:把達成共識的 term 寫進 CONTEXT.md,達成共識的決策寫進 ADR。
  5. 衝突旗標:發現 ADR 之間或 term 之間有衝突時,明確標出。

實戰對話範例

範例一:術語挑戰

  • You:

    我們要加一個「訂閱」功能,使用者可以訂閱方案。

  • AI:

    「訂閱」這個詞在我們的詞彙表裡還沒定義。讓我挑戰它:

    • 「訂閱」是指一次性購買方案,還是定期續約
    • 如果定期續約,「訂閱」和現有的「會員」有什麼差別?會員也是定期的。
    • 一個使用者可以同時有多個訂閱嗎?

    從你剛才的描述,我猜你要的是定期續約的方案。如果是這樣,那「會員」和「訂閱」的邊界在哪?會員是不是其實就是一種訂閱?

  • You:

    會員是免費的、訂閱是付費的。

  • AI:

    這是個關鍵區分。那壓力測試一下:如果某個方案首月免費、之後付費,它在首月算會員還是訂閱?

    這個邊界值得記進 CONTEXT.md。我建議的定義:

    • 會員:免費、定期續約的關係。
    • 訂閱:付費、定期續約的關係。
    • 邊界按是否付費畫分。

    同意嗎?同意我就寫進 CONTEXT.md


範例二:ADR 衝突

  • You:

    我們 ERP 要把「訂單」存到 MongoDB。

  • AI:

    等一下 —— docs/adr/0003-order-storage.md 記錄了我們用 PostgreSQL 存訂單的決策,理由是 ACID。你現在要改用 MongoDB?

    這是個 ADR 衝突。兩個選項:

    1. 你推翻舊 ADR —— 那我們要寫 ADR-0004,引用並 supersede 0003。
    2. 你其實是要存別的東西(例如「訂單事件流」),不是「訂單」本體 —— 那這是個新 term,需要定義。

    是哪一個?


它寫入的位置

/domain-modeling 會延遲建立並維護:

  • CONTEXT.md(repo 根目錄)—— 領域詞彙表與 ubiquitous language。
  • CONTEXT-MAP.md(僅 monorepo)—— 多情境時,每個情境一個 CONTEXT.md
  • docs/adr/(根目錄;多情境時還有 src/<context>/docs/adr/)—— 架構決策記錄。

重點:這些檔案不預先建立。 只在 term 或決策真的被 resolve 時才寫。一個空白 repo 是預期狀態,不是問題。


何時應該使用

  • 對話中出現模糊或矛盾的 term:停下來定義它。
  • 面臨需要記錄的決策:寫成 ADR,而非口頭帶過。
  • 想要磨利 ubiquitous language:讓變數、函式、檔名都用共享語言。
  • 作為 /grill-with-docs/improve-codebase-architecture 的子步驟:這兩個 skill 內部會呼叫 /domain-modeling

何時不應該使用

  • 還沒有任何對話或 context:這是延遲建立的,先有東西討論才建模。
  • 純技術決策、與領域無關:直接寫 ADR,不必建模 term。
  • 對方(使用者)還沒準備好定義:逼問會變成 /grilling,先讓討論發酵。

為什麼這很重要

有了 ubiquitous language,開發者之間的對話與程式碼的表達,全部衍生自同一個領域模型。

Eric Evans,《Domain-Driven Design》

共享語言讓代理少說廢話 —— 不是「一個 lesson 在一個 section 裡被變成 real 的問題」,而是「materialization cascade 的問題」。這個精簡每次對話都會複利回報。


與其他技能的關係

/domain-modelingsetup-matt-pocock-skills 記錄的 domain docs 版面填起(它建立 CONTEXT.md 和 ADRs)。/grill-with-docs/improve-codebase-architecture 內部會呼叫它。它與 /codebase-design 互補 —— 前者管領域詞彙,後者管模組介面設計。不確定該用哪個 skill 時,用 /ask-matt 來路由。