Skill Learning

writing-shape

1. Bilingual SKILL.md

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

入口 skill:writing-shape左右滑动切换语言 · 段落位置自动对齐
<what-to-do>
The user has passed (or will pass) a markdown file of raw material. Treat it as the : anything from a tidy list of fragments to to a transcript. The format does not matter. 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: and mine the pile to fill it. Do not edit the raw material file: it is .
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 : 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 , and grounds new ones . 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 ; 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 . 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 . 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, : "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, 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. . 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>
<what-to-do>
用户已经传入(或将要传入)一个包含原始素材的 Markdown 文件。把它视为素材堆:它可以是整理整齐的片段列表,可以是一整墙没有结构的散文,也可以是一份转录稿。格式并不重要。做任何其他事情之前,先从头到尾读完它。
然后进行一次塑形会话,产出一份独立的文章文档。这是 **收敛(exploit)**:探索已经完成,素材堆已经固定;选定一个结构,并开采素材堆来把结构填满。不要编辑原始素材文件:对这个 Skill 而言,它是只读的。
如果用户没有说明文章保存在哪里,只询问一次,然后记住该路径。
</what-to-do>
<supporting-info>
## 循环
1. **读完素材堆。** 完整读取输入文件。形成对其中内容的整体感知。 2. **确立前置知识。** 与用户确定读者开始阅读时已经知道什么:哪些概念从一开始就已经 **落地(grounded)**。其他一切概念,都必须先由某个内容块落地,后面的内容块才能依赖它。参见 [概念落地](#grounding)。 3. **起草 2–3 个候选开头。** 每个开头都应该暗示不同的文章论点或角度。把它们全部展示出来。推动用户选定一个,或组合出一个混合版本。选中的开头界定了文章其余部分必须完成什么。 4. **逐段生长。** 开头确定后,问:“基于这个开头,读者接下来需要听到什么?”从素材堆中抽取内容来回答。下一个内容块只能依赖已经落地的概念,并在自身落定时使新概念落地。要讨论下一个内容块采用何种形式:段落、列表、表格、提示框、引语还是代码块。每个格式选择都应该是有意识且能说清理由的。 5. **边写边追加到文章文件。** 不要批量处理。每当一个段落或内容块达成一致,立即写入,让用户看到文章逐渐成形。 6. **重复第 4 步,直到文章完成。** 何时完成由用户决定。
## 概念落地
每个 **概念** 都必须先 **落地(grounded)**,内容块才能依赖它:读者要么在进入文章前就知道它,要么已经在前面的内容块中遇见它。一个内容块如果借用了尚未落地的概念,就会让读者掉队。判断单位是概念,不是表示概念的词:即使没有出现任何行话,内容块仍可能依赖读者不具备的想法。当一个概念拥有名称(一个 **术语(term)**)时,让它落地意味着让想法和术语同时落定。
概念有两种落地方式:
- **前置知识(Prerequisite)**:在开头之前已经落地。由读者带入,并在开始时固定。 - **文中引入(Introduced)**:由某个内容块确立;从此以后,它在文章余下部分都是已落地的。
持续维护一份已落地概念清单。当你问“读者接下来需要听到什么?”时,如果下一步需要一个尚未落地的概念,那么这个概念本身就是答案:先让它落地(在这里或更早的内容块中),否则这一步就走不通。这比 [从素材堆中抽取](#pulling-from-the-pile) 的“指出缺口”高一层:在那里,是素材堆缺少材料;在这里,是文章缺少地基。
真正的杠杆在于:哪些内容被设为前置知识,哪些概念在文章内部落地。前置要求太多,会把读者挡在门外;文内落地太多,开头又会淹没在定义里。确立前置知识时,要与用户一起敲定这条边界。
## 对话感
这是一次反向的 grilling 会话。在构思阶段,问题是“你真正注意到了什么?”在这里,问题变成“这篇文章真正主张什么?读者需要按什么顺序听到它?”要反驳,要追问。不要放过薄弱的过渡。如果一个段落没有为自己的位置创造价值,就删掉它。
要持续使用的具体动作:
- “这个段落为读者做了什么,是上一个段落没有做到的?” - “如果删掉它,会坏掉什么?” - “这应该是散文,还是列表?为什么要用散文?” - “这个句子同时做了两件事:拆开它,或者只选一件。” - “开头承诺的是 X,我们却漂到了 Y。要么把线索重新串起来,要么修改开头。”
## 从素材堆中抽取
把原始素材当作采石场,而不是脚本。抽出一个片段,重新加工,使它适应周围段落,再把它放进去。一个片段可以拆进多个段落,与另一个片段合并,也可以被改写。素材堆的工作是供开采;文章的工作是读起来像一个统一的声音。
如果素材堆缺少文章需要的内容,要明确指出缺口:“这里需要一个例子,但素材堆里没有。现在给我一个,否则我们就删掉这一节。”
## 真正要进行的格式辩论
选择如何呈现一个内容块时,要把这些取舍拿到台面上与用户讨论,而不是默默决定:
- **散文 vs. 列表。** 散文承载论证;列表承载并列项。如果各项并不真正平行,散文更好;如果确实平行,列表浏览起来更快。 - **行内内容 vs. 提示框。** 技巧、警告和旁注放进提示框(`> [!TIP]`、`> [!NOTE]`),但前提是把它们放在正文中真的会让主论证跑偏。否则就留在正文中。 - **表格 vs. 重复结构。** 如果同一种结构以相同字段重复 3 次以上,就用表格。否则使用带粗体引导语的散文。 - **引语 vs. 改写。** 当原始措辞本身是重点时引用;当只有想法重要时改写。 - **代码块 vs. 行内代码。** 多行、可运行或用于演示的内容 → 代码块。单个 token 或标识符 → 行内代码。
## 写作节奏
每当一个内容块达成一致,就把它追加到文章文件中。每次写入前都从磁盘重新读取文件:用户可能在两轮对话之间编辑过它。绝不要盲目覆盖。如果用户想重写某个段落,只在原位置编辑那个具体段落;其余部分保持不动。
## 范围之外
- 挖掘素材堆中不存在的新片段(缺口按“从素材堆中抽取”一节处理)。 - 编辑原始素材文件。 - 发布、为特定平台排版,或添加用户没有要求的 frontmatter。
</supporting-info>

Entry SHA-256: f5e6c57bdd85178ace4a260c92f46da6b64ddee18215b461d875739c68976f72

2. Why This Skill Is Clever

一句话核心机制

它把文章写作建模为一个受概念依赖约束的交互式增量循环:先固定素材与读者前置知识,再让用户选择开头,之后每次只决定并落盘下一个内容块。

触发与边界

直接来源: 这个 Skill 由用户显式调用,因为 frontmatter 写明 disable-model-invocation: true。它需要一份原始素材 Markdown;若输出路径未给出,只询问一次并记住。它明确拒绝三类扩张:不编辑素材文件、不凭空挖掘新片段、不负责发布或平台排版。

支持性上下文: 上游 skills/in-progress/README.md 将它标为 Beta,且概括为“逐段塑造文章,并在每一步争论格式选择”。这解释了它为何尚未进入插件,但不是本页所展示 SKILL.md 原文的一部分。

信息架构与执行顺序

  1. 完整读完固定的素材堆,避免过早套结构。
  2. 与用户确立读者的前置知识,建立初始的“已落地概念”集合。
  3. 提供 2–3 个代表不同论点的开头,让用户选定文章承诺。
  4. 反复追问读者下一步需要什么,只允许新内容依赖已落地概念。
  5. 对段落、列表、表格、提示框、引语和代码形式进行显式辩论。
  6. 每个内容块达成一致便立即追加;用户决定文章何时完成。

最巧妙的设计点

1. 用“收敛”声明阶段转换

“This is exploit: the exploring is done”

直接来源: 它先宣布探索结束、素材固定,然后才允许结构化。这避免写作阶段继续无限发散,也与前序素材收集职责解耦。

2. 把可读性变成概念依赖图

“Every concept has to be grounded before a block can lean on it”

直接来源: 规则检查的是概念而非词汇,所以即使没有行话,隐含知识跳跃也会被识别。设计解释: 这相当于给文章段落增加拓扑排序约束:一个块只能消费前置知识或前文已引入的概念。

3. 让开头成为后文的可检验契约

“The chosen opening defines what the rest of the article must do.”

直接来源: 候选开头不是文风试写,而是不同论点的分叉。选定后,后续每一段都能用“是否兑现开头承诺”来验收,从而抑制主题漂移。

4. 把格式选择从默认值提升为决策

“Each format choice should be deliberate and defensible.”

直接来源: Skill 不允许模型默默选择格式,而是要求与用户公开权衡。它还给出了散文/列表、行内/提示框、表格/重复结构等具体判据,让“排版偏好”变成可复用的语义决策。

5. 增量写入,同时防住协作覆盖

“Re-read the file from disk before every write”

直接来源: 每个已同意的块立即落盘,形成可见进度;每次写前重读,则承认用户可能在轮次之间编辑。两条规则组合成乐观并发控制:小步提交,但不以旧快照盲写。

防失败机制与 trade-off

明确不变量: 原始素材只读;先完整读取;未落地概念不能被后文依赖;每个已同意内容块立即写入;每次写前重新读取;局部改写不得殃及其余文章。

解释与取舍: 强制逐段协商能显著提升结构一致性和用户控制,但也增加轮次与时间成本;“用户决定何时完成”保留了人类判断,却缺少可自动检测的终止标准。Skill 使用 XML 风格标签和 disable-model-invocation,这些触发语义依赖具体代理运行时;迁移到其他框架时需要重新表达。Beta 身份也意味着接口可能变化。

可迁移原则

今日实践题

选一篇你熟悉的技术文章:列出读者“进入文章时”已经知道的 3 个概念,再找出一个在落地前就被后文依赖的概念。你会把它改成前置知识,还是在更早的段落中引入?

证据说明

核心机制、顺序、引文和不变量来自本报告展示的 writing-shape/SKILL.md。Beta 状态仅使用 skills/in-progress/README.md 作为支持性上下文。关于“概念依赖图”“可检验契约”和“乐观并发控制”的说法是工程设计解释,不是上游原文术语。

Source & provenance
Repository path
skills/in-progress/writing-shape/SKILL.md
Generated
2026-08-28 18:41 Asia/Shanghai
Upstream commit
6654f6b60cd9d5be8b54c6fafe44346dabeb3b76
Source
View on GitHub