实战案例:GitHub 官方讲透如何用好Harness 送你一套清晰、可重复落下的 8 步工作流
- 每天都有新 MCP、新技能、新工作流冒出来,追不过来。GitHub 官方博客 7 月 27 日发文说:别追了,把手上这个 AI 编程工具本身用熟,效果更好。
- 作者 Burke Holland 在 GitHub 和微软做开发者布道,主攻 GitHub Copilot 方向,带过开发者工具布道团队。他给的是自己每天在跑的八步流程,全程只用 GitHub Copilot 的现成功能。
- 动手写代码前,先让 AI 一次出 20 个原型摆在一页里对比,连「加一个 API 接口」这种看不见的活也先画图。他的理由是:这些东西你不看到就不会去想。
- 最后一道关卡是让另一家公司的模型来挑毛病:他用 GPT-5.6 Terra 写代码,Copilot 自动叫了 Claude Sonnet 来审,两家训练数据不同,盲点也不一样。
- 全权限模式他建议开,但只能在沙箱里开:AI 投资人 Matt Shumer 就在自己 Mac 上开过,一个环境变量解析出错,一条递归删除命令把他主目录里的文件几乎删光。
- 原文标题《The harness is all you need (mostly)》结尾那个 mostly(大部分时候)有分量:他自己在这篇文章里就装了两个技能,一个用来把计划问透,一个用来给设计定调。
GitHub 官方梳理的八步工作流,拿开发一个日期选择器当例子
GitHub 官方账号分享的一篇极其实用的 AI 开发者工作流指南。它讲的是一个很现实的问题:不要被每天层出不穷的新 AI 工具、复杂提示词或各种黑科技弄得焦虑不安,真正能在实际生产里让你产能暴增的,是把 harness(外壳)用透。
作者 Burke Holland 在 GitHub 和微软做开发者布道,主攻 GitHub Copilot 方向。他拿「从零开发一个日期选择器(Date Picker)组件」当例子,梳理出一套清晰、可重复落地的八步工作流,全程只用 GitHub Copilot 的现成功能,不装任何新东西。
下面这八步就是他每天在跑的流程,点标签看每一步在干什么:
挑一个入口,新手从命令行版开始
几个入口正在收拢到同一个外壳,学一次到处能用。
把审批按钮关掉,换到沙箱里跑
不给自主权就谈不上提效,但全权限必须配隔离环境。
/allow-all(别名 /yolo)
一次要 20 个原型,摆一页对比
你看到了才知道自己想要什么。
Give me 20 mocks for a date picker web component…
进计划模式,让它把边界问题问出来
需求写得含糊没关系,含糊正是这一步要解决的。
/plan Build a date picker web component…
批准计划,交给 Autopilot 跑完
内置的循环,逼模型接着干,直到计划里每一项真的做完。
人来审,别接受「差不多能用」
交出来的东西多半不是你要的,这一步你的品味决定成品质量。
叫另一家公司的模型来挑毛病
换一家公司的模型来审,两边盲点不一样。
Perform a rubber duck review on…
提交,换话题就开新会话
会话按主题分,聊着聊着跑题跑远了就该换一个。
第一步:挑一个入口,新手从命令行版开始
光是 GitHub Copilot 家族里就有一堆入口:命令行版(CLI)、新出的 GitHub Copilot 桌面应用、VS Code、Visual Studio、JetBrains,这还只是举几个例子。
好消息是这些入口正在收拢到同一个外壳上。细节各有不同,核心流程是一样的:学一次,到处能用。
他给新手的建议是从命令行版开始。理由是想学会这个外壳,最好离它越近越好。终端里就是纯文字,没有一堆界面要学,你打一句话,Agent 干活,交互更直接、更即时,用他的话说,「说实话挺爽的」。
他这次演示用的是新出的 GitHub Copilot 桌面应用。这个桌面应用建在 Copilot 命令行版之上,macOS、Linux、Windows 都能装。它主打的是同时开好几个 Agent 会话,每个跑在自己独立的 git 工作树和分支上,互不干扰。会话模式有三种,正好对应下面几步要讲的东西:
| 会话模式 | 谁在做主 |
|---|---|
| Interactive互动 | 你来我往,它做一步等你一句 |
| Plan计划 | 它先出实现计划,你审、你批 |
| Autopilot自动驾驶 | 你不用管,它自己一步接一步跑到任务完成 |
第二步:把审批按钮关掉,但别在自己电脑上关
YOLO 模式(you only live once,「人生只活一次」,程序员用它自嘲「豁出去了」),官方名字叫 Allow All(全部允许),具体开法各家工具不太一样,多数就是在聊天里打一句 /allow-all,/yolo 是同一个命令的别名。开了之后 Agent 想跑什么命令就跑什么,不再一步一问。
他坚持要开的理由是:Agent 得有自主权,你才看得到效率提升。如果它干什么都要你点一下「批准」,那你不如自己干。而且一天到晚坐那儿点批准是很难受的体验。更糟的是,点多了你就被训练成不看内容直接点,那这个批准环节就白设了。
他紧接着甩了个链接,指向 7 月 10 日的一条推文。Matt Shumer 是 AI 圈的活跃投资人,也做过 AI 写作产品 HyperWrite 的 CEO。他把 GPT-5.6 Sol 放在自己 Mac 上跑。Agent 在执行一个文件清理任务时,拼出了一条递归删除命令(rm -rf),把他 Mac 主目录里的东西几乎删光了。
我很生气……OpenAI 团队正在查这件事,但这种事感觉应该发生在 GPT-3.5 身上,而不是 2026 年年中、跑在最高推理档上的前沿模型。
Matt Shumer,2026-07-10
所以作者的结论是:开 YOLO 可以,但别在本机开。在公司里更是如此,数据在组织的系统上,出事代价很大。要开就找个沙箱一个跟你本机隔离的一次性环境,里面被删光了也不影响你自己的文件。,最容易上手的是 GitHub Codespaces(云端开发环境)或者 dev container(在本机上用容器隔出来的开发环境)。
权限一共四档,从只读放行到全自动
这一层决定了你能不能既省心又安全。Copilot 命令行版默认并不是每件事都拦你:只读操作,搜索、读文件、跑只读命令,本来就自动放行。要你点头的是那些能改动系统的动作:跑破坏性命令、写文件、访问网址。
从「每步都问」到「全自动」,中间还有几个档位:
| 档位 | 它还会不会停下来 | 什么时候用 |
|---|---|---|
| 默认 | 只读的自动放行;改文件、跑破坏命令、访问网址每次问你 | 在自己电脑上干活 |
| --allow-all / --yolo | 要许可的动作不再问;但走到决策点,它还是会停下来问你想怎么办 | 在沙箱里放手让它干 |
| --no-ask-user | 不再问你澄清问题,自己拿主意;但不会自己续跑下一步 | 不想被追问,又不想它一直烧额度 |
| autopilot 模式 | 自己一步接一步跑到任务完成;没给全权限就干不了要审批的活 | 有明确计划,交给它一次做完 |
还能更细。--allow-tool='shell(git:*)' --deny-tool='shell(git push)' 的意思是「所有 git 命令都行,就是不许推代码」。有一条规矩要记住:拒绝规则永远压过允许规则,哪怕你开了 --allow-all 也一样。
第三步:先做原型,你看到了才知道自己想要什么
AI 最神奇的地方之一,是前期原型现在便宜到白菜价。以前做原型是项目里一个完整的阶段,很多时候算奢侈品;现在一句话就能出。
拿一个日期选择器(date picker)组件当例子。听起来简单,实际上一堆问题等着回答:组件里怎么导航?选中的日期长什么样?选一段区间又长什么样?用户怎么在日、月、年之间切?
他的做法是一句话要 20 个。
Give me 20 mocks for a date picker web component. Put them all in an HTML file so I can compare.
出来的 20 个方案里,有一个是从年视图开始的(图里左边那个「Year at a glance」,一眼看全年)。他看到才想到:我想要的是让用户能从年缩放到月、再缩放到日。
这些东西你不看到就不会去想。
These are the kinds of things you don't consider until you see them.
人处理图像、形状、看得见的布局,比处理密密麻麻的文字快得多。前期用很低的成本做几个原型,能让复杂概念一下子变直观。
看不见的活也照样先画图
他要加一个 API 接口(就是让程序之间互相调用的一个入口),这件事没有界面可看,他一样先要可视化原型。
Create a visual mockup of the API for this project. Add five options for how we could handle a new API endpoint that allows the user to download their analytics data.
GitHub Copilot 桌面应用支持 Mermaid 图一种用文字描述来画流程图的写法,写几行文字就能渲染成方框和箭头,所以 AI 能直接「写」出图来。,所以它把这五种做法直接渲染成了一棵树。
模型怎么选:中间那档,而且从头到尾别换
他推荐日常大部分活用中档模型,GPT-5.6 Terra 或者 Claude Sonnet,推理档位选中等。GPT-5.6 这一代 7 月 9 日进的 Copilot,一共三个型号:Sol 推理最强,Terra 均衡,Luna 最轻最便宜。他推荐的 Terra 就是中间那一档。
另一条建议更值钱:同一个功能、同一个 bug,从头到尾别换模型,也别换推理档。原因是提示词缓存(prompt caching)模型那边把你之前的对话存着,下次接着聊不用重新算一遍,费用打折。换模型或换推理档,缓存就作废了。:只要你不换,之前的对话在模型那边还是缓存状态,后面的请求能打折。换了就等于从头再来一遍。
第四步:进计划模式,让它把你想不到的问题一个个问出来
现在你知道自己真正想要什么了,而不是一开始以为自己想要的。该出实现计划了。
不用新开会话,直接切到计划模式。
/plan Build a date picker web component. I want the user to be able to zoom in and out of years, months, and days.
他自己说这个提示词挺含糊的,但没关系,计划这一步就是干这个用的。
理论上,只要你能把完美的提示词、完美的上下文、按完美的顺序组织好,模型可以一次成功。理论上。但我们没人做得到。计划模式帮你逼近这个理想,方式是把你如果亲手做这件事、迟早也得回答的那些问题,提前一个个问出来。
计划模式会问的问题长这样,每一个都在决定一件具体的事:
起始日期和结束日期,能不能是同一天?
决定「选一个日期」和「选一段区间」要不要用同一套逻辑。允许同一天,代码里就得处理「区间长度为零」这种情况。
选了一半算不算数?
用户点了起始日、还没点结束日就跑了,这个状态要不要存下来、要不要在界面上留痕。
用户能不能清空已经选的日期?
决定要不要有「清空」按钮,以及清空之后这个字段是空值还是回到默认日期。
「今天」要不要一直摆在明面上?
决定界面上有没有一个常驻的「今天」入口,还是要翻到当月才找得到。
允不允许手动输入?
一旦允许,就得处理各种乱七八糟的输入格式,还要决定输错了怎么提示。
日期存成什么格式?
决定这个组件跟别的系统怎么对接。存字符串还是时间戳,跨时区会不会差一天,都在这一问里。
允不允许把日期粘贴进来?
跟手动输入是两回事:粘贴进来的内容可能带着别处的格式,得单独处理。
这样的问题还有一长串。这些边界情况你不可能全想到,但模型能帮你揪出来不少。
你要是照单全收,这个计划过程的价值就被你自己抵消掉了。它的意义在于逼你把每个细节自己想一遍,哪个要哪个不要,你得当场拿主意。
你也能反过来问模型
他大概知道模型指的是什么,但还是问了一句,好让双方在同一个频道上。你插进去问问题也不会打断计划流程,它接着往下走。
想让它问得更狠:装一个专门追问的技能
装上 Matt Pocock 做的 grill-me 技能(「来烤我」),他是 TypeScript 圈很有名的教学作者,把两个命令连起来打,它会问得多得多、狠得多。这个技能干的事是一次只问一个问题、揪着一个计划刨到底,直到你和 Agent 对每个分支都达成共识。(这是他这篇文章里用到的第一个技能。)
/plan /grill-me Build a date picker web component. I want the user to be able to zoom in and out of years, months, and days.
第五步:批准计划,交给 Autopilot 自己跑完
计划出完,GitHub Copilot 通常会直接问你要不要切到 Autopilot 去实现。
Autopilot 是一个内置的循环。它逼着模型接着干,办法是确认它有没有真的把说过要做的事做完,在这里就是计划里的每一项。
Copilot 在这个阶段会自动当派活的(这个角色英文叫 orchestrator,编排者):需要读代码库里的文件,它派「Explore」子代理(subagent),配一个小模型;判断某个动作比较复杂,它多半会派「General Purpose」子代理,配一个大模型。你想精细控制也可以,用自定义 Agent 和自定义指令。但什么都不做,你照样吃得到多个子代理、多个模型协同的好处,哪怕你根本不知道有这些东西存在。
Autopilot 什么时候会停
autopilot 会在四种情况下停:它认为任务完成了、遇到问题走不下去了、你按 Ctrl+C 停了它、或者达到了你设的最大续跑次数。最后这个是用 --max-autopilot-continues 设的,防止它陷进无限循环,写进脚本自动跑的时候尤其该设,因为出事时你不在旁边。
还有一条安全设计,正好解释了上一步和这一步为什么是配套的:在 autopilot 模式下,除非你明确给了全部权限,否则它做不了任何需要审批的动作。权限不给够,它就只能一路自动拒绝,活干不完。
第六步:人来审,别接受「差不多能用」
这一步最爽:你终于看到 AI 做出了什么。
但多半不会正好是你想要的,这很正常。模型读不了你的心,而且它会出错。你得跟它反复磨,磨到你真正想要的样子。不管是代码还是界面,这一步你的品味决定成品的质量。
他一眼看出的四个问题:
- 动画不一致
- 鼠标悬停在已选中的日期上时,文字看不清(对比度不够)
- 顶上不需要写「12 YEARS」
- 点「Today」时,如果你正在月视图或年视图,它不会跳到那一天
- 他不太喜欢这个设计,看着太像 AI 做的,因为它本来就是
他用的是自己做的 CSS 框架 Postrboard(一套设计系统,40 多个组件),装成技能挂给 Agent,技能里就是指一下 CSS 在哪、怎么用。不一定要用他这个,随便挑一个喜欢的 CSS 框架都行,给模型一点设计上的指引很有用,很多时候一个 CSS 框架就够了。(这是他这篇文章里用到的第二个技能。)
然后他甩过去一串话,一字未改是这样的:
ok - we don't need a landing page here - just the component, output and settings panel in a minimal setting. Use the /postboard skill for the design and colors. For the date picker, when I click on the day, it tries to zoom in, but can't because there is nothing to zoom to. There should be no zoom there. It doesn't need to say "Zoom Out" at the top When I mouse over a month or year that contains the selected day, I cannot read the hover text. When I click "Today" it should take me to that day view, even if I'm on the month or the year. The months don't need numbers under them and they don't need to be in boxes Same goes for years. And it doesn't need to say "12 years" at the top."
(他原话里把框架名写成了 /postboard,少了一个 r,实际叫 Postrboard。)
别想太多。修一堆小毛病的时候,直接说给模型听就行。你有上下文,你就有提示词。
Notice how conversational this is. Don't overthink it.
别接受「差不多能用」的 AI 输出。要求质量,而且要狠。这部分责任还在你身上,能分辨出什么是好东西、什么不是,就是你带来的价值。AI 永远替代不了人的手感和创造力。
第七步:叫另一家公司的模型来挑毛病
改到满意之后,再请一次 Rubber Duck review(橡皮鸭审查)。不需要什么特殊格式,一句大白话就能叫。
Perform a rubber duck review on this date picker component implementation
机制是这样的:GitHub Copilot 会去找一个跟你当前会话模型不同家族的模型来审,实际操作里就是换一家公司的模型。作者用的是 GPT-5.6 Terra,它就找了 Claude Sonnet 来审。道理很朴素,不同模型是拿不同数据训出来的,盲点不一样。一个模型自己审自己,多半会漏掉同一批东西。
橡皮鸭只看不改,挑毛病也有边界
橡皮鸭是内置的一个 Agent,只读,不改文件,它只负责给意见,改不改由主 Agent 和你决定。它给的意见分三档:阻塞(不修这活就成不了)、非阻塞(该修,不修也能用)、建议(优先级低但真有用)。它还被明确要求不要挑格式、命名、注释语法这类不影响实际问题的毛病。没发现问题它会明说没有。
它不是只能用在最后,原型能审,计划也能审,看你想不想在那一步要第二个 AI 的意见。
它最该出场的时机是计划做完、代码还没写那一刻,这时候改方向最便宜。除此之外还有三个时机:写到一半查盲点、测试写完验覆盖够不够、以及反复失败时换个脑子分析,别拿同一个思路一遍遍试。小改动它一般会跳过,不添乱。
你也可以随时手动叫它,打一句 /rubber-duck 还缺哪些边界情况? 就行。
rubber ducking 是软件行业一个老办法:你把代码或者思路,讲给一个死物听,传统上是一只橡皮鸭。光是「把话说出口」这个动作,就常常让你自己发现漏洞。区别是这只鸭子会回嘴,它给的意见能直接照着改。
再狠一点:让两个模型自己来回磨
橡皮鸭和 Autopilot 能串成一个循环。
/autopilot rubber duck this date picker implementation. When you have the result, review it carefully and make any necessary adjustments. Repeat the rubber duck review until both you and the reviewing model agree that the only items that remain have diminishing returns.
代价是烧更多 token。但用他的话说,这是拿两个模型轮流捶,把代码捶硬,等于替未来的自己省下踩坑的时间。
第八步:提交,换话题就开新会话
做完就提交,或者接着往这次改动里加下一个功能。他还有一条会话管理建议:下一件事如果跟这个不相干,就开新会话。会话应该按主题分,聊着聊着跑题跑远了,多半就该换一个了。
这是他做出来的成品,从年到月到日逐级缩放,左边组件右边设置面板实时联动:
他自己也说这例子有点刻意,但还是让人停一秒:日期选择器过去是前端最难啃的活之一,随便找个做过的人问问就知道。
说好的不用技能,他自己装了两个
他这篇文章的开头是一句「如果你现在被 AI 搞得应接不暇,你不是一个人」,接着列了每天刷屏的新工具、新 MCP、新技能、新工作流,还有那句永远配套的「快看!我用这么一条怪提示词,把 AI 彻底搞明白了」。他的回应就一句:
我……不信你们。
I…don't believe you.
他每天用 AI 干活,结论是装得越少、懂得越深,效率反而越高。装什么插件、配什么规则、想什么招把 Agent 骗着多干点活,这些事有意思,但在他看来更像小把戏。真正让他效率上台阶的,是他怎么用这个外壳、有多懂它。
他对现在市面上的垃圾产出还有一句:你随便让 Agent 生成一个技能,它一定二话不说给你造一个出来。那玩意儿到底能不能用是另一回事,而这种东西可以随手发到各种技能市场和 MCP 市场上去。
他没把话说死。他明确写了:等你往后要定义复杂工作流、给团队做自动化,技能、MCP、自定义 Agent 这些当然会变得重要,「实际上,我在这篇文章里就用了几个!」他的点只有一个:不靠这些东西,你也能把 AI 用得很好。
他最后的总结有三层:
第一,简单的流程对大部分人就够了。简单还有个附加好处,同时开好几摊的时候,你更容易搞清楚哪个 Agent 在什么状态、自己上次干到哪了。你的上下文窗口也就那么大,模型一次能记住的东西是有限的。
第二,AI 这块能玩的东西没有上限:MCP、技能、指令、自定义 Agent、工作流、循环、让 Agent 去提示 Agent、搭一整支虚拟开发团队,都行。
第三,也是他放在最后的那句:
现在没人真的知道自己在干嘛。我们都是边做边摸索。今天那些神奇的咒语,很多会变成明天的反面教材。
nobody really knows what they are doing right now.
回过头看原文标题结尾那个 mostly(大部分时候),它是有分量的。这篇文章从头到尾,他用了两个技能:Matt Pocock 的 grill-me 用来把计划问透,自己做的 Postrboard 用来给设计定调。开头的免责声明里他自己就承认了。
所以「外壳就够了」真正的意思是:你不必追着每天冒出来的新东西跑,光靠手上这个工具的现成功能,就能把活干得很好。等你真碰上需要自动化的复杂流程了,再去加那些东西。
GitHub 官方摊开自己每天在跑的八步 AI 编程流程:不装插件,全用现成功能
GitHub 开发者布道师 Burke Holland 拿从零做一个日期选择器当例子,把八步一步不落地写完,这一页带图讲完。
↓ 一页读完 · 有一张会动的图
每天都有新插件、新技能、新提示词冒出来,追不过来。GitHub 官方博客 7 月 27 日发文给了个反方向的答案:别追了,把手上这个 AI 编程工具本身用熟,效果更好。他说的「工具本身」指 harness(外壳),包在大模型外面那层系统,决定它能调哪些工具、什么时候停下来问你、一件事拆成几步做。
八步流程从头跑到尾
多个小助手配不同模型自动分工协同
让另一家公司的模型来审你的代码
要定义复杂的多环节工作流
要给整个团队做自动化
他拿「从零做一个日期选择器」当例子,就是网页上点开选日期的那个小控件。看着简单,实际一堆问题要回答:怎么在年月日之间切、选一段区间长什么样、能不能手动输入。
以前做原型是项目里一个完整阶段,做一版就算奢侈,所以多数人照着脑子里的想象直接开写。现在一句话就能出一堆。
做一版要排进项目周期,多数时候省掉,直接照着想象开写,写到一半才发现要的不是这个。
给我 20 个日期选择器的样稿,全放一个 HTML 文件里,我好对比。
20 个里有一个是从年视图开始的,他看到才想到自己真正要的是「年→月→日逐级放大」。这些东西你不看到就不会去想。连「加一个 API 接口」这种没界面可看的活,他也照样先让 AI 把五种做法画成一张树状图再挑。
他建议把「这一步要不要允许」的审批全关掉,让 AI 想跑什么命令就跑什么。理由是一步一问不如自己干,而且点多了人就被训练成不看内容直接点,这道关就白设了。前提是换个地方跑。
改到满意之后还有一道关:一句大白话就能叫一次「橡皮鸭审查」,工具自动挑一个跟当前会话不同家族的模型来审。他用 GPT-5.6 Terra 写代码,来审的是 Claude Sonnet。不同数据训出来的模型,盲点不一样,自己审自己多半漏掉同一批东西。
名字来自软件行业的老办法:把思路讲给一只橡皮鸭听,光是说出口就常常自己发现漏洞,区别是这只鸭子会回嘴。最该叫它的时机是计划做完、代码还没写那一刻,那时候改方向最便宜。
这套流程、七段可直接抄走的提示词原话,以及 20 个原型、7 个边界问题这些数字,都是 Burke Holland 在 GitHub 博客里的自述;权限档位和橡皮鸭的三档意见来自 GitHub 官方文档。他在 GitHub 做开发者布道,讲的是自家产品,方法本身与用哪家工具无关。
- × 新 MCP,今天又三个
- × 新技能,说不装就落后
- × 新工作流,配一天还没跑通
给了个反方向的答案:
把手上这个工具用熟。
从零做一个日期选择器
全摆进同一个页面里对比。
年缩到月,月缩到日,我要的是这个。
一条递归删除命令跑了
一小时二十一分钟才被发现,
主目录里的文件几乎删光。
那是一次性环境,
删光了也碰不到你的文件。
来审的是 Claude Sonnet。
盲点也就不一样
它只读,
一个文件都不动
那个「大部分时候」
一个给设计定调。
开头的免责声明里认了。
动工前把边界问透,
交付前找一双不一样的眼睛来挑刺。