Harness Engineering:用agents.md重构软件工程契约

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 工具(内部知识库搜索增强插件),整个过程如下:

  1. 先建 vibe/ 目录 :这是约定俗成的根目录,存放所有 Harness 相关资产。
  2. vibe/agents.md :定义核心能力边界(如“支持从 Confluence、Notion、本地 Markdown 导入元数据”、“搜索结果需按语义相关性排序”)。
  3. 拆解 Skills :不是写函数,而是定义 Skill 接口。例如 fetch-confluence-pages Skill 的输入是 space_key last_modified_after ,输出是标准化的 PageDocument[] 结构体。具体实现用 Python 写,但接口契约在 skills/confluence.yaml 里声明。
  4. MCP (Model Control Protocol)编排 :在 vibe/mcp.yaml 中定义执行流:“先调用 fetch-confluence-pages → 对每个 PageDocument 调用 extract-keywords → 将结果存入向量库”。MCP 是纯声明式,不包含任何业务逻辑。
  5. 最后才写代码 :在 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% 的原因是 --inputs JSON 格式错误或 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 的本质,从来就不是关于工具或语法,而是关于一种新的、更严谨、更透明、也更累人的工程诚实。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值