AI Coding Agent 的真正战场:Harness 工程深度解析

37 阅读14分钟

模型决定智能上限,Harness 决定这种智能能否稳定、安全、可解释地转化为生产结果。

引言:为什么"套个壳"远远不够

2026 年,AI Coding Agent 已经从"能帮你补全代码"进化到"能独立完成工程任务"。但当你仔细拆解这些系统时会发现一个反直觉的事实:真正决定 Agent 能否在生产环境可靠工作的,不是模型本身,而是模型之外的 Harness 系统。

以 Claude Code 为例,逆向分析显示只有约 1.6% 的代码是 AI 决策逻辑(API 调用 + 响应解析),98.4% 是确定性基础设施——权限门禁、上下文管理、工具路由、错误恢复、会话持久化。DeepSeek Harness 更是把这个理念推到极致:连 Agent Loop 本身都是一个可替换的插件。

本文基于对 Claude Code 和 DeepSeek Harness 两套生产级系统的深入分析,提炼出 AI Agent Harness 的核心工程问题和设计范式。这不是两个产品的功能对比,而是关于如何让概率模型在真实世界中持续、安全、可恢复地工作的系统工程讨论。


一、Harness 到底在解决什么问题

一个最小的 Agent 实现只需要:

while not done:
    response = call_model(context)
    if response.has_tool_calls:
        results = execute_tools(response.tool_calls)
        context.append(results)
    else:
        return response.text

但进入真实产品后,你会发现这个循环远远不够。它没有回答:

问题域具体挑战
启动与边界这次运行用什么模型、什么工具、什么权限?谁决定的?能被覆盖吗?
上下文治理200K token 窗口怎么分配?长任务产出百万 token 怎么办?
行动安全模型要执行 rm -rf / 怎么拦?谁有权批准?
状态连续进程崩了怎么恢复?中断后文件还在原来状态吗?
完成判定模型说"完成了",真的完成了吗?测试跑了吗?
多端协作CLI、IDE、Web、SDK 怎么共享同一套执行语义?

Harness 就是回答这些问题的完整系统。它位于用户/应用、模型与真实执行环境之间,负责:

  1. 组合配置——决定每次运行的能力和边界
  2. 构造上下文——在有限窗口内提供有效工作集
  3. 调度执行——把模型意图变成安全的真实动作
  4. 管理状态——让长任务能中断、恢复、分叉
  5. 判断完成——用证据而非自然语言确认任务结束

二、两种设计哲学:极致可组合 vs 极致确定性

DeepSeek Harness:"Everything is a Plugin"

DeepSeek Harness 以 Cordis 为运行时骨架,把一切都做成可替换插件——包括 Agent Loop 本身。

Cordis Kernel (极小核心)
├── Model Adapters (deepseek-v4 / claude / openai-compatible)
├── Tools (file / shell / web-search)
├── Sessions (会话状态 — 也是插件)
├── Sandboxes (隔离执行 — 也是插件)
├── Loops (Agent 循环策略 — 也是插件!)
└── Storage (持久化 — 也是插件)

Cordis 核心只做三件事:生命周期管理、插件依赖解析、上下文传播。关键创新是"可逆性"——每个插件产生的副作用都被跟踪,卸载时自动清理。这意味着你可以在运行时安全地热替换一个有问题的工具插件,而不影响其他能力。

Claude Code:"Thin Brain, Thick OS"

Claude Code 走了另一条路:极简主循环 + 极厚基础设施。

核心 while-loop 信任模型做所有规划决策,不做显式 DAG 或状态机。但围绕这个循环,构建了层层确定性保障:

  • 7 种权限模式 + ML 风险分类器
  • 5 层渐进式上下文压缩
  • 动态工具池(内置 + MCP + 条件加载)
  • JSONL 追加式会话轨迹
  • Sub-agent 上下文隔离
  • Hooks 生命周期拦截
  • Managed Settings 企业策略

为什么不做显式规划? Anthropic 的判断是:模型自带规划能力(Extended Thinking),确定性规划器反而会限制模型。而且模型升级后自动获得更好的规划,不需要改 Harness 代码。

本质区别

DeepSeek Harness 回答: "如何让【任何模型】变成可靠的 agent?"
→ 它是一个操作系统内核

Claude Code 回答: "如何让【Claude 模型】安全地在用户电脑上做事?"
→ 它是一个产品应用

三、上下文工程:Agent 的认知供应链

模型看到的不是全部事实,而是一个精心构造的投影

这是 Harness 区别于普通 Chat 封装的核心。它不是把"所有已知信息"塞进请求,而是把不同生命周期的信息编译成当前工作集。

信息类型加载时机生命周期目的
System Prompt每次请求产品级角色、协议、行为约束
项目指令 (CLAUDE.md)会话启动仓库级架构规范、构建命令、团队规则
工具 Schema每次请求前缀运行时告诉模型能做什么
会话历史累积 + 压缩当前 Session因果链和工作进展
长期记忆按相关性召回跨会话项目经验和稳定偏好
Skills被调用时按需完整领域知识和工作流

关键设计约束:知识、能力、历史必须分层。

把三类信息都塞入 System Prompt 会导致:固定前缀过大、无关知识长期占 Token、工具 Schema 爆炸、权限边界不清。

五层压缩:在信息保真与预算之间的受控折中

Claude Code 的 5 层 Compaction Pipeline 是上下文工程的教科书:

Layer 1: 源头截断
  单次工具返回 > 50K chars → 模型摘要替换原始结果

Layer 2: 工具结果压缩
  旧的 file reads / shell output / grep 结果优先回收

Layer 3: 对话压缩
  早期 user/assistant 来回被 AI 摘要替代

Layer 4: Sub-agent 隔离
  重型探索消耗 100K+ tokens,只返回结论(几百 tokens)

Layer 5: 自动压缩触发
  接近窗口限制时全局压缩,用户无感继续

核心思想:Context 不是 Transcript 的同义词,而是从完整事实和持久状态中构造出的当前认知工作集。

DeepSeek 的方案:事实追加,视图派生

DeepSeek Harness 把"耐久事实"与"模型当前可见视图"分离。Session Event Log 保留全量证据,Surface 用摘要节点替换一段可见历史:

持久事件 (append-only) → 支持审计、恢复、回放
    ↓ derive
当前 Surface → 经过 replace/shadow 后的模型可见视图
    ↓ project
模型请求 → 实际提交给 LLM 的消息

日志保留全量证据,压缩只改变视图投影。这意味着你可以从任意历史点 fork、resume 或 replay,而不会丢失原始信息。

Prompt Cache 反向塑造架构

一个不直观但极其重要的约束:

逻辑上等价的动态重排,可能因为破坏缓存前缀而显著增加成本。

因此,工具池变化必须兼顾稳定排序;新增信息应放在后缀或按需加载,而不是频繁改变公共前缀。性能约束在反向塑造架构设计。


四、工具执行:从模型意图到受控现实

模型只是提出请求,Harness 才拥有执行权

这是整个系统的因果边界:

模型输出 tool_use → 行动尚未发生
Harness 执行工具 → 行动才真正发生
Harness 返回 tool_result → 模型获得观察

一次工具调用的完整管线:

模型提出调用
    → Schema 校验(参数结构是否正确)
    → 语义校验(路径是否在工作区内)
    → PreHook(可修改输入或阻止)
    → 权限判定(当前主体是否获准)
    → 执行 handler
    → PostHook(可审计或追加处理)
    → 结果标准化 + 大小限制
    → 配对 tool_result 写回消息

三个检查不能混为一谈: Schema 判断格式、语义校验判断环境适用性、权限判断授权。它们必须依次发生。

并发:不是简单的 Promise.all

function executeToolBatch(toolCalls):
    batches = partitionByConurrency(toolCalls)
    for batch in batches:
        if batch.isConcurrencySafe:  // 纯读取
            results = runWithLimit(batch.calls, maxConcurrency)
        else:  // 写操作
            results = runSerially(batch.calls)
        // 关键:结果按模型原始调用顺序提交
        yieldEach(results)

无论并发还是串行,结果都按原始调用顺序产出。这同时获得吞吐与可回放确定性。

Capability Seam:同一工具,不同后端

DeepSeek Harness 的 Capability Seam 把一个能力拆成三个角色:

角色包含什么不应该包含什么
Service Definition接口、参数、返回值、错误契约具体实现
Provider本地/沙箱/远程的具体实现业务编排
Consumer工具对能力的使用对某个 Provider 的硬编码

这意味着同一个 Read/Write/Bash 工具逻辑,可以在本地、Docker 沙箱或远程 E2B 环境中运行,只需要替换 Provider。


五、安全控制:不能只靠 Prompt 说"请不要"

Claude Code:多层正交防御

控制机制回答的问题强制点
工具可见性模型是否知道这项能力工具组装阶段
Deny/Allow Rules某工具/资源是否明确禁止或允许规则引擎
Permission Mode默认自主性和交互策略会话级
Auto Classifier此动作是否需要人工确认独立 ML 回路
Hooks组织是否要阻止/记录/追加审批生命周期事件
Sandbox即使执行,最多影响哪些资源OS 级隔离
Managed Settings企业要求是否不可覆盖最高优先级配置

关键认知:权限回答"是否同意执行",Sandbox 回答"实际最多能影响什么"。二者正交。

DeepSeek Harness:Capability-Based Security

Plugin A 声明需要:
    cap:fs:read(/workspace/*)
    cap:shell:exec(git, npm)

Runtime 授权:
    ✓ fs:read /workspace/src/main.ts
    ✗ fs:read /etc/passwd (未授权路径)

插件只拥有被显式授予的 capabilities。这是最小权限原则的编程语言级实现——工具插件不能访问超出其声明范围的资源,即使它运行在高权限进程中。

Auto Mode:第二个模型回路

Claude Code 内部可能同时存在两个模型:

  • 主模型:决定要做什么
  • 权限分类模型:判断动作能否自动执行

分类器降低确认疲劳(不用每次都点批准),但不应成为唯一安全边界。两个模型的目标、延迟和错误代价完全不同。


六、状态连续性:四种状态不能混淆

长任务能够持续运行,靠的不是模型一直"记得",而是 Harness 把不同生命周期的状态分别保存。

状态类型保存什么恢复特点
消息事实tool_use / tool_result / 用户输入 / 模型输出强调因果完整
模型工作视图系统提示 + 摘要 + 最近历史每轮根据预算重新投影
持久工作状态任务、依赖、计划、验收标准不随上下文压缩消失
执行实体状态Shell / 后台任务 / 子 Agent有独立状态机
外部环境状态文件 / Git / 数据库 / 云资源不因恢复 JSONL 自动回到原状态

一个关键边界: 恢复会话轨迹(JSONL),不代表恢复真实世界。Resume 后,Harness 必须重新核对重要的外部事实。

完成判定:模型停止不等于任务完成

当模型不再发出工具调用时,可能是:

  • 任务确实完成了
  • 忘记验证了
  • 缺少权限
  • 没看见后台结果
  • 把局部成功误认为整体完成

因此,"模型准备结束"只能触发一次候选停止,真正的出口需要 Completion Gate:

  1. 是否仍有未完成的 Task?
  2. 是否仍有测试/后台任务在运行?
  3. 是否有待处理的权限请求?
  4. Stop Hook 是否提出新的阻断条件?
  5. 关键结论是否有与任务类型匹配的完成证据?
任务类型典型完成证据仅有文本为什么不够
代码修改文件差异 + 测试通过代码可能未写入或不可运行
外部写入返回对象 ID + 回读确认请求发出不代表落库成功
审批流程审批实例终态创建流程不等于流程通过

七、扩展生态:不是一个插件接口能解决的

Claude Code 的扩展体系不是一个万能插件接口,而是一组处于不同生命周期、上下文成本和强制等级的接入面:

需求更合适的接入面原因
每轮必须知道的规范CLAUDE.md启动加载,持续可见
仅某类文件适用的规范Rules条件加载,降低无关上下文
偶尔使用的领域知识Skill按需进入上下文
调用外部系统MCP提供真实外部动作
每次改文件后强制扫描Hook确定性执行
大量搜索但只需结论Sub-agent独立上下文,摘要返回
跨团队发布整套能力Plugin组合、版本和分发

扩展分层是系统完整性的重要体现,不能简化成"它支持插件"。


八、多 Agent 协作:不是开更多线程那么简单

五种并行模式各有边界

模式上下文文件隔离典型用途
Sub-agent独立,摘要返回可选 worktree研究、验证
Background Task任务内异步不隔离长命令
Agent View多个独立会话可结合 worktree同时委派多个独立任务
Agent Team独立,可互发消息不自动隔离需要协调的依赖任务
Worktree/Batch独立会话是并行代码修改

三种隔离维度必须分别设计

  1. 上下文隔离:不同 Agent 不共享完整会话历史
  2. 能力隔离:不同 Agent 获得不同工具和权限
  3. 环境隔离:不同 Agent 使用独立 worktree 或容器

Sub-agent 主要解决前两项,Worktree 解决第三项。Team 增加通信协调,但不自动完成环境隔离。

多 Agent 不是 Harness 成熟度的简单倍增器。 任务可分解性和结果合并成本决定其实际价值。


九、从对比中提炼的设计原则

原则体现通用意义
模型与执行器分离Tool Use 与真实执行分离不让概率模型直接拥有副作用
知识、能力、历史分层CLAUDE.md / Skill / MCP / Session避免所有内容长期塞入 Prompt
概率指导、确定性强制Prompt 对比 Rules/Hook/Sandbox关键边界不能只靠自然语言
状态追加、视图压缩JSONL / Compact / Sidechain保留轨迹,动态构造工作集
恢复属于正常流程Transition / Fallback / 有限重试故障处理可测试、可预算
稳定前缀优先Tool 排序 / Cache / 延迟加载性能约束反向塑造架构
扩展按生命周期分层Skill / MCP / Hook / Agent / Plugin不用万能接口承载全部责任
并行与隔离分开Agent 协作 + Worktree 文件隔离明确上下文、能力和环境三维度
Harness 必须单独评测Feature Gate / OTel / Ablation不把系统效果全部归因于模型

十、战略判断与适用边界

DeepSeek 赌 "Harness is the Moat"

  • 模型能力会趋同
  • 但 production-grade 的 agent runtime 有巨大工程壁垒
  • 开源生态网络效应一旦形成,很难被取代
  • 类比:Linux kernel 本身不赚钱,但围绕它的生态价值万亿

Claude Code 赌 "Model is the Moat"

  • 只要模型持续领先,harness 只需"把模型伺候好"
  • System prompt 与模型的深度耦合是竞争壁垒
  • 终端用户不关心架构是否优雅,只关心"能不能帮我写好代码"
  • 类比:iPhone 不需要开放硬件接口,靠体验赢

适用场景判断

如果你要...更适合的方向
在生产中部署 agent 服务可组合运行时(DSH 风格)
个人日常编码提效深度调优产品(Claude Code 风格)
需要完整审计链Event Sourcing + append-only log
需要多模型降本模型无关适配层
追求单一场景极致体验模型锁定 + prompt 深度耦合
构建企业级 Agent 平台多层配置作用域 + Managed Settings

结语:下一个十年的基础设施

将 Coding Agent 描述成"会改代码的 AI"没有错,但远远不完整。更准确的判断是:

当前的 AI Agent 系统正在把 Coding 场景中验证过的模型运行、能力执行、状态连续性和策略治理机制,产品化为跨本地、云端和嵌入式应用的智能运行时。

它最值得投入的不是某个隐藏 Prompt,也不是某个工具或循环,而是如何让一个概率模型在真实世界中持续工作,同时保持可控、可恢复、可扩展和可治理。

模型能力在快速趋同。Harness 工程——这些看不见的 98.4%——才是下一个阶段真正的竞争壁垒和基础设施。


本文基于 2026 年 8 月对 Claude Code (生产版) 和 DeepSeek Harness (v0.1 Developer Preview) 的架构分析。分析综合官方文档、开源代码、第三方研究论文和历史版本材料。

参考资料:

  • Jiacheng Liu et al., "Dive into Claude Code: The Design Space of Today's and Future AI Agent Systems" (arXiv 2604.14228), 2026
  • DeepSeek Harness Official Architecture Documentation
  • Cordis: A Programming Paradigm for Spatiotemporal Composability (Paper Draft, 2026-08-13)
  • Claude Code Official Documentation (code.claude.com)
  • VILA-Lab 46-page Reverse Engineering Analysis