前 21 课把 22 个已发布 skill 逐个拆完了。这一课换一个视角:不按 skill 看,按文件看。 这组 skill 在一个项目仓库里跑起来之后,会在你本地留下一批 Markdown 文件——配置记录、领域词汇表、 架构决策、本地工单、学习存档。每个文件都有明确的生命周期:被谁创建、在什么时机创建、 之后又被谁、在什么时机修改。把这张地图装进脑子,你就拥有了「作者级理解」里最难补的一块: 看到仓库里任何一个 md 文件,能立刻说出它是哪个 skill 的哪一步写的、下一步谁会再碰它。 本课所有结论都来自对 22 个 SKILL.md 及其附属模板原文的逐行核查,文末给出关键出处。
回忆 0001 课的系统地图:这组 skill 分成配置层(setup-matt-pocock-skills 跑一次)、
编排层(你手动输入斜杠命令启动的完整流程)和纪律层(被别的 skill 反复调用的基本功)。
那张图回答的是「我该启动哪个 skill」。但日常用久了你会遇到另一类问题,而那张图答不上来:
.scratch/login-flow/issues/03-validate-token.md,这是谁写的?我该手改它吗?CONTEXT.md 里一个术语不对,直接编辑安全吗,还是有 skill 会覆盖我的修改?这些问题的共同点是:它们都问文件的归属和生命周期。MISSION.md 里的目标说得明白—— 要「看见场景就知道每个 skill 会改仓库/tracker 里的什么」。这一课就是把这个能力一次性补齐: 先把全部本地 md 文件按「写它的那一层」分成四类,再逐类讲清创建时机和修改时机, 最后汇成一张可以随时回来查的大表。
把所有本地 md 文件摆在一起,它们清楚地分成四堆。分类的标准是谁在什么时候写它:
| 层 | 文件 | 写入者 | 写入频率 |
|---|---|---|---|
| 配置层 | CLAUDE.md/AGENTS.md 的 ## Agent skills 区块、docs/agents/issue-tracker.md、docs/agents/domain.md、docs/agents/triage-labels.md |
setup-matt-pocock-skills |
每仓库一次;之后靠手改 |
| 领域模型层 | CONTEXT.md、CONTEXT-MAP.md、docs/adr/NNNN-*.md |
domain-modeling(被 grill-with-docs、triage、improve-codebase-architecture、wayfinder 顺带调用) |
懒创建,之后持续内联更新 |
| 流程产物层(仅本地 tracker) | .scratch/<feature>/spec.md、.scratch/<feature>/issues/NN-*.md、.scratch/<effort>/map.md、.out-of-scope/<concept>.md |
to-spec、to-tickets、wayfinder、triage |
每个 feature/每张工单一次,之后被追加 |
| 教学工作区层 | MISSION.md、RESOURCES.md、NOTES.md、GLOSSARY.md、learning-records/NNNN-*.md |
teach |
学习会话中持续维护 |
还有第五类不在仓库里:handoff 的交接文档和 improve-codebase-architecture
的 HTML 报告都写进操作系统的临时目录,刻意不落在仓库里——
因为它们是会话级的消耗品,不该污染版本历史。
把同一件事画成一张「仓库地图」会更直观。下面这棵树按四层配色, 每个文件后面跟着它的创建者和修改者——这就是本课大表的图形版:
your-repo/ ├─ CLAUDE.md └「## Agent skills」区块 · setup 编辑已存在者 · 手改/重跑 setup ├─ docs/agents/ │ ├─ issue-tracker.md · setup 必写 · 手改(如 PR 旗标) │ ├─ domain.md · setup 必写 · 重跑 setup 才变 │ └─ triage-labels.md · setup 条件写(装了 triage)· 手改 ├─ CONTEXT.md · 第一个术语解决时才出生 · domain-modeling 持续内联更新 ├─ CONTEXT-MAP.md · 多上下文布局专用 · 没人负责建,需手动补 ├─ docs/adr/NNNN-*.md · 三重门槛懒创建 · 推翻不删,新 ADR 标取代 ├─ .scratch/<feature>/spec.md · to-spec 写一次即冻结 ├─ .scratch/<feature>/issues/NN-*.md · to-tickets 生 · triage 改状态 · prototype 追加指针 ├─ .scratch/<effort>/map.md + issues/ · wayfinder 画地图 · 认领/解决/翻案时持续改 ├─ .out-of-scope/<concept>.md · triage 拒绝 enhancement 才建 · 翻案时整文件删 ├─ MISSION.md · RESOURCES.md · NOTES.md · GLOSSARY.md · teach 懒创建 · 持续维护 ├─ learning-records/NNNN-*.md · teach 四类事件触发 · 推翻标 superseded 不删 └─ (仓库外)$TMPDIR/ · handoff 交接文档 · 架构评审 HTML 报告
分层图:0001 系统地图 · 领域语言:本仓库自己的 CONTEXT.md
场景:你刚在一个新仓库装好这套 skill,跑 /setup-matt-pocock-skills。
它会问你三个问题——工单系统用哪家、triage 标签叫什么、领域文档放哪——
然后在第四步把答案落成文件(setup-matt-pocock-skills/SKILL.md:72-112):
CLAUDE.md 或 AGENTS.md 的 ## Agent skills 区块
这是编辑,不是新建:setup 先探测仓库根目录已有哪个文件——
有 CLAUDE.md 就编辑它,没有再编辑 AGENTS.md,两个都没有才问你建哪个。
规则写得很死:「绝不在 CLAUDE.md 已存在时新建 AGENTS.md,反之亦然」
(SKILL.md:76-80)。如果文件里已有 ## Agent skills 区块,
就原地更新内容,不会追加重复段落(SKILL.md:82)。
这个区块是给 agent 的导航牌,里面用一句话概括工单系统、标签词汇、领域文档布局,
并各自指向 docs/agents/ 下的详细文件。
docs/agents/ 下的三份配置记录docs/agents/issue-tracker.md——必写。记录工单系统是 GitHub、GitLab
还是本地文件模式,内容由对应的种子模板(issue-tracker-github.md 等)复制而来
(SKILL.md:49)。里面有一面「PRs as a request surface」旗标,默认关,
想让外部 PR 进 triage 队列的人可以日后手改它。
docs/agents/domain.md——必写。记录领域文档的布局是
single-context(单一上下文:根目录一个 CONTEXT.md 加 docs/adr/)
还是 multi-context(多上下文:根目录 CONTEXT-MAP.md 指向各上下文自己的
CONTEXT.md)。单上下文是默认,绝大多数仓库直接写不询问(SKILL.md:59-61)。
docs/agents/triage-labels.md——条件写:只有安装了
triage skill 才创建(SKILL.md:102)。它把五个标准 triage role
(needs-triage、needs-info、ready-for-agent、
ready-for-human、wontfix)映射到你工单系统里真实的标签字符串。
答案干净利落:主要就是你的手。setup 在结尾明确说「之后可以直接编辑
docs/agents/*.md,只有想换工单系统或推倒重来时才需要重跑本 skill」
(SKILL.md:116)。除此之外,所有别的 skill 对这些文件只读:
triage 读标签映射、wayfinder 读「Wayfinding operations」一节、to-spec/to-tickets 读发布位置——
但没有任何 skill 会回头改它们。它们是「人拥有的配置」,不是「skill 拥有的状态」。
CONTEXT.md、
CONTEXT-MAP.md、docs/adr/ 在 setup 阶段一个都不会出现——
setup 只在 domain.md 里记录它们将来住哪。
domain.md 原文说得很白:「domain-modeling skill 在术语或决策
真正被解决时懒创建它们」。下一节讲这套懒创建机制。
出处:setup-matt-pocock-skills/SKILL.md 第 49、59-61、72-116 行 · 详解课:0002
场景:你在和 agent 讨论一个功能,对话里第五次出现「materialization cascade(实体化级联)」
这个行话。如果此时 grill-with-docs 在场,它会把术语钉进
CONTEXT.md——而这就是领域模型层文件被写入的典型瞬间。
这一层的写入者只有一个:domain-modeling,但它常被四个上层 skill 顺带调用。
CONTEXT.md:懒创建 + 内联更新
创建时机:「如果没有 CONTEXT.md,在第一个术语被解决时创建它」
(domain-modeling/SKILL.md:40)。不是会话开始时,不是 setup 时——是第一个
术语真正被钉下来的那一刻。单上下文布局就在仓库根目录;多上下文布局下,
写进 src/<context>/CONTEXT.md(由根目录的 CONTEXT-MAP.md 指路,
格式细节见 domain-modeling/CONTEXT-FORMAT.md:34-60)。
修改时机:每次有新术语被解决,就地更新——「不要攒着批量写」
(SKILL.md:62)。触发这些更新的入口有四个:
grill-with-docs——它的全部实现就一行「用 domain-modeling 跑一场 grilling」,文件效果全部来自 domain-modeling;triage 第四步——打磨 issue 时并行跑 grilling 和 domain-modeling,决策落地就内联更新(triage/SKILL.md:76);improve-codebase-architecture 第三步——给深化后的模块起名遇到新概念时加入 CONTEXT.md,并明说「不存在就懒创建」(improve-codebase-architecture/SKILL.md:68-69);wayfinder——它的探路会话同样内嵌 grilling + domain-modeling(wayfinder/SKILL.md:111-112,124)。CONTEXT-MAP.md:一个没有明确创建者的文件
这是本组 skill 里少有的文档空白。setup 只在 docs/agents/domain.md 里记录
「这个仓库用多上下文布局」,domain-modeling 只说「如果 CONTEXT-MAP.md
存在就读它」——没有任何一行原文规定谁来创建这张地图本身。
实际推断:选了多上下文布局后,由用户或 domain-modeling 在第二个上下文出现时补建。
如果你在真实仓库里遇到它缺失,手动创建是安全的——格式在
domain-modeling/CONTEXT-FORMAT.md 里。
docs/adr/NNNN-<slug>.md:三重门槛把关的懒创建
ADR(架构决策记录,记录一个难解释的技术决策)同样懒创建,但门槛高得多:
一个决策必须同时满足三个条件才配拥有一个文件——难逆转、出人意料、
有真实取舍(domain-modeling/SKILL.md:67-73)。文件名按序号递增
(NNNN-<slug>.md,模板见 ADR-FORMAT.md)。
多上下文仓库里,系统级 ADR 放根目录 docs/adr/,上下文专属 ADR 放
src/<context>/docs/adr/(SKILL.md:29-37)。
修改时机:ADR 文件本身基本不可变,但它有两个额外的创建入口和一个「软修改」机制——
improve-codebase-architecture 会在你拒绝一个候选深化点、且拒绝理由有分量时,主动提议记成 ADR,原话是「要不要记成 ADR,免得以后的架构评审又把它翻出来?」(SKILL.md:70);出处:domain-modeling/SKILL.md 第 29-73 行 · 详解课:0004 domain-modeling、 0014 triage、 0017 improve-codebase-architecture
场景:你 setup 时选了「本地文件工单」。此后每一次「发布到工单系统」的动作,
实际都变成「在 .scratch/ 下写一个 md 文件」。这套约定集中定义在
setup-matt-pocock-skills/issue-tracker-local.md——它是本节最重要的一手材料,
四个 skill 的写入行为都从它派生:
.scratch/<feature-slug>/spec.md(issue-tracker-local.md:8);.scratch/<feature-slug>/issues/<NN>-<slug>.md,从 01 编号,一单一文件,「绝不用单个合并文件」(第 9 行);Status:(第 10 行);## Comments 标题下(第 11 行);.scratch/<feature-slug>/ 下新建文件」(第 13-15 行)。spec.md:to-spec 写一次,之后没人改
创建时机:to-spec 第三步「按模板写好 spec,发布到工单系统」
(to-spec/SKILL.md:19),本地模式下即 .scratch/<feature-slug>/spec.md,
同时写入 triage 状态行 Status: ready-for-agent。
修改时机:没有。spec 是写一次就冻结的快照——
之后的 to-tickets、code-review、implement 都只读它。远端 tracker 模式下,
它变成一个 GitHub/GitLab issue,本地什么都不写。
issues/NN-*.md:to-tickets 创建,prototype 和 triage 追加
创建时机:to-tickets 第五步,一张工单一个文件,按依赖顺序从 01 编号,
使用本地工单模板(标题、Blocked by:、Status: ready-for-agent、
验收标准勾选项,to-tickets/SKILL.md:62-82)。注意它明确不碰父级:
「不要关闭或修改任何父 issue」(第 67 行)。
修改时机,按时间顺序:
prototype——如果实现中做了原型验证,会在对应工单文件里追加一条「上下文指针」(原型分支的指向)和结论:「在实现工单上留下指向那个分支的上下文指针,把答案也记下来」(prototype/SKILL.md:26)。本地模式下这就是往 ## Comments 里追加。triage——本地模式下,「应用 triage 角色」就是改工单顶部的 Status: 行,「发 agent brief(给 agent 的执行简报)」就是往 ## Comments 追加内容。wayfinder 的地图:.scratch/<effort>/map.md + 决策工单
wayfinder 在远端 tracker 下用 issue + 子 issue 表达一切;本地模式下才落文件,
且它有一条独立规则:「如果没有提供 tracker,默认用本地文件工单」(wayfinder/SKILL.md:25)。
它写两种文件:
.scratch/<effort>/map.md——创建时机是「画地图」第三步
(SKILL.md:113),内容是目的地、笔记、已做决定、尚未明确、超出范围五节。
.scratch/<effort>/issues/NN-*.md——决策工单(Decision ticket,
内容是问题而不是实现切片)。创建时机有两个:
画地图时一批(第 114 行),探路过程中新问题浮现时逐张新增(第 126 行)。
修改时机(本地模式的操作全部定义在 issue-tracker-local.md:23-30):
Status: 改成 claimed;## Answer 下、状态改为 resolved,然后回头改 map.md——往「已做决定」一节追加一条上下文指针;SKILL.md:126)。出处:issue-tracker-local.md 全文 · 详解课:0009 to-spec、0010 to-tickets、 0016 wayfinder
triage 在远端 tracker 下几乎全落在远端(评论、标签、关闭);本地仓库里它有一个专属文件和一个共享行为:
.out-of-scope/<concept>.md:拒绝增强提案时的档案
创建时机非常窄:一个增强提案(enhancement,不是 bug)被判定为
wontfix 时(triage/SKILL.md:85)。而且「因为已经实现了所以 wontfix」
的情况不写(triage/OUT-OF-SCOPE.md:86-88)——
这个文件的用途是让未来的 agent 知道「这个方向我们已经拒绝过」,已实现的功能不需要这个档案。
一个概念一个文件,kebab-case 命名。
修改时机:同一个概念再次被提出时,往已有文件的「Prior requests(历史请求)」
列表里追加一行(OUT-OF-SCOPE.md:94);维护者改变主意、重新考虑某个拒绝时,
整个文件被删除(OUT-OF-SCOPE.md:99-105)。
第 5.2 节已说过:本地模式下 triage 的「应用角色」和「发简报」都落在工单文件里——
改 Status: 行、往 ## Comments 追加。
所以本地模式下一份工单文件的一生是这样的(注意最后一棒是只读,
implement 不会回头写它):
Status: ready-for-agent,正文是验收标准勾选项
Status: 行应用角色;往 ## Comments 追加 agent brief
## Comments 追加原型分支的上下文指针和结论
出处:triage/OUT-OF-SCOPE.md 第 17、86-105 行 · 详解课:0014 triage
这三个 skill 都写 md,但写的是「写完就不再碰」的一次性产物,只是落点完全不同:
| Skill | 文件 | 创建时机 | 修改时机 |
|---|---|---|---|
| research | 一份调研结论 md,路径不固定——「存在仓库已有同类笔记的地方,没有惯例就放在合理位置并说明」(research/SKILL.md:11-12),本地 tracker 仓库里通常自然落在 .scratch/ 下 |
每次调研结束,由后台 agent 写出,每个论断附出处 | 无——写完即冻结的快照 |
| handoff | 一份交接文档 md,写在操作系统临时目录——「存到用户操作系统的临时目录,不是当前工作区」(handoff/SKILL.md:8),文件名由 agent 自定 |
每次你输入 /handoff 时(纯 user-invoked) |
无——它就是给下一个会话用的消耗品,刻意不污染仓库 |
| prototype | 可选的一份小 README.md,挨着一次性原型代码,说明「这个原型回答什么问题」(prototype/LOGIC.md:18);UI 分支更倾向写在文件顶部注释里 |
搭原型时(LOGIC 分支且需要说明运行方式时) | 无——原型本身是「用完即删」的,README 随它一起消失 |
三者对比着记:research 落仓库但不归任何目录惯例管;handoff 刻意落仓库外;
prototype 的 README 跟着一次性代码生死。诊断 bug 时
diagnosing-bugs 也会产生大量东西,但全是脚本、日志和回归测试代码,
不是 md——它把复盘假设写进的是提交信息或 PR 描述(diagnosing-bugs/SKILL.md:132)。
详解课:0006 handoff、0007 research、 0008 prototype、0015 diagnosing-bugs
这层你最熟悉——本课程自己就是产物。teach 把当前目录当作有状态的
教学工作区,维护五份 md(0021 课有完整讲解,这里只列生命周期):
| 文件 | 创建时机 | 修改时机 |
|---|---|---|
MISSION.md |
首次会话,问清「你为什么想学这个」之后 | 学习目标发生转移时——先征得你同意,同时配一条学习记录 |
RESOURCES.md |
课程早期,还没积累起可信资源清单时优先建 | 持续:补新资源、记 ## Gaps(覆盖缺口)、删掉坏来源 |
NOTES.md |
你第一次表达教学偏好时 | 持续:每有新偏好或工作笔记就记 |
GLOSSARY.md |
主题发展出自己的术语体系时;一个术语你真正懂了才收录 | 就地更新,理解加深就修订;建好后每节课都必须遵守它 |
learning-records/NNNN-*.md |
懒创建目录,出现四类事件之一时写一条:你展示出了真实理解、你透露了已有知识、一个误解被纠正、目标发生转移 | 原则不可变;被后来的记录推翻时标注 Status: superseded by 而不是删除 |
注意一个和工程 skill 同构的设计:懒创建 + 序号文件 + 推翻不删除—— learning-records 之于 teach,就是 ADR 之于 domain-modeling。这不是巧合, SKILL.md 自己就说学习记录「大致相当于软件开发里的架构决策记录」。
详解课:0021 teach · 格式源:LEARNING-RECORD-FORMAT.md
知道谁不写和知道谁写一样重要——当你在仓库里找不到某个文件时, 这张「沉默名单」能帮你排除一半嫌疑。以下 skill 在消费仓库里一个 md 都不写:
| Skill | 为什么不写 / 它的产物在哪 |
|---|---|
| grill-me | 全部实现是一行「跑一场 grilling」,纯对话,无文件 |
| grilling | 纯访谈循环,产物是「对齐了的理解」,留在对话里 |
| ask-matt | 纯路由器,只描述别的 skill 的产物,自己零写入 |
| implement | 只写源代码和测试代码;工单文件它只读。本地模式下它连工单的 Status 都不更新——这个状态转换属于 wayfinder 的认领/解决流程 |
| tdd | 只写测试与被测代码;读 CONTEXT.md 对齐测试命名 |
| diagnosing-bugs | 产物是复现脚本、调试日志、回归测试代码;复盘写进提交信息 |
| code-review | 双轴评审报告只在对话里呈现,不落盘 |
| resolving-merge-conflicts | 只改冲突中的文件(其中可能碰巧有 md,但那是合并带的,不是 skill 的指令) |
| codebase-design | 纯词汇与流程纪律;design-it-twice 的设计稿只在对话里 |
| writing-great-skills | 纯参考资料,SKILL.md 自己声明「This skill is all reference.」 |
反过来,会写 md 的 skill 一共十二个:setup-matt-pocock-skills、domain-modeling、 grill-with-docs(借道 domain-modeling)、triage、improve-codebase-architecture、 wayfinder、to-spec、to-tickets、research、handoff、prototype、teach。 12 写 + 10 不写 = 22,与已发布集合对平。
全课浓缩成一张表。打印出来贴在手边的就是它(速查表版见 reference/local-md-files-map.html):
| 文件 | 创建者 × 创建时机 | 修改者 × 修改时机 | 主要读者 |
|---|---|---|---|
CLAUDE.md/AGENTS.md 的 ## Agent skills 区块 |
setup 第四步,编辑已存在的那个文件(都没有才问建哪个);已有区块则原地更新 | 重跑 setup(换工单系统时);用户随时手改 | 每次会话的 agent 入口 |
docs/agents/issue-tracker.md |
setup 第四步,必写,按所选举证复制种子模板 | 用户手改(如打开 PR 旗标);重跑 setup | triage、wayfinder、to-spec、to-tickets、code-review |
docs/agents/domain.md |
setup 第四步,必写,记录单/多上下文布局 | 重跑 setup | domain-modeling 及所有读领域文档的 skill |
docs/agents/triage-labels.md |
setup 第四步,仅当安装了 triage | 用户手改标签映射 | triage |
CONTEXT.md(根或 src/<ctx>/) |
domain-modeling 懒创建:第一个术语被解决时 | domain-modeling 内联更新:每个术语落地即改(入口含 grill-with-docs、triage 第四步、improve-codebase-architecture、wayfinder);用户手改安全 | tdd、diagnosing-bugs、to-spec、to-tickets、triage 等几乎全员 |
CONTEXT-MAP.md |
无明确创建者(文档空白);多上下文布局下推断由用户或 domain-modeling 补建 | 新增上下文时更新指针 | domain-modeling |
docs/adr/NNNN-*.md |
domain-modeling 懒创建:决策同时满足难逆转+出人意料+有取舍时;improve-codebase-architecture 在你拒绝候选且理由有分量时提议创建 | 不修改旧文件;被推翻时新写 ADR 并在 Status 里标注取代 | 全员(做决策前查历史) |
.scratch/<feature>/spec.md(仅本地 tracker) |
to-spec 第三步「发布到工单系统」时,含 Status: ready-for-agent 行 |
无——写一次即冻结 | to-tickets、implement、code-review |
.scratch/<feature>/issues/NN-*.md(仅本地 tracker) |
to-tickets 第五步,一单一文件,从 01 按依赖顺序编号 | triage 改 Status: 行、往 ## Comments 追加简报;prototype 追加原型分支的上下文指针 |
implement、code-review、resolving-merge-conflicts |
.scratch/<effort>/map.md(仅本地 tracker) |
wayfinder「画地图」第三步 | wayfinder:每张工单解决后往「已做决定」追加指针;雾散、越界、决定被推翻时同步改 | wayfinder 后续会话 |
.scratch/<effort>/issues/NN-*.md(仅本地 tracker) |
wayfinder 画地图时一批 + 探路中新问题浮现时逐张新增 | wayfinder:认领改 Status: claimed,解决写 ## Answer 并改 resolved |
wayfinder 后续会话 |
.out-of-scope/<concept>.md |
triage:增强提案被判 wontfix 时(已实现而关闭的不写) | triage:同概念再被提出时追加历史请求行;维护者翻案时整文件删除 | triage 未来的自己 |
| research 调研结论 md(路径随仓库惯例) | research 的后台 agent,调研结束时 | 无 | 委托调研的人 |
| handoff 交接文档(OS 临时目录) | handoff,每次手动调用时 | 无——下一个会话的消耗品 | 下一个会话的 agent |
prototype 的 README.md(可选,挨原型代码) |
prototype 的 LOGIC 分支需要说明运行方式时 | 无——随原型一起删除 | 用户 |
MISSION.md / RESOURCES.md / NOTES.md / GLOSSARY.md / learning-records/NNNN-*.md |
teach:首次会话 / 早期 / 首个偏好 / 首个术语 / 四类学习事件(均懒创建) | teach:目标转移(需你同意)/ 持续 / 持续 / 就地修订 / 推翻时标 superseded 不删除 | teach 自己(算最近发展区) |
CONTEXT-MAP.md 没有 owner
第 4.2 节说过:setup 只记录布局,domain-modeling 只读地图,没人负责建地图。
选了多上下文布局后记得手动补建这个文件,格式照 CONTEXT-FORMAT.md。
这也是「行为不对时该拧哪段文本」的实例——若想让 setup 顺手建它,
改的是 setup-matt-pocock-skills/SKILL.md 第四步的写入清单。
Status: 没人写「done」
本地模式下,工单从 to-tickets 创建起就是 Status: ready-for-agent,
而 implement 实现完不会更新这行状态——
认领(claimed)和解决(resolved)的语义是 wayfinder 那套决策工单流程的,
普通实现工单在流程文本里没有对应的状态推进。如果你在意本地工单的状态闭环,
要么手改,要么在 implement/SKILL.md 里补一段「收尾时更新 Status」的指令。
docs/agents/*.md 是手改区,不是状态区
想调行为——换 tracker、改标签映射、打开 PR 旗标——直接编辑 docs/agents/
下对应文件即可,不要重跑 setup。setup 自己明说重跑只用于换工单系统或推倒重来。
反过来,CONTEXT.md 和 ADR 是 skill 的内联更新区,你手改它们也安全,
但要预期 skill 会持续往里面写——它们更像「人机共写的活文档」。
大表查起来容易,难的是现场判断。下面五个「案情」都是真实使用中会遇到的场景—— 你在仓库里发现某个文件(或发现某个文件不在),能立刻说出它是谁写的、 什么时候写的吗?点一个选项,马上见分晓;答错可以重试,答对会展开解析。 先凭第 10 节大表的记忆作答,别往上翻。
案情 1
你在 .scratch/search-rework/issues/02-index-strategy.md 顶部看到一行
Status: claimed。这行状态是谁、在什么时候写上去的?
claimed 是 wayfinder 探路流程的专属语义:开始处理某张决策工单时,
先把它的 Status: 改成 claimed,解决后再写 ## Answer
并改 resolved(issue-tracker-local.md:23-30)。
to-tickets 创建的初始状态是 ready-for-agent;triage 改的是五个 triage role
(needs-triage 等),没有 claimed 这个角色。
顺带:这个 Status 行出现在 wayfinder 的 .scratch/<effort>/issues/ 下,
正好说明这是一张决策工单而不是实现工单。
案情 2
同事说他刚在新仓库跑完 /setup-matt-pocock-skills,但根目录下怎么也找不到
CONTEXT.md,怀疑 setup 坏了。真相是?
docs/agents/domain.md 里记录 CONTEXT.md 将来住哪,
从不创建文件本身。CONTEXT.md 的出生时刻是「第一个术语被解决时」——
由 domain-modeling(或借道它的 grill-with-docs、triage 等)懒创建
(domain-modeling/SKILL.md:40)。所以新仓库没有它完全正常,
重跑 setup 也不会变出来。
案情 3
仓库里出现一份 .out-of-scope/dark-mode.md,里面还有一列
「Prior requests」。这份文件是因什么而生的?
.out-of-scope/<concept>.md 只有一个出生条件:增强提案
被 triage 判 wontfix(bug 不算、「已实现所以关闭」也不算)。
同概念再被提出时 triage 往「Prior requests」追加一行;维护者翻案时整文件删除
(triage/OUT-OF-SCOPE.md:86-105)。wayfinder 的越界记在
map.md 的「Out of scope」一节;架构评审的拒绝记成 ADR——三处别混。
案情 4
你发现 docs/agents/issue-tracker.md 里的工单系统选错了,
想从 GitHub 换成本地文件模式。正确动作是?
SKILL.md:116)——
因为本地模式和 GitHub 模式的 issue-tracker.md 内容来自不同种子模板,
手改描述改不出本地模式需要的「Wayfinding operations」等整段约定。
而调小行为(比如打开 PR 旗标、改标签映射)才是直接手改文件的场景:
docs/agents/ 是手改区,但换底层 tracker 属于结构性变更。
案情 5 你在操作系统的临时目录里发现一份两周前的 handoff 文档, 内容早已过时。该怎么理解它的存在?
handoff/SKILL.md:8),写完后没有任何 skill 会再碰它——
没有更新机制,也没有人去读旧档。过期了删掉即可,和仓库状态无关。
teach 的状态文件(MISSION.md 等)在本仓库工作区里,不在临时目录。
先别往回翻表,凭记忆答。选项字数刻意对齐,不会从长度泄题。
本课的压缩版已经放进 reference/local-md-files-map.html—— 一张打印友好的一页表,以后在仓库里遇到陌生 md 文件时翻它。 建议配对的复习路径:先回 0001 系统地图 把四层结构再过一遍,然后随便挑一个你自己的仓库,对着大表找出里面已有哪些文件、缺哪些。
skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md——
全文不到一屏,却是 .scratch/ 下所有文件格式的唯一权威定义,
to-spec、to-tickets、triage、wayfinder 四个 skill 的本地写入行为都从它派生。
其次是 setup 的 SKILL.md
第四步(第 72-116 行),配置层文件的写入规则全在那里。