Skill Learning

domain-modeling

1. Bilingual SKILL.md

左右滑动可直接切换英文版与中文版;两种语言按段落自动对齐。英文中的蓝色虚线词语可点击查看解释。共标记 16 处。

入口 skill:domain-modeling左右滑动切换语言 · 段落位置自动对齐
# Domain Modeling
Actively the project's domain model as you design. This is the *active* discipline — challenging terms, inventing edge-case scenarios, and writing the glossary and decisions down . (Merely *reading* `CONTEXT.md` for vocabulary is not this skill — that's a one-line habit any skill can do. This skill is for when you're changing the model, .)
## File structure
Most repos have a single context:
``` / ├── CONTEXT.md ├── docs/ │ └── adr/ │ ├── 0001-event-sourced-orders.md │ └── 0002-postgres-for-write-model.md └── src/ ```
If a `CONTEXT-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives:
``` / ├── CONTEXT-MAP.md ├── docs/ │ └── adr/ ← system-wide decisions ├── src/ │ ├── ordering/ │ │ ├── CONTEXT.md │ │ └── docs/adr/ ← context-specific decisions │ └── billing/ │ ├── CONTEXT.md │ └── docs/adr/ ```
— only when you have something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed.
## During the session
### Challenge against the glossary
When the user uses a term that conflicts with the existing language in `CONTEXT.md`, . "Your glossary defines 'cancellation' as X, but you seem to mean Y — which is it?"
### Sharpen fuzzy language
When the user uses , propose a precise canonical term. "You're saying 'account' — do you mean the Customer or the User? Those are different things."
### Discuss concrete scenarios
When domain relationships are being discussed, . Invent scenarios that and force the user to be precise about the boundaries between concepts.
### Cross-reference with code
When the user states how something works, . If you find a contradiction, surface it: "Your code cancels entire Orders, but you just said partial cancellation is possible — which is right?"
### Update CONTEXT.md inline
When a term is resolved, update `CONTEXT.md` right there. — capture them as they happen. Use the format in [CONTEXT-FORMAT.md](./CONTEXT-FORMAT.md).
`CONTEXT.md` should be . Do not treat `CONTEXT.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and .
###
Only offer to create an ADR when all three are true:
1. **** — the cost of changing your mind later is meaningful 2. **Surprising without context** — a future reader will wonder "why did they do it this way?" 3. **** — there were genuine alternatives and you picked one for specific reasons
If any of the three is missing, skip the ADR. Use the format in [ADR-FORMAT.md](./ADR-FORMAT.md).
# 领域建模
在设计过程中,主动构建并持续打磨项目的领域模型。这是一项**主动的**纪律——质疑术语、构造边缘场景,并在词汇和决策成形的那一刻就把它们记录下来。(仅仅为了了解词汇而**阅读** `CONTEXT.md` 并不属于此技能——那是任何技能都能采用的一行式习惯。本技能用于你正在改变模型,而不只是使用模型的时候。)
## 文件结构
大多数仓库只有一个上下文:
``` / ├── CONTEXT.md ├── docs/ │ └── adr/ │ ├── 0001-event-sourced-orders.md │ └── 0002-postgres-for-write-model.md └── src/ ```
如果根目录存在 `CONTEXT-MAP.md`,说明仓库包含多个上下文。该映射会指出每个上下文位于何处:
``` / ├── CONTEXT-MAP.md ├── docs/ │ └── adr/ ← 系统级决策 ├── src/ │ ├── ordering/ │ │ ├── CONTEXT.md │ │ └── docs/adr/ ← 特定上下文的决策 │ └── billing/ │ ├── CONTEXT.md │ └── docs/adr/ ```
按需创建文件——只有确实有内容要写时才创建。如果没有 `CONTEXT.md`,就在第一个术语得到明确界定时创建它。如果没有 `docs/adr/`,就在需要第一份 ADR 时创建该目录。
## 会话过程中
### 对照词汇表提出质疑
当用户使用的术语与 `CONTEXT.md` 中既有语言冲突时,立即指出来。“你的词汇表把 ‘cancellation’ 定义为 X,但你现在似乎想表达 Y——到底是哪一个?”
### 磨利含糊的语言
当用户使用含糊或含义过载的术语时,提出一个精确的规范术语。“你说的是 ‘account’——你指的是 Customer 还是 User?它们是不同的概念。”
### 讨论具体场景
讨论领域关系时,用具体场景进行压力测试。构造能够探查边缘情况的场景,迫使用户精确说明各概念之间的边界。
### 与代码交叉核对
当用户说明某个机制如何运作时,检查代码是否与之吻合。如果发现矛盾,就明确指出:“你的代码会取消整个 Order,但你刚才说可以部分取消——哪一个才是对的?”
### 就地更新 CONTEXT.md
术语一旦得到明确界定,就立即更新 `CONTEXT.md`。不要把这些变更攒到最后——在它们发生时就捕获。使用 [CONTEXT-FORMAT.md](./CONTEXT-FORMAT.md) 中的格式。
`CONTEXT.md` 应当完全不含实现细节。不要把 `CONTEXT.md` 当作 spec、scratch pad 或实现决策的存放处。它只是一份词汇表,仅此而已。
### 谨慎提出 ADR
只有在以下三个条件全部成立时,才提出创建 ADR:
1. **难以逆转(Hard to reverse)**——以后改变主意的成本很高 2. **缺少上下文就会令人意外(Surprising without context)**——未来的读者会疑惑“为什么要这样做?” 3. **源于真实的权衡(The result of a real trade-off)**——确实存在不同方案,而你基于具体理由选择了其中一个
如果三项中有任何一项不成立,就跳过 ADR。使用 [ADR-FORMAT.md](./ADR-FORMAT.md) 中的格式。

Entry SHA-256: 9617041db9b0f6606ecf974e2061c83596b05059b5bb20ddb884c60f147c70e9

2. Why This Skill Is Clever

一句话核心机制

把领域建模变成会话内的主动校准回路:术语一出现就对照词汇表、用场景与代码施压,结论一成形就写入唯一职责的长期记录。

触发与边界

Direct source: frontmatter 将触发范围限定在“讨论代码库术语、编写或编辑 CONTEXT.md、记录或编辑 ADR”;正文又明确区分了主动改变模型与“Merely reading CONTEXT.md”。因此,单纯读取既有词汇不是一次完整的领域建模任务。

Supporting context: agents/openai.yaml 只声明显示名与简短描述,没有提供显式的仅人工调用开关。具体 harness 是否自动调用、如何发现 skill,不能从所选原文中推出。

Interpretation: 这是一个应嵌入设计对话的伴随型 skill,而不是“会后整理文档”的独立阶段。若迁移到没有代码读取或文件编辑能力的环境,应把“交叉核对”和“就地更新”改成明确的待办,而不能假装已经闭环。

信息架构与执行顺序

  1. 先定位上下文结构。 根目录有 CONTEXT-MAP.md 就按多上下文工作,否则默认一个根级 CONTEXT.md;文件按需创建。
  2. 让语言先接受冲突检查。 用户的词与既有 glossary 不一致时立即提出二选一问题;含糊或过载时提出规范术语。
  3. 用场景迫使边界显形。 通过具体边缘案例检验领域关系,而不是停留在抽象同意。
  4. 把口头模型与运行现实交叉核对。 用户描述与代码行为冲突时,显式展示矛盾,让人决定是模型错了还是代码错了。
  5. 结论即时落盘。 术语写入 CONTEXT.md,但实现决策被排除;只有通过三重门槛的决策才进入 ADR。

最巧妙的设计点

1. 用“删除测试”划出调用边界

“This skill is for when you're changing the model, not just consuming it.”

Direct source: 原文主动排除了“只读 CONTEXT.md”这一低成本习惯。

Interpretation: 这避免了一个常见的 skill 反模式:把任何相关动作都吞进自身触发面。只有模型正在发生变化时,重型的质疑、场景和记录流程才值得启动。

2. 把文件结构变成可观察的路由信号

“If a CONTEXT-MAP.md exists at the root, the repo has multiple contexts.”

Direct source: 是否存在一个明确文件,直接决定单上下文与多上下文的路由方式。

Interpretation: 这比依靠目录规模或命名猜测更稳定。仓库自己提供一个廉价、可机械检查的结构信号,agent 因而更少把术语写错位置。

3. 以按需创建对抗空文档仪式

“Create files lazily — only when you have something to write.”

Direct source: CONTEXT.mddocs/adr/ 都要等到第一个真实内容出现才创建。

Interpretation: 空模板容易制造“已经完成治理”的错觉,也会鼓励为了填满栏目而写低价值内容。延迟创建把文件存在本身变成一个更可信的信号:这里确实已有结论。

4. 让反例而不是共识磨利模型

“stress-test them with specific scenarios”

Direct source: skill 要主动发明边缘场景,迫使用户精确说明概念之间的边界。

Interpretation: 抽象定义往往可以同时容纳互相矛盾的理解;具体场景会暴露所有权、生命周期和例外规则。它把词汇讨论从文案润色升级成可证伪的模型检验。

5. 把代码设为证据,而不是自动真理

“check whether the code agrees”

Direct source: 发现口头描述与代码冲突时,skill 提出“which is right?”,没有默认任何一方获胜。

Interpretation: 这是双向校验:代码可能偏离业务,用户也可能误述现状。通过展示矛盾而非替用户下结论,skill 保留了领域所有者的决策权。

6. 用两个存储体实现严格的信息分型

“It is a glossary and nothing else.”

Direct source: CONTEXT.md 只存领域词汇,明确排除 spec、scratch pad 和实现决策;高价值决策则进入 ADR。

Supporting context: CONTEXT-FORMAT.md 要求短定义、规范词和 _Avoid_ 同义词;ADR-FORMAT.md 则允许 ADR 只用一个短段落,并把额外栏目设为可选。

Interpretation: 这不是简单的“多写两个文档”,而是把“世界里有哪些概念”与“为什么这样实现”分开。不同寿命、不同读者和不同更新频率的信息不再互相污染。

防失败机制与 trade-off

显式 invariants(Direct source):

Trade-off 与可移植风险(Interpretation):

可迁移原则

  1. 给 skill 写清楚反触发条件。 说明相关但太轻的动作不属于本流程,比堆触发词更能控制调用成本。
  2. 把仓库结构变成路由协议。 用一个明确、可检查的文件或 manifest 决定内容应该写到哪里。
  3. 结论在形成时落盘。 即时记录能保留上下文,也能避免会后重构记忆。
  4. 用反例和实现证据检验术语。 好的 glossary 不是定义集合,而是经受过边界场景与现实行为校验的模型。
  5. 为不同类型的信息设置单一职责存储。 术语、规格、草稿和决策理由应各有归宿,并明确禁止交叉污染。

今日实践题

团队一直把付费的人、登录的人和合同主体都叫作 account。请设计一个具体边缘场景,迫使大家区分这三个概念;然后说明最终术语应写入 CONTEXT.md,还是需要另写 ADR,以及为什么。

Evidence note

本文的触发边界、目录规则、会话动作、CONTEXT.md 禁止项与 ADR 三重门槛来自所选 SKILL.md(Direct source)。CONTEXT-FORMAT.mdADR-FORMAT.mdagents/openai.yaml 仅用于解释模板形状和 harness 展示信息(Supporting context),它们不是双语阅读器中的所选原文。关于调用成本、反例驱动、信息寿命与可移植性的判断属于设计分析(Interpretation)。

Source & provenance
Repository path
skills/engineering/domain-modeling/SKILL.md
Generated
2026-08-14 08:23 Asia/Shanghai
Upstream commit
8b78b531ab965735c5dc74f6f7a219e1e37326df
Source
View on GitHub