个人工作站 › 调查报告 ← 返回报告清单
Skills Update Brief

mattpocock/skills v1.3.1 更新说明

这一版真正的主角是三条“收尾”技能:pr、implement-spec、retro。它们和一批破坏性改名一起,把整个技能集从“一堆能用的工具”变成了有一条明确主线的流水线。

版本 1.3.1(1.3.0 为主更新) 上游 mattpocock/skills 本机安装 2026-10-14 锁文件 55 技能 / 6 来源 其中 mattpocock 38 个
22 → 38本机 mattpocock 技能数
(8/4 备份 → 现在)
3本次重点新技能
pr · implement-spec · retro
3破坏性变更
删除 · 重命名 · 术语
18已合入但未发布的
patch changeset

01这次更新改了什么

主线被定型了。以前是一批各自独立的技能,现在 ask-matt(路由器)把 90% 的工作都指向同一条路径:

grill-with-docs→ to-spec→ to-tickets→ implement / implement-spec→ code-review→ pr→ retro

本次更新的三个重点技能,正好是这条链上最后、也是最缺的三段:怎么把工作合并进去(implement-spec)、怎么把 PR 讲清楚(pr)、怎么让下次更顺(retro)。

一句话概括每个重点

为什么这三个一起毕业 它们解决的是同一个焦虑:agent 干得越来越快,但“收尾”还全靠人。合并、写 PR 说明、把这次踩的坑变成下次的护栏——恰恰是 vibe coding 最缺、而工程化最需要的部分。

02三条破坏性变更

升级前必须先知道的三件事,都会静默影响本机行为:

变更类型你需要做什么
resolving-merge-conflicts 被移除,无替代品 删除 直接删本地目录。npx skills update 对“上游已删除”的技能是静默跳过的,会一直残留
CONTEXT.md / CONTEXT-MAP.md → GLOSSARY.md / GLOSSARY-MAP.md 术语 用 git mv 改名的就文件。11 个技能现在只读 GLOSSARY.md,旧名字对它们不存在
跨技能调用从 "/skill" 散文改为显式 Call the Skill tool with "X" 约定 不用你做,但要知道:很多技能内容因此重写了。也是 grill-me 现在只剩一行“去调用 grilling”的原因
0.1 版本就埋下的坑,这次一并修了 上游自己承认:那个“显式调用”的新约定跟“user-invoked 技能不能被别的技能调用”这条不变式冲突,导致 6 个技能里写了永远不会生效的调用指令(diagnosing-bugs 的 post-mortem 交接就这样悄悄死掉了)。这次删掉散文交接、把硬依赖改成“叫人类去跑”。

03重点 ① pr

/pr

PR 描述该长什么样

model-invoked · agent 会自动用 1.3.0 毕业 只管 body,不开 PR

它是格式参考,不是工作流。不推分支、不开 PR、不决定改什么——只规定 agent 在写 PR body 时该用什么形状。

核心判断:默认的 PR body 是用散文描述 diff,这个技能要求用“能说清重点的最小可视化视图”。审阅者手上已经有 diff 了,body 的作用是让他读 diff 之前先看到 diff 的形状。

模板:三段,顺序固定

## Summary

<diagram, diff-sketch, or tree>

## Evidence

- **Before:** <screenshot/output/failing test run>
  **After:** <screenshot/output/passing test run>

## Merge Danger

**Door:** <one-way or two-way>

**Blast Radius:** <one-word description>

Summary — 六种视图,只挑一个或几个

伪代码(逻辑/算法)、调用树(运行控制流)、组件树(UI 结构 + 状态/模块边界)、浅文件树(职责划分/大重构)、Mermaid(交互/数据流)、shaped diff(形状已存在、重点是“改了什么”)。

技能明确写了:可以用一个,可以用几个,很少会用到全部。挑最小的那个。每个视图放在它所支撑的那句短文字旁边。

Evidence — 必须是“前后”,不是“结论”

  • 截图(S 级)——仅当改动是视觉的、且环境能截图时。
  • 执行证据(A 级)——测试结果、console 输出;写清“哪个测试之前失败、现在通过”。
  • “测试全绿”本身不是证据,那是一个主张。无 UI 的改动(迁移、后台任务、重构)就用失败→通过的测试或变化的 console 输出。

Merge Danger — 这是全篇的领头概念

把“这次合并安全吗?”从一个直觉变成一条可以被反驳的主张:

  • one-way door(单向门):走不回去——破坏性迁移、公开 API 移除、难以回滚的决策。
  • two-way door(双向门):回滚很便宜,风险低。
  • Blast radius:错了会波及什么——布局位移、API 消费方、移动端适配。

它同时告诉审阅者该在哪里花人类注意力:双向门 + 小爆炸半径就快读,单向门慢慢读。

来历 Summary 里那套“最小可视化”思路借自 Dex Horthy 的 show-me(humanlayer/skills)。上游在技能里带了 CREDITS.md 署名——顺带一提,本机也装了那个 show-me。

已知的坑(官方文档自己列的)

最该警惕的一条 别盲信 agent 自己的门的判定。写代码的那个 agent 在给自己打分,所以它说“双向门、爆炸半径小”的时候最该怀疑。回滚一个 commit 撤销不了已经发出的邮件;一次已标注的灰度发布,在第一次写入新格式之后就不再是双向门了。

缓解办法两条:① 确保 agent 手上有 ticket 或 spec,不只是 diff;② 把“本仓库永远视为单向门的改动”(schema 迁移、对外发布、删除类操作)写在 agent 会读到的地方。
  • 不会打开 PR——implement 结束于提交到当前分支;implement-spec 是唯一的例外。
  • 不处理回流的 review 评论,也不在 PR 改动后自动刷新 body(大改之后要让 agent 重写)。
  • 不读仓库自带的 .github/pull_request_template.md。默认两边互相打架,得在仓库的 agent 文档里定优先级(比如把三段嵌进仓库模板)。
  • 输出是 Markdown,不是 HTML。Mermaid 在 GitHub/GitLab 能渲染,在终端里是生的。
用对了的样子 只看 Summary 的图就能明白改了什么,不用打开 diff;body 没有前言,直接从 Summary 开始;Evidence 有前有后;每个 PR 都写了门和爆炸半径,而且你确实在单向门那里放慢了速度。

04重点 ② implement-spec

/implement-spec

一次跑完整个 spec

user-invoked · 只能你打 1.3.0 毕业 任务图 · 并行 · integration branch

它把 tickets 读成任务图而不是清单。blocking 边决定什么能开始,于是任何时刻都有一批“所有前置都已落地”的 tickets 构成frontier,frontier 上的全部同时开跑。节奏由图的形状决定,而不是它们在 tracker 上的排列顺序。

和 implement 的区别(这是这个技能存在的理由)

implementimplement-spec
谁在调度你:一个 ticket 一个会话,中间 clear,自己记着哪些解除了阻塞一个编排会话
并行度一次一个frontier 上有多少跑多少(后台子代理)
你什么时候读每个 ticket 落地就能读最后统一评审 integration branch
适用小改动、没有真正的图一个 spec 里 5+ 张 ticket

九步流程(SKILL.md 的实际步骤)

  1. 读 spec 和 tickets,理解任务图。
  2. (可选)用探索子代理把代码库/外部文档的调研做完,笔记存到仓库外一个所有后续子代理都能读到的目录。
  3. 建 integration branch。若 tracker 以 PR 收尾或你要求,则在第 5 步首次合并之后开 draft PR(没有领先 commit 的分支开不了 PR)。
  4. 用实现子代理逐张建 ticket,各自一个 worktree、各自一个分支。每个实现者:确认 worktree 基于 integration branch → 调用 tdd 建 ticket → 报告完成前把 integration tip 合并进自己分支。
  5. 实现者完成后,用合并子代理把它的工作合进 integration branch。
  6. 若 frontier 因此变化,立刻再起一批实现子代理——这是并发拉满的关键。
  7. 全部完成后,调 code-review 审 integration branch,所有问题交给一个实现子代理修。
  8. 有 draft PR 就标 ready;否则按 tracker 的方式收尾每张 ticket,并报告 integration branch。
  9. 清理所有实现者 worktree。
两个关键设计 ① 沟通用 context pointer:spec、ticket、探索笔记、之前的 commit——而不是把摘要粘来粘去。子代理的 prompt 保持小,编排者的窗口留给任务图。
② 落地必须是 fast-forward:每个实现者在报完成前先把 integration tip 合进自己分支,所以合并进主线不会变成冲突解决。

前置条件(缺一个就不是它该干的事)

  • issue tracker:由 setup-matt-pocock-skills 配置;没配就停下让你跑它,而不是猜着用 gh。
  • tickets 必须带 blocking 边(照 to-tickets 的写法)。没有边就是平图,所有 ticket 一起开跑。
  • harness 要支持后台子代理 + 每个一个 git worktree。不支持的话,它只是“更慢的 implement”。
离线可用 目标是 integration branch,不再是 PR。只有 tracker 以 PR 收尾、或你明确要 PR 时才开。配本地 markdown tracker 可以完全离线跑完,停在分支上,tickets 按 tracker 的方式关闭。

已知的坑(文档里用户报的真实问题)

坑 1 · review / fix 循环跑几小时 code-review 是拿代码对着整个 spec比的,所以只有在所有 ticket 都落地之后跑才有意义。中途跑的话,每张没建的 ticket 都会被读成失败 → agent 去建它 → 又触发一轮 review。有用户报过一张五 ticket 的特性,“review 和 fix 循环花了大约四小时”。如果看到第二轮全面 review 开始,直接叫它只做针对性检查然后停。
坑 2 · 并行不等于不冲突 worktree 不消除冲突,只是把冲突推迟到合并时。两件“代码库不同部位”的 ticket 仍然共享消息目录、配置注册表或某个类型。真实案例:web 和 mobile 两张 ticket 把同一个字符串分别命名成 blockedSince 和 blockedOn。规避:让两张 frontier ticket 之间有 blocking 边(串行),或者在探索笔记里把要新增的名字钉死。
坑 3 · GitHub 的 blocked-by 是过期数据 GitHub 的 blocked-by 计数只在 blocker 关闭时下降,而 tickets 通常是 PR 合并时才关闭——也就是整轮结束的时候。tracker 适合给出起始图,不适合作为中途的依据。让编排者自己按“哪些已经合进 integration branch”算 frontier。
坑 4 · worktree 里的测试会静默跳过还报绿 worktree 只有 git 跟踪的内容。依赖 gitignore 的 fixture、本地数据库或凭证的测试,在那里会静默 skip 然后报绿。这类 ticket 让编排者在主 checkout 里验证。
另外:它的输出是“草稿”,由那次 review 补完——不是能直接发的东西。tdd 现在每个实现者都会跑,但没有 implement 那种“和你交互确认 seam”的步骤,所以 seam 要写进 spec 或 tickets。

05重点 ③ retro

/retro

复盘会话,改的是环境不是代码

user-invoked · 只能你打 1.3.0 毕业 只提议,不动手

它读这次会话自己的记录,找到 agent struggle 的那些时刻,然后按严重程度排序给出一份候选修复清单——改的是 agent 的工作环境,不是代码。

agent 交付的那个 bug、它花了二十次工具调用才找到的文件、评审漏掉的那条规则——retro 都不直接修。它问的是:仓库里是什么让这些事发生?什么样的检查、指针或标准能让它下次不发生?

七类候选,类别决定修复落在哪

会话里发生了什么用什么修
找文件/事实花了很久导航指针(从一个它已经会读的文件指出去)
犯了一个工具本可以抓住的错自动检查:lint 规则、类型、测试、pre-commit hook、CI job
评审漏掉一个判断类错误CODING_STANDARDS.md 里给评审 agent 的规则
AGENTS.md / CLAUDE.md 太长把其中的 steering 搬到标准或检查里
某次工具调用性价比极低简化那个工具,或换掉它
steering 文件里全是“改了等于没改”的行删掉这些 no-ops
agent 拿不到它需要的信息放宽访问:把 dev server 日志 tee 到文件、给只读访问
领头判断 · standards 属于评审者,不属于实现者 实现 agent 的上下文压力最大(要探索、写代码、调失败);评审 agent 只拿到一个 diff,压力最小。所以一条新规则应该放在有余力执行它的地方——评审。
它永远不放进 AGENTS.md:那是每个会话都加载的,不管相不相关。

写任何规则之前先分类违规

  • 机械性违规(禁用 API、import 形状、文件位置规则)→ 一律做成确定性检查(仓库自己的 linter 里的自定义规则 / 新 pre-commit hook / 新 CI job,取最便宜的那个)。能写检查就不要写规则。
  • 判断类(跨文件一致性、“和周围风格一致”、任何护栏无法替代的东西)→ 才写进 CODING_STANDARDS.md。
  • 仓库完全没有护栏(没有 pre-commit hook,也没有跑 lint/typecheck/test 的 CI job)——这本身就是一条 finding,不是中性默认值。
它也会先读仓库自己的检查命令(package.json/构建工具的 lint/check、CI workflow),所以“一个已经存在但没接上或悄悄坏掉的检查”才是 finding,而不是重新发明一遍。技能还要求先加载 writing-for-agents 拿写作风格。

怎么用

  • 会话还“热”的时候跑最好(默认复盘当前会话),因为 struggle 还在上下文里。
  • 会话已经出了 smart zone?先 clear,然后把新的 /retro 指向 session logs 里的那一次。
  • 跑在“本来就难”的会话后面才有价值——顺利的会话没什么可教。
它的弱点(文档里写得相当诚实) ① 只会堆积,不会清理。 它能删 prose(no-ops、该搬走的 steering),但不审计上个月自己提议的 lint 规则/hook/CI——它只看一次会话,没法告诉你某条规则现在太吵或它背后的 bug 已经消失。规则得你自己 prune:一条经常在好代码上报警的规则,就是该删的信号。
② 单个会话为样本。 安静但昂贵的错误可能排在响亮但便宜的错误后面。
③ 最容易挨的批评:编通用建议。 有用户说“任务一旦完成,AI 就忘了 session 中段的 struggle,然后为了填满 retro 的分类发明通用建议”。技能的对策是:每条候选都必须来自会话自己的记录——任何指不回具体时刻的候选,直接丢掉。
④ 无 dry-run,不自动装 hook。 它只提议,直到你挑了一条才动手。这是刻意的:有用户被“自动 hook 拦住了好的改动”烫过。
用对了的样子 每条候选都能指回会话里某个具体时刻;重复犯的错变成了会失败的检查;你的 AGENTS.md 越来越短而不是越来越长;检查本来就有、只是没接上——那 finding 是“接上它”而不是“再建一个”。

06其他值得说的

流程与写法约定

技能增删改

技能状态说明
wizard新增生成交互式 bash 脚本,带你走只有人才能做的步骤(开通基础设施、配凭证/CI secret、点第三方控制台、一次性迁移)。model-invoked——agent 撞到“只有你能过的墙”时自己会拿出来用
to-questionnaire新增答案不在你脑子里也不在代码里,而在别人脑子里时——它先拷问你的“寄送”(给谁、要拿回什么),再拿这份问卷去问对方。是 grill-me 的反面
wait-what新增某句话没听懂时的纠错器:让 agent 用你缺的上下文、用 GLOSSARY.md 的词汇、用大白话重讲一遍
research新增把读资料的体力活丢给后台 agent,只信一手来源,最后在仓库里留一个带引用的 Markdown
code-review强化原 review 改名毕业;Standards 轴新增一套常驻的 Fowler 坏味道基线(神秘命名、重复代码、依恋情结、数据泥团、基本类型偏执、重复 switch、霰弹式修改、发散式变化、夸夸其谈通用性、过长的消息链、中间人、被拒绝的遗赠),且有两条约束:仓库文档化的标准优先于基线,所有坏味道只作为判断项上报、绝不判硬违规
tdd重写变成纯 reference;引入 seam 作为“测试放哪”的领头词(写测试前先和你确认);去掉 refactor 阶段(TDD 现在只有 red → green,重构归 code-review);新增“同义反复测试”反模式——断言用和实现一样的方式重算,天然通过、零信息量
prototype重写① 逻辑分支的产物变成单个可分享的 HTML 文件(无构建、无服务,双击就能开,带状态面板、随时可点的自由玩法、以及分标签的引导式 walkthrough);② “丢弃”不再意味着删除——原型作为一手资料留在 prototype/<name> 分支上,实现 issue 里留指针
triage扩展现在也能分诊外部 PR(把 PR 当成“带代码的 issue”),走同一套角色和状态机
wayfinder大改由 decision-mapping 改名而来;地图搬到 issue tracker(一张 wayfinder:map issue,tickets 是它的子 issue,一个团队共享的 URL);加 ## Destination;区分 ## Not yet specified(雾)与 ## Out of scope;每张 ticket 标 HITL / AFK;新增第四种 task ticket 类型;无雾时提前退出
to-tickets合并to-plan + to-issues 合并进来,to-issues 删除;to-prd 改名 to-spec(“spec” 成为唯一贯穿术语)
writing-for-agents改名原 writing-great-skills;write-a-skill 更早被它替换掉。retro 开始前会先加载它
resolving-merge-conflicts删除不再需要,也没有替代品——处理进行中的 merge/rebase 不需要专属技能。文档页保留并标注 archived
上游 in-progress/ 里还有一个 chief-of-staff,尚未发布,本机也没装。

分发方式(1.2.0 起)

07本机现状与行动清单

证据来自本机锁文件 C:\Users\GG_Bond\.agents\.skill-lock.json(55 技能 / 6 来源,其中 38 条来自 mattpocock/skills)与 2026-10-14 的更新记录。

状态

行动清单

① 删掉已废弃的残留 resolving-merge-conflicts 仍留在 C:\Users\GG_Bond\.agents\skills\ 并有链接在 C:\Users\GG_Bond\.pi\agent\skills\。npx skills update 对上游已删除的技能是静默跳过的,不会帮你清。手动删目录 + 链接:
rm -rf ~/.agents/skills/resolving-merge-conflicts
rm -rf ~/.pi/agent/skills/resolving-merge-conflicts
② 迁移 CONTEXT.md → GLOSSARY.md 本机命中两处:
  • C:\ai\library\library\CONTEXT.md
  • C:\ai\library\performance\library\CONTEXT.md
用 git mv(保留历史)改成 GLOSSARY.md。不改的话,domain-modeling、grill-with-docs、code-review、wait-what、tdd 等 11 个技能会当作它不存在。
③ 让 implement-spec 真的能并行 它需要 harness 支持后台子代理 + 每个子代理一个 git worktree,否则只是更慢的 implement。本机有 pi-subagents(async + worktree 都支持),但有一点值得先验一下:这些技能是用 -a pi 装的,pi 是否尊重 disable-model-invocation: true 这个 frontmatter 字段(决定“只能你打”的边界)我没在文档里确认到——跑 skills-doctor 或直接问 pi 的 skills 文档。
④ 可以清理的旧物
  • C:\ai\_tmp\backup-project-skills-20261014\——22 个 8 月 4 日的旧技能副本(含已删除的 resolving-merge-conflicts 与已改名的 writing-great-skills),仅作对照用。
  • C:\ai\_tmp\mp-skills\——v1.3.1 的完整克隆(含 docs/、CHANGELOG.md、.changeset/),跟上游缓存那份内容一致,想留一份离线参考就留它。
⑤ 顺手定个 PR 模板优先级 pr 不读仓库的 .github/pull_request_template.md。如果之后要让 agent 在这个目录里写 PR,先在仓库的 agent 文档里说清谁优先(推荐:填仓库模板,把 Summary / Evidence / Merge Danger 三段嵌进去)。

常用命令

skills-doctor                 # 本地:影子 / 悬空链接 / 锁文件 / 未纳管目录
skills-doctor --upstream      # 再比上游:上游新增了什么(本机当前无网络,会全部跳过)
npx -y skills@latest update -g -y
注意:--upstream 比的是名字,上游改名会同时显示成“新增 + 已删”,不代表真丢东西(本次 writing-great-skills → writing-for-agents 就是这种情况)。

08还没发布的 18 条

上游 HEAD 已包含 18 个 .changeset(全部是 patch),但尚未进入 CHANGELOG——也就是说下一版会来。挑几条影响使用方式的:

技能将要发生的变化
code-review主动搜索仓库里的标准文件并把 CODING_STANDARDS.md / CONTRIBUTING.md 交给 Standards 子代理;两个子代理改为前台运行并使用它们的返回报告;tracker 路径不再硬编码
grilling每个问题的措辞改成“回答 yes 就等于接受推荐答案”,避免同意变成回答 no
to-tickets每张 ticket 变成源 issue 的 sub-issue;blocker 是原生边时省略 ## Blocked by。需要重跑 /setup-matt-pocock-skills 刷新 docs/agents/issue-tracker.md
wayfinder不再给地图和 tickets 贴 ready-for-agent;交叉引用只写真 issue id;research 分支不再开 PR;按 label 决定 ticket 的收尾方式
diagnosing-bugsPhase 5 在信任“红”之前,先把强制变异与干净副本 diff 一遍——一个其实什么都没改的编辑不能冒充失败测试
implement拿到 ticket 引用后先去 tracker 取回并报出标题,引用有歧义就问;对 tdd/code-review 改用 Call the Skill tool with X 措辞
wizard模板修复若干:ask 改用 Readline(方向键可移光标)、write_env 单引号包裹值(空格/#/$/引号都能存活)、.env 是 symlink 时正确写入并保留文件权限、EOF 时不再死循环
handoff / teach明确给出临时目录($TMPDIR、否则 /tmp、Windows 上 %TEMP%);teach 的工作区写在你运行它的目录,且测验正确答案位置轮换
ask-matt陈述某个技能干什么、或建议跳过某一步之前,先去读那个技能的 SKILL.md,不再只信自己的一行摘要
这份报告属于 个人工作站 › 调查报告 ← 返回报告清单
返回调查报告