AI Coding 的稳定性,不能只靠 Prompt:一次 Harness 工程化拆解
AI Coding 进入长流程之后,很多问题看起来像"模型不够聪明",实际更像"流程没有被工程化"。
一个模型可以会写代码、会解释需求、会调用工具,但这不等于它能稳定完成一条真实研发链路。真实任务里还有状态保存、阶段切换、权限控制、单测验证、部署确认、失败回退和人工审批。只靠一段越来越长的 CLAUDE.md 或系统提示词,很难长期覆盖这些约束。
这篇文章讨论的就是 Harness Engineering:把 AI 的工作方式,从"靠提示词提醒"变成"由外部结构约束"。
文章目录
- [AI Coding 的稳定性,不能只靠 Prompt:一次 Harness 工程化拆解](#AI Coding 的稳定性,不能只靠 Prompt:一次 Harness 工程化拆解)
-
- [1. 先定义:Harness 到底是什么](#1. 先定义:Harness 到底是什么)
- [2. 问题背景:为什么堆 Prompt 会到达上限](#2. 问题背景:为什么堆 Prompt 会到达上限)
- [3. 问题分析:AI Coding 常见的三类流程失败](#3. 问题分析:AI Coding 常见的三类流程失败)
-
- [3.1 上下文遗忘](#3.1 上下文遗忘)
- [3.2 状态漂移](#3.2 状态漂移)
- [3.3 验证绕过](#3.3 验证绕过)
- [4. 一个最小可用 Harness 应该长什么样](#4. 一个最小可用 Harness 应该长什么样)
-
- [4.1 极简常驻入口](#4.1 极简常驻入口)
- [4.2 状态文件](#4.2 状态文件)
- [4.3 职责隔离](#4.3 职责隔离)
- [4.4 门禁脚本](#4.4 门禁脚本)
- [4.5 可运行门禁 Demo](#4.5 可运行门禁 Demo)
- [4.6 评测样例](#4.6 评测样例)
- [5. 原文实践中最值得迁移的设计](#5. 原文实践中最值得迁移的设计)
-
- [5.1 主会话变薄](#5.1 主会话变薄)
- [5.2 文件交接替代口头交接](#5.2 文件交接替代口头交接)
- [5.3 门禁外置,而不是提醒模型自觉](#5.3 门禁外置,而不是提醒模型自觉)
- [6. 编排方式怎么选](#6. 编排方式怎么选)
- [7. 验证闭环:评测 Harness 不要让裁判下场干活](#7. 验证闭环:评测 Harness 不要让裁判下场干活)
- [8. 从零开始落地,可以按这个顺序](#8. 从零开始落地,可以按这个顺序)
-
- 第一步:把"必须验证"的动作写成脚本
- 第二步:把流程状态落盘
- [第三步:拆出 verifier](#第三步:拆出 verifier)
- [第四步:给 harness 做回归样例](#第四步:给 harness 做回归样例)
- [9. 边界:哪些场景不值得 Harness 化](#9. 边界:哪些场景不值得 Harness 化)
- [10. 结论:AI Coding 的工程重点在外部结构](#10. 结论:AI Coding 的工程重点在外部结构)
- 参考资料
1. 先定义:Harness 到底是什么
在 AI Coding 场景里,可以把 harness 理解成一套外部工程框架:
Harness = 规则入口 + 状态持久化 + 职责隔离 + 工具权限 + 门禁验证 + 评测回路。
它和 prompt 的区别在于:
| 对比项 | Prompt | Harness |
|---|---|---|
| 作用方式 | 告诉模型应该怎么做 | 把流程变成可执行约束 |
| 可靠性来源 | 模型理解与遵守 | 状态、脚本、hook、评测 |
| 失败方式 | 忘记、跳步、自我矛盾 | 被门禁拦截、回退、等待人确认 |
| 适合场景 | 短任务、低风险任务 | 长流程、多阶段、有验证和权限边界的任务 |
一个最小 Harness 可以先画成下面这条链路:
#mermaid-svg-C5OFqc1zI85hMujv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-C5OFqc1zI85hMujv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-C5OFqc1zI85hMujv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-C5OFqc1zI85hMujv .error-icon{fill:#552222;}#mermaid-svg-C5OFqc1zI85hMujv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-C5OFqc1zI85hMujv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-C5OFqc1zI85hMujv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-C5OFqc1zI85hMujv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-C5OFqc1zI85hMujv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-C5OFqc1zI85hMujv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-C5OFqc1zI85hMujv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-C5OFqc1zI85hMujv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-C5OFqc1zI85hMujv .marker.cross{stroke:#333333;}#mermaid-svg-C5OFqc1zI85hMujv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-C5OFqc1zI85hMujv p{margin:0;}#mermaid-svg-C5OFqc1zI85hMujv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-C5OFqc1zI85hMujv .cluster-label text{fill:#333;}#mermaid-svg-C5OFqc1zI85hMujv .cluster-label span{color:#333;}#mermaid-svg-C5OFqc1zI85hMujv .cluster-label span p{background-color:transparent;}#mermaid-svg-C5OFqc1zI85hMujv .label text,#mermaid-svg-C5OFqc1zI85hMujv span{fill:#333;color:#333;}#mermaid-svg-C5OFqc1zI85hMujv .node rect,#mermaid-svg-C5OFqc1zI85hMujv .node circle,#mermaid-svg-C5OFqc1zI85hMujv .node ellipse,#mermaid-svg-C5OFqc1zI85hMujv .node polygon,#mermaid-svg-C5OFqc1zI85hMujv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-C5OFqc1zI85hMujv .rough-node .label text,#mermaid-svg-C5OFqc1zI85hMujv .node .label text,#mermaid-svg-C5OFqc1zI85hMujv .image-shape .label,#mermaid-svg-C5OFqc1zI85hMujv .icon-shape .label{text-anchor:middle;}#mermaid-svg-C5OFqc1zI85hMujv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-C5OFqc1zI85hMujv .rough-node .label,#mermaid-svg-C5OFqc1zI85hMujv .node .label,#mermaid-svg-C5OFqc1zI85hMujv .image-shape .label,#mermaid-svg-C5OFqc1zI85hMujv .icon-shape .label{text-align:center;}#mermaid-svg-C5OFqc1zI85hMujv .node.clickable{cursor:pointer;}#mermaid-svg-C5OFqc1zI85hMujv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-C5OFqc1zI85hMujv .arrowheadPath{fill:#333333;}#mermaid-svg-C5OFqc1zI85hMujv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-C5OFqc1zI85hMujv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-C5OFqc1zI85hMujv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C5OFqc1zI85hMujv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-C5OFqc1zI85hMujv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C5OFqc1zI85hMujv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-C5OFqc1zI85hMujv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-C5OFqc1zI85hMujv .cluster text{fill:#333;}#mermaid-svg-C5OFqc1zI85hMujv .cluster span{color:#333;}#mermaid-svg-C5OFqc1zI85hMujv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-C5OFqc1zI85hMujv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-C5OFqc1zI85hMujv rect.text{fill:none;stroke-width:0;}#mermaid-svg-C5OFqc1zI85hMujv .icon-shape,#mermaid-svg-C5OFqc1zI85hMujv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C5OFqc1zI85hMujv .icon-shape p,#mermaid-svg-C5OFqc1zI85hMujv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-C5OFqc1zI85hMujv .icon-shape .label rect,#mermaid-svg-C5OFqc1zI85hMujv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C5OFqc1zI85hMujv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-C5OFqc1zI85hMujv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-C5OFqc1zI85hMujv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PASS
FAIL
用户目标
规则入口
状态文件 state.json
职责隔离 agent / 阶段产物
确定性门禁脚本
进入下一阶段
阻断并回退
评测样例回归
如果发布平台不渲染 Mermaid,也可以把这张图转成图片后插入。它表达的重点是:模型可以参与节点里的判断,但阶段推进必须经过外部可检查的门禁。
原文有一句表达很有代表性:模型供给智商,harness 供给纪律。为了避免把这句话写成绝对事实,本文更中性地说:当任务变长、工具变多、风险变高时,稳定性往往需要由模型外部的工程结构来补足。
2. 问题背景:为什么堆 Prompt 会到达上限
很多团队最开始都会走同一条路:把所有流程规范写进一个常驻说明文件。
比如:
- 开发前先确认需求。
- 改代码前先写测试。
- 提交前必须跑单测。
- 部署前必须合并主分支。
- 高风险命令必须询问用户。
短期看,这种方式有效。问题是规则越写越多,常驻上下文越来越重,模型真正用来理解代码和任务的空间反而被挤压。
这不是纯主观感受。Lost in the Middle 论文指出,长上下文模型并不总能稳定使用上下文中部的信息,相关信息在开头或结尾时表现更好,在中部时性能可能显著下降。RULER 也提醒,单纯测试"长文本里找针"不足以代表真实长上下文能力,还需要多跳、聚合等更复杂任务。
所以,长上下文不是免费的流程保险箱。把所有规则都塞进 prompt,只是把问题从"没有规则"变成"规则存在但可能被忽略"。
3. 问题分析:AI Coding 常见的三类流程失败
结合原文实践和公开资料,可以把 AI Coding 的流程失败归为三类。
3.1 上下文遗忘
模型不是没有看过规则,而是在长任务中,规则被大量代码、日志、工具输出和中间推理稀释。到后半段时,它可能忘记"下一步应该验证"或"这个操作需要人工确认"。
VILA-Lab 的 Dive-into-Claude-Code 仓库把 Claude Code 拆成模型循环、权限、上下文管理、工具路由、恢复等基础设施来看。它的一个核心观察是:Agent loop 本身并不复杂,真正复杂的是围绕它的系统工程。
3.2 状态漂移
长任务经常跨多个阶段:需求分析、方案设计、编码、编译、单测、接口测试、部署、验收。只靠对话历史保存状态,很容易出现"模型以为做过了,但实际产物不存在"的情况。
这类问题的解法不是让模型更努力回忆,而是让状态落盘。例如用 state.json 记录当前阶段、责任 agent、已完成产物、待执行门禁和失败原因。
3.3 验证绕过
AI 最容易让人误判的地方,是它会给出看似完整的验收叙述:
- "我已经完成修改。"
- "测试应该可以通过。"
- "这个方案是安全的。"
但工程上不能接受"应该"。验证必须落到确定性动作:编译是否真的跑过、单测是否真的通过、接口是否真的返回预期结果、危险命令是否真的被拦截。
Claude Code hooks 官方文档确认,PreToolUse 可以在工具调用执行前控制 allow、deny、ask 或 defer。这类机制的价值就在于:流程约束不再只依赖模型记忆,而可以在工具执行边界被拦住。
4. 一个最小可用 Harness 应该长什么样
原文中的 harness 很完整,包含多层配置、22 个 skills、12 个 commands、19 节点链、G1-G8 门禁和评测平台。但大多数团队不需要从这个规模开始。
更现实的起点是六个部件。
4.1 极简常驻入口
常驻入口只放最少内容:角色、基本代码偏好、流程触发条件、关键门禁索引。
不要把完整 TDD 指南、部署细则、评审模板全部常驻。它们应该按阶段加载,避免挤占主上下文。
4.2 状态文件
用一个结构化文件记录流程状态,例如:
json
{
"task_id": "feature-2026-08-04-001",
"intent": "FEATURE",
"risk": "HIGH",
"phase": "VERIFYING",
"required_outputs": [
"phases/requirements.md",
"phases/design.md",
"phases/verification.json"
],
"gates": {
"compile": "pass",
"unit_test": "pending",
"predeploy": "blocked"
}
}
这个文件的意义不是好看,而是让"流程走到哪"不再依赖模型记忆。
4.3 职责隔离
Claude Code 官方 subagents 文档说明,每个 subagent 启动时都有新的隔离上下文,不会看到主对话历史。这个机制适合把角色拆开:
developer:只负责实现。verifier:只负责检查。deployer:只负责部署预发。reviewer:只负责找风险。dispatcher:只负责读状态并决定下一步。
重点不是 agent 数量,而是输入输出边界。一个 agent 写 phases/design.md,另一个 agent 只读这个产物继续工作。这样比"大家在同一段对话里互相解释"更可审计。
4.4 门禁脚本
门禁应该尽量确定性。例如:
G1:需求产物是否存在。G2:设计文档是否包含验收标准。G3:编译是否通过。G4:单测是否通过。G5:关键接口测试是否通过。G6:证据文件是否完整。G7:部署确认是否存在。G8:生产发布是否由人确认。
这些门禁不应该只是"建议"。如果失败,就阻断流程,把状态退回到对应阶段。
4.5 可运行门禁 Demo
为了避免只停留在方法论,这里给一个最小可运行 demo。它不模拟完整研发流程,只验证一件事:流程能否独立于模型叙述,被外部脚本检查并阻断。
本地文件:
text
data/processed/harness-demo/
├─ state.json
├─ gate_check.py
└─ phases/
├─ requirements.md
├─ design.md
└─ verification.json
核心状态文件 state.json 记录任务阶段、必需产物和门禁状态:
json
{
"task_id": "feature-2026-08-04-001",
"intent": "FEATURE",
"risk": "HIGH",
"phase": "VERIFYING",
"required_outputs": [
"phases/requirements.md",
"phases/design.md",
"phases/verification.json"
],
"gates": {
"requirements_review": "pass",
"design_review": "pass",
"compile": "pass",
"unit_test": "pass",
"evidence": "pass"
}
}
门禁脚本只做确定性检查:字段是否存在、阶段产物是否存在、所有 gate 是否为 pass。这里保留核心代码:
python
import json
import sys
from pathlib import Path
REQUIRED_FIELDS = ["task_id", "intent", "risk", "phase", "required_outputs", "gates"]
def fail(message: str) -> None:
print(f"FAIL {message}")
raise SystemExit(1)
def main() -> None:
state_path = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("state.json")
if not state_path.exists():
fail(f"state file not found: {state_path}")
state = json.loads(state_path.read_text(encoding="utf-8-sig"))
missing_fields = [field for field in REQUIRED_FIELDS if field not in state]
if missing_fields:
fail(f"missing state fields: {', '.join(missing_fields)}")
root = state_path.parent
missing_outputs = [name for name in state["required_outputs"] if not (root / name).exists()]
if missing_outputs:
fail(f"missing phase outputs: {', '.join(missing_outputs)}")
failed_gates = [name for name, status in state["gates"].items() if status != "pass"]
if failed_gates:
fail(f"non-pass gates: {', '.join(failed_gates)}")
print(f"PASS task={state['task_id']} phase={state['phase']}")
print(f"checked_outputs={len(state['required_outputs'])}")
print(f"checked_gates={len(state['gates'])}")
if __name__ == "__main__":
main()
运行通过样例:
powershell
python data\processed\harness-demo\gate_check.py data\processed\harness-demo\state.json
真实输出:
text
PASS task=feature-2026-08-04-001 phase=VERIFYING
checked_outputs=3
checked_gates=5
再把 unit_test 临时改成 pending,脚本会阻断流程:
text
FAIL non-pass gates: unit_test
EXIT_CODE=1
这个 demo 很小,但它说明了 harness 的关键点:模型可以写"测试应该通过",但阶段推进不能相信这句话;只有状态、产物和门禁都通过,流程才进入下一步。
4.6 评测样例
Harness 本身也要被测试。否则每次改规则,都只能靠体感判断有没有变好。
可以先做 3 类样例:
| 样例类型 | 检查目标 |
|---|---|
| 低风险修复 | 是否能走最短流程,不引入过度评审 |
| 高风险功能 | 是否触发设计、单测、部署和验收门禁 |
| 故意失败任务 | 是否能发现编译失败、测试失败或缺失证据 |
SWE-bench 和 AgentBench 的共同启发是:评估 Agent 不能只看最终回答,要看它是否能在真实或半真实环境里完成任务。对团队内部 harness 来说,也应该尽量用可重复的测试任务和确定性评分,而不是只看一次演示是否顺利。
5. 原文实践中最值得迁移的设计
原文实践很复杂,但最值得迁移的不是"19 个节点"这个数字,而是三个设计原则。
5.1 主会话变薄
原文把主会话设计成一个"薄控制器":主会话不直接读所有产物、不直接判断业务细节,只执行 dispatcher 给出的下一步指令。
这个设计的价值在于减少污染。主会话不再同时承担需求分析、技术设计、编码、验证和部署,而是把职责交给不同 agent 和文件产物。
这和微服务里的 thin controller 有点像:控制器不承载业务复杂度,只负责接收输入、调用服务、返回结果。
5.2 文件交接替代口头交接
多 agent 系统最怕"聊天式交接"。一个 agent 说"我已经完成了设计",另一个 agent 信了,但文件里没有验收标准,后续就会一路错下去。
文件交接更慢,但更稳:
- 每一步有明确产物。
- 每个产物可以被 diff。
- 每个阶段能被恢复。
- 每次失败能定位到文件和门禁。
Apache Burr 的设计也体现了类似方向:用 action、transition 和 state 构建可观测、可测试的 AI 应用。无论具体框架怎么选,状态和转移显式化,都是长流程 Agent 的共同趋势。
5.3 门禁外置,而不是提醒模型自觉
"请你务必运行测试"是一条 prompt。
"没有测试结果文件就不能进入下一阶段"才是门禁。
这两者的可靠性差别很大。前者依赖模型遵守,后者依赖外部检查。Claude Code hooks、状态机、CI 脚本、schema 校验,本质上都在做同一件事:把关键约束从模型推理里拿出来。
6. 编排方式怎么选
原文对 Claude Code Workflow、Agent Team、dispatcher + 文件交接做了对比。这里整理成更通用的判断。
| 编排方式 | 适合场景 | 不适合场景 |
|---|---|---|
| Prompt-only | 短任务、一次性脚本、低风险修改 | 跨天任务、多阶段验证、权限复杂任务 |
| Workflow 脚本 | 单阶段、可并行、无人工确认、时长可控 | 需要人工门禁、跨 session 恢复、长构建任务 |
| Agent Team | 多人并行探索、多模块独立处理 | 严格顺序工序链、强状态一致性要求 |
| Dispatcher + 文件交接 | 有状态工序链、需要审计、需要恢复和人工确认 | 极短任务、强并行计算、无持久化需求 |
这里没有绝对最优。更合理的做法是混合使用:dispatcher 管控制流,Workflow 加速纯计算或并行评审,Team 处理独立探索任务。
7. 验证闭环:评测 Harness 不要让裁判下场干活
原文里一个很好的观点是:评测平台是评估者,不是执行者。
这句话很关键。假如被测 AI 没有部署,评测平台替它部署了;被测 AI 没有跑测试,评测平台替它跑了。那最后得到的分数就不再反映 harness 能力,而是反映评测平台帮了多少忙。
一个更稳的评测平台应该只检查:
- 产物是否存在。
- 状态是否符合 schema。
- 编译日志是否真实产生。
- 单测结果是否真实存在。
- 门禁失败时是否阻断。
- 高风险操作是否出现人工确认。
Scaling Laws for Agent Harnesses via Effective Feedback Compute 这篇论文也把 harness 放在工具使用、反馈、验证、记忆和修复这些外部机制里讨论。它的摘要指出,原始 token、工具调用、耗时或成本,并不能区分有用反馈和冗余交互,因此提出 EFC 这类 trace-level 指标来衡量反馈质量。
这对工程实践的启发是:不要只统计 AI 跑了多少轮、花了多少 token,要看每次反馈是否有效、是否被保留、是否推动了修复。
8. 从零开始落地,可以按这个顺序
如果你准备给团队的 AI Coding 流程加 harness,不建议第一天就搭完整状态机。可以按四步走。
第一步:把"必须验证"的动作写成脚本
先从最硬的动作开始:编译、单测、lint、接口 smoke test、敏感命令拦截。
这些动作不需要 LLM 判断,直接用脚本和 CI 检查。
第二步:把流程状态落盘
引入 state.json 或类似结构,记录当前阶段、下一步、必需产物、门禁状态。
这一步能解决大量"模型以为做过了"的问题。
第三步:拆出 verifier
先不要急着拆 10 个 agent。最值得优先拆的是 verifier。
让写代码的 agent 不负责最终验收,让 verifier 在干净上下文里只看产物和验收标准。这样能减少"自己审自己"的问题。
第四步:给 harness 做回归样例
每次改规则,都跑一组小样例:低风险修复、高风险功能、故意失败任务。只要这三类能稳定跑,harness 才有继续扩展的基础。
9. 边界:哪些场景不值得 Harness 化
Harness 不是越重越好。
这些场景通常不适合上复杂 harness:
- 一次性资料整理。
- 简单脚本或低风险文本修改。
- 没有外部验证标准的创意任务。
- 失败成本很低、人工检查更快的任务。
- 团队还没有稳定开发流程,连人类 SOP 都没定清楚的任务。
Harness 的前提是过程可观测。如果中间产物无法落盘、验收标准无法定义、失败也无法复现,那么加再多 agent 和状态机,也只是增加协调成本。
10. 结论:AI Coding 的工程重点在外部结构
AI Coding 的稳定性不能只靠模型自觉,也不能只靠更长的 prompt。长流程任务需要外部结构:状态要落盘,职责要隔离,权限要拦截,门禁要阻断,评测要可重复。上面的最小 demo 已经验证了一个基本闭环:当阶段产物存在且 gate 全部为 pass 时流程放行;当 unit_test 仍是 pending 时脚本返回 EXIT_CODE=1 并阻断。
可以用一句话概括:
Prompt 让模型知道应该怎么做,Harness 让系统保证关键步骤不能被跳过。
这不是否定 prompt 的价值。Prompt 仍然负责表达目标、传递上下文、约束输出格式。但当任务进入多阶段、多工具、多风险边界之后,prompt 应该退到合适的位置,把流程纪律交给更确定的工程机制。
参考资料
- 原文:微信公众号《AI 不缺智商缺纪律:一场 Harness 工程化实践》
- VILA-Lab:Dive-into-Claude-Code
- Claude Code Docs:Hooks reference
- Claude Code Docs:Create custom subagents
- Nelson F. Liu 等:Lost in the Middle: How Language Models Use Long Contexts
- Cheng-Ping Hsieh 等:RULER: What's the Real Context Size of Your Long-Context Language Models?
- Xuanliang Zhang 等:Scaling Laws for Agent Harnesses via Effective Feedback Compute
- SWE-bench:官方仓库
- AgentBench:ICLR 2024 页面
- Apache Burr:官网
- sd0x-dev-flow:GitHub 仓库
- VikingMem:arXiv HTML
- Sverklo:GitHub 仓库
- Codebase-Memory-MCP:GitHub 仓库
感谢阅读,记得点赞、关注、收藏,欢迎各位评论区交流!!!
