← 返回 关于

Harness 才是关键

2026-08-28 · 原文链接

刚入行做开发时,有位老前辈曾跟我说,摩尔定律同样适用于软件。那时我还不明白,我们持续讨论该如何解决问题,本身就是进步的轨迹;抱怨 J2EE、吐槽 NetBeans 太慢,对着表格布局和每次操作都要整页刷新的体验长吁短叹——这些日复一日的优化,同样是推动进步的引擎。

过去十八个月尤其如此,改进几乎从未停歇。Tab 补全让位于智能体编程,智能体编程又演化成了通过 Harness 管理智能体。我从一开始惊叹于生产力的飞跃,到如今已经进入状态,开始琢磨还能把这颗柠檬榨出多少汁来。

一些新的事实

单个开发者做出的项目,在质量和一致性上已经可以比肩大型开发团队。你完全可以、也应该构建量身定制的应用,而且不用太担心有经验的工程师如何上手:只要他们对自己的技术栈烂熟于心,很快也会知道该如何为你的项目贡献代码。但我最深刻的体会是,Harness 才是关键——它是我的预期与大语言模型能力相接的支点。

目前,我的整套配置由两份订阅(Cursor 和 Claude)支撑,需要时再用 Pi 补充。三者共享同一套 skills 和 AGENTS.md。虽然我使用三个 TUI,体验却是统一的。对我而言,这让模型真正成了商品:Claude 或 Cursor 里没有什么不可替代的秘方或特殊体验,是我保持生产力所必需的。因此,对于本月底从 Cursor 转向 Codex,我毫不焦虑。

成本优势

商品化1时代,许多现成模型都能给出很好的结果;不过,自 deepseek-v4-flash-0731 发布以来,我一直主要依赖它。只有极少数情况下,我才会动用 Anthropic API 的预算来使用 Fable。

大部分维护工作和简单任务,我都可以交给 DeepSeek。只有在探索重要功能,或进行牵涉众多部分的大型重构时,我才会请前沿模型上场。最近,我了解到 prewalk2:这是 Can Bölük 提出的一种方法,在规划阶段和第一个任务中使用前沿模型,等模式确立后再把工作移交出去。我把它和 Building an Advanced Agentic Harness3 中 planner/worker/critic 的角色拆分结合了起来——让同一个提示词既规划、又执行、再自我批评,会混淆各自的目标,所以应当把每个角色隔离开来。我把这两种方法做成了一个 skill,并配套写了一个 Pi 扩展,可以在工作的任何阶段接手。

先由 exploration 产出一份 plan,并将其整理成明确的 DAG(有向无环图)任务列表。随后由 worker 接手,一次专注实现 DAG 中的一个节点。全部完成后,我会引入 critic,对已有实现做简化并提出质疑。这个阶段经常会给出足够有力的反对意见,让流程退回 worker 阶段。但 critic 满意之后,工作便会交给 promoter;它提醒我:在把成果妥善传达给其他人之前,这项工作还不算完成。

我加入 promoter 这一步,是为了弥补自己的一个弱点:总想发布完就立刻奔向下一件事。它会提醒我把已经完成的工作告诉大家。这个阶段我还需要 Fable 稍微帮一把,因为推广这件事很微妙,很容易搞砸;况且没人喜欢批评者,所以让前沿模型参与,可以让批评更有分量。

一条浅弧上依次分布着五个阶段:explore、planner、worker、critic 和 promoter。一条浅色带沿整条弧线内侧延伸,深度与最高峰相当;它代表商品化模型,承担了绝大多数工作。两个红色尖峰伸入 worker 的开头,另一个矮得多的尖峰则横跨 critic 与 promoter 的交界处。

即使在任务最繁重的场景中,这套流程也让我的 Fable 用量降低了 75%。这感觉很合理,有点像一次 AI soak(长时间浸泡式使用)。依靠两份各二十美元的订阅,并在 Pi、DeepSeek 和偶尔注入的 Fable 之间灵活切换,我既能照顾好客户,也能切实推进自己的项目。

与产品 Harness 的连接

我的产品4 是一款相机应用:每次拍一张照片,就能轻松看到它被转换成矢量图。它的乐趣正来自简单。分辨率会降低,照片会被简化为不同明度的图层和形状。它保留上下文、去掉细节,让你自己重新把细节画回来。它的设计目标仅此而已。你可以把图打印出来,在上面作画;也可以导入 Procreate,在所有分层之中继续创作。

Harness 可以通过 poster-driver5 使用这项功能。在无头 Chrome 中打开它并驱动线上网站,就能把任何图像或拆解后的视频制作成海报。为这个应用编写脚本,就像加载一个网页一样简单。

一种过去只能用笨拙方案实现的高级用法,现在已经触手可及,而且用起来很有趣;这个功能还有大量空间值得探索:

# run from harness root
npm run make:animation artifacts/my-movie.mp4

大语言模型帮我理清了实现方法,并写好了一段保存在 Harness 里的脚本;这样它就能运行无数次,而不会继续消耗 token。因为 Harness 能够触达产品,产品也变得更强大了。它支持 File System Access API。在 Brave 中启用后,我正把自己的想法同步到工作目录。收割自己那些伤感男孩式歌词,独自在房间里唱给自己听。痛并快乐着。我还在探索另一种创意用法:制作一个以自家街区为原型的 3D Blender 环境,再把海报叠加到上面。那会成为场景、故事板,以及远超 Web 所能呈现的东西。

如今,这个应用仿佛真正变得完整可用,而一年前这根本不可能。创作者依然可以用 AI 的方式来使用一款非 AI 工具。创造过程中最好玩的那些部分,我们仍然可以留给自己。

拆解 Harness

我的整个工作日都在这个 Harness6 里度过。我把 nvim 配置映射进工作目录,这样大语言模型就知道我当前打开的是哪个文件,既能编辑它,也能在我这个游得还不够快的人需要时,帮我用对移动命令。我尝试用“夹具(jig)”来理解 Harness:大语言模型和我一起编辑配置,让我可以专注工作,同时又能坚持使用 Vim 命令。

这个 Harness 是自包含的,能够支持主目录之外的多种能力(沙箱、Web 界面、File System Access API、Docker、Deno 可执行文件等)。

这些概念在我脑中仍未完全成形,所以我一直把 npm startcursor-agentclaude 称为 TUI,以便保持 Harness 这个概念的清晰。所有 TUI 共享同一个 Harness。

保持一切可审计非常重要,因此 TUI 都被要求把内容放在 artifacts/ 目录中。Cursor 用 .gitignore 忽略文件,我认为这很聪明,所以根目录必须不属于任何 Git 仓库。我有一个 skill,负责在 Harness 和 work 目录中的仓库之间同步。Skills、extensions 和 AGENTS.md 都是根目录中的一等公民,随时等待修改和扩展。TUI 必须遵守这些规矩。

brayness/
├── AGENTS.md
├── AGENTS.local.md
├── bin/
├── prompts/
├── plans/
├── skills/
├── extensions/
├── artifacts/
└── work/
    ├── realness/
    ├── blog/
    ├── brayness/
    ├── nvim/
    └── ...

起初,我对 skills 的规定太过细致;现在我正学着减少那些具体要求,也逐渐意识到,越过某条界线之后,你只是在浪费 token,对这些铁疙瘩唠叨个没完。等 Harness 稳定下来,我需要采用更实证的方法来确认每项改动究竟产生了什么影响。

下面是其中一些 skill,按我的规划弧线分类。

explore

planner

worker

critic

promoter

双脚重新踏回地面之后,我在 cursor-agent 或 Claude 里都不再感到迷失。我对工作流拥有了掌控权,也能塑造自己设计解决方案的方式。我在 Pi 中学到的东西,往往会反哺 Claude 和 Cursor 中的体验。有了 Pi,我相信任何问题都能靠 bash 一路解决。让 Harness 运行脚本,再由大语言模型协调这些脚本。

过去三个月里,我发现自己越来越常离开编辑器,转向终端。这背后似乎是多种原因恰好形成了和声:把代码放心交给智能体、换用 Ghostty,以及借助 nvim 对抗技能退化。这种程度的重新洗牌,通常足以让我的产出瘫痪;但现在,无论个人项目还是客户工作,质量和推进速度都达到了最高水平。一些小事也帮助我逐渐适应 AI 时代的工作体验,比如用分屏为长时间运行的智能体任务构建上下文。


政府封禁 Fable,并开始摆出一副要以家长式特权掌控整个行业的姿态,使这一切突然变得紧迫起来。我,以及大概另外十万名软件开发者,忽然都意识到必须分散模型访问渠道。于是,为了自由,我们集体决定试试这些中国模型。Pi 从一个我刚刚调通、还只是在随便把玩的工具,一跃成为整套配置中最重要的一环。

评论7

  1. https://www.emergingtrajectories.com/lh/commodification-and-circularity/
  2. https://stencil.so/blog/prewalk
  3. https://data4sci.com/blog/building-an-advanced-agentic-harness
  4. https://realness.online/about
  5. https://realness.online/poster-driver
  6. https://github.com/scott-fryxell/brayness
  7. https://news.ycombinator.com/item?id=49452346