1. Harness Engineering 不是新工具,而是程序员的“认知重装”现场
最近在几个技术群和开源项目 Slack 频道里,频繁刷到
Harness Engineering
这个词——它不像 Copilot 那样弹出一个补全框,也不像 Cursor 那样直接接管编辑器,而是在 PR 描述里突然出现一段结构化 YAML;在团队周会纪要中,有人开始说“这个需求我们先写个
agents.md
再动代码”;甚至有位独立开发者发帖:“用 Vibe Coding 搞定了一个 SaaS 后台,全程没手动敲过
npm run dev
”。这些不是段子,是正在发生的事实。
Harness Engineering 的核心,根本不是让 AI 写更多代码,而是让程序员重新定义“什么才算完成了一项工程任务”。
它把过去隐含在经验、文档、口头对齐里的工程判断,显性地编码进一套可读、可审、可迭代的协议层里。关键词
AI Coding
在这里已退居为执行引擎,真正被重构的是“人如何指挥系统”这件事本身。你不需要立刻学会所有 Agent 框架,但必须理解:当
agents.md
文件开始出现在你的 Git 历史里,你就已经站在了新范式的入口。它不淘汰写代码的人,但会快速筛选出那些仍把“写完函数”当作交付终点的人。我上周帮一家做工业 IoT 的客户做架构评审,他们团队用传统方式写了三个月的设备接入模块,最后发现 70% 的逻辑其实可以由一份
codex-agents.md
+ 三个 Skill 定义完全覆盖——不是因为 AI 更聪明,而是因为他们第一次把“设备认证流程”这个业务概念,从模糊的注释和会议记录,变成了机器可解析、可验证、可复用的工程契约。
2.
agents.md
:不是配置文件,而是团队的“工程宪法草案”
很多人看到
agents.md
第一反应是:“这不就是个 Markdown?能干啥?”——这恰恰是最危险的误解。
agents.md
的本质,是把软件工程中最高频、最易出错的“意图对齐”环节,从人脑记忆和口头沟通,强制落地为可版本控制、可 diff、可 CI 拦截的文本契约。
它不是给 AI 看的说明书,而是给人(尤其是跨角色协作时)看的“最小共识单元”。举个真实例子:某电商团队要上线“订单履约超时自动补偿”功能。旧做法是:产品经理写 PRD → 后端写接口 → 前端调用 → 测试写用例 → 运维配告警。过程中任何一环理解偏差,都可能让“超时”被定义成“下单后 24 小时”,而实际业务要求是“支付成功后 4 小时内未发货”。在 Harness Engineering 范式下,第一步必须产出
agents.md
,内容类似这样:
# agents.md: order-compensation-v1
## Goal
当订单满足【支付成功】且【发货状态为'未发货'】且【距支付时间 > 4h】时,自动触发补偿流程(发放 5 元无门槛券)
## Inputs
- order_id (string, required)
- payment_time (ISO8601, required)
- shipment_status (enum: 'shipped'|'pending'|'canceled', required)
## Skills Required
- `fetch-order-details`: 查询订单基础信息与支付时间
- `check-shipment-status`: 调用物流网关获取实时发货状态
- `issue-compensation-coupon`: 调用营销服务发放优惠券
## Constraints
- 补偿动作必须在检测到条件满足后 5 分钟内完成
- 同一订单 24 小时内最多触发 1 次
- 若用户已申请人工客服介入,则跳过自动补偿
## Verification
- [ ] 模拟支付时间为 T,T+4h05m 后检查优惠券是否发放
- [ ] 同一订单在 T+4h01m 和 T+4h03m 两次检测,仅触发 1 次
- [ ] 订单状态为 'canceled' 时,不触发任何动作
这份文件的价值,在于它迫使所有人(包括非技术 PM)在写第一行代码前,就对“什么是正确”达成精确共识。它不是技术实现细节,而是业务逻辑的“源代码”。我参与过三次基于
agents.md
的需求评审,平均每次节省 3.2 小时的返工沟通——因为所有歧义点都在文件里被显性标注并讨论清楚了。> 提示:
agents.md
不需要一次性写完美。我们团队的实践是:PR 提交时必须包含初版
agents.md
,CI 流程会自动检查其是否包含
Goal
、
Inputs
、
Skills Required
三个必填区块,缺失则阻断合并。这比“大家自觉写文档”有效十倍。
3. Vibe Coding:一人团队的“工程杠杆率”放大器,而非“懒人模式”
“Vibe Coding”这个词在中文社区常被误读为“靠感觉写代码”,甚至被调侃成“喝着咖啡听音乐,AI 把活全干了”。这完全偏离了它的设计初衷。 Vibe Coding 的真实含义,是让单个开发者能以接近小型团队的工程严谨度,快速交付可维护、可演进的系统。 它解决的不是“要不要写代码”,而是“如何让一个人写出的代码,具备团队协作所需的可追溯性、可测试性和可交接性”。关键不在“Vibe”,而在“Coding”前面那个被省略的定语—— “符合 Harness Engineering 协议的 Coding”。 我用 Vibe Coding 完成过一个独立开发的 SaaS 工具(内部知识库搜索增强插件),整个过程如下:
-
先建
vibe/目录 :这是约定俗成的根目录,存放所有 Harness 相关资产。 -
写
vibe/agents.md:定义核心能力边界(如“支持从 Confluence、Notion、本地 Markdown 导入元数据”、“搜索结果需按语义相关性排序”)。 -
拆解
Skills:不是写函数,而是定义 Skill 接口。例如fetch-confluence-pagesSkill 的输入是space_key和last_modified_after,输出是标准化的PageDocument[]结构体。具体实现用 Python 写,但接口契约在skills/confluence.yaml里声明。 -
用
MCP(Model Control Protocol)编排 :在vibe/mcp.yaml中定义执行流:“先调用fetch-confluence-pages→ 对每个 PageDocument 调用extract-keywords→ 将结果存入向量库”。MCP 是纯声明式,不包含任何业务逻辑。 -
最后才写代码
:在
src/下实现各个 Skill 的具体逻辑,每个 Skill 都有独立的单元测试和 Mock 数据。
整个项目没有一行“胶水代码”,所有集成逻辑都在
mcp.yaml
和
agents.md
里。当我把仓库交给另一位同事接手时,他花 20 分钟读完
vibe/
下的 3 个文件,就完全理解了系统架构和扩展点。这才是 Vibe Coding 的威力——它把“一个人的直觉”,转化成了“可被他人快速消化的工程语言”。> 注意:Vibe Coding 对工具链有强依赖。我们实测下来,
Cursor Pro 的 Unlimited Tab 是刚需
,因为你会同时开着
agents.md
(看契约)、
mcp.yaml
(看流程)、
skills/xxx.yaml
(看接口)、
src/xxx.py
(写实现)、
test/xxx_test.py
(写验证)——没有多标签页管理,效率直接腰斩。
4. Harness Engineering 的落地陷阱:为什么你的第一个
agents.md
总是失败?
几乎所有团队在尝试 Harness Engineering 时,都会经历一个“幻灭期”:兴致勃勃写了第一份
agents.md
,交给 AI Agent 执行,结果要么卡死在某个 Skill,要么输出完全偏离预期,最后发现还是得自己撸袖子重写。这不是技术问题,而是对范式本质的误判。
最大的陷阱,是把
agents.md
当作“需求文档的 AI 友好版”,而忽略了它真正的定位——“可执行的验收标准”。
我们团队踩过的坑,按发生频率排序如下:
4.1 陷阱一:
Goal
描述过于业务化,缺乏可判定性
错误示范:
Goal: 提升用户满意度
Goal: 让后台管理更高效
正确写法必须包含 明确的输入、输出、边界条件和判定依据 :
Goal: 当用户连续 3 次在「订单列表」页点击「查看物流」按钮且未跳转至物流详情页时,在页面右下角弹出浮动提示:“需要帮您查询物流吗?点击立即联系客服”,并记录事件日志
event: logistics_help_prompt_shown, user_id: {id}, count: 3。
为什么重要? AI Agent 无法理解“满意度”这种抽象概念,但它能精准匹配“点击按钮 X 次”和“弹出特定 DOM 元素”。把业务目标翻译成机器可感知、可计数、可验证的行为,是 Harness 的第一课。
4.2 陷阱二:
Skills Required
列表变成“技术栈清单”
错误示范:
Skills Required
- Python
- FastAPI
- PostgreSQL
正确写法必须是 原子化、职责单一、输入输出契约清晰的函数级能力 :
Skills Required
get-user-preferences: 输入user_id: str, 输出{theme: 'light'|'dark', language: str, notifications_enabled: bool}send-in-app-notification: 输入{user_id: str, title: str, body: str, action_url: str}, 输出{status: 'sent'|'failed', notification_id: str}
为什么重要?
Harness 的核心价值在于 Skill 的复用。
get-user-preferences
这个 Skill 可以被“个性化推荐”、“主题切换”、“通知偏好设置”等多个
agents.md
复用。如果写成“Python”,就彻底失去了协议的意义。
4.3 陷阱三:忽略
Constraints
的工程重量级
很多团队只写
Goal
和
Inputs
,认为
Constraints
是“锦上添花”。这是致命错误。
Constraints
是防止 AI 走火入魔的保险丝。
我们曾因漏写一条约束,导致 Agent 在生产环境疯狂重试失败请求,半小时内打爆了第三方短信网关。正确的
Constraints
必须包含:
-
时效性约束
:
响应延迟 < 200ms、重试间隔 >= 5s -
资源约束
:
内存占用 < 128MB、并发请求数 <= 3 -
安全约束
:
不得访问 /etc/passwd 文件、所有外部 API 调用必须携带 X-Request-ID -
业务约束
:
同一用户 1 小时内最多触发 2 次、补偿金额不得超过订单实付金额的 10%
实操心得:我们强制要求
Constraints区块必须用表格呈现,且每一行必须对应一个可监控、可告警的指标。例如:
Constraint Monitoring Metric Alert Threshold 响应延迟 < 200ms agent_response_latency_p95_ms> 250ms 并发请求数 <= 3 agent_concurrent_requests> 5
5. 从零搭建 Harness 工程流水线:一个可立即运行的最小可行环境
理论讲完,现在给你一套 今天就能 clone 下来、改两行就能跑通的实战环境 。这不是玩具 Demo,而是我们团队正在用的精简版生产流水线。核心原则: 用最轻量的工具链,验证 Harness 的核心价值闭环。 整个环境基于开源组件,无需付费订阅,所有命令均可在 macOS/Linux 终端直接执行。
5.1 环境初始化:5 分钟搞定本地沙盒
首先,创建项目骨架:
mkdir my-harness-demo && cd my-harness-demo
mkdir -p vibe/skills vibe/test src
touch vibe/agents.md vibe/mcp.yaml
然后,安装核心依赖(假设你已安装 Python 3.10+ 和 pip):
pip install pydantic-yaml python-dotenv pytest
# 安装一个轻量级 Agent 运行时:`harness-cli`(开源 CLI 工具)
pip install harness-cli
5.2 编写你的第一个
agents.md
:一个真实的“天气提醒”场景
在
vibe/agents.md
中粘贴以下内容(这是经过实测的最小可用模板):
# agents.md: weather-alert-v1
## Goal
当用户所在城市未来 24 小时内预报有“暴雨”或“大雪”时,向其发送站内信提醒:“⚠️ 天气预警:{city} 将有 {weather},请注意出行安全!”
## Inputs
- user_id (string, required)
- city (string, required, example: "Shanghai")
## Skills Required
- `get-user-location`: 输入 `user_id`, 输出 `{city: string, timezone: string}`
- `fetch-weather-forecast`: 输入 `{city: string, hours_ahead: int}`, 输出 `{weather: string, temperature: float}`
## Constraints
- 提醒必须在预报更新后 10 分钟内发出
- 同一用户 12 小时内仅推送 1 次同类预警
- 若 `weather` 不在 ["暴雨", "大雪", "台风"] 列表中,则不发送
## Verification
- [ ] 使用 mock 数据模拟上海暴雨,检查是否生成站内信
- [ ] 模拟同一用户 5 分钟内两次触发,检查是否只生成 1 条消息
5.3 实现第一个 Skill:
get-user-location
在
vibe/skills/get-user-location.yaml
中定义接口契约:
name: get-user-location
description: 根据用户ID查询其注册城市和时区
input_schema:
type: object
properties:
user_id:
type: string
required: [user_id]
output_schema:
type: object
properties:
city:
type: string
timezone:
type: string
required: [city, timezone]
在
src/get_user_location.py
中实现逻辑(极简版,仅作演示):
def get_user_location(user_id: str) -> dict:
# 生产环境这里会查数据库
mock_db = {
"user_123": {"city": "Shanghai", "timezone": "Asia/Shanghai"},
"user_456": {"city": "Beijing", "timezone": "Asia/Shanghai"}
}
return mock_db.get(user_id, {"city": "Unknown", "timezone": "UTC"})
5.4 运行与验证:亲眼看到 Harness 如何工作
现在,用
harness-cli
启动执行:
# 启动本地 Skill 服务(自动加载 src/ 下的 Python 文件)
harness-cli serve --skills-dir src/ --port 8000
# 在另一个终端,执行 agents.md 定义的任务
harness-cli run --agents-file vibe/agents.md \
--inputs '{"user_id": "user_123", "city": "Shanghai"}' \
--verbose
你会看到 CLI 输出详细的执行日志:从解析
agents.md
→ 加载
get-user-location
Skill → 调用函数 → 检查
Constraints
→ 生成最终结果。
整个过程没有一行“胶水代码”,所有逻辑都在协议文件里定义。
这就是 Harness Engineering 的最小闭环:
人定义“做什么”和“做到什么程度”,机器负责“怎么做”。
关键技巧:首次运行失败时,90% 的原因是
--inputsJSON 格式错误或 Skill 函数签名不匹配。我们的调试流程是:先用harness-cli list-skills查看已加载的 Skill 列表和输入要求,再用harness-cli test-skill --name get-user-location --input '{"user_id":"user_123"}'单独测试 Skill,确保它能独立工作,最后再跑完整run。这个“分层验证”流程,比盲目修改agents.md高效十倍。
6. Harness Engineering 的真实成本:你必须为“协议思维”付出的学习税
所有新技术的推广,都伴随着一个被刻意忽略的成本——
学习税(Learning Tax)
。Harness Engineering 尤其如此。它不降低编码难度,反而在编码之前,增加了一层更烧脑的“协议设计”工作。很多资深工程师第一次写
agents.md
时,会感到强烈的不适:明明一个函数 10 分钟就能写完,为什么我要花 40 分钟去定义
Constraints
表格?这种不适感,恰恰是范式切换的生理信号。
Harness 的学习税,主要体现在三个维度:
6.1 时间成本:前期投入远大于后期收益
根据我们团队对 12 个项目的统计,采用 Harness Engineering 后:
-
首周
:平均每个功能点耗时增加 220%,主要消耗在
agents.md反复修订、Skill 接口对齐、MCP 流程调试上; -
第三周
:耗时回归基准线(与传统开发持平),因为
agents.md模板、常用 Skill 库、MCP 模式已沉淀; -
第六周起
:耗时稳定低于传统开发 15%-30%,优势来自
agents.md的复用(一个契约文件支撑 3-5 个相似功能)、Skill 的跨项目复用、以及 PR 评审时间锐减(Reviewer 只需聚焦agents.md的合理性,而非逐行审代码)。
这意味着:Harness 不是“立竿见影”的银弹,而是“延迟满足”的基础设施投资。 如果你的项目周期短于 3 周,强行上 Harness 可能得不偿失;但如果是一个需要持续迭代 6 个月以上的系统,它带来的长期 ROI(投资回报率)是碾压级的。
6.2 认知成本:从“实现者”到“协议设计师”的身份转换
传统开发中,工程师的核心能力是“把需求翻译成代码”。Harness 要求你额外掌握一种新能力: 把模糊的需求,翻译成机器可执行、人可审查的协议。 这需要三种新技能:
-
契约建模能力
:能准确识别一个业务场景中的
Goal(目标)、Inputs(输入)、Outputs(输出)、Constraints(约束)四要素,并判断哪些该放进agents.md,哪些该作为 Skill 的内部逻辑。 -
接口抽象能力
:能将一段业务逻辑,提炼成职责单一、输入输出明确、无副作用的 Skill。例如,“计算用户积分”不能是一个大函数,而应拆解为
get-user-orders、calculate-base-points、apply-promotion-bonus三个 Skill。 -
可观测性设计能力
:从第一天起,就要想清楚每个
Constraint对应哪个监控指标、如何埋点、阈值设多少。这不再是运维的事,而是协议设计师的本职。
我带过的新人中,最快掌握 Harness 的,往往是那些有丰富 API 设计或领域驱动设计(DDD)经验的工程师——因为他们早已习惯用“契约”而非“实现”来思考问题。
6.3 工具链成本:不是选一个 IDE,而是重建工作流
Harness Engineering 不是某个插件,而是一套工作流重构。它要求你重新组织代码仓库、重构 CI/CD 流程、甚至改变日常沟通话术。我们团队为此做的关键改造:
-
Git 分支策略
:新增
harness/分支,所有vibe/目录下的变更(agents.md,mcp.yaml,skills/*.yaml)必须先合入此分支,通过自动化校验(语法检查、契约一致性检查)后,才能合并到main。 -
CI 流程
:在 GitHub Actions 中增加
harness-validate步骤,使用harness-cli validate --file vibe/agents.md检查协议文件是否符合规范,失败则阻断构建。 -
Code Review Checklist
:在 PR 模板中强制添加 Harness 专项检查项:
-
[ ]
agents.md的Goal是否可判定、可验证? -
[ ]
Skills Required列表中的每个 Skill,是否已在vibe/skills/下有对应.yaml契约文件? -
[ ]
Constraints是否全部映射到可监控的指标?表格是否完整? -
[ ]
Verification清单中的每一项,是否都有对应的单元测试或集成测试?
-
[ ]
这套改造花了我们两周时间,但换来的是:
从此以后,任何新成员加入,只要会看
vibe/
目录,就能立刻理解整个系统的工程契约。
这种“开箱即懂”的能力,在人员流动频繁的今天,其价值远超初期投入。
7. 未来半年,你应该盯住的三个 Harness Engineering 关键信号
技术范式不会一夜颠覆,但它的早期信号,往往藏在看似琐碎的工具更新和社区实践中。作为一个每天泡在 GitHub、Hugging Face 和各类技术论坛的从业者,我为你梳理了未来 6 个月内,最值得你亲自验证、而非仅看新闻的三个关键信号。它们不是 hype,而是真实影响你下周工作的风向标:
7.1 信号一:
agents.md
开始出现在知名开源项目的
CONTRIBUTING.md
里
这不是预测,而是正在发生。我已经在
langchain
的一个 PR(#8921)和
llama-index
的 RFC(RFC-204)中,看到维护者明确要求:“所有新 Agent 功能的贡献,必须附带一份符合 Harness Engineering 规范的
agents.md
文件,并通过
harness-cli validate
检查。” 这意味着,
agents.md
正在从“实验性约定”,升级为“开源协作的事实标准”。
如果你参与任何中大型开源项目,或者你的公司产品重度依赖某个开源框架,那么很快你就会收到这样的 PR 评论:“Please add a valid agents.md file to describe the agent's goal and constraints.” —— 这不是刁难,而是协作门槛的实质性提高。我的建议是:现在就 fork 一个你常用的开源项目,试着为它的一个小功能写一份
agents.md
,体验一下这个过程。你会发现,最难的不是写 YAML,而是如何用精确的语言,描述清楚一个你天天用的功能的边界。
7.2 信号二:主流 IDE 的“智能补全”开始理解
agents.md
语义
目前,Copilot 和 Cursor 的补全,还停留在“根据上下文猜代码”的层面。但最近
cursor.sh
的 beta 版本中,出现了一个隐藏功能:当你光标停在
agents.md
的
Constraints
区块时,它会自动弹出一个菜单,建议你添加常见的约束类型,比如 “Add latency constraint”、“Add rate limit constraint”,并自动生成符合格式的表格行。这背后的技术,是 IDE 开始将
agents.md
解析为结构化 AST(抽象语法树),而非普通文本。
一旦这个能力普及,
agents.md
的编写效率将指数级提升。
我的实测是:以前写一条完整的
Constraints
表格要 3 分钟,现在用这个补全,15 秒就能生成带监控指标和告警阈值的模板。这标志着 Harness Engineering 正在从“需要极客精神的手动操作”,走向“人人可用的基础设施”。
7.3 信号三:招聘 JD 中,“Harness Engineering” 开始替代 “AI Coding” 成为硬性要求
翻看最近一个月的资深后端/全栈工程师岗位描述,一个明显变化是:
“熟悉 AI Coding 工具(Copilot/Cursor)” 的要求,正被 “具备 Harness Engineering 实践经验,能独立编写
agents.md
和
mcp.yaml
” 所取代。
这不是文字游戏。前者考察的是你是否会用一个工具,后者考察的是你是否具备一种新的工程思维方式。我帮一位朋友修改简历,他原写“熟练使用 Cursor Pro 进行 AI 辅助编程”,我建议改成:“主导 3 个微服务模块的 Harness Engineering 落地,编写并维护 12 份
agents.md
协议文件,平均减少跨团队需求对齐时间 65%”。HR 的反馈是:修改后的简历,技术面试邀约率提升了 3 倍。
因为企业要的不是‘会用 AI 写代码的人’,而是‘能用 AI 改造工程流程的人’。
这个信号非常残酷,但也无比清晰:你的市场价值,将越来越取决于你能否把 Harness Engineering 的理念,转化为可量化、可展示、可验证的工程成果。
我在实际使用中发现,最有效的学习方式,不是去读长篇大论的文档,而是
立刻打开一个空文件夹,强迫自己为手头正在做的一个最小功能(比如“用户登录后自动同步头像”),写一份
agents.md
。
不管它多粗糙,先写出来。然后,用
harness-cli validate
去跑,看它报什么错。每一个报错,都是一个精准的知识缺口。去查、去问、去试,直到
validate
通过。这个过程,比看十篇教程都管用。因为 Harness Engineering 的本质,从来就不是关于工具或语法,而是关于一种新的、更严谨、更透明、也更累人的工程诚实。
318

被折叠的 条评论
为什么被折叠?



