mobile wallpaper 1
mobile wallpaper 2
mobile wallpaper 3
mobile wallpaper 4
2368 字
6 分钟
拆解 Matt Pocock 的写作三部曲:writing-fragments、writing-shape 与 writing-beats 源码精读与机制解析

让大语言模型写一篇文章,最常见的翻车姿势是什么?

把一段模糊的要求扔给模型,命令它「写一篇关于 X 的深度长文」。模型随即吐出一篇充满「在当今数字化浪潮下」「首先、其次、总而言之」「赋能与范式革命」的空泛 AI 八股。

这种翻车的根因在于:把「灵感开采(Explore)」和「结构成文(Exploit)」混在了一个 Prompt 甚至一个上下文回合里完成。

在 Matt Pocock 开源的 mattpocock/skills 套件中,专门针对长文写作构建了三部曲:

  1. writing-fragments:纯粹的灵感开采(Explore),拒绝一切预设结构;
  2. writing-shape:自顶向下的逐段辩驳塑形(Exploit);
  3. writing-beats:像文字冒险游戏一样的节拍演进(Exploit 另一分支)。

本文完整公开这三个 Skill 的原始实现,逐行拆解其背后的工程设计与人机博弈心智。

核心心智:Explore 与 Exploit 的彻底解耦#

在强化学习与搜索理论中,Explore(探索) 指的是在未知空间里寻找潜在可能性,不急于获得收益;而 Exploit(利用) 指的是基于已知的高价值信息收网兑现。

写作也是完全相同的过程:

  • Explore 阶段:你在思考「这次我到底抓到了什么有趣的视角?有哪些反常识的 Bug 经历?有哪些精彩的类比?」。此时强加「第一章、第二章、开头引言」只会杀死灵感。
  • Exploit 阶段:灵感池(The Pile)已经固定,不再发散。此时的唯一任务是:怎么排兵布阵,把这堆碎片熔炼成一篇逻辑无可辩驳的文章。

Matt Pocock 写作体系的基石,正是把这两件事物理隔离开:先用 writing-fragments 堆积碎石,再在 writing-shape 或 writing-beats 中把碎石砌成墙。

[无序思维] ──> writing-fragments (Explore: 灵感矿场)
│
▼ (固定为 raw-pile.md)
┌─────────────┴─────────────┐
▼ ▼
writing-shape writing-beats
(自顶向下: 逐段辩驳塑形) (自底向上: 认知地基冒险)

第一部曲:writing-fragments——小说家日记式的无结构开采#

writing-fragments 对应整个流派的入口。它的使命极其纯粹:通过拷问式提问,把人类脑子里的未成形想法挖出来,落成无结构的碎片文件。

完整源码#

---
name: writing-fragments
description: "Writing, explore: mine raw fragments, no structure yet."
disable-model-invocation: true
---
<what-to-do>
This is pure **explore**: widen the space of what could be written without committing to structure. Committing is _exploit_, a separate skill's job. Run a grilling session that produces fragments, interviewing the user relentlessly about whatever they want to write about. Imposing phases, outlines, or article structure is out of scope here.
As fragments emerge from either side of the conversation, append them to a single markdown file.
If the user did not pass a path, ask once where to save the document, then remember it for the rest of the session.
Capture fragments from the very first thing the user says, including the initial prompt.
On first write, put a single H1 at the top with a working title (it can change later) and nothing else: no metadata, no TOC, no date.
</what-to-do>
<supporting-info>
## What is a fragment
A fragment is any piece of text that might survive into the final article. It must be _readable by the author_ (the author can tell what it means), but it does not need to define its terms or be comprehensible to a cold reader. The bar is "is this a piece of good writing?", not "is this a self-contained argument?"
Fragments are deliberately heterogeneous. Examples of what could be a fragment:
- A sharp sentence you'd want to deploy somewhere but don't yet know where.
- A claim with a one-line justification.
- A vignette: a thing that happened, a code snippet, a scenario, an analogy.
- A half-thought: "something about how X feels like Y, work this out later."
- A quote, a piece of dialogue, an overheard line.
- A list of related observations that hang together by feel.
- A complaint, a confession, a punchline.
- A **leading word**: a compact metaphor or coinage the whole piece can hang on (one term that names the idea, the way _tracer bullets_ or _fog of war_ names a whole pattern).
Of these, the leading word is the most valuable fragment to land. It is load-bearing: name the right one in explore and it shapes the structure, the transitions, and the title later, paying dividends through the entire exploit phase. When the conversation circles a recurring idea, push to coin a word for it.
The novelist's diary is the model: years of unstructured noticings that later get mined for raw material. Fragments are noticings.
## File format
```markdown
# Working title
A first fragment lives here.
It can be multiple paragraphs. It can include lists, code, quotes: whatever
shape the fragment naturally takes.
---
A second fragment.
---
> A quoted line that the user wants to keep around.
A reaction to it.
---
- A cluster of related observations
- That hang together by feel
- And want to be near each other
```
Fragments are separated by a horizontal rule (`\n---\n`). No headings inside the body. No tags. No order beyond the order they were added.
## Writing rhythm
Append silently. Don't ask permission for each fragment. Mention what you added in passing ("adding that"), but don't interrupt the conversation with save dialogs.
Before every write: re-read the file from disk. The user may have edited, reordered, or deleted fragments between turns, so preserve their changes. Never overwrite the file; only append (or, if the user asks, edit a specific fragment in place).
The user can say "cut the last one", "rewrite that one sharper", "merge those two" at any time. Treat those as first-class instructions.
</supporting-info>

完整译文#

---
name: writing-fragments
description: "写作,探索阶段:开采原始素材碎片,暂不引入任何结构。"
disable-model-invocation: true
---
<要执行的操作>
这是纯粹的**探索(Explore)阶段**:在不承诺任何结构的前提下,尽可能拓宽可写内容的边界空间。确立结构是“利用(Exploit)阶段”的任务,属于另一个 skill 的职责。发起一场产出碎片的质询拷问对话,就用户想写的任何主题对其进行无休止的追问。在此阶段强加阶段划分、大纲或文章结构均属于超出范围。
当对话双方碰撞出碎片内容时,将它们直接追加到单个 Markdown 文件中。
如果用户未指定文件保存路径,询问一次并在本会话中牢记该路径。
从用户所说的第一句话(包括最初的 Prompt)开始捕获并记录碎片。
首次写入文件时,在顶部放置单个 H1 标题作为暂定标题(后续可修改),除此之外不包含任何其他内容:不添加元数据、不添加目录、不添加日期。
</要执行的操作>
<辅助参考信息>
## 什么是碎片(Fragment)
碎片是指任何可能保留到最终文章中的文字切片。它必须**对作者本人可读**(作者知道它代表什么意思),但不需要先解释定义,也不要求对陌生的冷读者做到自洽易懂。衡量的门槛是“这是否是一段精彩的文字?”,而不是“这是否构成一个完整的论证?”。
碎片有意保持高度异构。碎片包含但不限于以下类型:
- 一句你很想在某个地方用上、但尚不知放在哪里的犀利句子。
- 一个附带一句话论据的断言或主张。
- 一个微型场景:真实发生的事情、一段代码片段、一个具体情景、一个类比。
- 一个尚未成形的半成品想法:“关于 X 的感觉很像 Y,后续再推导”。
- 一段引言、一句对话、无意中听到的一句话。
- 一组凭感觉聚合在一起的关联观察笔记。
- 一句吐槽、一段坦白、一个包袱或笑点。
- 一个**前导词(Leading word)**:一个整篇文章都可以依附的精炼隐喻或新造词(用一个词命名整套模式,就像用 *示踪弹(tracer bullets)* 或 *战争迷雾(fog of war)* 概括一套完整范式一样)。
在上述所有碎片中,前导词是最具落地价值的瑰宝。它是承重的支柱:在探索阶段找准了前导词,后续利用阶段的结构、转折过渡和文章标题都会围绕它自然生长,在整个成文过程中持续释放红利。每当对话开始反复围绕某个概念打转时,推动去为它创造一个专属词汇。
小说家的创作日记就是本模式的原型:记录数年毫无结构的灵感观察,日后作为原始素材来开采。碎片就是观察沉淀。
## 文件格式
```markdown
# 暂定标题
第一个碎片写在这里。
它可以是多个自然段。也可以包含列表、代码、引用:任何碎片自然呈现的形态皆可。
---
第二个碎片。
---
> 用户想要保留的一句摘录引用。
对这句引用的即时反应。
---
- 一组凭感觉聚合在一起的关联观察
- 它们在直觉上彼此呼应
- 想要彼此挨在一起
```
每个碎片之间用水平分割线(`\n---\n`)隔开。正文内严禁出现小标题。不打标签。除了添加时的先后顺序外,不附加任何层级顺序。
## 记录节奏
静默追加。不要每记录一个碎片都向用户请示确认。顺带提一句即可(例如“已记录”),不要用保存确认弹窗打断对话流。
每次写入磁盘前:强行从磁盘重新读取文件。用户可能在对话间隙编辑、重新排序或删除了某些碎片,务必绝对保留用户的修改。绝不可盲目覆盖全文件;仅执行末尾追加(如果用户明确要求,则原地修改指定的具体碎片)。
用户随时可以说“删掉最后一条”、“把那条写得再犀利点”、“把那两条合并”,将这些视为第一优先级的明确指令。
</辅助参考信息>

核心机制精解#

  1. 绝对剥离结构(Imposing structure is out of scope):
    AI 本能地喜欢列目录、排第 1 点第 2 点。该 Skill 强制规定:除了顶层一个工作标题,全文只能用 \n---\n 分割碎片,严禁任何内部小标题、目录或元数据。这彻底释放了思考的自由度。
  2. 重度聚焦 Leading Word(前导锚点词):
    源码中指出,碎片中最珍贵的是一个精炼的隐喻或新造词(如《敏捷软件开发》里的 Tracer Bullets 示踪弹)。如果通篇对话总在围绕一个现象打转,AI 的核心职责是逼问并命名出一个 Leading Word——这在后续 Exploit 阶段将成为整篇文章的支柱。
  3. 静默追加与磁盘优先(Silent Append & Disk Truth):
    对话时不打断人类的思路,提取到火花就静默追加到文件末尾。每次写入前强行从磁盘重新读取,完全尊重人类在本地编辑器里的手动删改。

第二部曲:writing-shape——逐段辩驳的塑形工坊#

拿到素材碎片后,进入第一种成文路径:writing-shape。它采用自顶向下的逐段博弈模式,AI 从随和的记录员瞬间变成冷酷的编辑。

完整源码#

---
name: writing-shape
description: "Writing, exploit: shape raw material into an article, paragraph by paragraph."
disable-model-invocation: true
---
<what-to-do>
The user has passed (or will pass) a markdown file of raw material. Treat it as the input pile: anything from a tidy list of fragments to a wall of unstructured prose to a transcript. The format does not matter. Read it end-to-end before doing anything else.
Then run a shaping session that produces a separate article document. This is **exploit**: the exploring is done, the pile is fixed: commit to a structure and mine the pile to fill it. Do not edit the raw material file: it is read-only to this skill.
If the user did not say where to save the article, ask once and remember the path.
</what-to-do>
<supporting-info>
## The loop
1. **Read the pile.** Read the input file in full. Form a sense of what's in it.
2. **Establish the prerequisites.** Settle with the user what the reader knows walking in: the concepts that are **grounded** from the start. Everything else must be grounded by a block before a later block can lean on it. See [Grounding](#grounding).
3. **Draft 2–3 candidate openings.** Each opening should imply a different thesis or angle for the article. Show all of them. Force the user to pick or compose a hybrid. The chosen opening defines what the rest of the article must do.
4. **Grow paragraph by paragraph.** After the opening lands, ask "given this opening, what does the reader need to hear next?" Pull material from the pile to answer. The next block may only lean on grounded concepts, and grounds new ones as it lands. Argue about the form the next block takes: a paragraph, a list, a table, a callout, a quote, a code block. Each format choice should be deliberate and defensible.
5. **Append to the article file as you go.** Don't batch. Write each agreed paragraph or block immediately so the user can see the article taking shape.
6. **Loop step 4 until the article is done.** The user decides when it's done.
## Grounding
Every **concept** has to be **grounded** before a block can lean on it: the reader either walked in knowing it or met it in an earlier block. A block that reaches for an ungrounded concept loses the reader. The unit is the concept, not the word for it: a block can lean on an idea the reader lacks even with no jargon in sight. Where a concept has a name (a **term**), grounding it means landing the idea and the term together.
A concept gets grounded one of two ways:
- **Prerequisite**: grounded before the opening. The reader brings it. Fixed at the start.
- **Introduced**: a block establishes it, and from then on it's grounded for the rest of the article.
Keep a running list of what's grounded. When you ask "what does the reader need to hear next?", an ungrounded concept the next move needs is itself the answer: ground it first (here or in an earlier block) or you can't make the move. This is the gap-naming of [Pulling from the pile](#pulling-from-the-pile) one level up: there the pile is missing material; here the article is missing a foundation.
The lever is what you make a prerequisite versus what you ground inside the article. Demand too much up front and you shut readers out; ground too much inside and the opening drowns in definitions. Settle it with the user when you establish prerequisites.
## Conversational feel
This is a grilling session inverted. In ideation, the question was "what are you actually noticing?" Here it's "what is this article actually arguing, and in what order does the reader need to hear it?" Push back. Refuse to let weak transitions slide. If a paragraph doesn't earn its place, cut it.
Specific moves to keep using:
- "What does this paragraph do for the reader that the previous one didn't?"
- "If I cut this, what breaks?"
- "Is this prose, or should it be a list? Why prose?"
- "This sentence is doing two jobs: split it or pick one."
- "The opening promised X. We've drifted to Y. Either re-thread it or change the opening."
## Pulling from the pile
Treat the raw material as a quarry, not a script. Pull a fragment, rework it to fit the surrounding paragraph, and place it. A fragment may be split across multiple paragraphs, merged with another, or paraphrased. The pile's job is to be mined; the article's job is to read as one voice.
If the pile lacks something the article needs, name the gap explicitly: "We need an example here and the pile doesn't have one. Give me one now or we cut this section."
## Format arguments to actually have
When choosing how to render a block, weigh these tradeoffs out loud with the user, not silently:
- **Prose vs. list.** Prose carries argument; lists carry parallel items. If items aren't truly parallel, prose is better. If they are, a list is faster to scan.
- **Inline vs. callout.** Tips, warnings, and asides go in callouts (`> [!TIP]`, `> [!NOTE]`), but only if they'd genuinely derail the main argument inline. Otherwise leave them inline.
- **Table vs. repeated structure.** If the same shape repeats 3+ times with the same fields, a table. Otherwise prose with bold leads.
- **Quote vs. paraphrase.** Quote when the original wording is the point. Paraphrase when only the idea matters.
- **Code block vs. inline code.** Multi-line, runnable, or illustrative → block. Single token or identifier → inline.
## Writing rhythm
Append to the article file as each block is agreed. Re-read the file from disk before every write: the user may have edited between turns. Never overwrite blindly. If the user wants a paragraph rewritten, edit that specific paragraph in place; leave the rest alone.
## Out of scope
- Mining for new fragments that aren't in the pile (handle gaps as in "Pulling from the pile").
- Editing the raw material file.
- Publishing, formatting for a specific platform, or adding frontmatter the user didn't ask for.
</supporting-info>

完整译文#

---
name: writing-shape
description: "写作,利用阶段:将原始素材逐段打磨、塑造成一篇文章。"
disable-model-invocation: true
---
<要执行的操作>
用户已经提供(或即将提供)一份原始素材的 Markdown 文件。将其视作输入素材堆(Pile):无论是一份整洁的碎片清单、一整面毫无结构的大白话长文,还是一份对话记录均可,格式并不重要。在执行任何其他动作之前,必须从头到尾通读一遍。
随后发起一场打磨塑形对话,产出一份独立的文章文档。这是**利用(Exploit)阶段**:探索已经结束,素材堆已经固定;确定文章结构并开采素材堆来填充它。不要修改原始素材文件:对本 skill 而言,原始素材文件是只读的。
如果用户未说明将文章保存在何处,询问一次并在本会话中牢记该路径。
</要执行的操作>
<辅助参考信息>
## 执行循环
1. **通读素材堆。** 完整通读输入文件,对其中的内容形成全局把握。
2. **确立前置认知基准。** 与用户商定读者在阅读前已知晓哪些概念:即从一开始就**已筑基(Grounded)**的概念。所有其他概念必须在后续段落倚赖它之前,先由某个前置区块完成筑基。参见 [筑基(Grounding)](#筑基grounding)。
3. **起草 2–3 个备选开头。** 每个开头应该代表文章不同的主旨或切入视角。将所有备选展示给用户,强制用户从中挑选其一或综合成一个折中方案。选定的开头将定义文章后续必须履行的承诺。
4. **逐段生长演进。** 开头确定后,提问:“基于这个开头,读者接下来最需要听到什么?”从素材堆中提取材料来回答。下一个文本区块只能依赖已筑基的概念,并在落盘时为新概念筑基。就下一个区块应采取的排版形态展开争辩:是散文自然段、列表、表格、提示块、引用还是代码块?每一个格式选择都必须深思熟虑且理由充分。
5. **边讨论边实时追加至文章文件。** 不要批量暂存。每商定好一个段落或区块,立即写入文件,让用户看到文章逐步成型。
6. **循环执行第 4 步直到文章成篇。** 由用户决定文章何时完结。
## 筑基(Grounding)
每一个**概念**在被某个文本区块引用或依附之前,必须已经完成**筑基**:即读者要么在阅读本文前就自带该认知,要么在前面的区块中已经接触过它。一个引用了未筑基概念的区块会让读者迷失。这里的最小单元是概念本身,而非词汇名称:即便不带任何专业黑话,只要区块依赖了一个读者欠缺的抽象概念,就会造成理解断层。当概念具有专有名称(**术语**)时,筑基意味着将概念内涵与专有名称同时讲清落地。
概念通过以下两种方式之一完成筑基:
- **前置自带(Prerequisite)**:在开篇前就已经筑基。读者自带该认知。在开头时就予以固定。
- **正文引入(Introduced)**:由某个区块在正文中建立,自此之后该概念对后续所有区块都已筑基。
实时维护一份已筑基概念清单。当你提问“读者接下来需要听到什么?”时,下一个行文动作所需的未筑基概念本身就是答案:你必须先把它筑基(在本段或前序段落中完成),否则你无法迈出下一步。这比 [从素材堆中取材](#从素材堆中取材) 高了一个维度:那里缺少的是素材,而这里文章缺少的是逻辑地基。
核心杠杆在于:将哪些概念划为读者前置认知,将哪些概念在文章内部筑基。如果在前置条件上要求太苛刻,会把大量读者拒之门外;如果在文章内部筑基过多,开篇段落又会被海量定义淹没。在确立前置基准阶段与用户商定好这个平衡。
## 对话质感
这是一场反向的质询拷问会。在头脑风暴构思阶段,问题是“你到底观察到了什么细节?”;而在这里,问题变成了“这篇文章到底在论证什么主旨?读者应该按什么先后顺序接收这些信息?”。勇于推辞并直言反驳。绝不放过生硬薄弱的过渡。如果一个段落证明不了自身的存在价值,果断砍掉它。
行之有效的典型质询句式:
- “相比上一段,这个段落为读者带来了什么不可替代的增量?”
- “如果把这段删掉,整篇文章会崩坏吗?”
- “这真的是一段论证散文吗?它不应该是一个列表吗?为什么偏要写成自然段?”
- “这句话同时承担了两个职责:把它拆开,或者只选一个重点。”
- “开篇承诺了要讲 X,但现在行文已经漂移到了 Y。要么重写过渡把线索收回来,要么回头修改开头。”
## 从素材堆中取材
把原始素材当作采石场,而不是必须照念的剧本。取出一块碎片,重写并打磨它以融入周围的段落,然后安放进去。一个碎片可以拆分到多个自然段中,可以与另一个碎片合并,也可以意译重述。素材堆的使命是被开采;而最终文章的使命是以一致的语调流淌。
如果素材堆中缺少文章当前需要的支撑材料,明确指出缺口:“我们这里需要一个实际例子,但素材堆里没有。现在提供我一个,或者我们砍掉这个小节。”
## 必须当面争辩的排版权衡
在决定渲染某个区块的格式时,将以下权衡公开与用户讨论,而不是自行默默拍板:
- **散文自然段 vs 列表**。散文负责承载论证推进;列表负责承载平行并列项。如果各项内容之间并非严格平行对等,散文更好。如果纯属平行项,列表扫描效率更高。
- **行内叙述 vs 提示块(Callout)**。技巧、警告和插话放进提示块(`> [!TIP]`, `> [!NOTE]`),但前提是如果直接放在正文行内会严重干扰主线论证。否则保持在行内自然叙述。
- **表格 vs 重复结构**。当相同结构以相同字段重复出现 3 次以上时,制表。否则使用带粗体前缀的自然段落。
- **直接引用 vs 意译重述**。当原始表述的遣词造句本身就是重点时,直接引用。当只有其核心思想重要时,意译重述。
- **代码块 vs 行内代码**。多行、可运行或具有示范意义的内容 → 代码块。单个标识符或简单 Token → 行内代码。
## 写作节奏
每商定好一个区块,立刻追加至文章文件。每次写入前强制从磁盘重新读取:用户可能在对话轮次间手动编辑了文件。绝不可盲目覆盖。如果用户想要重写某一段,原地编辑该指定段落;保留其余部分不动。
## 超出范围的非目标事项
- 开采素材堆之外的新碎片(若遇素材缺失,按“从素材堆中取材”规则处理)。
- 修改原始素材文件。
- 发布操作、适配特定平台的格式调整,或添加用户未要求的 frontmatter。
</辅助参考信息>

核心机制精解#

  1. Grounding(认知地基)机制:
    这是整套理论中最精妙的概念。任何一段话,绝不能引用尚未“筑基(Grounded)”的术语或概念。概念的来源只有两条:
    • 读者前置自带(Prerequisites):比如预设读者已经熟练使用 Git。
    • 上文刚刚引入(Introduced):在前置段落中已经用通俗语言将其定义解释完毕。
      如果下一段必须使用某个复杂概念,而它既不是前置共识、上文也未提及,AI 必须拒绝推进,并要求优先插入一个筑基段落。
  2. 逐段质问(Grilling Inverted):
    AI 不会一次性吐出整篇文章,而是写一段、停下来、与人类辩论:
    • “这段话为读者提供了上一段没有的新信息吗?”
    • “如果把这段删掉,文章逻辑会崩吗?不会崩就删掉。”
    • “开篇承诺了要讲 X,现在怎么飘到了 Y?”
  3. 排版形式的显式权衡(Format Arguments):
    AI 必须把排版选择拿到台面上和作者争辩:为什么用列表而不用段落?(列表用于平行并列,散文用于论据推进);为什么用 Callout 提示块?(只有会干扰主线行文的支线知识才允许放进提示块)。

第三部曲:writing-beats——选择你自己的冒险(Choose-Your-Own-Adventure)#

如果说 writing-shape 像雕塑家一刀一刀削泥塑,那么 writing-beats 则像文字冒险游戏。它以「节拍(Beat)」为最小叙事颗粒度,每推进一步,就给出 2–3 条分支路径供作者选择。

完整源码#

---
name: writing-beats
description: Writing, exploit; assemble raw material into a journey of beats, grounding each term before a beat leans on it.
disable-model-invocation: true
---
<what-to-do>
The user has passed (or will pass) a markdown file of raw material. This is **exploit**: the exploring is done, the pile is fixed. Commit to a path through it and mine the pile to fill each beat.
If the user did not say where to save the article, ask once and remember the path.
Then run a beat-by-beat journey, choose-your-own-adventure style:
1. **Establish the prerequisites.** Before any beats, settle with the user what the audience already knows walking in: the concepts that are **grounded** from the start. Everything else must be grounded by a beat before a later beat can use it. See [Grounding](#grounding).
2. Write 2–3 candidate **starting beats**, drawn from the raw material. Each is a different entry point into the article. Each may only lean on grounded concepts; note what new concepts each one grounds. Show the user the beats before writing to the article file. The user picks one. Preview what beats that pick unlocks, as if the user is seeing a little way down the path.
3. Once the user picks a starting beat, write **only that beat** to the article file. A beat may be one sentence or several paragraphs, whatever that beat naturally is. Stop there.
4. Re-read the article file from disk. Then offer 2–3 candidate **next beats**: different directions the journey could pivot to from where the article now stands. Each must be reachable from the current grounded set; note what each one grounds.
5. Loop steps 3–5 until the article reaches a natural end.
</what-to-do>
<supporting-info>
## Grounding
Every **concept** has to be **grounded** before a beat can lean on it: the audience either walked in knowing it or met it in an earlier beat. A beat that reaches for an ungrounded concept loses the reader; that is the one move the journey can't make. The unit is the concept, not the word for it: a beat can lean on an idea the reader lacks even with no jargon in sight. Where a concept has a name (a **term**), grounding it means landing the idea and the term together.
A concept gets grounded one of two ways:
- **Prerequisite**: grounded before the first beat. The audience brings it. Fixed at the start.
- **Introduced**: a beat establishes it, and from then on it's grounded for every later beat.
So each beat does two jobs: it **requires** concepts that are already grounded, and it **grounds** new ones. Keep a running list of what's grounded so far, and update it each time a beat lands.
This is what shapes the choose-your-own-adventure. A candidate beat is only reachable if everything it requires is already grounded; picking a beat that grounds concept X unlocks every beat that was waiting on X. When you offer next beats, they must all be reachable from the current grounded set, and say what each one grounds, so the user can see which paths it opens.
The big lever is what you make a prerequisite versus what you ground inside the piece. Demand too much up front and you shut out readers who don't have it; ground too much inside and the early beats drown in definitions. Settle this with the user when you establish prerequisites, and revisit it whenever a tempting beat turns out to require a concept nothing has grounded yet: the fix is either a grounding beat before it, or promoting the concept to a prerequisite.
## What is a beat
A beat is one move in the journey. It does one thing: sets a scene, lands a point, asks a question, drops an aside, twists the angle. Then it stops, leaving the reader at a place where the next beat can pivot.
A beat is sized by what it needs:
- A single sentence if that's all the move is ("And then nothing happened for three weeks.").
- A short paragraph if the move needs setup.
- Multiple paragraphs if the beat is a self-contained vignette, argument, or example.
If a "beat" needs five paragraphs and three subheadings, it's not a beat; it's two beats glued together. Split it.
## Pulling from the pile
Pull material from the raw pile to populate each beat. You can paraphrase, split, recombine, or quote. The pile is a quarry.
## Ending the journey
The article ends when the journey is complete, not when the pile is empty. Most piles will have leftover fragments that don't make it in. That is fine; that is the point of having more raw material than you need.
## Writing rhythm
- Append one beat at a time. Never write ahead.
- Re-read the article file from disk before every write. Preserve user edits absolutely.
- If the user edits a previous beat substantially, let it change what comes next.
- If the user says "rewrite that beat" or "go back and try a different beat 3", do it: edit in place, leave the rest alone.
</supporting-info>

完整译文#

---
name: writing-beats
description: 写作,利用阶段:将原始素材组装成由节拍(Beat)构成的叙事旅程,在某个节拍依赖任何术语之前先完成筑基。
disable-model-invocation: true
---
<要执行的操作>
用户已经提供(或即将提供)一份原始素材的 Markdown 文件。这是**利用(Exploit)阶段**:探索已经结束,素材堆已经固定。选定一条贯穿它的叙事路径,并开采素材堆来填充每一个节拍(Beat)。
如果用户未说明将文章保存在何处,询问一次并在本会话中牢记该路径。
随后运行一场“选择你自己的冒险(Choose-Your-Own-Adventure)”风格的逐节拍探索之旅:
1. **确立前置认知基准。** 在开启任何节拍之前,与用户商定读者阅读前已知晓哪些概念:即从一开始就**已筑基(Grounded)**的概念。所有其他概念在后续节拍倚赖它之前,必须先由前面的节拍完成筑基。参见 [筑基(Grounding)](#筑基grounding)。
2. 从原始素材中提取并撰写 2–3 个备选**起始节拍(Starting beats)**。每一个都是切入文章的不同入口,且只能依赖已筑基的概念;标明每一个备选节拍分别能为哪些新概念筑基。在正式写入文章文件之前,将这些备选节拍展示给用户。由用户挑选其一。向用户预览该选择将解锁哪些后续节拍,让用户能看清这条路径延伸的方向。
3. 一旦用户选定了一个起始节拍,**仅将该节拍**写入文章文件。一个节拍可以是一句话,也可以是数个自然段,取决于该动作本身自然所需的篇幅。写完即停,不要多写。
4. 从磁盘重新读取文章文件。随后提供 2–3 个备选**下一节拍(Next beats)**:代表文章从当前立足点可以转向的不同推进方向。每个备选必须在当前已筑基集合下可直接抵达;标明每个备选将为哪些新概念筑基。
5. 循环执行步骤 3–5,直至文章迎来自然的完结。
</要执行的操作>
<辅助参考信息>
## 筑基(Grounding)
每一个**概念**在被某个节拍引用或依附之前,必须已经完成**筑基**:读者要么在阅读前就自带该认知,要么在前面的节拍中已经接触过它。一个依赖了未筑基概念的节拍会让读者迷失;这是本旅程中绝对不可犯的错误。衡量的单元是概念本身,而非该概念的专有词汇:即便不带任何专业黑话,只要节拍依赖了读者欠缺的想法,读者就会跟不上。当概念具有专有名称(**术语**)时,筑基意味着将概念内涵与术语名称同时讲清落地。
概念通过以下两种方式之一完成筑基:
- **前置自带(Prerequisite)**:在第一个节拍之前就已经筑基。读者自带该认知。在开篇时就予以固定。
- **正文引入(Introduced)**:由某个节拍在正文中确立,自此之后该概念对后续所有节拍都已筑基。
因此每个节拍都承担双重职责:它**依赖(Requires)**已经筑基的概念,同时为新概念**筑基(Grounds)**。实时维护一份已筑基概念清单,每当一个节拍落盘,更新该清单。
这就是塑造“选择你自己的冒险”体验的核心动力。一个备选节拍只有在它所依赖的一切前置概念都已筑基时,才是可达的;选择一个能为概念 X 筑基的节拍,就会瞬间解锁此前所有在等待 X 的后续节拍。当你提供备选下一节拍时,它们必须全部在当前已筑基集合下可直接抵达,并标明各自能筑基什么新概念,以便用户看清它们能打开哪些分支路径。
核心杠杆在于:将哪些概念划为读者前置认知,将哪些概念在正文内部筑基。如果前置要求过高,会把大量读者关在门外;如果在文章内部筑基过多,前期的节拍又会被海量解释定义淹没。在确立前置基准阶段与用户商定好这个边界,并在后续遇到诱人的节拍却需要尚未筑基的概念时随时重温:解决方案要么是在其前面补一个负责筑基的过渡节拍,要么将该概念直接升级为前置认知。
## 什么是节拍(Beat)
节拍是叙事旅程中的一次动作推进。它只做一件事:交代一个场景、落地一个观点、抛出一个疑问、插入一句题外话、转折一个观察视角。随后立刻停住,让读者停留在下一个节拍可以灵活转向的节点。
节拍的大小完全由其动作所需决定:
- 如果动作本身极简,可以只有单单一句话(“然后整整三周,什么都没发生。”)。
- 如果动作需要铺垫,可以是一个精炼的自然段。
- 如果该节拍是一个独立完整的情景故事、论证小节或代码示例,可以是多个自然段。
如果一个所谓的“节拍”需要五个自然段外加三个子标题,那它根本不是一个节拍;它是两个节拍粘在一起了,必须拆开。
## 从素材堆中取材
从原始素材堆中提取材料来填充每个节拍。你可以意译重述、拆分、重组或直接引用。素材堆就是采石场。
## 完结旅程
当叙事旅程达到自洽圆满时,文章即告结束,而不是等到素材堆被彻底掏空才结束。绝大多数素材堆都会剩下一些最终未能入选的碎片。这完全正常;拥有比实际所需更多的原始素材,正是前期探索的意义所在。
## 写作节奏
- 每次只追加一个节拍。绝不超前预写。
- 每次写入前强行从磁盘重新读取文件。绝对保留用户的修改。
- 如果用户对前面的某个节拍进行了实质性修改,允许其改变后续的推进走向。
- 如果用户说“重写那个节拍”或“退回第三个节拍尝试另一种走向”,照做:原地编辑该处,保持其余部分不动。
</辅助参考信息>

核心机制精解#

  1. 什么是 Beat(节拍)?
    它不是传统意义上的「段落」或「小节」,而是叙事旅程中的一次最小动作:设定一个场景、抛出一个痛点、提出一个疑问、转折一个视角。它可以是一句话(“然后整整三周什么都没发生。”),也可以是一个完整的代码论证。但只要做完这个动作,必须立刻停下。
  2. 状态机与地基解锁链(State Machine & Unlocking):
    writing-beats 将写作建模成了一个状态机:
    • 每个候选 Beat 会明确标出:它依赖哪些已筑基概念(Requires),以及它落盘后能解锁哪些新概念(Grounds)。
    • 只有当某条支线所需的前置概念全部满足时,该候选 Beat 才对作者可见。选择一个 Beat,就会像技能树一样点亮并解锁下一批潜在候选路线。
  3. 永远不写在前面(Never write ahead):
    杜绝 AI 自作主张把后续 5 个段落全写出来的冲动。每次只写用户选定的那个 Beat,停下,重新读盘,展示新的 2–3 条分支路径。

终极对比:两套成文工作流该怎么选?#

当你用 writing-fragments 沉淀出了一份 raw-material.md 后,该选 writing-shape 还是 writing-beats?

对比维度writing-shape(塑形工坊)writing-beats(节拍冒险)
思维方向自顶向下(Top-Down)自底向上(Bottom-Up)
控制粒度论点驱动,以段落(Paragraph)为单元叙事驱动,以动作(Beat)为单元
推进体验严厉的责任编辑:每写一段都在审视“文章主题是否漂移”RPG 游戏:给出多条分支道路,选一条并解锁后续视野
排版意识极强:强制争辩 Prose / List / Callout / Table较弱:只关注当前 Beat 的动作是否完成
适用文体论证型技术长文、深度架构复盘、最佳实践指南技术纪实故事、复杂概念通俗讲解、叙事型教程

启示:从“一键成文”到“人机交互式筑基”#

深入读完 Matt Pocock 的这三个写作 Skill,会给工程人员和技术写作者带来一个巨大的认知冲击:

  1. AI 写作的最大价值不是「代笔」,而是「反向质询器」:
    在 writing-fragments 和 writing-shape 中,AI 绝不是低眉顺眼的打字员,而是像一个极度挑剔的读者,不断向人类提问:“这句话对读者到底有什么增量?”“没有案例就砍掉”。这种持续的压迫感反而能逼出真正高密度的干货。
  2. Grounding 认知地基模型具有普适性:
    很多技术文章之所以晦涩难懂,不是因为读者水平差,而是作者无意识地在第 2 段跳过了概念地基,直接在悬空地基上搭建第 3 段的结论。把 Grounding 变成显式的状态追踪,是消灭技术文章信息断层的降维打击手段。
  3. 禁用模型自主调用(disable-model-invocation: true)的深意:
    这三个 Skill 统一禁止 LLM 自动激活。因为它们代表的是人类与 AI 共同创作的神圣控制权——何时开始采矿、何时开始辩驳、走哪条节拍道路,必须牢牢握在人类手里。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

拆解 Matt Pocock 的写作三部曲:writing-fragments、writing-shape 与 writing-beats 源码精读与机制解析
https://l1ngg.info/posts/tech/mattpocock-writing-trio-explained/
作者
L1ngg
发布于
2026-09-11
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

相关文章 智能推荐
1
Matt Pocock 的 38 个 Agent Skills 速通:从想法到代码的 AI 研发流水线
技术 详解 Matt Pocock 开源的 mattpocock/skills 套件:一整套覆盖需求质询、架构设计、TDD、Bug 排查到代码评审的 AI 研发流水线,讲清哪些该人点、哪些让 LLM 自行触发。
2
腾讯 AI Agent 架构面经:拆解会话、执行与工具状态的三层设计
技术 从一道经典的 AI Agent 系统设计面试题出发,深度拆解 Session、Run 与 Tool Call 的三层状态模型,讲透并发控制、状态流转、用户插话、中断恢复与副作用失败边界。
3
从 Forge 到 Google SDK:为什么响应回调拿不到 HTTP 状态码?
技术 从 Forge 的 onPayload / onResponse 监控需求出发,深链排查 pi-ai 在多 Provider 下的行为割裂、非 2xx 异常绕过机制,以及 Google SDK 内部流式响应信息丢失的底层根因。
4
MCP 高并发与高可用架构面经:从故障熔断自愈到分布式横向扩展
技术 深度剖析大模型系统设计中关于 MCP(Model Context Protocol)的高频架构面试题,拆解 Server 突然不可用时的四层容错自愈链路,以及多 Client 高并发场景下的非阻塞并发、流量背压与企业级网关治理方案。
5
读 Karpathy 的 LLM Wiki:从无状态 RAG 到持久累积的个人知识库(附全文精译)
技术 Andrej Karpathy 提出了一种基于 LLM Agent 维护个人 Wiki 的新范式:将 Obsidian 作为 IDE,LLM 作为程序员,Wiki 作为代码库,打破传统 RAG 的单次检索局限。本文包含背景介绍、全文翻译与深度技术思考。

目录