mcpp-docs-style · git:20260817.f2f9094 · 2026-08-17 · sha256 6daefa77431674c6

mcpp-docs-style git:20260817.f2f9094A

Immutable. This exact content is served forever at /api/v1/blob/6daefa77431674c6.

---
name: mcpp-docs-style
description: Use when writing or editing anything under docs/ (English or 简体中文), README files, or long-form design records — states the register mcpp documentation is written in (declarative, precise, professional), the constructions that are not admitted (question headings, conversational asides, internet slang, figurative jargon), and the bilingual parity rules.
---

# mcpp 文档风格规范

## 适用范围

`docs/**`(含 `docs/zh/**`)、`README.md`、`.agents/docs/**` 的对外部分。

代码注释与 commit message **不受本规范约束** —— 它们的读者、篇幅与目的都不同,
那里允许并鼓励叙述「为什么」以及实测过程。本规范约束的是**面向用户的文档**。

## 一、总原则

文档是**参考资料**,不是博客,也不是聊天记录。判据只有一条:

> 一位不认识作者、只想解决自己问题的工程师,能不能在最短时间内
> 拿到准确的事实,并且不会误以为某个说法比实际更随意或更绝对。

由此得到三条可执行的规则:陈述、精确、克制。

## 二、标题

**标题一律是名词短语或陈述句,不使用疑问句、不使用口语片段。**

疑问句标题把「读者已经知道自己在找什么」这个前提丢掉了 —— 目录里一列问句,
读者要先把每个问句翻译成主题才能定位。

| 不采用 | 采用 |
|---|---|
| 一段话讲完 | 概述 |
| 打什么由谁决定 | 打包内容的决定依据 |
| 哪些 `.cppm` 会被发布 | 发布的接口单元 |
| 消费者的构建会检查什么 | 消费端的构建检查 |
| 怎么消费 | 消费方式 |
| 老版本 mcpp 拿到这种包会怎样 | 旧版本 mcpp 的行为 |
| 为什么两者都不许裁剪 | 两个集合不可裁剪的原因 |
| 这些说法验证到哪一步、在哪台机器上 | 验证范围 |
| The whole idea in one paragraph | Overview |
| What decides what gets packed | What determines the package contents |
| Consuming one | Consuming a package |
| What you may rely on, and what changes | Stability guarantees |

「…的原因」「…的依据」「…的范围」是把 why 型标题转成名词短语的常用形。
**保留 why 本身,去掉疑问语气。**

## 三、词汇

### 不采用的类别

1. **网络用语与口语**:搞定、干活、坑、真香、翻车、打脸、一把梭、白给、
   凉了、炸了、神器、黑科技、敲黑板、划重点。
2. **拟人与比喻性行话**:姊妹篇、腿(fat package 的一份产物)、travel(源码
   「旅行」)、picky、happy path 的中文直译。技术术语本身可以是比喻
   (rpath、sysroot),但**不要新造比喻**。
3. **填充语**:其实、说白了、简单来说、众所周知、显然、当然、值得一提的是。
   如果一件事显然,就不必说;如果不显然,「显然」会让读者怀疑自己。
4. **含糊的程度词**:很快、非常、极其、基本上、差不多。用数字或范围替代 ——
   「2.42×」「64.77s」「四个平台中的三个」。

### 人称

默认**不使用第二人称**。写动作的对象,不写「你」。

- 不采用:你可以在 `mcpp.toml` 里写 …
- 采用:在 `mcpp.toml` 中声明 …

例外:**教程体**文档可以使用第二人称,因为那里读者正在跟着做。教程体是
**列出来的,不是推断的**:`00-getting-started.md`、`01-examples.md`、
`04-build-from-source.md`。其余全部按参考文档处理。

引用 mcpp 自身输出的部分不受此限:`did you mean 'x86_64-linux-musl'?` 与
`your toolchain : …` 是程序打印的原文,**逐字复现是要求,不是文风问题**。
检查脚本因此会先剔除行内代码段再判定。

## 四、句式

- **陈述句优先。** 命令式仅用于操作步骤(「运行 `mcpp build`」)。
- **一句话一个事实。** 从句套从句的长句拆开。
- **不使用反问。**「难道不应该……吗?」没有信息量。
- **不使用感叹号。**
- **破折号克制使用**:插入语用逗号或括号;破折号留给「随后是对前半句的
  重述或收束」这一种用法。

## 五、断言的强度必须与证据相符

这是本规范里最实质的一条,也是最容易违反的一条。

| 证据 | 允许的表述 |
|---|---|
| 跑过、有输出 | 「实测」「测量得到」,并给出数字或报错原文 |
| 读代码推断 | 「按 X 的实现」「由 Y 决定」 |
| 未验证 | 「未验证」「尚无测试覆盖」—— **必须写出来** |

**不要把推断写成实测。** 反例(本仓库真实发生过):把「守卫在原生构建上失效」
写成实测结论,而它是从「`targetTriple` 结构上可能为空」推断的;实际运行时
它非空,结论不成立。判据:**「结构上可能」不等于「运行时确实」——
要么读运行时产物,要么不要写成实测。**

同理,不要用「完全」「永远」「所有平台」这类全称词,除非确实逐个验证过;
写「已在 Linux / macOS / Windows 验证」比写「全平台可用」更有价值,
因为前者可被检验。

## 六、双语对照

`docs/X.md` 与 `docs/zh/X.md` 是**同一份文档的两个版本**,不是两篇文章。

- 章节结构、标题层级、表格行数必须一一对应;
- 代码块、命令、报错原文**逐字相同**,不翻译;
- 术语表统一:module interface unit / 模块接口单元、implementation partition /
  实现分区、import library / 导入库、install name / install name(不译)。
- 改动一侧时**同时改另一侧**。只改一侧会让两份文档随时间分叉,
  而读者无从知道哪一份是新的。

## 七、结构

- 顶部一段引言说明**这份文档回答什么问题**,以及相关文档的链接
  (用「相关文档:」,不用「姊妹篇」)。
- 表格用于枚举与对照,散文用于因果。**不要用散文列举**。
- 「当前边界 / Current limitations」一节是必要的,不是可选的:
  没有写出边界的文档,读者只能靠踩到才知道。

## 八、机器检查

规则里可判定的那一半由 `.github/tools/check_docs_style.sh` 执行:

```
bash .github/tools/check_docs_style.sh
```

它检查三条:标题不是疑问句/口语片段;参考文档不使用第二人称;
`docs/X.md` 与 `docs/zh/X.md` 的标题结构一致(按层级序列比对,
并剔除代码块内的 `#` 注释 —— 第一版脚本把 ```sh 块里的 `# GET, never HEAD`
数成了标题,报出一个并不存在的结构分歧)。

**它不检查第五节** —— 断言强度与证据是否相符需要读者判断,而那是本规范里
最重要的一条。脚本能做的事不等于规范的全部。

## 九、自检清单

提交文档改动前:

```
[ ] 标题没有疑问句、没有口语片段
[ ] 没有网络用语、没有新造比喻
[ ] 没有第二人称(教程体除外)
[ ] 每条「实测」都有数字、路径或报错原文
[ ] 没有未经验证的全称断言
[ ] 中英两版结构对应,代码块逐字一致
[ ] 有「当前边界」一节
[ ] `bash .github/tools/check_docs_style.sh` 通过
```