<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Harness - DJJ</title><link>https://blog.pdjjq.org/tags/harness/</link><description>反抗吧，朋友！</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 29 Sep 2026 21:50:10 +0800</lastBuildDate><atom:link href="https://blog.pdjjq.org/tags/harness/index.xml" rel="self" type="application/rss+xml"/><item><title>Harness for Roleplay (Part 1)</title><link>https://blog.pdjjq.org/post/harness-for-roleplay-part-1-1mtu3f.html</link><pubDate>Tue, 29 Sep 2026 21:50:10 +0800</pubDate><guid>https://blog.pdjjq.org/post/harness-for-roleplay-part-1-1mtu3f.html</guid><description>&lt;p>我很早之前在小冰工作, 后面在 Crushon 和 Tipsy 都工作过, 很不幸, 他们都是做 AI as Beings 类的产品.&lt;/p>
&lt;p>我大概在 2024 年的时候写过一篇 &lt;a href="https://blog.pdjjq.org/post/is-there-a-threshold-for-character-chat-1yq84v">blog&lt;/a> 其中有这样的观点:&lt;/p>
&lt;blockquote>
&lt;p>人类始终没有意识到, 自己有多么喜欢戏剧.&lt;/p>&lt;/blockquote>
&lt;p>我依然持有这个观点.&lt;/p>
&lt;p>戏剧或 roleplay 可能是人类最容易接受的娱乐方式之一。游戏里有 RPG、ARPG，有各种角色扮演与冒险，电影、电视剧本质上也是如此。提供剧情、新的体验和一个全新视角，单是去体验本身，就已经具备极好的沉浸感与娱乐价值。&lt;/p>
&lt;p>我在 2024 年时就提到过，后续的发展会是多模态模型（包含图像、音频等），除此之外还会有多角色，以及更精准获取用户的运营能力。不过找用户如今已是非常技术化的问题，现在的运营难度比起一二十年前要大得多。而从实际在 Tipsy 的经历来看，我认为 Tipsy 的技术也并没有多领先。&lt;/p>
&lt;p>更值得思考的问题是：随着模型能力越来越强，仅仅靠纯聊天或对白这种形式，已经无法满足所有用户的需求了。纯 chat 只适合比较初级的阶段，到了 2026 年，情况应该有所变化，仅靠对话支撑的娱乐消费形式绝对不再可靠和稳定。&lt;/p>
&lt;p>随着技术发展，roleplay 也需要像 coding 一样，拥有一套坚固的生态和组件来支撑运行。&lt;/p>
&lt;p>分析一下 coding harness：&lt;br>
说白了 harness 就是鞍具，用来驯服 agent。但现在 harness 已经不仅是驯服模型，而是怎样更充分地利用模型能力，安全、稳定、快速地完成工作。在生产力方面，它需要具备：&lt;br>
• Sub-agent&lt;br>
• Context 管理&lt;br>
• 工具管理&lt;br>
• 预算管理&lt;br>
• Workflow 与 teams 协同能力&lt;/p>
&lt;p>但这些对于角色扮演来说还远远不够。&lt;/p>
&lt;p>现在的角色定义虽然有了一些进阶探索（比如 SillyTavern / 酒馆这类工具支持 Character Card V3，可以定义角色图片、描述、性格、背景以及 Lorebook，还能接入插件），但依然存在很大短板：&lt;/p>
&lt;ol>
&lt;li>Context 管理与 prompt 管理仍然不足。&lt;/li>
&lt;li>角色间的信息可见性（哪些事情该知道、哪些不该知道）缺乏控制。&lt;/li>
&lt;li>多角色交互非常粗暴。目前的处理更像是一个全知全能的模型在扮演某个角色来推进，这种模式差得很远。&lt;/li>
&lt;/ol>
&lt;p>因此，我们需要一套专门为 roleplay 设计的 harness。原因在于：&lt;/p>
&lt;ol>
&lt;li>涉及工具使用和 agent 间通信时，绝非单纯调用一次模型就能解决，往往需要在模型间多次调用。&lt;/li>
&lt;li>随着剧情（本子）扩展，世界书可能会直接塞爆整个上下文，必须有更好的 context 管理手段。&lt;/li>
&lt;li>纯粹的 chatbot 已经不够用了，整个生态需要的是真正的 roleplay agent。&lt;/li>
&lt;/ol>
&lt;p>这套 roleplay harness 需要提供以下能力：&lt;br>
• 基础的角色扮演能力&lt;br>
• 主动交互能力：主动找用户聊天、告知信息并推进剧情&lt;br>
• 多角色协同&lt;br>
• 语音支持&lt;br>
• 渐进式暴露（这必然离不开工具调用）&lt;br>
• 多模态生成（生图、生视频等）&lt;/p>
&lt;p>这是一个相当复杂的过程。&lt;/p>
&lt;p>目前行业里大家做得并不好：真正赚钱的情感陪伴产品都在吃老本，从 2023 年到现在几乎没有任何变化，这令人难以理解；而有技术能力的人又大多聚焦在生产力工具的 harness 和 agent 上。生产力工具表面上看与付费能力挂钩更紧密，但角色扮演这类娱乐化场景所能释放的消费潜力，实际上可能更高。&lt;/p>
&lt;p>归根结底，做这套 harness 的目标，是建立一个包含创作者、消费者及完整能力的生态，去支持创作者的分享与作品的分发。&lt;/p>
&lt;p>这应该是一个非常大的工程。&lt;/p>
&lt;p>我认为 character 这个东西未来会成为 AI 的灵魂，就像我非常喜欢的电影《Her》里面一样。在初始状态下，一个 AI 就应该是有角色、有灵魂的状态。换句话说，它应该知道自己是谁、想要做什么，以及你和它的交互方式会是什么样。&lt;/p>
&lt;p>另外一点，我觉得现在还缺少一种生态。我们当然可以看到像 Risu 或者 char.hub 这些产品，它们确实提供了一些所谓的分享能力，但这种分享还远远不够：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>非常不工程化：它分享出来的东西，你可能会觉得拿来用还行，但如果我想去二次创作和改编，想像是给代码repo 提 PR 一样去协作，做得到吗？做不到。整个发布和协作机制是非常不完善的。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>消费侧缺少更好的能力整合：现在的模型和厂商迭代速度非常快，有些用户可能青睐某些特定模型的思考能力或表达能力。这种情况下，我们怎么可能只去做纯粹用 context window 来存放记忆这么简单的事情？&lt;/p>
&lt;/li>
&lt;li>
&lt;p>消费侧其实欠缺的东西更多。现在的生图、生模型、3D、语音、TTS、ASR，这些能力进步速度已经非常非常快了。&lt;/p>
&lt;blockquote>
&lt;p>我其实会觉得我们需要一个更开放的生态，像是 OpenRouter、其他的一些聚合商，或者 Coding Plan 这种各种各样的东西，它们能做的事情其实非常多。我们不要总想着圈地自萌，把用户圈起来、剩下的东西做个分佣就结束了，我觉得这非常不合理。&lt;/p>
&lt;p>因为创作者其实可以用自己的创作能力去变现，而这种变现不是说一直给你写 character 就完了，我们需要一些更好的、更适应时代的新创作者&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;/ol>
&lt;p>甚至我认为，在你和 character、和 story 展开互动的整个发展过程中，我们需要提供更好的底层能力来支撑，比如 memory、用户的参与度，甚至包括一些天马行空的创造力。这些东西都应该被系统化地支持，而不是用现在这种粗糙笨拙的方式去做，体验非常不好。&lt;/p>
&lt;p>‍&lt;/p></description></item><item><title>Tager: Harness</title><link>https://blog.pdjjq.org/post/taker-harness-zwha5w.html</link><pubDate>Tue, 07 Jul 2026 14:34:47 +0800</pubDate><guid>https://blog.pdjjq.org/post/taker-harness-zwha5w.html</guid><description>&lt;h1 id="agent-harness让模型在真实系统中可靠工作">Agent Harness：让模型在真实系统中可靠工作&lt;a class="heading-anchor" href="#agent-harness%e8%ae%a9%e6%a8%a1%e5%9e%8b%e5%9c%a8%e7%9c%9f%e5%ae%9e%e7%b3%bb%e7%bb%9f%e4%b8%ad%e5%8f%af%e9%9d%a0%e5%b7%a5%e4%bd%9c" aria-label="本节链接">#&lt;/a>
&lt;/h1>&lt;h2 id="1-核心范式agent--model--harness">1. 核心范式：Agent = Model + Harness&lt;a class="heading-anchor" href="#1-%e6%a0%b8%e5%bf%83%e8%8c%83%e5%bc%8fagent--model--harness" aria-label="本节链接">#&lt;/a>
&lt;/h2>&lt;p>一个生产级 Agent 不是&amp;quot;一个更聪明的模型&amp;quot;，而是两部分组成的复合系统：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;br />组成&lt;/th>
&lt;th>&lt;br />角色类比&lt;/th>
&lt;th>&lt;br />职责&lt;/th>
&lt;th>&lt;br />本质特征&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;br />&lt;strong>Model&lt;/strong>&lt;/td>
&lt;td>&lt;br />CPU&lt;/td>
&lt;td>&lt;br />阅读上下文、推理、决定下一步动作&lt;/td>
&lt;td>&lt;br />无状态、无外设、受上下文窗口限制&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />&lt;strong>Harness&lt;/strong>&lt;/td>
&lt;td>&lt;br />操作系统&lt;/td>
&lt;td>&lt;br />上下文加载、工具编排、权限隔离、记忆管理、会话生命周期、持久化、观测、重试、人类介入&lt;/td>
&lt;td>&lt;br />确定性代码，是模型之外的全部执行支架&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>剥离 Harness，模型本身​&lt;strong>读不了代码库、跑不了测试、也无法在跨越数天的异步任务里保持记忆连贯&lt;/strong>。它只能生成 token。&lt;/p>
&lt;p>核心循环是 ​&lt;strong>ReAct（Reason + Act）&lt;/strong> ：模型读上下文 → 决定动作 → Harness 通过沙箱/API 执行 → 把观察结果（Observation）反哺给模型 → 循环直到任务完成。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>工程启示&lt;/strong>：评估 Agent 能力应当评估「模型 + Harness 配置」整体，而非单看基座模型。一个设计精良的 Harness 能托住弱模型的底线，也能在强模型出现&amp;quot;上下文腐烂&amp;quot;或逻辑幻觉时，通过强制验证循环把它重新锚定回真实任务。&lt;/p>&lt;/blockquote>
&lt;h3 id="参考架构">参考架构&lt;a class="heading-anchor" href="#%e5%8f%82%e8%80%83%e6%9e%b6%e6%9e%84" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>把 &lt;strong>控制平面（Harness）&lt;/strong> 与 &lt;strong>执行/计算环境&lt;/strong> 分离，是安全、耐久、可扩展的基础——避免把高价值凭证直接暴露到模型生成代码的运行环境里，同时支持快照、重放与容器失效后的恢复。&lt;/p>
&lt;p>暂时无法在飞书文档外展示此内容&lt;/p>
&lt;p>下面分两条主线展开：&lt;strong>内部（内稳定）&lt;/strong> 和 ​&lt;strong>外界（外部影响）&lt;/strong> 。&lt;/p>
&lt;h2 id="2-内部内稳定让模型长时间不跑偏">2. 内部：内稳定——让模型长时间不跑偏&lt;a class="heading-anchor" href="#2-%e5%86%85%e9%83%a8%e5%86%85%e7%a8%b3%e5%ae%9a%e8%ae%a9%e6%a8%a1%e5%9e%8b%e9%95%bf%e6%97%b6%e9%97%b4%e4%b8%8d%e8%b7%91%e5%81%8f" aria-label="本节链接">#&lt;/a>
&lt;/h2>&lt;p>长时 Agent 的第一个硬问题不是&amp;quot;会不会调用工具&amp;quot;，而是&amp;quot;会不会在第十轮后忘掉自己在干什么&amp;quot;。内稳定主要由 &lt;strong>Context + State + Retry + 模型原生特性&lt;/strong> 四块支撑。&lt;/p>
&lt;h3 id="21-context-管理与-compact-压缩">2.1 Context 管理与 Compact 压缩&lt;a class="heading-anchor" href="#21-context-%e7%ae%a1%e7%90%86%e4%b8%8e-compact-%e5%8e%8b%e7%bc%a9" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>上下文窗口是有限且昂贵的资源。原始工具输出（几千行日志、全量查询结果）会迅速填满窗口，导致信噪比骤降——这就是 ​&lt;strong>上下文腐烂（Context Rot）&lt;/strong> ，会直接削弱推理能力与任务完成率。&lt;/p>
&lt;p>生产级 Harness 摒弃&amp;quot;把所有历史无脑追加&amp;quot;的策略，改用动态上下文管理：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Compact（压缩）&lt;/strong> ​：窗口使用接近阈值时，后台智能总结并卸载较旧上下文，把核心发现提炼为高密度结构化记忆块（JSON/YAML），作为持久化提示注入下一轮。&lt;strong>直接让 API 抛 context-limit 错误，在生产里不可接受。&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Tool-Call Offloading（工具输出卸载）&lt;/strong> ：对庞大的工具输出做动态截断，上下文里只保留头部和尾部 token（提供执行状态），完整结果写入（虚拟）文件系统，模型需要时按需读取，保持核心推理流纯净。&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>关键认知&lt;/strong>​：上下文窗口只是模型的​&lt;strong>工作记忆&lt;/strong>​，不应承担系统&lt;strong>完整状态仓库&lt;/strong>的角色。仅靠 compaction 不够——没有良好的任务分解和阶段性收尾，模型会留下半完成状态，下一轮只能靠猜。&lt;/p>&lt;/blockquote>
&lt;h3 id="22-目标漂移goal-drift的监测与治理">2.2 目标漂移（Goal Drift）的监测与治理&lt;a class="heading-anchor" href="#22-%e7%9b%ae%e6%a0%87%e6%bc%82%e7%a7%bbgoal-drift%e7%9a%84%e7%9b%91%e6%b5%8b%e4%b8%8e%e6%b2%bb%e7%90%86" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>模型长时间无监督自治时，即便初始提示再清晰，行为与推理也会逐渐偏移。这是多智能体系统崩溃的核心诱因之一。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;br />漂移类型&lt;/th>
&lt;th>&lt;br />表现机制&lt;/th>
&lt;th>&lt;br />检测指标&lt;/th>
&lt;th>&lt;br />治理策略&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;br />&lt;strong>语义漂移&lt;/strong>&lt;/td>
&lt;td>&lt;br />长上下文中倾向模式匹配，被先前噪声/对抗 token/自身冗余文本带偏，压倒初始系统提示&lt;/td>
&lt;td>&lt;br />与目标的余弦相似度衰减、目标遵循度分数下降&lt;/td>
&lt;td>&lt;br />情景记忆巩固（定期修剪+总结上下文）、用跨模型验证代替自我评估&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />&lt;strong>协调漂移&lt;/strong>&lt;/td>
&lt;td>&lt;br />多代理协作中共识协议崩溃，或&amp;quot;幻觉放大&amp;quot;——把某代理的错误推断固化为群体记忆&lt;/td>
&lt;td>&lt;br />代理间一致性指数&lt;/td>
&lt;td>&lt;br />动态路由、向高稳定性锚点代理注入基准示例强制纠偏&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />&lt;strong>任务漂移&lt;/strong>&lt;/td>
&lt;td>&lt;br />被某个挑战性子问题吸引，过度消耗资源，迷失最高层宏观目标&lt;/td>
&lt;td>&lt;br />任务完成边界突破、API 调用频率异常峰值&lt;/td>
&lt;td>&lt;br />&amp;ldquo;计划-执行-反思&amp;quot;架构，强制反思器验证当前输出是否服务于顶层目标&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>治理目标漂移最有效的手段​&lt;strong>不是写更长的系统提示&lt;/strong>，而是把目标拆进确定性结构：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>目标重申（Goal Anchoring）&lt;/strong> ：每一步强制重申顶层目标。&lt;/li>
&lt;li>&lt;strong>生成者与评估者分离&lt;/strong>：避免模型对自身输出盲目自信。&lt;/li>
&lt;li>&lt;strong>步数硬限制&lt;/strong>：在漂移越过临界点前强制阻断并触发修正。&lt;/li>
&lt;li>&lt;strong>结构化承载&lt;/strong>​：把目标拆进 ​&lt;strong>计划对象、阶段产物、检查点、状态机、可回放日志&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;h3 id="23-持久化persistence与可恢复执行resumeable">2.3 持久化（Persistence）与可恢复执行（Resumeable）&lt;a class="heading-anchor" href="#23-%e6%8c%81%e4%b9%85%e5%8c%96persistence%e4%b8%8e%e5%8f%af%e6%81%a2%e5%a4%8d%e6%89%a7%e8%a1%8cresumeable" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>企业级 Agent 正从&amp;quot;即时请求-响应助手&amp;quot;演变为​&lt;strong>长期运行的后台软件实体&lt;/strong>：可能暂停数天等人审批合同，或休眠等待 IT 系统配置硬件。保持连接常开或阻塞工作线程都不可行。&lt;/p>
&lt;p>机制：图执行的每个超步（super-step）基于全局唯一标识（如 &lt;code>thread_id&lt;/code>）把完整状态快照（checkpoint）写入持久层（如 PostgreSQL）。由此催生两种关键模式：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>事件驱动休眠&lt;/strong>​：执行到 &lt;code>interrupt()&lt;/code>​ 或需外部事件时，进程主动释放计算资源并写入状态机；当 Webhook 回调到达或人类提交审批（&lt;code>Command(resume=...)&lt;/code>​），Harness 从持久层**水化（hydrate）**先前状态，精确地从中断节点唤醒模型继续执行。&lt;/li>
&lt;li>&lt;strong>睡眠时间计算（Sleep-time Compute）&lt;/strong> ：利用用户离线的空闲时间执行耗时的文献综述、代码分析、故障排查，把&amp;quot;思考成果&amp;quot;持久化，待用户上线直接呈现。&lt;/li>
&lt;/ul>
&lt;p>持久化至少应保存五类对象：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;br />组件&lt;/th>
&lt;th>&lt;br />建议持久化内容&lt;/th>
&lt;th>&lt;br />目的&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;br />会话状态&lt;/td>
&lt;td>&lt;br />目标、阶段、上次完成节点、用户偏好&lt;/td>
&lt;td>&lt;br />resume 与分支恢复&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />工具调用日志&lt;/td>
&lt;td>&lt;br />工具名、归一化参数、结果摘要、幂等键&lt;/td>
&lt;td>&lt;br />去重、审计、补偿&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />环境快照&lt;/td>
&lt;td>&lt;br />工作目录、生成文件、安装依赖、输出目录&lt;/td>
&lt;td>&lt;br />中断后继续跑&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />记忆层&lt;/td>
&lt;td>&lt;br />长期偏好、项目约定、历史决策&lt;/td>
&lt;td>&lt;br />减少再解释成本&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />审计轨迹&lt;/td>
&lt;td>&lt;br />模型调用、审批、手工接管、策略命中&lt;/td>
&lt;td>&lt;br />合规与事后复盘&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="24-llm-特性支持与-retry-机制">2.4 LLM 特性支持与 Retry 机制&lt;a class="heading-anchor" href="#24-llm-%e7%89%b9%e6%80%a7%e6%94%af%e6%8c%81%e4%b8%8e-retry-%e6%9c%ba%e5%88%b6" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>Harness 不应假设模型一次就对，也不应把所有错误都丢给&amp;quot;再问一遍&amp;rdquo;。正确做法是​&lt;strong>区分错误类型&lt;/strong>：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;br />错误类型&lt;/th>
&lt;th>&lt;br />是否可自动重试&lt;/th>
&lt;th>&lt;br />推荐措施&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;br />429 / 限流 / 短暂 5xx&lt;/td>
&lt;td>&lt;br />可以&lt;/td>
&lt;td>&lt;br />指数退避 + jitter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />结构化输出解析失败&lt;/td>
&lt;td>&lt;br />条件可重试&lt;/td>
&lt;td>&lt;br />优先用约束解码/结构化输出；失败时把具体错误反馈给模型做局部修复&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />工具超时 / 网络抖动&lt;/td>
&lt;td>&lt;br />条件可重试&lt;/td>
&lt;td>&lt;br />仅对&lt;strong>无副作用或幂等&lt;/strong>工具自动重试&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />不可逆副作用失败&lt;/td>
&lt;td>&lt;br />&lt;strong>不应盲重试&lt;/strong>&lt;/td>
&lt;td>&lt;br />需要幂等键、补偿事务或人工确认&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />目标 / 计划错误&lt;/td>
&lt;td>&lt;br />不建议直接重试&lt;/td>
&lt;td>&lt;br />回到 planner，重做任务分解&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>可以把&amp;quot;模型原生特性&amp;quot;理解为 Harness 的​&lt;strong>降噪器&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Function Calling&lt;/strong>：把动作参数从自然语言里解耦出来。&lt;/li>
&lt;li>&lt;strong>结构化输出（Structured Output）&lt;/strong> ：通过约束解码（constrained decoding）保证 schema 合规，减少&amp;quot;无效 JSON / 缺字段 / 类型错乱&amp;quot;的解析重试。LLM 生成畸形 JSON 或不存在的参数时，执行钩子捕获异常，构建含具体错误与修正指导的提示反馈给模型，触发内部 Retry，全程无需人类介入。&lt;/li>
&lt;li>&lt;strong>指令层级（Instruction Hierarchy）&lt;/strong> ：降低把外部内容当命令执行的概率（详见 Safety 篇）。&lt;/li>
&lt;li>&lt;strong>Compaction&lt;/strong>：延长有效上下文寿命，但不能替代状态设计。&lt;/li>
&lt;/ul>
&lt;h2 id="3-外界外部影响工具的副作用怎么管">3. 外界：外部影响——工具的副作用怎么管&lt;a class="heading-anchor" href="#3-%e5%a4%96%e7%95%8c%e5%a4%96%e9%83%a8%e5%bd%b1%e5%93%8d%e5%b7%a5%e5%85%b7%e7%9a%84%e5%89%af%e4%bd%9c%e7%94%a8%e6%80%8e%e4%b9%88%e7%ae%a1" aria-label="本节链接">#&lt;/a>
&lt;/h2>&lt;p>模型自身是封闭的；Harness 通过 &lt;strong>工具（Tool）&lt;/strong> 和 &lt;strong>环境（Env）&lt;/strong> 赋予它感知与改造世界的能力。但赋予行动力的同时引入了​&lt;strong>副作用（Side Effects）&lt;/strong> ，这要求极严密的权限生命周期管理。&lt;/p>
&lt;h3 id="31-tool-与-env">3.1 Tool 与 Env&lt;a class="heading-anchor" href="#31-tool-%e4%b8%8e-env" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>工具可以是内联函数、数据库、第三方 API，甚至另一个 Agent。常见形态包括 hosted tools、function tools、agents-as-tools、MCP、文件读写、命令执行、Web、subagents 等。&lt;/p>
&lt;p>一旦工具连接真实环境，副作用就成了一等问题：写/删文件、发邮件、下单、付款、创建工单、写数据库、浏览器点击、跨系统同步……对这些动作，Harness 不能只看&amp;quot;​&lt;strong>能不能做&lt;/strong>​&amp;quot;，还要判断&amp;quot;​&lt;strong>是否已经做过、是否应该现在做、是否需要人类盖章&lt;/strong>&amp;quot;。&lt;/p>
&lt;h3 id="32-副作用管理执行钩子干跑幂等">3.2 副作用管理：执行钩子、干跑、幂等&lt;a class="heading-anchor" href="#32-%e5%89%af%e4%bd%9c%e7%94%a8%e7%ae%a1%e7%90%86%e6%89%a7%e8%a1%8c%e9%92%a9%e5%ad%90%e5%b9%b2%e8%b7%91%e5%b9%82%e7%ad%89" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>在&amp;quot;模型意图&amp;quot;与&amp;quot;实际执行&amp;quot;之间必须建立防火墙：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>执行钩子（Execution Hooks）&lt;/strong> ​：不是模型能阅读的软性指南，而是​&lt;strong>由确定性代码编写的强制闸门&lt;/strong>。调用外部系统前做强制类型校验，拒绝非法的参数幻觉。&lt;/li>
&lt;li>&lt;strong>干跑模式（Dry-run）&lt;/strong> ：真正提交前先计算并展示&amp;quot;我将要做什么&amp;quot;，为自动化校验或人类审查提供缓冲，避免错误在长链路里复合放大。&lt;/li>
&lt;li>&lt;strong>幂等键（Idempotency Key）&lt;/strong> ​：对工具调用以 &lt;code>tool + 归一化参数&lt;/code>​ 生成键并记录，防止重试/崩溃恢复/并发子代理导致​&lt;strong>重复发信、重复扣费、重复写库&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;h3 id="33-permission-控制与-human-confirm">3.3 Permission 控制与 Human Confirm&lt;a class="heading-anchor" href="#33-permission-%e6%8e%a7%e5%88%b6%e4%b8%8e-human-confirm" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>涉及高风险、高价值或不可逆操作（生产库修改、大额转账）时，仅靠逻辑校验不够，必须引入 ​&lt;strong>Human-in-the-Loop（HITL）&lt;/strong> 。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>一条铁律：永远不要让具有非确定性的语言模型自主决定&amp;quot;何时需要人类审批&amp;quot;。&lt;/strong> 审批节点必须由 Harness 的状态机​&lt;strong>预先硬编码&lt;/strong>。&lt;/p>&lt;/blockquote>
&lt;p>运行到预定义边界时，Harness 强制剥夺模型执行权，把任务状态挂起为 &lt;code>PENDING_APPROVAL&lt;/code>​，向人类控制台推送含上下文的审批负载。人类可批准、拒绝、甚至直接修改中间变量；处理完毕后，Harness 把修正信息合并入上下文并恢复执行。这保证了权限流转的​&lt;strong>可预测、可审计&lt;/strong>。&lt;/p>
&lt;p>生产级 Permission 模型建议至少分四层：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>资源边界&lt;/strong>：文件根目录、网络白名单、凭证作用域。&lt;/li>
&lt;li>&lt;strong>工具边界&lt;/strong>：允许哪些工具、哪些参数模式。&lt;/li>
&lt;li>&lt;strong>动作边界&lt;/strong>：哪些动作可自动、哪些必须确认。&lt;/li>
&lt;li>&lt;strong>组织边界&lt;/strong>：谁能配置工具、谁能查看审计、谁能升级权限。&lt;/li>
&lt;/ol>
&lt;h2 id="4-关键组件清单">4. 关键组件清单&lt;a class="heading-anchor" href="#4-%e5%85%b3%e9%94%ae%e7%bb%84%e4%bb%b6%e6%b8%85%e5%8d%95" aria-label="本节链接">#&lt;/a>
&lt;/h2>&lt;p>一个生产 Harness 的最小可用组件集：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;br />组件&lt;/th>
&lt;th>&lt;br />作用&lt;/th>
&lt;th>&lt;br />失效后果&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;br />Orchestrator&lt;/td>
&lt;td>&lt;br />驱动 plan-act-observe 循环与子代理编排&lt;/td>
&lt;td>&lt;br />流程散乱、无法恢复&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />Context Manager&lt;/td>
&lt;td>&lt;br />构建工作上下文、compaction、记忆召回&lt;/td>
&lt;td>&lt;br />目标漂移、上下文膨胀&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />Session / State Store&lt;/td>
&lt;td>&lt;br />保存状态、日志、断点、标识&lt;/td>
&lt;td>&lt;br />crash 后丢进度&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />Tool Router&lt;/td>
&lt;td>&lt;br />把模型动作映射到工具与环境&lt;/td>
&lt;td>&lt;br />参数错配、工具滥用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />Policy Engine&lt;/td>
&lt;td>&lt;br />权限判断、风险分级、审批升级&lt;/td>
&lt;td>&lt;br />高风险动作越权&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />Sandbox / 隔离环境&lt;/td>
&lt;td>&lt;br />运行代码与文件操作&lt;/td>
&lt;td>&lt;br />主机/个人数据暴露&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />Observability / Audit&lt;/td>
&lt;td>&lt;br />追踪模型、工具、审批、成本&lt;/td>
&lt;td>&lt;br />无法复盘和合规&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />Retry / Idempotency Layer&lt;/td>
&lt;td>&lt;br />处理瞬时错误与去重&lt;/td>
&lt;td>&lt;br />重复副作用、双写&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="5-主流实现对比">5. 主流实现对比&lt;a class="heading-anchor" href="#5-%e4%b8%bb%e6%b5%81%e5%ae%9e%e7%8e%b0%e5%af%b9%e6%af%94" aria-label="本节链接">#&lt;/a>
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;br />实现&lt;/th>
&lt;th>&lt;br />权限模型&lt;/th>
&lt;th>&lt;br />持久化策略&lt;/th>
&lt;th>&lt;br />沙箱/隔离&lt;/th>
&lt;th>&lt;br />特点&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;br />&lt;strong>OpenAI Agents SDK&lt;/strong>&lt;/td>
&lt;td>&lt;br />工具级&lt;code>needs_approval&lt;/code>，HITL pause/resume&lt;/td>
&lt;td>&lt;br />&lt;code>to_state()&lt;/code>、session、sandbox snapshots、resumable state&lt;/td>
&lt;td>&lt;br />原生 Sandbox，支持多家 provider&lt;/td>
&lt;td>&lt;br />状态/审批/沙箱一体化强&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />&lt;strong>Anthropic Claude Agent SDK / Claude Code&lt;/strong>&lt;/td>
&lt;td>&lt;br />默认只读、显式授权、allowlist、&lt;code>acceptEdits&lt;/code>、hooks 可控&lt;/td>
&lt;td>&lt;br />会话恢复、memory 文件、compaction、checkpointing&lt;/td>
&lt;td>&lt;br />&lt;code>/sandbox&lt;/code>文件系统与网络隔离，工作目录写限制&lt;/td>
&lt;td>&lt;br />coding agent 体验成熟，上下文管理原生强&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />&lt;strong>LangGraph + Deep Agents&lt;/strong>&lt;/td>
&lt;td>&lt;br />interrupts + 人工审查，策略自定义&lt;/td>
&lt;td>&lt;br />checkpointer + stores，&lt;code>thread_id&lt;/code>恢复&lt;/td>
&lt;td>&lt;br />Deep Agents 支持 sandbox backends&lt;/td>
&lt;td>&lt;br />编排灵活，适合自定义状态机与长流程&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;br />&lt;strong>Google ADK&lt;/strong>&lt;/td>
&lt;td>&lt;br />Tool Confirmation、ApprovalTool、自定义安全工具&lt;/td>
&lt;td>&lt;br />sessions / state / TTL / long-running resume&lt;/td>
&lt;td>&lt;br />Agent Sandbox、GKE Agent Sandbox&lt;/td>
&lt;td>&lt;br />多语言、长流程与企业治理完善&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>这张表最重要的结论不是&amp;quot;谁最强&amp;quot;，而是四家都在收敛到​&lt;strong>同一种架构&lt;/strong>：状态外置、审批内建、工具标准化、沙箱隔离、可恢复执行。差异主要在默认体验与企业治理深度。&lt;/p>&lt;/blockquote>
&lt;h2 id="6-统一的-run-loop伪代码">6. 统一的 Run Loop（伪代码）&lt;a class="heading-anchor" href="#6-%e7%bb%9f%e4%b8%80%e7%9a%84-run-loop%e4%bc%aa%e4%bb%a3%e7%a0%81" aria-label="本节链接">#&lt;/a>
&lt;/h2>&lt;p>把前面所有要素收进一个循环：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">run_agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">task&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state_id&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">load_state&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state_id&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 持久化恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">done&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ctx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">build_context&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">goal&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">goal&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">short_term&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">recent_history&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_term&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">recall_memory&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">workspace&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">mount_workspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">near_context_limit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ctx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">compact&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 保留目标/计划/关键证据/未完成事项&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">reply&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ctx&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tool_schemas&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">tool_registry&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">schemas&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">output_schema&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">PlannerOrAction&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 结构化输出&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">type&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;plan_update&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plan&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">merge_plan&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plan&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plan&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">persist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">type&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;tool_call&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">risk&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">policy_engine&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">classify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tool&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 风险分级&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">risk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">requires_human&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">persist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pending&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">reply&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pause_for_approval&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state_id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 硬编码审批点，挂起等待&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">token&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">make_idempotency_key&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tool&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">safe_execute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tool&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sandbox&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">select_sandbox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tool&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">idempotency_key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">token&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">retryable&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">backoff_retry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">reply&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">token&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># 仅幂等动作重试&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">recent_history&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">persist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">type&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;final&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">reply&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">output&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">done&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">persist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">output&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个流程把 &lt;strong>上下文构建、compaction、结构化输出、风险分级、沙箱执行、幂等重试、暂停恢复&lt;/strong> 统一进一个 run loop，基本对应当前主流框架的共同抽象。&lt;/p></description></item><item><title>一场外围的狂欢</title><link>https://blog.pdjjq.org/post/fuck-claude-code-zilfwb.html</link><pubDate>Fri, 10 Apr 2026 00:50:23 +0800</pubDate><guid>https://blog.pdjjq.org/post/fuck-claude-code-zilfwb.html</guid><description>&lt;p>Claude Code 的源码泄露了, 然后呢?&lt;/p>
&lt;p>公众号, X, RSS, Blog 全部都在讲 Claude Code 的 Harness Engineering&lt;/p>
&lt;p>Codex Cli / Gemini Cli / OpenCode / Crush 也是开源的, 为什么不早早的去研究他们呢?&lt;/p>
&lt;p>我的问题可以换成另外一个问题: Claude Code 比他们哪里做的更好?&lt;/p>
&lt;h1 id="agent--agent-software">Agent &amp;amp; Agent Software&lt;a class="heading-anchor" href="#agent--agent-software" aria-label="本节链接">#&lt;/a>
&lt;/h1>&lt;p>我们先简单的聊一聊 Agent 以及 由 Agent 作为核心的 Software&lt;/p>
&lt;p>Agent 到底是什么?&lt;/p>
&lt;blockquote>
&lt;p>我不想再看到 Agent 的 L1 - L5 这种垃圾言论了&lt;/p>&lt;/blockquote>
&lt;ol>
&lt;li>Tool Use&lt;/li>
&lt;li>Task Finish&lt;/li>
&lt;li>Model Driven&lt;/li>
&lt;/ol>
&lt;p>好了, 这就是我对于 Agent 的定义: AI 驱动, 使用工具, 完成任务&lt;/p>
&lt;p>这里就引出了几个问题:&lt;/p>
&lt;ol>
&lt;li>哪些工具? 工具能力/权限?&lt;/li>
&lt;li>什么任务? 怎么判断完成? 完成的路径&lt;/li>
&lt;li>Context: 有状态的数据 + 无状态的接口 = Agent&lt;/li>
&lt;/ol>
&lt;p>Agent Software 就是帮助解决这些问题的外围设施&lt;/p>
&lt;h3 id="tool">Tool&lt;a class="heading-anchor" href="#tool" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>工具决定了 Agent 的能力, 也决定了对环境的影响&lt;/p>
&lt;p>Write -&amp;gt; 文件&lt;/p>
&lt;p>Bash -&amp;gt; PC&lt;/p>
&lt;p>WebSearch / Fetch -&amp;gt; Content/Info&lt;/p>
&lt;p>这就是 Agent 最迷人的地方, 给他一个工具, 给他一个描述, 给他一个描述, 他就可以做到对外界的影响, 立竿见影&lt;/p>
&lt;p>同样的这也是最痛苦的地方, 工具是有副作用的, 那么很简单: 预测工具副作用, 然后拦截/执行&lt;/p>
&lt;p>这他妈的需要你去看 Harness ?&lt;/p>
&lt;h3 id="task">Task&lt;a class="heading-anchor" href="#task" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>不要再给我说 ReAct, CoT, ToT, 现在是2026 年了, 今天不聊侏罗纪的事&lt;/p>
&lt;p>&lt;strong>任务&lt;/strong>&lt;/p>
&lt;p>或者是目标, 这就是一个 Agent 执行要完成的事情&lt;/p>
&lt;p>这里又涉及到几个问题:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>任务描述是否足够清晰?&lt;/p>
&lt;ol>
&lt;li>问一问 - AskUserQuestion&lt;/li>
&lt;li>稀释 Context : 从文档/数据/代码中搜集 context&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>任务是否能够验证?&lt;/p>
&lt;ol>
&lt;li>程式化的验证:Code/UnitTest&lt;/li>
&lt;li>无反馈-自我判断&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>完成的路径&lt;/p>
&lt;ol>
&lt;li>尝试过什么&lt;/li>
&lt;li>哪些路径失败了&lt;/li>
&lt;li>哪些可能性值得尝试&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;p>我的问题是, Harness 能够解决什么问题?&lt;/p>
&lt;p>Harness 最终是不是回到了修改 Prompt Message 来实现? 回答我!&lt;/p>
&lt;h3 id="context">Context&lt;a class="heading-anchor" href="#context" aria-label="本节链接">#&lt;/a>
&lt;/h3>&lt;p>OpenAI 的 Response API 是无状态的&lt;/p>
&lt;p>Anthropic 的 Messages API 是无状态的&lt;/p>
&lt;p>每一次请求通过传入 Tools / System Prompt / Message History 来拼装 Context 获取返回&lt;/p>
&lt;p>有状态的数据 -&amp;gt; Message History -&amp;gt; LLM -&amp;gt; Agent Loop Next Step&lt;/p>
&lt;p>最终的一切就变成了:&lt;/p>
&lt;ol>
&lt;li>状态数据的存储&lt;/li>
&lt;li>Message History 的封装&lt;/li>
&lt;li>Model 返回的处理&lt;/li>
&lt;/ol>
&lt;p>Harness 解决了什么问题? Claude Code 解决了什么问题?&lt;/p>
&lt;ol>
&lt;li>Context Length: 不要太长, 防止 Rot&lt;/li>
&lt;li>Context Reserve: Context 预备 Summerize, 超长 Tool 结果返回&lt;/li>
&lt;li>Prompt Cache: 成本考虑 + TTFT, 所以要尽量的做 Message Append&lt;/li>
&lt;/ol>
&lt;h1 id="fuck-claude-code">Fuck Claude Code&lt;a class="heading-anchor" href="#fuck-claude-code" aria-label="本节链接">#&lt;/a>
&lt;/h1>&lt;p>让我说的更直白一些:&lt;/p>
&lt;ol>
&lt;li>Claude Code 配上垃圾模型产出一样是垃圾&lt;/li>
&lt;li>设计不是那么完善的Software配合出色的模型一样可以做到高质量的产出&lt;/li>
&lt;li>Claude Code 的核心从来就是模型, 是 A畜 的 Opus 模型&lt;/li>
&lt;li>Codex Cli 配合 GPT5.4 一样可以做到极其出色的效果&lt;/li>
&lt;/ol>
&lt;p>那么我的问题是: Claude Code 比 Codex/Gemini 值得学习的地方是什么?&lt;/p>
&lt;p>是配合设施和模型的融合, 为模型做配套, 而不是适配任何模型&lt;/p>
&lt;h1 id="fuck-harness">Fuck Harness&lt;a class="heading-anchor" href="#fuck-harness" aria-label="本节链接">#&lt;/a>
&lt;/h1>&lt;p>Harness Engineering 只能用来唬一唬完全不同软件工程的人&lt;/p>
&lt;p>如果你写过程序, 确定性, 函数的副作用, 事务性, 记录, 这他妈的不就是你每天在做的的事情吗?&lt;/p>
&lt;p>告诉我, 你每天写的 RPC/ API 是不是工具调用, 是不是用有状态的输入 + API Call 获得对环境(业务)的影响?&lt;/p>
&lt;p>状态存在哪里? 文件? DB? Cache? NoSQL? 哪里不能存? 要支持多快的存储, 多快的读取? 要支持事务性的写入? 要支持 Lock? 要Lock?&lt;/p>
&lt;p>抽象状态? 表结构设计? JSON 设计?&lt;/p>
&lt;h1 id="fuck-djj-by-gemini">Fuck DJJ by Gemini&lt;a class="heading-anchor" href="#fuck-djj-by-gemini" aria-label="本节链接">#&lt;/a>
&lt;/h1>&lt;ul>
&lt;li>&lt;strong>非确定性 RPC 的地狱：&lt;/strong> “你每天写的 RPC/API 是不是工具调用”。是，&lt;strong>但传统 RPC 的调用方是确定性的代码，而 Agent 的调用方是一个随时可能发癫、产生幻觉、参数瞎填的概率模型。&lt;/strong> 传统的防御性编程防的是人类和系统异常；Harness 要防的是一个有自己想法、甚至会“骗”接口的 AI。如何用确定性的代码逻辑，去兜底和引导一个非确定性的输入源，还要让它自己意识到错误并重试，这其中的恶心程度远超普通的 CRUD 和状态流转。&lt;/li>
&lt;li>&lt;strong>Harness 最终回到了修改 Prompt？&lt;/strong> “Harness 最终是不是回到了修改 Prompt Message 来实现”。答案是：&lt;strong>是的&lt;/strong>。因为目前大模型的 API 本质上就是无状态的文本/Token 补全器。所有高大上的架构、长文本截断、工具执行结果的反馈，在请求发出去的那一秒，都必须被拍扁成极其讲究排版的 Prompt。但这不仅是“修改 Prompt”这么简单，这是&lt;strong>动态的、程序化的 Context 编排&lt;/strong>，是极其吃性能和 Token 成本的架构设计。&lt;/li>
&lt;/ul>
&lt;h1 id="能学到什么">能学到什么?&lt;a class="heading-anchor" href="#%e8%83%bd%e5%ad%a6%e5%88%b0%e4%bb%80%e4%b9%88" aria-label="本节链接">#&lt;/a>
&lt;/h1>&lt;ul>
&lt;li>如何设计 System Prompt 的？&lt;/li>
&lt;li>如何利用 Prompt Caching 来做极端成本优化和降低延迟的？&lt;/li>
&lt;li>怎么在 Context 爆炸之前做“截断与总结” 让 Agent 能够继续 Loop&lt;/li>
&lt;li>如何引导模型自我验证代码的？&lt;/li>
&lt;/ul></description></item></channel></rss>