Lesson 0002 · 深课 · 配置层

setup-matt-pocock-skills

你刚 clone 了一个仓库,想让 AI 用这套工程流程帮你干活。正式开工前,要先在这个仓库里跑一次 /setup-matt-pocock-skills: 它会一边翻你的仓库、一边问你几组问题,把「issue(工作票)放在哪个系统、分拣标签叫什么、领域文档怎么摆」这三件事定下来, 写成 docs/agents/ 下的几个配置文件,并在 CLAUDE.mdAGENTS.md 里加一段指路说明。 这节课把它的 SKILL.md 和自带的模板文件逐段拆开:它会看什么、问什么、写什么、写出来的东西被谁读。 学完你应当能预判它会写出的每个文件,并且分得清什么时候直接手改文件、什么时候才值得重跑它。

1. 它在整个系统里站在哪、谁能启动它

在 Lesson 0001 的三层地图里, setup-matt-pocock-skills 独占配置层——0001 打的比方是「开店前的装修」: 它在你的每个目标仓库里跑一次,把约定写成文件。 它自己不写业务代码、不发工单、不做分拣状态机; 它只产出其它工程 skill 假定已经存在的那些配置。

从哪个角度看 它是怎样的 依据在哪
谁能启动它(这套词汇里叫「调用轴」) User(只能人启动):文件开头的元数据区(frontmatter)里有 disable-model-invocation: true;Codex 一侧还有 policy.allow_implicit_invocation: false。两个开关的意思一样:AI 不许自己启动它 SKILL.md frontmatter · openai.yaml
怎么启动 你在目标仓库里输入 /setup-matt-pocock-skills;AI 不会自己触发它,别的 skill 也不能在正文里写一句话来调它(0001 讲过的 prose 调用对「只能人启动」的 skill 不适用) docs 页invocation.md
它是什么形态 一段靠对话推进的流程说明(prompt-driven:AI 照着提示词一边探索一边和你确认),不是每次吐出完全一样结果的脚手架脚本 SKILL.md:「Explore, present… confirm… then write」(探索 → 汇报 → 确认 → 才写)
它配置哪三件事 issue tracker(工单放哪个系统)· triage labels(分拣标签叫什么)· domain docs(领域文档怎么摆、怎么用) SKILL.md 开篇三条
在 ask-matt 地图里的位置 工程流程开始之前跑一次的准备工作;就算你的工单系统不在内置名单里(自定义 tracker),也通过它来写配置 ask-matt/SKILL.md
一句话记住它 它写的是行为配置:不教下游 skill 怎么调 API,只把约定写下来。 下游 skill 开工前先读 docs/agents/*(以及 ## Agent skills 里的指路说明),再决定是调 gh、调 glab、往 .scratch/ 写文件,还是按你描述的「Other」流程操作。 这样工单系统的细节只写在一个地方,而不是硬编码进每个 skill。

这个仓库里还有一份写给人看的说明(agent 干活时以 SKILL.md 为准,这份只是同一内容的通俗版,别拿它当行为依据): docs/engineering/setup-matt-pocock-skills.md · 发布后的 URL 长这样:https://aihero.dev/skills-setup-matt-pocock-skills

2. 什么时候必须跑、什么时候别跑

它的 description 原文只有一句: Run once before first use of the other engineering skills.(在第一次使用其它工程 skill 之前跑一次。) 写给人看的文档说得更明确:每个目标仓库一次,在第一次用任何其它工程 skill 之前。

2.1 为什么说它是必须先跑的前提,而不是「可选项」

好几个只能人启动的工程 skill,在正文第一屏就写明「我依赖 setup 产出的配置」;缺了配置,它们会反过来要求你先跑 setup:

下游 skill 它对 setup 的依赖是怎么写的 缺配置时会发生什么
to-spec 「issue tracker and triage label vocabulary should have been provided — run /setup-matt-pocock-skills if not」(工单系统和标签词汇「应该已经配好了」,没配就去跑 setup) 不知道把需求文档(PRD)发到 GitHub / GitLab / .scratch 的哪一处;也不知道 ready-for-agent 这个角色名对应你 tracker 上的哪个字符串
to-tickets 同上;发布票的时候「How depends on the tracker setup configured」(具体怎么发,取决于 setup 配了什么工单系统) 依赖关系用错形式——该用平台原生依赖的地方写成本地文件号,或反过来;票写到错误的位置
triage 角色名是内部统一的标准名;真实标签字符串「mapping should have been provided — run setup if not」(映射关系应该已经配好);外部 PR 要不要进分拣队列,读的是 issue-tracker 配置 可能新建一套重复标签,或者漏掉本该分拣的外部 PR
wayfinder map(决策地图)、子票、blocking(谁挡谁)、frontier(没被任何依赖挡住、现在就能开工的票)全都「随工单系统而变」;具体操作读 tracker 文档里的 Wayfinding operations 一节;没配置就默认当本地 markdown 处理 在 GitHub 仓库里却默认往本地 .scratch 写地图(或者反过来)
code-review docs/agents/issue-tracker.md 就要求你先跑 setup;commit 里提到的 issue,按该文档的流程去取 审查「需求符合度」这条轴时,对不上真实工单的内容

写给人看的文档里有一段「It's working if」(怎么算配置成功),可以直接当验收标准用: docs/agents/ 下出现 issue-tracker.mddomain.md(装了 triage 的话还有 triage-labels.md), 且 CLAUDE.mdAGENTS.md 里出现 ## Agent skills 这一段; 之后 triage / to-tickets 能直接作用在正确的位置、打正确的标签,而不是靠猜或反复问你。

2.2 什么时候不要重跑它

别把「安装 skill」和「跑 setup」搞混npx skills add … --skill=setup-matt-pocock-skills 只是把这个 skill 装进你的 AI 运行环境(harness,比如 Claude Code 或 Codex); 它不会顺手配置你的业务仓库。真正的配置动作,是你在目标仓库里再手动跑一次 /setup-matt-pocock-skills

3. 五步流程总览(探索 → 完成)

SKILL.md 的流程是固定骨架,五步必须按顺序推进。提问节奏是「一组一问」——一次只问一组问题,你答完才进下一组,不会一口气甩给你一张大表单。

1. Explore 读仓库现状,不假设文件存在 2. Present/ask 汇报发现 → 提问 A → (B?) → (C?) 每组先给 recommended answer;一词即可接受 3. Confirm 亮出 ## Agent skills 段和 docs/agents/* 草稿,你可以改 4. Write 按规则写 CLAUDE.md/AGENTS.md + 写入 docs/agents/* 5. Done 宣布完成、点名谁会读、说清以后手改还是重跑

整个流程贯穿三条原则: 推荐答案写在最前面(你回一个词,比如 yes,就算接受); 探索阶段已经有答案的问题整组跳过(没装 triage 就不问 B;仓库不是 monorepo,C 就直接按默认布局写、不问你); 先确认再写(第 3 步的草稿你可以改,改完它才落笔)。

4. 第 1 步:探索阶段它翻哪些东西

SKILL.md 列了一张「看现状、不假设」的信号清单。下表把每个信号对应到它影响的后续决定:

探查对象 它要回答的问题 影响后面哪一步
git remote -v.git/config 是 GitHub 吗?是 GitLab 吗(含自建实例)?用的是哪个 remote? A 组的默认推荐:是 GitHub 就推荐 GitHub,是 GitLab 就推荐 GitLab,都不是才谈 local 或 other
根目录 AGENTS.mdCLAUDE.md 存在吗?里面已经有 ## Agent skills 这一段吗? 第 4 步选哪个文件来写;已有这一段就在原位置更新内容,不重复追加
根目录 CONTEXT.mdCONTEXT-MAP.md 领域文档已经存在吗?是不是已经分成了多个 context? C 组汇报现状时会提到;domain 模板不管哪种情况,都会写「怎么用」的规则
docs/adr/src/*/docs/adr/ ADR(架构决策记录)的摆法看起来像不像多 context? 佐证「这是不是 monorepo / 多 context」的判断
docs/agents/ 这个 skill 以前的输出还在吗(即以前跑过吗)? 算重跑还是首次;汇报时要明说「已经有配置了」
.scratch/ 是否已有「用本地 markdown 文件当 issue」的约定? A 组可能因此推荐 Local markdown
triage skill 是否安装 同目录有没有 triage 的 skill 文件夹,或者 harness 的可用技能列表里有没有 triage 决定 B 组问不问;也决定写不写 triage-labels.md 和 Agent skills 里的 Triage 小段
Monorepo 信号 pnpm-workspace.yamlpackage.json 里的 workspaces 字段、packages/* 下各包自带 src/ 只有「真的很大的多包仓」才会把 multi-context 作为选项端出来;默认一律 single-context(几乎所有仓库都是)
探索阶段的纪律 原文是「Read whatever exists; don't assume.」——有什么读什么,别假设。 所以汇报时要同时说清已经有什么缺什么。 举个例子:remote 指向 GitHub、没有 docs/agents/、有 CLAUDE.md 但没有 Agent skills 段、triage 已安装、没有 monorepo 信号——探到这一步,后面要问哪几组问题、每组推荐什么答案,基本已经定了。

5. 第 2 步:汇报 + A·B·C 三组提问,何时整组跳过

汇报完仓库现状,就按顺序一组一组地问:一次一组、你答完再进下一组。 每组都先把推荐答案摆在最前面;只有真正需要你做决定的分叉点,才附一行解释。

5.1 A 组 —— 工单系统(几乎总会问)

SKILL 原文的意思是这样的:「issue tracker」就是这个仓库的 issue(工作项)放在哪里。 to-ticketstriageto-specqa 这些 skill 都要读写它——所以得让它们知道: 是调 gh issue create,还是往 .scratch/ 写 markdown 文件,还是按你描述的其它流程。 选你实际用来跟踪工作的那个地方。

默认怎么推荐:这套 skill 是为 GitHub 设计的。remote 指向 GitHub,就推荐 GitHub;指向 GitLab(gitlab.com 或自建实例),就推荐 GitLab;其它情况(或你有自己的偏好),端出四个选项。所谓模板(skill 里叫 seed),就是 skill 自带的成品文件,setup 时照抄或按你的回答微调后写进你的仓库:

选项 issue 放在哪 用什么操作 抄进仓库的模板
GitHub 这个仓库的 GitHub Issues gh 命令行 issue-tracker-github.md,抄成 docs/agents/issue-tracker.md
GitLab 这个仓库的 GitLab Issues glab 命令行 issue-tracker-gitlab.md
Local markdown .scratch/<feature>/ 目录下的文件 直接读写 markdown 文件 issue-tracker-local.md
Other(Jira、Linear 等) 由你定义 你用一段自然语言描述的工作流 没有模板:setup 根据你的描述,从零写出 docs/agents/issue-tracker.md

选择会记录在 docs/agents/issue-tracker.md。 GitHub / GitLab 模板里有一个开关叫「PRs / MRs as a request surface」——意思是「把外部人提的 PR 也当作需要分拣的请求入口」,默认是关的(off);setup 过程中不会主动提这个开关。 你如果想让外部 PR 进分拣队列,事后自己在文件里把它改成 yes。

5.2 B 组 —— 分拣标签词汇(有条件才问)

整组跳过的硬规则 探索阶段判定 triage skill 没安装整组问题完全跳过。 没装的 skill 不需要标签词汇。同时:不写 docs/agents/triage-labels.md## Agent skills 里也省略 ### Triage labels 这一小段。

如果 triage 已安装,只问一个问题:

Do you want to keep the default triage labels?(要保留默认的分拣标签吗?推荐回答:yes

默认有五个角色,标签字符串就等于角色名本身: needs-triageneeds-infoready-for-agentready-for-humanwontfix。 答 yes → 照模板 triage-labels.md 原样写入。 答 no(常见原因:你的 tracker 上已经有 bug:triage 这类标签)→ setup 会收集一份一一对应的替换表(overrides),让 triage 去打你已有的标签,而不是新建一套重复标签。

这张映射表的意思是:左列是这套 skills 内部统一使用的标准角色名(canonical name,skill 之间约定好的叫法);右列是你的 tracker 上真实存在的标签字符串; skill 说到某个角色时,查右列。以后要改,只改右列就行,不用动 skill 源码。

5.3 C 组 —— 领域文档(几乎总是不问,直接按默认写)

注意:setup 写的是 docs/agents/domain.md 里的使用规则和布局说明, 它不会顺手创建 CONTEXT.md 本体。 domain 模板写得很明白:文件不存在就静默继续,不建议你「先建一个空的 CONTEXT」。 真正负责创建术语表和 ADR 的是 /domain-modeling(由 /grill-with-docs/improve-codebase-architecture 等在需要时才调用它来创建)。

6. 四种工单系统的模板有什么差别

三份内置模板结构差不多:先约定常规操作(创建 / 读取 / 列表 / 评论 / 打标签 / 关闭), 再约定「发布 / 拉取」各是什么意思,最后附一节给 /wayfinder 专用的 Wayfinding operations(寻路操作集)。 选 Other 则完全依赖你写的那段自然语言描述——wayfinder / to-tickets 能不能顺利干活,取决于你那段描述有没有覆盖同样的操作。

6.1 常规操作对照

操作 GitHub 模板 GitLab 模板 Local 模板
创建 issue / 发布 gh issue create(多行正文用 heredoc 传) glab issue create(用 --description 传正文;也可以加 -- 打开编辑器写) .scratch/<feature-slug>/ 下新建一个文件(目录不存在就顺手建)
读取一张票 gh issue view <n> --comments glab issue view <n> --comments 读用户给的路径或编号对应的那个文件
列表 / 过滤 gh issue list 加 json/jq,按标签和状态过滤 glab issue list -F json 加标签过滤 .scratch/ 的目录结构
评论 gh issue comment glab issue note(GitLab 把评论叫 note) 在文件末尾的 ## Comments 小节追加
打标签 gh issue edit --add-label / --remove-label glab issue update --label / --unlabel 改文件顶部的 Status: 行(角色字符串见 triage-labels 配置)
关闭 gh issue close(可以顺带带一条评论) issue noteissue close(close 命令本身不带评论参数) 按约定改 Status 或归档(具体由使用它的 skill 解读)
PR/MR 作为请求入口 开关默认 no;设成 yes 后用 gh pr 系列命令,只把外部作者的 PR 算进来(作者身份是 CONTRIBUTOR / FIRST_TIME / NONE 的) 默认 no;设成 yes 时用 glab mr,过滤掉 member/owner 之外的 本地 markdown 没有 PR 这个概念
# 编号的歧义 issue 和 PR 共用一套数字编号,光看 #123 分不清;要先 gh pr view 试一下,不是 PR 再当 issue 处理 issue 和 MR 的编号是分开的;知道自己在看哪一边就能消歧 直接用路径或文件号,没有歧义

6.2 Local markdown 的目录约定(to-tickets / triage 都靠它)

6.3 Wayfinding operations(wayfinder 专门读这一节)

三份模板都定义了六件事:map(决策地图)、child ticket(子票)、blocking(谁挡谁)、frontier(没被挡住、现在就能开工的票)、claim(认领)、resolve(解决)。 这就是 wayfinder 敢说自己「不挑工单系统」(tracker-agnostic)的真正底气:它的正文只讲概念,具体物理操作以 setup 写进你仓库的这一节为准。

GitHub GitLab Local
Map(地图) 单独一条 issue,打标签 wayfinder:map 同左(有 epic 功能的档位可以用 epic 来装地图;普通带标签的 issue 哪里都能用) .scratch/<effort>/map.md
Child(子票) 优先用 GitHub 的 sub-issue 功能;没有的话,在地图正文里放任务列表、子 issue 正文写 Part of #<map>;再打标签 wayfinder:<type> 描述顶部写 Part of #<map>,加类型标签 issues/NN-slug.md;文件里用 Type:Status:
Blocking(谁挡谁) 优先用原生的 dependencies API(注意要用 database id,不是 # 编号);不行就在正文写 Blocked by: 用 quick action /blocked_by #n(需要 Premium 及以上);不行就在正文写一行 Blocked by: NN, NN;被依赖的文件全部 resolved 之后,这张票才算解锁
Claim(认领) gh issue edit --add-assignee @me(会话里第一次写操作时认领) glab issue update --assignee @me Status: 改成 claimed 并保存,然后再开始干活
Resolve(解决) 评论写下答案 → 关闭 → 在地图的 Decisions-so-far 小节追加一条指向结论的引用 note → 关闭 → 同样追加 ## Answer 并把 Status: 改成 resolved → 更新 map.md
同样一张票,在不同 tracker 上长什么样 Local:一票一文件,依赖关系靠正文里的 Blocked by 编号。
「真 tracker」(GitHub 等):一条 issue 一张票;优先用平台原生的 blocking / sub-issue 功能;然后打上 ready-for-agent(映射后的真实字符串)。 票的内容模板是一样的,变的只是依赖关系的物理形式——这正是 setup 存在的理由。

7. 第 3、4 步:先给你看草稿,再精确写文件

7.1 给你看的草稿清单

写入任何文件之前,setup 必须把下面这些东西完整亮出来,而且你可以改:

  1. 将写进 CLAUDE.mdAGENTS.md## Agent skills 整段全文
  2. docs/agents/issue-tracker.md 全文
  3. docs/agents/domain.md 全文
  4. docs/agents/triage-labels.md 全文——仅当 triage 已安装且 B 组问过

7.2 实际写出哪些文件

路径 什么时候写 内容从哪来 它管什么
docs/agents/issue-tracker.md 每次都写 github / gitlab / local 三份模板之一;选 Other 时则是你口述的那段描述 发布、拉取、打标签、wayfinding 这些操作以它为准
docs/agents/domain.md 每次都写 domain.md 模板(按 single / multi 布局) 规定探索前先读什么、术语表怎么用、输出和 ADR 冲突时怎么办
docs/agents/triage-labels.md 仅当 triage 已安装且 B 组问过 triage-labels 模板,加上你给的替换 五个角色名 → 你 tracker 上的真实标签字符串
CLAUDE.mdAGENTS.md 里的 ## Agent skills 每次都写(具体写哪个文件,按下面的选择规则) 第 4 步的模板;Triage 小段按条件决定加不加 给 agent 看的简短指路,指回 docs/agents

7.3 domain.md 模板里实际写了什么(就是「怎么用」的规则)

AI 在探索代码库之前应该先读:

缺这些文件就静默继续——不报警,也不逼你先建空文件。

给领域概念起名字时:用术语表里的词,不要漂移到「术语表明确说不要用」的同义词。想用的概念不在表里,只有两种可能:要么你在发明这个项目根本不用的叫法,要么它该交给 /domain-modeling 补进术语表。

输出和已有 ADR 冲突时:必须明确说出来,禁止悄悄覆盖。

布局 结构(模板示意)
Single(默认) /CONTEXT.md + docs/adr/ + src/
Multi(CONTEXT-MAP 在根目录) 根目录 CONTEXT-MAP.md + 系统级的 docs/adr/;各 src/<ctx>/CONTEXT.mdsrc/<ctx>/docs/adr/

8. ## Agent skills 这段写进哪个文件、怎么写

8.1 选哪个根文件——三条规则

  1. 已经有 CLAUDE.md只编辑它
  2. 没有 CLAUDE.md、但有 AGENTS.md → 编辑它
  3. 两个都没有 → 问你要创建哪一个;不替你选
禁止两边都写 已有 CLAUDE.md 时绝不顺手新建 AGENTS.md(反过来也一样)。 已有 ## Agent skills 段 → 在原来的位置更新内容,不追加第二份;也不要动这一段之外你自己写的内容。

8.2 这一段的模板(来自 SKILL.md)

## Agent skills

### Issue tracker

[one-line summary of where issues are tracked]. See `docs/agents/issue-tracker.md`.

### Triage labels

[one-line summary of the label vocabulary]. See `docs/agents/triage-labels.md`.

### Domain docs

[one-line summary of layout — "single-context" or "multi-context"]. See `docs/agents/domain.md`.

### Triage labels 小段和 triage-labels.md 同一个条件:只有 triage 已安装且 B 组问过才出现。 每行 one-line summary 要写你确认后的真实选择(比如「GitHub Issues via gh」),不要留个空壳占位。

历史上,其它 skill 是通过这一段来找到 tracker 文档位置的——先看指路说明再去找文件,而不是把路径写死在 skill 里。 wayfinder 等 skill 就曾从「写死 docs/agents/issue-tracker.md」改成跟着同一个指路走,免得文档挪了位置之后悄悄退回本地 tracker 的行为。 作者级排错经验:如果 AI 找错了工单系统,先看 ## Agent skills 指的对不对,再看被指的那个文件的内容。

9. 第 5 步:收尾,以及写出的文件被谁读

收尾时 AI 应该:宣布 setup 完成;点名哪些工程 skill 会读这些文件; 提醒以后可以直接手改 docs/agents/*.md;只有换工单系统或推倒重来才需要重跑这个 skill。

9.1 谁读哪个文件(一张表)


to-spec / to-tickets
配置文件 谁读它 读它做什么(依据各 skill 的 SKILL.md)
issue-tracker.md to-spec 把综合好的 PRD / spec 发布到配置好的工单系统,并打上 ready-for-agent 标签
to-tickets 按工单系统的形式发布多张票和 blocking 关系——本地就是文件路径,远程就是 issue
triage 查询、改标签、评论、关闭;还有可选的「外部 PR 入口」和 # 编号消歧规则
wayfinder 专读 Wayfinding operations 那一节:地图、子票、blocking、frontier、认领、解决
code-review 从 commit 里的 issue 引用出发,按文档里的流程把相关工单拉下来,服务「需求符合度」这条审查轴
triage-labels.md triage 标准角色名 → 真实标签字符串;发票时打上映射后的 ready-for-agent 等标签
domain.md 一批 skill 的「先读术语表 / ADR」习惯 to-spec / to-tickets / tdd / diagnosing-bugs / improve-codebase-architecture / triage 探索时都尊重词汇和 ADR; 要主动改模型则走 domain-modeling(它按需才创建 CONTEXT/ADR,和 domain.md 的「缺失就静默」正好一致)

另:implement 流程收尾会调 code-review,所以也间接依赖 tracker 文档; grill-with-docs 通过 domain-modeling 写 CONTEXT/ADR,布局要和 domain.md 声明的 single / multi 一致。

排错口诀(回到 0001 的配置层思路) 「issue 发到了错的地方」→ 先查 docs/agents/issue-tracker.md## Agent skills 的指路, 不是先去改 to-tickets 的全文。
「标签名和 tracker 对不上」→ 改 triage-labels.md 的右列。
「AI 自己发明同义词」→ 查 CONTEXT 和 domain.md 的词汇规则,必要时跑 /domain-modeling

10. 之后想改配置:手改文件还是重跑

你想改什么 正确动作 不要做的
标签字符串(你的 tracker 已有自己的一套) 编辑 docs/agents/triage-labels.md 的右列 为改一个标签重跑整个 setup
打开「外部 PR/MR 也进分拣队列」 在 issue-tracker 文档里把 PRs/MRs as request surface 设成 yes 指望 setup 对话主动问这个(默认不提)
补全 Other tracker 的 CLI 细节 丰富 issue-tracker.md 里的描述(创建 / 列表 / 评论 / blocking / wayfinding 都写清) 只写一句「我们用 Jira」,却指望 wayfinder 自己猜出 API
把布局说明从 single 改成 multi-context domain.md 的结构段,并且真的建好 CONTEXT-MAP、把 CONTEXT 拆成多份 只改 domain.md 却从不创建 CONTEXT-MAP(规则和现实脱节)
在 GitHub ↔ GitLab ↔ Local ↔ Other 之间换 重跑 setup(或者等价地:整体替换 issue-tracker.md,并同步更新 Agent skills 摘要) 只改 Agent skills 那一行摘要,底下却留着旧的操作文档
推倒重来 重跑 skill,在 Confirm 阶段好好审草稿 手搓第二份 ## Agent skills,造成重复段落
Agent skills 摘要过时了 和 docs/agents 的内容一起更新那几行 one-liner 摘要写着 GitHub、文件里却是 local(指路说谎)

SKILL.md 的收尾段是权威分界,原文: edit docs/agents/*.md directly later — re-running this skill is only necessary if they want to switch issue trackers or restart from scratch. 翻译过来:以后直接改 docs/agents/*.md 就行;只有换工单系统、或者想推倒重来,才需要重跑这个 skill。

11. 合理的灵活用法与常见错误

11.1 这些「偏离」是合法的

11.2 常见错误

错误 为什么糟 正确姿势
没跑 setup 就直接 to-spec / to-tickets 下游 skill 自己也会要求你先 setup;否则行为全靠猜 先跑 /setup-matt-pocock-skills
以为 setup 会顺手创建 CONTEXT.md domain.md 明确是按需才创建;缺文件就静默 需要术语表时用 grill-with-docs / domain-modeling
不是 monorepo 却硬上 multi-context 违反「几乎总是 single」的默认;AI 会去找不存在的 CONTEXT 只有探索发现信号时才讨论 multi
没装 triage 却写了 triage-labels 违反 B 的跳过规则和条件写入规则 未安装就两处都省(不写文件、不写小段)
同时维护 CLAUDE.md 和 AGENTS.md 两套 Agent skills 违反「只编辑已存在的那个」 只认一个文件为准
跳过 Confirm 直接写 你失去改草稿的机会;容易写错 tracker 坚持走第 3 步
默认打开「PR 作为请求入口」 SKILL 要求默认关,且 setup 不主动提 需要时事后手改文件
Local 下把所有票写进一个文件 local 模板和 to-tickets 都禁止合并文件 issues/NN-slug.md,一票一文件
以为把 setup skill 装进 harness 就算配置好了目标仓库 安装 ≠ 在仓库里写出配置 在目标仓库里跑一次它

12. 检索练习

先尽量不回看上文。每题选项长度对齐。核对后回到对应章节补洞。

自测(立即反馈)

1. 本 skill 的调用轴与启动方式,正确的是?
2. Explore 发现 triage 未安装时,Section B 应如何处理?
3. 无 monorepo 信号时,Section C 的正确默认行为是?
4. 根目录已有 CLAUDE.md、没有 AGENTS.md 时,Write 阶段应?
5. GitHub/GitLab 模板里「PRs/MRs as request surface」在 setup 中的默认策略是?
6. wayfinder 在本仓库如何获知 map/子票/blocking 的物理操作?
7. 日后只想把 needs-triage 映射成 tracker 已有的 bug:triage,作者级做法是?
8. 选择 Local markdown tracker 后,to-tickets 发布实现票的默认落点是?
额外提取(无选项) 合上本页,凭记忆写出:(1) 五个步骤的名字;(2) 哪些文件每次都写、哪些有条件才写; (3) 选 CLAUDE.md 还是 AGENTS.md 的三条规则;(4) 「手改还是重跑」的分界那句话。 写完对照第 3、7、8、10 节。

13. 一手材料与下一课

本课主一手材料(请打开原文读,不要只背本页):

建议下一课(0003): grilling 一族——grilling 这套基本功(面试纪律的全文所在),加上 grill-me / grill-with-docs 两个写得很薄的入口(正文只有几行,实际纪律都在被调用的文件里)。 配置层就绪后,主流程通常从「把模糊想法问清楚」开始;深课会拆「一次只问一个问题」的纪律,以及它和 domain-modeling 的分工边界。

老师就在会话里。 对本课任何一行有疑问——比如选 Other 时那段描述最少要覆盖哪些操作、 或者「装了 triage 但暂时不想写 labels 文件」算不算违规——直接在对话里问。 回答会回到对应 SKILL.md / 模板文件的原文,而不是临场编造。 做完检索练习后,回复练习结果 / 卡住的地方 / 「开 0003」,我们进下一课。