前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8836
  • MCP Nexus 1.0:MCP工具路由与发现层,一个端点代理数百工具
  • MCP网关安全:AI Agent生产部署的鉴权与限流实战
  • GitHub安全实验室:AI驱动的模糊测试实战
  • Meta Muse 被曝可被诱导泄露全文件系统
  • Black Forest Labs 发布开源机器人控制模型
  • Google Cloud API Gateway原生支持MCP协议
  • 3 万次 AI Agent 调用审计:可验证收据机制实践
  • 用 AgentCore Gateway 和 MCP 构建跨账号 AI Agent 架构
  • AI 性能成本每年下降 13 倍,超越所有前代技术
  • Lovable年化收入超6000万美元,vibe coding进入主流
  • Agent失败的根本原因:从未定义"完成"的标准
  • Agent补丁审查策略:second process重放验证才能合并
  • 我用 Claude Code 九天给 47 个服务接入 OpenTelemetry 链路追踪
  • Google Gemini CLI新增文件修改确认机制
  • DeepSeek推理优化:内核补齐+通信重构,吞吐翻7倍
  • Hugging Face推出LFM2.5-VL-DSpark视觉语言模型加速方案
  • 管理 15 万 AI Agent 对数据库团队的挑战与变革
  • Cursor 收购 Firetiger 后一月推出代码变更生产追踪 Bot
  • OpenAI AI Agent 自主入侵澳大利亚政府网站
  • Claude Code 实际项目开发全流程复盘
  • Google Cloud Developer 插件让 AI 编码助手直连云端部署
  • OpenAI Agent 入侵澳大利亚 Medicare 统计门户
  • Google DeepMind负责人透露Gemini 4即将发布
  • Impeccable:AI 编程代理的确定性设计语言框架
  • AI Agent 生产环境失败启示录:构建攻击性测试
  • 金融合规监控系统的工程实践:数据管道、Agent 架构与审计日志
  • 2026 年十大 LLM 网关横评:语义缓存与多提供商故障转移
  • codebase-memory-mcp:毫秒级代码知识图谱MCP服务器,158语言支持
  • Strands Agents:开源AI Agent开发框架,支持Python/TS全生命周期管理
  • 2026年9大开源LLM网关生产级对比:Bifrost领先
  • 用 TigerGraph+MCP 构建自主欺诈调查 Agent
  • Jev 决策模型真实成本拆解:何时省钱何时烧钱
  • 开源CLM-8B:Agent动作评分比Jev快9倍
  • JEV:打破布尔二值困境的类型安全验证方案
  • Claude Opus 5.5降价40%逼近前沿性能
  • VS Code 1.139:Agent 会话首次加载提速约 12 倍
  • 定时 Agent 总重复干活?用完成分类账让它知道什么是「做完」
  • TypeSafe AI Jev 编码指南:类型化决策、置信度校准与推测式广播
  • Vercel Connect 新增 TanStack AI 集成
  • Anthropic与OpenAI 90分钟内相继降价
  • 选LLM API的六个价格陷阱
  • Agent记忆正常仍出错:问题在状态不在记忆
  • 已加载 42 / 8836
8.0
热点
AI SCORE
编程提效2026-09-24 22:36

Agent补丁审查策略:second process重放验证才能合并

dev.to · AI#Agent#测试策略#工程实践
Editor brief · 编辑速览

提出Agent补丁应被block直到第二个进程重放seed-locked property campaign并匹配witness文件;通过独立测量trials spent、fixture digest和replay结果来防止同一上下文中测试通过带来的虚假信心。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

一个 Agent Patch 会被阻断,直到第二个进程重放一次种子锁定的属性测试并匹配一个 Witness 文件。本地通过的运行日志只是一个候选观察结果,不是合并凭证。

Witness 有意保持精简。它记录的是 Fixture 摘要(digest)、属性 ID、种子(seed)、试验预算、已消耗的试验次数,以及重放期间是否调用了模型。审阅者可以重新生成这些字段,但无法重新生成对话记录。

为什么创作日志是错误的产物

Agent Diff 通常会携带一次通过运行,而这次运行与写出变更的上下文相同。共享的上下文会推高置信度。

在 Diff 辩论开始前,先分离三项测量结果:比较已消耗试验次数与预算;比较 Fixture 摘要与预生成时固定的针点;比较重放结果与 Witness。如果某项测量缺失,Patch 就继续处于阻断状态。

这是一种测试策略,不是评分。预算内零失败意味着测试活动(campaign)完成了,不代表属性集合本身是充分的。

Witness 必须携带的字段

使用固定的 Schema,使审阅不依赖日志格式。以下示例是一个提案,不是生产关卡的日志。

{
  "schema": "agent-patch-witness/v1",
  "fixture_digest": "sha256:<64 hex chars from step 1>",
  "properties": ["balance_non_negative", "transfer_conserves_sum"],
  "seed": 170924,
  "trial_budget": 200,
  "trials_spent": 200,
  "failures": 0,
  "counterexample": null,
  "model_called_during_replay": false
}

摘要的是字节,不是文件名。字节完全相同的重命名 Fixture 是同一个 Fixture。一个字节的编辑就会启动新的测试活动,即使属性名保持不变。

不要把生成的用例放进 Fixture 树。用例来自种子(seed)。Fixture 是那些用例可能触碰的固定输入。把两者混在一起会让摘要追逐生成器,从而隐藏漂移。

以下命令假设 fixtures/、properties/campaign.py 和 witness/latest.json 存在。它们仅作说明用,不声称任何通过率。

1. 在生成之前固定摘要

在任何模型调用之前、在 Patch 应用之前,对 Fixture 树做哈希。如果 Diff 也编辑了 fixtures/,将该编辑拆分为独立的变更。Patch 应该消费这个针点,而不是替换它。

python3 - <<'PY'
import hashlib, pathlib
root = pathlib.Path("fixtures")
h = hashlib.sha256()
for p in sorted(x for x in root.rglob("*") if x.is_file()):
    h.update(p.relative_to(root).as_posix().encode())
    h.update(b"\0")
    h.update(p.read_bytes())
print("sha256:" + h.hexdigest())
PY

将打印出的行存入审阅备注。之后的不匹配意味着测试活动测量了一棵与你固定的不同的树。丢弃那次运行,不要将其与更新的摘要取平均。

2. 只接受审阅者能够复述的谓词

属性只有在审阅者将其重新陈述为输入与输出之间的一个关系之后,才能进入测试活动。这种重新陈述不能依赖于 Patch 引入的私有辅助函数。草案可以来自人或模型。在那句话存在之前,两者都只是提案。

丢弃那些不约束行为的谓词。assert True、恒等比较、仅确认返回值的检查都会消耗预算而不产生证据。它们可以干净地重放,却仍然什么也没教。在账本打开之前删除它们。

3. 消耗固定的试验预算

预算是输入。已消耗试验次数是输出。运行器在达到预算时停止,即使每次试验都通过了。只有在记录反例时允许提前停止。

# Proposal sketch. Not an executed measurement.
import hashlib, random

def run_campaign(props, seed, budget, fixture_bytes):
    rng = random.Random(seed)
    spent = 0
    failures = []
    digest = "sha256:" + hashlib.sha256(fixture_bytes).hexdigest()
    for _ in range(budget):
        spent += 1
        case = {"n": rng.randrange(0, 50), "delta": rng.randrange(-10, 10)}
        for name, fn in props:
            ok, detail = fn(case)
            if not ok:
                failures.append({"property": name, "case": case, "detail": detail})
                return {
                    "seed": seed,
                    "trial_budget": budget,
                    "trials_spent": spent,
                    "failures": failures,
                    "fixture_digest": digest,
                }
    return {
        "seed": seed,
        "trial_budget": budget,
        "trials_spent": spent,
        "failures": failures,
        "fixture_digest": digest,
    }

你仍然需要提供 props。这个草图不会发明一个领域 Oracle。它的职责是停止规则:一次完整的通过会消耗全部预算,而一次失败会保留打破该关系的用例。

在提交之前收缩反例。重放失败的用例,然后在同一属性仍然失败的前提下逐步减小 n 和 delta。存储最小的用例。大幅转储更难审阅,作为证据也没有更强。

4. 序列化账本,而不是记录

只从账本字段写入 witness/latest.json。把提示词、Token 和聊天文本留在文件外。这些字符串不是种子的函数,所以第二个进程无法复现它们。

python3 properties/campaign.py --seed 170924 --budget 200 \
  --fixtures fixtures/ --out witness/latest.json
python3 -m json.tool witness/latest.json > /tmp/witness.pretty.json

如果 failures 非空,附加收缩后的用例然后停止。把失败保留为属性结果。不要重写 Witness 以让同一个用例消失。

5. 在模型无法参与的地方重放

在干净的进程中运行同一测试活动。先取消设置 prompt 和凭证变量。然后比较摘要、种子、预算、消耗和失败字段与 Witness。

env -u OPENAI_API_KEY -u MODEL_PROMPT \
  python3 properties/campaign.py --replay witness/latest.json --fixtures fixtures/
# Proposal check. Equality is exact, not approximate.
def replay_matches(witness, actual):
    keys = ("fixture_digest", "seed", "trial_budget", "trials_spent")
    if any(witness[k] != actual[k] for k in keys):
        return False
    if actual.get("model_called_during_replay"):
        return False
    return witness.get("failures", []) == actual.get("failures", [])

四项相等性决定重放结果。

Fixture 摘要等于预生成时的针点和 Witness 字段。

种子(seed)和 trial_budget 等于记录值。

trials_spent 等于预算,除非有记录的反例解释提前停止。

重放期间没有导入模型客户端。

托管运行器是可选容量,不是真相来源。超时或不打印匹配结果的传输成功都是缺失的重放。缺失的重放保持阻断状态。

6. 应用决策表

证据完整不等于批准。审阅者仍然需要阅读 Diff 以查找被删除的检查、被放宽的边界以及超出声称修复范围之外的编辑。决策表只回答测试证据是否可以被重新生成。

草案帮助和重放托管的适用场景

披露:本文作为 MonkeyCode 产品推广的一部分准备。MonkeyCode 的免费模型访问适用于第 2 步——作为候选谓词的草案辅助,两者仍然是提案,直到审阅者重新陈述它们。免费服务器选项适用于第 5 步——当已有可用的干净重放主机时,作为可选的重放托管。

两个选项都不指定模型、配额、机器规格或时长,本文也不添加这些数字。如果任一选项宕机,在本地解释器上运行相同命令。可用性不是证据。

不要上传包含密钥的 Fixture。摘要不会删除你复制到主机上的字节。先剥离密钥,或者在已经持有密钥的机器上重放。

在 Pull Request 上记录什么

在审阅评论中放入四项观察。它们是计数,不是评分。

trials_spent 对比 trial_budget。在 200 中仅跑到第 12 次就停止且失败列表为空,意味着测试活动没有完成。

摘要与第 1 步针点相等。sha256: 后的十六进制是 64 个字符。更短的字符串是截断,不是匹配。

failures 长度。零是完整测试活动的必要条件。一个反例足以阻断。

重放是否导入了模型客户端。这里唯一可接受的值是无。

在一个队列中,统计有多少 Patch 生成了 Witness、多少在重放时不匹配、多少只提供了创作会话日志。这些统计描述的是你的审阅,不是产品基准,本文也不报告任何基准。

Witness 证明的是可重新生成性,不是完备性。一个在每个输入上都返回 true 的谓词可以在重放时匹配却仍然遗漏缺陷。在信任这次消耗之前,先读一下那个谓词。

random.Random 很方便。它不是可移植性承诺。同一个种子在不同的解释器上可能产生分歧。固定用于重放的解释器,或者用你能控制整数递推的生成器替换它。

对 Fixture 树做哈希会忽略时钟、网络调用和进程全局变量。读取这些的属性会过度声明隔离性。将这些输入作为 Fixture 字段注入,或者拒绝该属性。

免费托管选项可以被撤回、限流或不可用。策略必须能够承受这种情况。如果唯一的通过路径是一条你无法重复的远程运行器,你就没有 Witness。你只有一个会话。

谁不应该使用这个方法

跳过没有行为声明的纯文档编辑。跳过你无法陈述一个在 Patch 回滚后仍然有意义的不变量的工作。跳过验证依赖于已见证构建的紧急回滚,而不是新的 Agent Diff。

不要对包含密钥的 Fixture 使用托管重放。不要接受来自同一个未中断模型会话的 Patch 的草案谓词作为 Oracle,除非第 2 步的重新陈述已在审阅中。便利不是独立性。

固定 Fixture 摘要。消耗一个可见的试验预算。从账本写入 Witness,然后在模型无法帮助的地方重放它。创作日志可以保留附件,但它不携带 Patch。

如果你的设置中已经有免费的 MonkeyCode 服务器,将第 5 步指向它,并在审阅中附加 witness/latest.json。服务器是重新生成 Witness 的地方,不是合并的理由。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
Agent失败的根本原因:从未定义"完成"的标准
下一篇
我用 Claude Code 九天给 47 个服务接入 OpenTelemetry 链路追踪