在Claude Code和Codex之上加一层决策层:让Coding Agent从碰运气变可预期
1. 为什么要在 Claude Code 和 Codex 之上再叠一层决策层先说结论单纯把 Claude Code 或 Codex 接进工作流能解决写代码的问题但解决不了该不该写、先写哪块、写到什么程度停手的问题。Jev 这个项目要做的就是在 Coding Agent 和实际任务之间插一层轻量决策逻辑让 Agent 在动手之前先想清楚路径而不是拿到一句话就开始疯狂输出。我最初接触这个思路是因为一个很现实的场景让 Agent 改一个跨模块的 bug它会在三个文件里来回横跳改完 A 发现 B 依赖 A 的旧签名改完 B 又发现 C 的测试挂了最后绕了一大圈回到原点。整个过程 token 烧得飞快产出却是一堆半成品。问题不在于模型能力不够而在于它缺少一个先规划、再执行、执行中校验的中间层。Claude Code 和 Codex 本身都带一定的 planning 能力但那是模型内部的隐式规划你没法干预、没法复用、没法针对自己的项目定制规则。Jev 的价值就在于把这层规划显式化、可配置化。这篇文章适合三类人看一是已经在用 Claude Code 或 Codex 做日常开发、但觉得能用但不够稳的工程师二是想给自己的 Agent 工作流加定制决策逻辑的团队三是对 Coding Agent 架构感兴趣、想理解决策层到底解决什么问题的人。下面我会从架构设计、接入方式、决策规则怎么写、实测中的坑这几个角度把整套东西拆开讲。需要提前说明的是Jev 不是一个现成的开源库它更像是一种架构模式——你可以用几十行胶水代码把它实现出来也可以用现成的编排框架搭。我下面给的方案是基于常见实践的合理设计具体实现细节你可以按自己的技术栈调整。2. Jev 决策层的核心架构与它到底管什么2.1 决策层不是再套一个模型很多人第一反应是决策层是不是再调一个 LLM 来做规划我的建议是尽量不要。原因很直接——多一次模型调用就多一次延迟、多一份不确定性而且规划模型和执行模型如果对项目上下文的理解不一致规划出来的东西执行模型根本落不了地。Jev 的决策层本质是一个规则引擎 轻量状态机。它不生成代码只做三件事判断任务类型、选择执行策略、在关键节点做校验和回退。真正写代码的活还是交给 Claude Code 或 Codex。这样设计的好处是决策逻辑完全可控、可测试、可版本管理不会因为模型抽风就整个流程崩掉。我把它拆成四个模块任务分类器拿到用户输入后先判断这是新增功能修 bug重构写测试还是纯问答。不同类别走不同策略。策略选择器根据任务类别和当前仓库状态决定用哪个 Agent、给多少上下文、要不要先出计划。执行编排器负责调用 Claude Code 或 Codex管理多轮交互处理中间产物。校验回退器在 Agent 声称完成后跑一遍预设的检查编译、测试、lint不通过就带着错误信息回退重试。2.2 为什么是快速决策而不是深度决策标题里快速决策这四个字很关键。我见过一些方案决策层做得极其复杂要分析依赖图、要跑静态分析、要生成完整设计文档结果决策本身花的时间比写代码还长。这在小任务上完全是负收益。Jev 的设计哲学是决策层的耗时必须控制在秒级且不能超过执行时间的 20%。所以它只做粗粒度判断不做细粒度分析。比如判断这个任务涉及几个文件不需要精确解析 AST扫一眼关键词和文件路径就够了。判断要不要先出计划看任务描述长度和涉及模块数就行。这种够用就好的决策反而比精确分析更实用因为它把时间留给了真正干活的 Agent。提示决策层的规则一定要能快速失败。如果规则匹配不上任何已知模式直接走默认策略交给 Agent 自由发挥不要卡在那里试图分析。我踩过的坑就是规则写太细遇到没覆盖的情况直接抛异常整个流程中断体验极差。2.3 和 Claude Code、Codex 原生能力的边界这里要说清楚一个容易混淆的点Claude Code 和 Codex 自己都有任务分解能力Jev 不是要取代它而是要在它之前和之后加东西。之前加的是入口决策决定这个任务要不要拆、拆成几步、每步给什么上下文。之后加的是出口校验Agent 说完成了到底算不算完成。中间那段怎么把任务做完还是交给 Agent 自己。打个比方Claude Code 和 Codex 像是两个手艺很好的工匠Jev 是站在门口的工头。工头不干活但工头决定这活派给谁、要带什么工具、干完了验收合不合格。没有工头工匠也能干但容易干错方向或者干过头。3. 把 Claude Code 和 Codex 接进决策层的具体做法3.1 两种 Agent 的调用方式差异Claude Code 和 Codex 在调用形态上不太一样这直接影响你怎么在决策层里封装它们。Claude Code 更偏向交互式 CLI你可以通过子进程调用把任务描述作为输入它会在当前工作目录里操作文件。它的强项是长上下文理解和多文件协同修改。Codex 则更偏向 API 式的补全和生成适合单点、明确的代码生成任务响应更快但上下文窗口相对小。我的封装策略是决策层统一抽象出一个AgentAdapter接口两个 Agent 各实现一份。接口方法就三个plan(task)返回执行计划、execute(plan)执行并返回结果、verify(result)做基础校验。这样决策层不用关心底层是哪个 Agent切换成本极低。class AgentAdapter: def plan(self, task, context): raise NotImplementedError def execute(self, plan): raise NotImplementedError def verify(self, result): raise NotImplementedError class ClaudeCodeAdapter(AgentAdapter): def execute(self, plan): # 通过子进程调用传入 plan 序列化后的指令 proc subprocess.run( [claude, --task, plan.to_prompt()], cwdself.workdir, capture_outputTrue, textTrue ) return proc.stdout3.2 上下文注入的粒度控制这是接入环节最容易做砸的地方。很多人图省事把整个仓库的文件列表甚至文件内容一股脑塞给 Agent结果 token 爆炸、Agent 注意力涣散。Jev 的做法是按任务类型决定上下文粒度任务类型注入内容大致 token 预算修 bug报错栈 相关文件路径 最近一次改动 diff2k-4k新增功能目标模块目录结构 接口定义文件4k-8k重构待重构文件全文 调用方列表8k-15k写测试被测函数签名 已有测试样例2k-3k这个表不是拍脑袋定的是我在实际项目里反复调出来的。核心原则是给 Agent 的信息刚好够它做决定多一分都是浪费。修 bug 时最有用的是报错栈和最近改动因为 bug 大概率就在最近改的那几行里。重构时才需要全文因为要理解整体结构。3.3 计划产物的结构化格式决策层让 Agent 先出计划这个计划不能是自由文本否则后续没法程序化处理。我定义了一个简单的 JSON schema{ steps: [ {id: 1, action: modify, target: src/auth.py, desc: 修复 token 校验逻辑}, {id: 2, action: test, target: tests/test_auth.py, desc: 补充边界用例} ], risk: medium, need_confirm: false }有了这个结构决策层就能做很多事比如发现risk是 high 就暂停等人工确认发现步骤超过 5 步就拆成两批执行发现某步 target 文件不存在就提前报错。这些都是自由文本计划做不到的。注意让 Agent 输出严格 JSON 是有技巧的。我在 prompt 里会明确说只输出 JSON不要任何解释文字并且在解析时做容错——如果解析失败用正则从文本里抠出 JSON 块再失败就降级为自由文本计划。硬解析失败直接报错是最蠢的做法。4. 决策规则怎么写才不沦为摆设4.1 规则的分层设计决策规则如果全写成一堆 if-else很快就会变成没人敢改的屎山。我采用三层结构第一层硬规则。基于确定事实的判断比如文件不存在就不能改测试没通过就不能提交。这层用代码写不依赖模型。第二层启发式规则。基于经验的概率判断比如任务描述里出现重构且涉及文件超过 3 个大概率需要先出计划。这层用配置写方便调整。第三层模型判断。实在拿不准的才调一次轻量模型做分类。这层是兜底用得越少越好。三层从下往上调用硬规则能定的绝不上升到启发式启发式能定的绝不调模型。这样既保证了速度又保证了覆盖率。4.2 一个真实的规则配置示例rules: - name: large_refactor_needs_plan when: keywords: [重构, refactor, 重新设计] file_count_gt: 3 then: action: require_plan agent: claude_code context_level: full - name: simple_bugfix_direct when: keywords: [修复, fix, 报错] file_count_lte: 2 then: action: direct_execute agent: codex context_level: minimal这套配置的好处是产品经理或者团队里不写代码的人也能看懂、能提修改意见。规则调整不需要改代码改 YAML 重启即可。4.3 规则冲突了怎么办多个规则同时命中是常态。我的处理顺序是优先级数值高的先匹配同优先级按配置顺序第一个命中的生效。听起来简单但实际用起来会发现第一个命中经常不是最优解。后来我加了一个规则投票机制让所有命中的规则各投一票票数最高的策略生效平票时走保守策略也就是需要更多确认的那个。这个改动让决策质量明显提升因为单条规则容易误判多条规则的综合判断更稳。5. 实测中暴露的问题和我的处理方式5.1 Agent 会假装完成了任务这是最坑的问题。Agent 返回已完成修改你去一看文件根本没动或者只改了一半。原因是它把我打算这么做和我已经这么做混为一谈了。我的解法是在校验回退器里加一道文件指纹检查执行前记录目标文件的 mtime 和 hash执行后对比。如果文件没变但 Agent 声称改了直接判定失败并重试。这个检查成本极低但拦住了大量假完成。5.2 多轮重试会陷入死循环Agent 改不对回退重试还是改不对再回退……我见过重试 8 次还在原地打转的情况。根因是每次重试给的上下文完全一样Agent 自然给出一样的错误答案。处理方式是重试时注入差异信息第一次重试告诉它上次这么改导致测试 X 失败第二次重试告诉它换个思路不要动 Y 文件。同时设一个硬上限重试 3 次还不行就停下来把问题抛给人。承认 Agent 有搞不定的情况比让它无限重试要诚实得多。5.3 决策层本身成了瓶颈有段时间我发现整体耗时变长了排查下来是决策层的规则匹配用了正则回溯遇到长任务描述时卡住。这个坑很隐蔽因为决策层代码量小谁也没想到它会慢。教训是决策层里任何可能随输入规模增长的操作都要设上限。正则加超时、文件扫描限制数量、模型调用设 deadline。决策层慢 1 秒整个流程的体验就垮了。5.4 两个 Agent 的输出格式不统一Claude Code 和 Codex 返回的结果结构不一样导致校验层要写两套解析逻辑。后来我在 Adapter 层做了归一化统一转成{status, files_changed, summary, raw}这个结构上层就干净了。这个改动不大但省了很多重复代码。6. 什么场景该用 Jev什么场景别用6.1 适合的场景多文件协同修改涉及 3 个以上文件的改动决策层的规划价值最明显。有明确验收标准的任务比如测试全绿编译通过校验回退器能自动判断成败。团队协作环境规则配置可以版本化团队共享一套决策逻辑新人也能受益。重复性任务比如每周的依赖升级、格式统一规则一次写好长期复用。6.2 不适合的场景探索性任务比如帮我看看这个模块怎么设计比较好这种没有明确终点的任务决策层反而添乱。单文件小改动改个变量名、修个 typo直接让 Agent 干就行套决策层是杀鸡用牛刀。强交互场景需要人机来回讨论的需求决策层的自动化逻辑会打断节奏。我的经验是任务越结构化、验收标准越明确决策层的收益越大。反过来越开放、越依赖人判断的任务越应该让 Agent 自由发挥。6.3 一个判断标准如果你发现自己在反复给 Agent 解释同样的规则、反复纠正同样的错误那就是该上决策层了。决策层的本质是把你脑子里的隐性规则显性化、自动化。如果这些规则本来就不存在或者每次都不一样那决策层也帮不了你。7. 落地时几个容易被忽略的细节7.1 日志要记全但别记敏感内容决策层的日志是排查问题的命根子。我记录每次决策的输入、命中的规则、选择的策略、执行结果、耗时。但要注意任务描述里可能包含业务敏感信息日志落盘前要做脱敏。这个在个人项目里容易忽略一旦上团队环境就是隐患。7.2 给决策层留一个手动挡再智能的决策也有翻车的时候。我在决策层上加了一个开关允许用户强制指定策略绕过所有规则。这个开关平时不用但关键时刻能救命。设计自动化系统时永远要留一条人工干预的通道。7.3 规则要定期清理规则只增不减是通病。我每个月会看一遍规则命中统计把连续一个月零命中的规则删掉。规则库越干净决策越可预测。留着没用的规则只会增加维护负担和误判概率。7.4 别追求一步到位我第一版 Jev 只有一条规则任务超过 3 个文件就先出计划。就这一条已经解决了我 60% 的痛点。后面是慢慢加规则、慢慢调优的。想着一开始就设计一套完美决策系统大概率会烂尾。先跑起来再迭代。这套东西我用了大半年最大的体会是Coding Agent 的能力上限由模型决定但它的稳定性下限由决策层决定。模型再强没有好的决策和校验产出依然不可靠。反过来哪怕模型一般只要决策层把任务拆得合理、校验做得扎实整体产出也能达到可用水平。Jev 这层东西不复杂但它把用 Agent从碰运气变成了一件可预期的事这才是它真正的价值所在。

相关新闻

CMake target_link_libraries签名冲突:openvslam报错定位与统一修复

CMake target_link_libraries签名冲突:openvslam报错定位与统一修复

1. 问题背景与核心症结拆解1.1 这个报错到底在说什么做过C项目构建的人,大概率都在CMake这个环节栽过跟头。The plain signature for target_link_libraries has already been used with the target "openvslam"这个报错,字面意思很直白&#…

2026/10/19 12:59:13 阅读更多 →
bypy百度网盘命令行工具实战指南

bypy百度网盘命令行工具实战指南

1. 为什么非得在命令行里碰百度网盘?——一个被低估的生产力缺口你有没有过这种时刻:深夜改完一份200MB的实验数据集,想传给合作者,但图形界面的百度网盘客户端卡在“正在扫描文件”上纹丝不动;或者在一台没有桌面环境…

2026/10/19 12:59:13 阅读更多 →
远程驾驶技术解析:Vay基于NVIDIA DRIVE AGX的算力与安全架构

远程驾驶技术解析:Vay基于NVIDIA DRIVE AGX的算力与安全架构

1. “没有司机的车”背后,其实是远程司机在开车 最近两年,自动驾驶行业里出现了一种和“全无人Robotaxi”并行的路线—— 远程驾驶(Teledriving) 。Vay这家公司主推的就是这个方向:车辆本身具备一定感知和计算能力&a…

2026/10/19 12:59:13 阅读更多 →

最新新闻

移动端开发面试全攻略:从底层原理到备战策略

移动端开发面试全攻略:从底层原理到备战策略

移动端软件开发工程师的面试,这几年变化真的很明显。早几年可能重点还在“会不会写界面”“用过哪些三方库”“有没有完整上线过项目”,现在几乎每一轮都在往底层原理、性能优化、架构设计、跨端方案这些方向追着问。我身边不少写了三四年业务页面的朋友…

2026/10/19 13:29:19 阅读更多 →
高通8155p车机Android9开ASAN:Android.bp改了不生效的排查与解决

高通8155p车机Android9开ASAN:Android.bp改了不生效的排查与解决

简介:这份资源面向在高通8155p平台上进行QNXAndroid9双系统开发的工程师,聚焦于开启ASAN(AddressSanitizer)以定位内存越界、泄漏等疑难问题的编译配置方法。包内同时提供Android.mk与Android.bp两套构建脚本示例,覆盖…

2026/10/19 13:29:19 阅读更多 →
open-code-review:把代码审查变成可落地的自动化流程框架

open-code-review:把代码审查变成可落地的自动化流程框架

代码审查这事儿,在团队里推行的时候最容易陷入两个极端:要么流于形式,变成“点赞机器”,要么因为标准不统一,审查意见满天飞,最后大家干脆不看。我搞 open-code-review 这个项目,就是想把这件“…

2026/10/19 13:29:19 阅读更多 →
LangChain+通义千问搭建本地文档RAG问答系统实战

LangChain+通义千问搭建本地文档RAG问答系统实战

如果你手头有一堆产品说明书、内部培训文档或者论文资料,想让模型直接回答“这个参数在哪一章有说明”“这种报错该怎么办”,把问题丢给通用大模型,得到的基本就是一段逻辑通顺但内容可疑的“编造”——因为模型压根没见过你的资料。RAG&…

2026/10/19 13:29:19 阅读更多 →
HALCON+C#解析CAD矢量图:DXF轮廓提取与坐标映射实战

HALCON+C#解析CAD矢量图:DXF轮廓提取与坐标映射实战

简介:本资源是一份面向机器视觉初学者与C#开发者的HALCON与C#联合编程实战示例,聚焦CAD图纸(DXF格式)的读取与图像化显示这一典型工业检测前置环节。项目基于HALCON.NET封装库实现,涵盖环境配置要点(如halc…

2026/10/19 13:29:19 阅读更多 →
反向传播中的dX:梯度信号的传递逻辑与工程实践

反向传播中的dX:梯度信号的传递逻辑与工程实践

1. 反向传播里回传的那个“梯度信号”,到底是个什么东西我最早接触反向传播时,最迷惑的就是那一堆名字像孪生兄弟一样的变量:dW、db、dX。W是权重,b是偏置,这两个是参数,算它们的梯度去更新参数&#xff0c…

2026/10/19 13:28:17 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →