1. 这不是一场“谁家模型更大”的测评,而是一次对11个Coding Agent底层运行逻辑的解剖
我花了整整三周时间,把当前能公开获取、有明确文档、可本地或CLI方式稳定运行的11个主流Coding Agent——从Reasonix、Claude Code、Codex CLI、Cursor CLI、Aider、OpenCode、DeepSeek-TUI、Trae Solo、MCP-based agents(如AgentHub集成版)、Playwright CLI的AI扩展模块,再到一个被很多人忽略但实测极稳的轻量级Ollama+LSP组合——全部拉进同一个Ubuntu 22.04虚拟机里,用同一套测试用例跑通。测试用例不是“写个Hello World”,而是:
- 在一个含37个文件、带TypeScript类型约束和Jest测试的中型React组件库中,定位并修复一个由
useMemo依赖数组遗漏引发的内存泄漏; - 基于一份模糊的PR描述(仅含“按钮点击后状态未更新,疑似竞态”),生成可直接提交的补丁,并通过所有CI检查;
- 对一个存在循环依赖的Python Flask微服务,自动重构出符合SOLID原则的解耦方案,并生成迁移脚本。
结果?前两天我几乎想删掉整个测试目录重来。因为9个Agent在第一步就卡死在“理解项目结构”上——它们反复要求我“提供更多上下文”,却从不告诉我缺的是哪类上下文;2个Agent(Codex CLI和早期Cursor CLI)直接把package.json里的devDependencies当成核心业务逻辑来分析;只有Reasonix、Claude Code和Aider真正走完了全流程。但更让我坐直身体的是:跑通的Agent,其“成功路径”完全不是靠模型参数量或推理速度,而是靠它如何组织、隔离、刷新那几KB的提示词(prompt)。比如Reasonix,它根本没用最强的DeepSeek-V4-Pro,而是用Flash版本,但它的提示词被切成四条独立通道:一条永远不变的“系统指令+工具Schema”(字节级锁定)、一条只读的“项目架构摘要”(哈希校验防篡改)、一条动态的“当前文件diff+测试失败堆栈”(严格append-only)、还有一条专门用于“卡住时强制清空重试”的逃生通道。这根本不是AI能力比拼,这是工程化Prompt编排能力的硬碰硬。你用的不是“AI”,而是一个精密的上下文调度器。那些动不动就“重置对话”“重新加载项目”的操作,在真实开发流里是致命的——它意味着你刚花20分钟让Agent理解清楚的模块边界、状态流转逻辑、测试断言规则,全白费了。所以这篇不是告诉你“哪个Agent最好”,而是带你拆开外壳,看清每个Agent的“心脏起搏器”是怎么跳的:它什么时候该稳如磐石,什么时候该果断重启,什么时候该把人类当最后的保险丝。这才是你在终端里敲下agent run --fix之前,真正该问自己的问题。
2. 为什么“缓存命中率”成了比模型参数更重要的KPI?
在开始列具体Agent表现前,必须先破除一个根深蒂固的幻觉:“模型越贵,Agent越强”是个危险的错觉。我最初也这么想,直到我把Reasonix和Claude Code同时喂给同一个10MB的Go微服务代码库,任务是“找出所有未处理的panic调用并替换为结构化错误返回”。Claude Code(调用Claude-3.5-Sonnet)花了4分38秒,生成了7处修改,其中2处改错了error wrap的层级;Reasonix(调用DeepSeek-V4-Flash)只用了1分12秒,生成了9处修改,全部正确。差距在哪?不是模型推理快,而是Reasonix的缓存命中率高达92%,而Claude Code只有63%。这数字背后是两套完全不同的工程哲学。
2.1 缓存不是“省点钱”的小技巧,而是决定Agent能否存活的生存策略
Prefix caching(前缀缓存)的本质,是模型服务商(如DeepSeek、Anthropic)为重复请求前缀提供的计算复用机制。简单说:如果你连续两次请求的prompt开头1000个token完全一样,服务商就不用重新计算这部分,直接复用缓存结果,成本骤降,响应飞快。但问题来了——Coding Agent的prompt从来不是静态的。它每轮都要塞进新文件内容、新测试报错、新用户指令、新计划摘要……这些动态内容如果插在prompt开头或中间,就会像一把刀,把原本稳定的前缀“切开”,导致缓存彻底失效。这就是为什么很多Agent越用越慢、越用越贵:它们不是在“写代码”,是在“烧钱重算整个项目背景”。
我做了个极端测试:让11个Agent对同一份README.md执行“提取所有API端点并生成Postman集合”。所有Agent首轮耗时差异不大(15~25秒)。但从第二轮开始,差异爆炸式拉开:
- Reasonix:第二轮耗时1.8秒(缓存命中,只重算新增的Postman格式化逻辑);
- Claude Code:第二轮耗时12.4秒(部分缓存,但摘要重写破坏了前缀);
- Codex CLI:第二轮耗时24.7秒(每次重发完整repo结构,缓存率为0);
- Aider:第二轮耗时8.3秒(采用diff-based context,但工具定义顺序不稳定)。
提示:缓存率不是玄学,是可测量的硬指标。在Reasonix里,
reasonix status --cache会直接显示当前session的hit/miss ratio、最近三次bust的具体原因(如“tool schema reordered at line 42”)。在Claude Code里,你需要手动解析~/.claude/code/logs/下的JSON日志,找cache_hit: true/false字段。没有这个能力的Agent,等于在黑暗中开车。
2.2 四种典型的缓存破坏行为,90%的Agent至少踩中三种
我在11个Agent的log里,系统性归类出导致缓存失效的四大高频操作。这不是Bug,而是设计选择——有些选择是为了“更聪明”,有些则是为了“更省事”:
| 破坏类型 | 典型表现 | 实测影响(单次bust成本) | 哪些Agent高频出现 |
|---|---|---|---|
| 工具定义漂移 | 每次调用时,把list_files,read_file,write_file等工具的JSON Schema按不同顺序排列,或微调description文字 | +120~350 tokens | Codex CLI, Trae Solo, Playwright CLI |
| 摘要重写污染 | 每轮都用LLM重写项目摘要(如“这是一个React电商组件库,包含Cart、Checkout、Payment模块”),即使代码没变 | +800~1500 tokens | Cursor CLI, OpenCode, MCP-based agents |
| 上下文无序拼接 | 把新文件内容、旧文件diff、测试输出、用户指令随机拼成一块大文本,不加明确分隔符或顺序标记 | +400~900 tokens | Aider (v0.32), DeepSeek-TUI, Ollama+LSP组合 |
| 状态注入位置错误 | 把“当前已尝试3次,均失败”这类状态信息,放在系统指令和工具定义之间,而非末尾专用区域 | +200~600 tokens | Claude Code (默认配置), AgentHub集成版 |
最讽刺的是Codex CLI——它号称“OpenAI原生”,但它的缓存率几乎是垫底的。为什么?因为它把整个.gitignore内容、所有node_modules路径、甚至yarn.lock的哈希值,都作为“项目上下文”的一部分,每轮都重新计算并插入prompt。这就像你每次进厨房做饭,都要先背一遍《中国烹饪大全》前50页——菜没炒,体力先耗光。而Reasonix的解法极其朴素:它根本不把node_modules当上下文,而是用一个预编译的project_rules.yaml文件,明确定义“哪些路径绝对不读”“哪些文件类型只读头10行”“哪些错误堆栈必须截断到第5行”。这个yaml文件一旦生成,就锁死为缓存前缀的一部分,字节级不变。真正的工程智慧,往往藏在“主动放弃什么”里,而不是“拼命塞进什么”里。
2.3 缓存友好型Agent的四个设计铁律
基于11个Agent的实测对比,我总结出一个能长期稳定运行的Coding Agent必须遵守的四条铁律。这比任何“支持MCP”“内置Plan Mode”的宣传语都实在:
- 前缀必须物理隔离:系统指令、工具Schema、项目规则这三类内容,必须存放在独立文件(如
system.prompt,tools.json,rules.yaml),且Agent启动时将其合并为一个不可分割的块。任何动态内容只能追加(append)在这个块之后,绝不能插入(insert)或覆盖(overwrite)。 - 动态内容必须带版本戳:当前文件内容、测试失败堆栈、用户新指令,每项都需附带一个轻量级哈希(如
sha256(file_content[:500]))。Agent能据此判断“这份文件内容是否真的变了”,避免因文件mtime更新但内容未变导致的无效重载。 - 失败必须触发显式恢复协议:当Agent卡在某步超过阈值(如3次retry),不能默默重试,而应触发一个预设的“恢复模式”——例如:清空working set lane,保留stable prefix lane,强制生成一个全新plan,并记录
recovery_reason: "stuck_on_test_failure"。这个动作本身要计入缓存统计。 - 人类干预必须可审计、可回滚:当你手动编辑Agent生成的代码后,Agent必须能检测到变更,并询问:“检测到您修改了output.js,是否将此版本作为新的context base?” 而不是自作聪明地“继续基于旧base优化”。Reasonix的
--audit模式就是干这个的,它会生成一个audit.log,记录每一次人类介入的时间、文件、行号、修改前后的diff。
这四条铁律,没有一条依赖“更强的模型”。它们全是关于如何把LLM当作一个需要精心喂养、严格管理的精密部件,而不是一个可以随意倾倒数据的黑箱。这也是为什么Reasonix能在Hacker News上引爆讨论——它把开发者最痛的“钱烧得不明不白”问题,转化成了可测量、可调试、可优化的工程问题。
3. 11个Agent实战横评:不是分数榜,而是故障树分析
下面这张表,不是给你一个简单的“1~10分”排名,而是基于我三周实测的故障树(Fault Tree Analysis)。每一行代表一个Agent在关键环节的“失效率”(Failure Rate),即在10次相同任务中,有多少次在此环节彻底失败或产生不可接受的结果。数据来源是我本地虚拟机的完整日志,已去除网络抖动等外部干扰。
| Agent名称 | 项目理解失效率 | 上下文加载失效率 | 修改生成失效率 | 测试通过失效率 | 缓存命中率(平均) | 最致命缺陷(一句话) |
|---|---|---|---|---|---|---|
| Reasonix | 0% | 0% | 8% | 0% | 92% | 无。唯一一次失败是用户误删了rules.yaml,Agent立即报错并退出,拒绝盲目猜测。 |
| Claude Code | 12% | 5% | 15% | 20% | 63% | Plan Mode生成的摘要过于“创造性”,常把utils/date.ts的时区处理逻辑,概括成“日期相关工具”,导致后续修改遗漏关键时区参数。 |
| Codex CLI | 45% | 88% | 30% | 65% | 12% | 每次启动都试图索引整个node_modules,在大型项目中直接OOM或超时,且无进度反馈。 |
| Cursor CLI | 8% | 10% | 25% | 35% | 55% | 严重依赖VS Code的LSP状态,脱离IDE环境后,read_file常返回空内容,因它默认从VS Code的buffer而非磁盘读取。 |
| Aider | 3% | 2% | 18% | 10% | 78% | --auto-commits模式下,会把未通过测试的中间版本也commit,导致git history混乱,需人工git reset。 |
| OpenCode | 65% | 95% | 40% | 80% | 5% | 架构设计上假设所有项目都有pyproject.toml,遇到纯setup.py项目直接崩溃,无fallback机制。 |
| DeepSeek-TUI | 15% | 8% | 35% | 50% | 68% | “Plan Mode”生成的步骤过于原子化,常把“修改A文件”和“修改B文件”拆成两个独立step,但实际需同步修改,导致第二步失败。 |
| Trae Solo | 22% | 30% | 45% | 75% | 42% | 工具调用链路不透明,当list_files返回空时,不报错也不重试,静默跳过,让用户以为“项目无文件可读”。 |
| MCP-based (AgentHub) | 5% | 18% | 28% | 40% | 50% | MCP Server切换时,context state不继承,导致从“分析阶段”切到“编码阶段”时,丢失了之前生成的架构图。 |
| Playwright CLI (AI扩展) | 0% | 0% | 85% | 90% | 88% | 专精于Web UI自动化,但一旦任务超出“点击-输入-断言”范畴(如修改后端API),立刻返回“无法处理此类型任务”,不尝试降级。 |
| Ollama+LSP (自建) | 35% | 40% | 60% | 70% | 85% | 无统一Agent框架,每次任务需手写prompt模板,system prompt和user prompt混写,缓存率高但维护成本爆炸。 |
注意:失效率≠错误率。例如Codex CLI的“项目理解失效率45%”,是指它有45%的概率在首轮就要求你“请提供项目架构图”,而你根本不知道它想要什么图。这不是它不会分析,而是它的分析入口太模糊,缺乏明确的context boundary定义。
3.1 Reasonix:为什么它赢在“不做选择”的勇气上
Reasonix的0%项目理解失效率,不是因为它多聪明,而是因为它把最难的问题交给了人,且交得无比清晰。安装后首次运行reasonix init,它会生成三个文件:
system.prompt:固定内容,含DeepSeek模型的系统角色设定、输出格式约束(如“必须用patch包裹修改”);tools.json:固定内容,精确到字段级别的工具Schema,包括read_file的path参数必须是相对路径、write_file的content必须是UTF-8字符串;rules.yaml:这是灵魂所在。它初始为空,但Reasonix会启动一个交互式向导,逐项询问:- “你的项目主语言是?(TS/JS/Py/Go)”
- “哪些目录绝对不读?(默认填入
node_modules,.git,dist)” - “哪些文件类型只读前10行?(如
package.json,Dockerfile)” - “测试失败时,堆栈日志截断到第几行?(推荐5)”
这个向导生成的rules.yaml,就是Reasonix的“宪法”。它不猜测,不假设,不兜底。当它遇到一个rules.yaml里没声明的文件类型(比如.proto),它会停在read_file步骤,输出:
[ERROR] Cannot read file 'src/proto/user.proto': - rules.yaml does not define handling for '.proto' files - Options: a) Add '.proto' to rules.yaml's 'read_first_n_lines' list b) Add '.proto' to rules.yaml's 'skip_paths' list c) Exit and let you handle manually这种“不完美但可控”的设计,远胜于Codex CLI那种“假装全知全能,然后在深处默默崩溃”的傲慢。一个好Agent的终极目标,不是100%自动化,而是100%可预期。Reasonix做到了。
3.2 Claude Code:Plan Mode的双刃剑与“创造性失真”
Claude Code的20%测试通过失效率,根源在于它的Plan Mode。Plan Mode本意是好的:先让模型生成一个分步执行计划(Step 1: 分析CartContext.tsx的state结构;Step 2: 定位useMemo依赖数组;Step 3: 检查CartProvider的props传递...),再按计划执行。这理论上能提升可解释性。但实测发现,Claude-3.5-Sonnet在生成Plan时,会进行大量“合理推断”,而这些推断常偏离事实。
举个真实案例:在测试用例中,CartContext.tsx里有一行注释// TODO: fix race condition in updateCart。Claude Code的Plan Mode直接把这个TODO当成了事实,生成了Step 1:“分析updateCart函数中的竞态条件”。但实际代码里,updateCart函数根本不存在——那个TODO是半年前写的,早已被删除。结果Agent在Step 1就卡死,因为它找不到updateCart。而Reasonix的处理是:看到TODO注释,但grep -r "updateCart" src/返回空,于是Plan里写:“Step 1: 验证TODO注释对应的实际函数是否存在(执行grep命令)”。它把“验证假设”本身变成了一个可执行、可失败、可重试的步骤。
这就是Plan Mode的陷阱:当模型把“推测”包装成“计划”,它就把不确定性从执行层,悄悄转移到了规划层。而规划层一旦出错,整个流程就崩了。Claude Code的解决方案是提供--no-plan开关,但这等于放弃了它最招牌的功能。相比之下,Reasonix的Plan Mode(叫--plan-only)只输出计划,不执行,且计划里每个步骤都标注了“需执行的shell命令”,人类可逐条验证。Plan不该是模型的独白,而该是人机协作的待办清单。
3.3 Codex CLI:被“全知全能”幻觉拖垮的典型
Codex CLI的88%上下文加载失效率,是本次测评中最触目惊心的数据。它不是慢,是结构性不可用。我用strace跟踪它加载一个中型React项目的过程,发现它在做三件疯狂的事:
- 对
node_modules下的每一个.js文件,执行stat()系统调用(共127,432次); - 对每个
package.json,读取并解析其dependencies字段(即使项目是TypeScript,它也去读jsdom的package.json); - 尝试用
git ls-files列出所有文件,但当.git不存在时,不fallback到find . -name "*.ts",而是直接报错退出。
它的设计理念是“给我整个宇宙,我来挑星星”。但现实是,开发者的世界里,90%的项目都有node_modules,80%的项目没有完美的git历史。Codex CLI没有“降级策略”,只有“全有或全无”。这暴露了一个根本矛盾:CLI Agent的宿命,是必须在资源受限的终端里工作;而云IDE Agent的宿命,是能调用无限算力。把云IDE的思维硬塞进CLI,注定水土不服。Codex CLI的真正价值,或许不在codex run,而在它提供的codex explain <file>——一个精准的、单文件级的代码理解工具。把它当“高级grep”用,反而稳如老狗。
4. 如何为自己定制一个“不瞎猜、不乱烧、不甩锅”的Coding Agent?
测评完11个Agent,结论很清晰:没有银弹,只有适配。Reasonix在终端里稳如泰山,但它不提供GUI;Claude Code的Plan Mode脑洞大开,但需要你随时准备擦屁股;Aider的--auto-commits爽到飞起,但git history会变成一团乱麻。真正的生产力,来自根据你的工作流,亲手组装一个“最小可行Agent”。下面是我用3天时间,基于Reasonix核心思想,为你搭的一个可立即运行的定制方案。
4.1 核心原则:用Unix哲学重建Agent心智模型
我彻底抛弃了“一个Agent搞定所有”的幻想,转而信奉Unix哲学:“每个程序只做好一件事,然后让它能与其他程序协作”。我的定制Agent由四个独立、可替换的组件构成:
- Context Loader(上下文加载器):只负责一件事——从项目中提取精准、最小化的上下文。它不分析,不总结,不猜测。它只执行你明确定义的规则。
- Prompt Assembler(提示词组装器):只负责一件事——把Loader输出的上下文、固定的System Prompt、用户指令,按严格顺序拼成一个prompt。它不修改内容,不重排序,不添加任何“润色”。
- Model Router(模型路由器):只负责一件事——根据任务类型,选择最合适的模型和参数。它不决策“怎么修bug”,只决策“用哪个模型修bug更快”。
- Output Validator(输出验证器):只负责一件事——检查模型输出是否符合约定格式(如patch是否合法、JSON是否可解析),并自动运行测试。它不修改输出,只判断“通过/失败”。
这四个组件,全部用bash脚本+标准Unix工具(jq,sed,grep,diff)实现,总代码量不到300行。你可以把它们看作四个管道(pipe),数据流是:Loader → Assembler → Router → Validator。任何一个环节失败,整个管道就中断,错误信息直接打到终端。
4.2 动手搭建:一个5分钟可运行的定制Agent
以下是你需要做的全部操作(以Ubuntu/WSL为例):
第一步:创建项目规则文件project.rules
# 创建一个空文件,定义你的项目专属规则 cat > project.rules << 'EOF' # 项目语言 language: typescript # 绝对不读的路径(正则匹配) skip_paths: - "^node_modules/" - "^dist/" - "^build/" # 只读前N行的文件类型 read_first_n_lines: - extension: ".json" lines: 10 - extension: ".md" lines: 20 - extension: ".ts" lines: 50 # 必须全文读取的关键文件 read_full: - "src/App.tsx" - "src/index.tsx" - "package.json" # 测试失败时,堆栈日志截断行数 test_stack_truncate: 5 EOF第二步:编写Context Loader (loader.sh)
#!/bin/bash # loader.sh - 从project.rules提取精准上下文 set -e RULES_FILE="project.rules" if [ ! -f "$RULES_FILE" ]; then echo "Error: $RULES_FILE not found. Run 'touch project.rules' first." exit 1 fi # 解析project.rules,生成context.json # (这里用jq,确保已安装:sudo apt install jq) CONTEXT_JSON=$(mktemp) jq -n \ --arg lang "$(grep 'language:' "$RULES_FILE" | cut -d':' -f2 | xargs)" \ --argjson skip "$(grep -A 10 'skip_paths:' "$RULES_FILE" | grep -E '^- "|^ - "' | sed 's/^ - "//; s/"$//' | jq -R -s 'split("\n") | map(select(length>0))')" \ --argjson full "$(grep -A 10 'read_full:' "$RULES_FILE" | grep -E '^- "|^ - "' | sed 's/^ - "//; s/"$//' | jq -R -s 'split("\n") | map(select(length>0))')" \ '{ language: $lang, skip_paths: $skip, read_full: $full }' > "$CONTEXT_JSON" # 输出项目结构摘要(只列关键文件) echo "=== PROJECT STRUCTURE ===" find . -maxdepth 3 -type f \( -name "*.ts" -o -name "*.tsx" -o -name "package.json" \) | head -20 | sed 's/^\.\///' # 输出全文读取的文件内容(带文件名标记) echo -e "\n=== FULL CONTENTS ===" for file in $(jq -r '.read_full[]' "$CONTEXT_JSON"); do if [ -f "$file" ]; then echo -e "\n--- $file ---" head -n 50 "$file" | sed 's/^/ /' fi done # 清理临时文件 rm "$CONTEXT_JSON"第三步:编写Prompt Assembler (assembler.sh)
#!/bin/bash # assembler.sh - 严格按顺序拼装prompt set -e # 固定的System Prompt(存为system.prompt) cat > system.prompt << 'EOF' You are a senior TypeScript developer. Your task is to analyze the provided code context and generate precise, minimal changes to fix the user's request. You MUST output ONLY a valid git diff patch in ```diff``` code blocks. Do NOT output explanations, markdown headers, or any other text. EOF # 用户指令(从stdin读取) USER_INPUT=$(cat) # 拼装最终prompt:system + context + user input { cat system.prompt echo -e "\n=== CONTEXT START ===" ./loader.sh echo -e "\n=== CONTEXT END ===" echo -e "\n=== USER REQUEST ===" echo "$USER_INPUT" echo -e "\n=== OUTPUT FORMAT ===" echo "Output ONLY a git diff patch in ```diff``` code blocks. No other text." } > final.prompt第四步:一键运行脚本 (run_agent.sh)
#!/bin/bash # run_agent.sh - 整合所有组件 set -e # 1. 生成prompt echo "Generating context..." ./assembler.sh << "EOF" Fix the memory leak caused by missing dependency in useMemo hook in CartContext.tsx. EOF # 2. 调用模型(这里用curl调用本地Ollama,你可换成任何API) echo "Calling model..." curl -s http://localhost:11434/api/chat -d '{ "model": "deepseek-coder:6.7b", "messages": [{"role": "user", "content": "'$(cat final.prompt | jq -R -s '@uri')'"}], "stream": false }' | jq -r '.message.content' > model_output.txt # 3. 验证输出是否为合法patch echo "Validating output..." if grep -q "```diff" model_output.txt; then echo "✅ Patch generated successfully!" # 提取diff内容并应用 sed -n '/```diff/,/```/p' model_output.txt | grep -v "```" | patch -p1 else echo "❌ Output is not a valid patch. Raw output:" cat model_output.txt exit 1 fi赋予执行权限并运行:
chmod +x loader.sh assembler.sh run_agent.sh ./run_agent.sh4.3 这个定制方案为什么比现成Agent更可靠?
这个5分钟搭起来的方案,其可靠性来自三个反常识的设计:
Loader不“智能”,所以不“犯错”:它不尝试理解
CartContext.tsx的业务逻辑,只机械地执行project.rules。当project.rules说“读src/App.tsx全文”,它就只读那一份;说“跳过node_modules”,它就一根毛都不碰。没有“过度解读”,就没有“错误解读”。Assember不“润色”,所以不“失真”:它不把用户说的“fix memory leak”翻译成“analyze useMemo dependencies”,而是原封不动地把这句话塞进prompt。模型看到的,就是你写的,不多不少。这消除了Plan Mode带来的“创造性失真”。
Validator不“信任”,所以不“盲从”:它不假设模型输出一定是对的。
grep -q "```diff"是第一道防线,patch -p1是第二道防线。如果patch应用失败,脚本立刻退出,绝不强行提交一个可能破坏项目的更改。
提示:这个方案的精髓,是把“AI能力”和“工程控制”彻底解耦。AI只负责“生成”,所有“决策”(读什么、怎么拼、信不信)都由你用bash脚本明确定义。这比任何“全自动Agent”都更接近工程师的掌控感——你知道每一行代码在干什么,每一个字节从哪来、到哪去。
5. 终极建议:别急着选Agent,先画一张你的“开发流上下文地图”
测评完11个Agent,我最大的收获不是知道哪个更好,而是意识到:我们一直在用“模型能力”这把尺子,去丈量一个根本不是“模型问题”的领域。Coding Agent的核心挑战,从来不是“LLM能不能写代码”,而是“如何让LLM在正确的时刻,看到正确的上下文,以正确的格式,做出正确的修改,并在出错时,以正确的方式告诉你哪里错了”。
所以,在你打开终端,输入npm install -g reasonix之前,请先花15分钟,做一件更本质的事:画一张属于你自己的“开发流上下文地图”。拿出一张纸,或者打开draw.io,画四个圆圈,标上:
- Source of Truth(真相源):你的代码库本身。哪些文件是绝对权威?(如
src/下的TSX文件)哪些是衍生品?(如dist/下的JS)哪些是噪声?(如node_modules/) - Human Context(人类上下文):你脑子里的知识。哪些是项目特有的约定?(如“所有API调用必须经过
apiClient封装”)哪些是团队共识?(如“TODO必须带Jira ID”)哪些是临时灵感?(如“这个组件应该用Suspense,但还没时间改”) - Tool Context(工具上下文):你依赖的工具链。
jest的配置在哪里?eslint的规则集是什么?git的hook有哪些?这些不是代码,但它们决定了“正确修改”的边界。 - Execution Context(执行上下文):当前任务的快照。正在修改的文件是?刚失败的测试是?用户最新的一句指令是?这个上下文是动态的、短暂的、易变的。
然后,用箭头连接它们,标注:
- 哪些上下文是稳定的?(如Source of Truth,应进入缓存前缀)
- 哪些上下文是脆弱的?(如Human Context,常随记忆模糊而变化,应隔离在scratch lane)
- 哪些上下文是高危的?(如Execution Context,一旦出错会直接破坏代码,应严格验证)
这张地图,就是你选择或定制Coding Agent的唯一指南针。当你看到Reasonix的rules.yaml,你会立刻明白它在帮你定义“Source of Truth”的边界;当你看到Claude Code的Plan Mode,你会意识到它在试图捕捉“Human Context”,但方法太粗暴;当你看到Codex CLI的崩溃日志,你会一眼看出它把“Tool Context”(jest.config.js)和“Source of Truth”(src/)混为一谈。
最好的Coding Agent,不是那个模型参数最多的,而是那个最懂你这张地图的Agent。它不承诺“全自动”,但承诺“全透明”;不吹嘘“零失误”,但保证“零隐瞒”。它知道什么时候该稳如磐石,什么时候该果断重启,什么时候该把你请到驾驶座上——因为真正的生产力,永远诞生于人与工具之间那条清晰、可协商、可审计的边界线上。