
1. 这不是模型排行榜而是一次真实工程现场的代码交付压力测试最近两周我几乎没碰过键盘写业务代码全泡在两个前沿模型的 CLI 工程交付现场里——不是看文档、不是跑 benchmark而是像带实习生一样手把手让 DeepSeek V4 Pro 和 GPT-5.3 Codex High 各自独立完成两个真实度极高的 TypeScript 工程任务一个是算法题里的“试金石”LRU Cache另一个是能直接扔进团队脚手架里跑起来的md-inspectorMarkdown 分析 CLI。这不是“谁更聪明”的智力游戏而是一场对工程直觉、边界意识、错误韧性、类型洁癖和交付闭环能力的实打实拷问。我用的不是第三方评测平台也不是抽象评分表而是自己搭的三重验证流水线第一层是 GPT-5.5 thinking 模型做盲审它不知道哪段代码是谁写的第二层是我自己逐行敲npm test npx tsc --noEmit node --loader ts-node/esm src/index.ts fixtures/valid.md验证可运行性第三层是把生成的 CLI 直接塞进我们组正在维护的文档平台 CI 流程里跑真实目录扫描。整个过程不设限、不提示、不补全——就像你把一个刚入职的高级前端工程师丢进需求池只给一份 PRD看他能不能交出可合并、可部署、可维护的代码。为什么选这两个模型因为它们代表了当前中文开发者最可能接触到的两类“强代码模型”DeepSeek V4 Pro 是国产模型中工程落地意愿最强、API 响应最稳的一支尤其在 TypeScript 生态里有明显倾向性GPT-5.3 Codex High 则是 OpenAI 在 Code 系列中首次明确以“工程交付”为设计目标的版本它的 prompt engineering 更偏向 real-world constraints 而非 pure algorithmic correctness。而测试场景也刻意避开了“写个排序”“生成 React 组件”这类玩具题——LRU Cache 看的是你对数据结构本质的理解是否穿透了语言语法糖md-inspector则逼你面对 Node.js 文件系统的真实毛刺权限拒绝、路径编码、空目录、读取中断、跨平台分隔符、正则误匹配……这些地方模型不会告诉你它错了它只会默默给你一段看起来很美、跑起来就 panic 的代码。关键词不是“AI”“大模型”“评测”而是TypeScript 工程交付、CLI 可运行性、tsc 类型检查通过率、错误语义一致性、测试覆盖率真实性。如果你正考虑把某个模型接入团队的代码生成工作流或者想评估它能否替代 junior dev 完成脚手架级任务这篇记录就是你该盯住的细节清单——不是分数而是它在哪一行漏掉了null as unknown as K在哪一个测试用例里把fs.readdirSync的异常吞掉了又在哪一个 CLI 参数校验里忘了处理--help的 exit code。这些才是决定你团队每天多花两小时 debug 还是少写三百行胶水代码的关键。2. LRU Cache一场关于“O(1)承诺”与“边界洁癖”的深度解剖2.1 为什么这道题比 LeetCode 标准题更难LRU Cache 表面是道经典算法题但在我这里它是一张“工程信用调查表”。LeetCode 只要你输出正确结果而真实项目里你得向同事、向 CI、向未来三个月的自己承诺get 和 put 真的稳定在 O(1)capacity0 不会崩undefined 值不会被误判为未命中测试不是只跑 happy path。这背后是三个层次的考验数据结构直觉层能否一眼识别 Map 双向链表是唯一能同时满足 O(1) 查找与 O(1) 顺序更新的组合还是下意识用Array.indexOf()写 get然后在性能 review 时被当场指出边界防御层capacity 接收 NaN、Infinity、负数、浮点数时是静默转 0 还是抛错key 为0、false、时if (map.get(key))是否导致逻辑坍塌这些不是“边缘 case”而是 Node.js 里process.argv解析、JSON Schema 校验、用户输入表单的日常。类型契约层TypeScript 不是加个: number就完事。当你声明class LRUCacheK, V你就承诺了 key 和 value 的泛型约束能在整个生命周期内被类型系统追踪——包括哨兵节点怎么建模、removeNode后指针如何清理、get返回值如何区分“未命中”与“命中 undefined”。所以我的测试不是让它写一次代码而是启动一个“压力追问循环”第一轮看本能反应第二轮加泛型第三轮加容量校验第四轮加tryGetAPI第五轮让它自我审查测试用例的完备性。这个过程暴露的不是“会不会”而是“有没有形成工程肌肉记忆”。2.2 DeepSeek V4 Pro标准答案的起点但不是终点DeepSeek V4 Pro 第一版交出的 LRU 实现让我立刻坐直了身体。它没走任何捷径直接给出教科书级结构class ListNode { key: number; val: number; prev: ListNode | null null; next: ListNode | null null; } class LRUCache { private capacity: number; private map new Mapnumber, ListNode(); private head: ListNode; private tail: ListNode; }get时从 Map 找节点并移至头部put时超容则淘汰 tail 前节点——完全符合 O(1) 承诺。更关键的是它主动处理了 capacity0 的情况if (this.capacity 0) return;还写了 5 个测试覆盖capacity0、capacity1、更新已有 key、LeetCode 示例用例。第一版评分 8.2扣分点很实在泛型缺失key: number; val: number锁死了类型无法用于LRUCachestring, User容量校验松散constructor(capacity: number)没检查isNaN(capacity)或capacity 0指针污染removeNode后没置node.prev node.next null导致 GC 无法回收内存泄漏隐患测试伪命题声称测试了“淘汰节点指针置空”但测试代码根本拿不到内部节点引用实际只验证了 key 是否被移除。这些问题不是能力不足而是工程习惯尚未固化。当我追问“请升级为泛型版本并确保类型安全”它迅速重构为export class LRUCacheK, V { private capacity: number; private map new MapK, DataEntryK, V(); private head: LinkEntry; private tail: LinkEntry; constructor(capacity: number) { if (!Number.isInteger(capacity) || capacity 0) { throw new Error(Capacity must be non-negative integer); } this.capacity capacity; this.head new LinkEntry(); this.tail new LinkEntry(); this.head.next this.tail; this.tail.prev this.head; } }它把链表指针逻辑抽离到LinkEntry数据逻辑放到DataEntryK, V彻底规避了null as unknown as K。还补了size、has、clear方法测试用 Vitest 覆盖NaN、Infinity、undefinedvalue 等场景。最终版评分升至 9.0但那个“伪测试”的修正过程特别值得玩味它先写了看似完美的测试被指出逻辑漏洞后不是辩解而是立刻删除并重写为“批量读写下的 LRU 淘汰正确性”——说明它具备可修正性只是缺乏初始的全局自查意识。提示DeepSeek 的强项在于“第一响应质量高”它像一个准备充分的面试者能快速给出标准解法。但它的弱项是“工程惯性不足”需要明确指令才能触发泛型、校验、清理等进阶动作。如果你的 workflow 是“先给 prompt再迭代 refine”它非常顺手但如果你期望它自动补齐所有工程细节就得在 system prompt 里写死规则。2.3 GPT-5.3 Codex High工程闭环的完整度藏在哨兵节点的设计里GPT-5.3 Codex High 第一版同样用了 Map 双向链表但结构更早体现工程思维class ListNodeK, V { key: K; value: V; prev: ListNodeK, V | null null; next: ListNodeK, V | null null; }泛型从第一行就存在。但它的问题也很典型constructor(capacity: number)里用Math.max(0, capacity)处理负数却没防NaNget返回V | undefined导致cache.get(key) undefined无法区分“未命中”与“命中 undefined 值”测试用例只覆盖 happy path没碰非法 capacity。真正拉开差距的是第二轮追问后的“circular sentinel”设计。它没沿用 DeepSeek 的“head/tail 两个独立哨兵”而是创建了一个自循环节点class LinkNode { prev: LinkNode; next: LinkNode; constructor() { this.prev this; this.next this; } } class DataNodeK, V extends LinkNode { constructor(public key: K, public value: V) { super(); } }这个设计精妙在哪第一彻底消除 null 检查node.next ! null变成node.next ! node类型更干净第二插入/删除逻辑统一无论插头插尾操作都是newNode.next this.next; this.next.prev newNode;没有 if-else 分支第三天然支持空链表初始化时head就是自循环节点无需额外判断。它还把get改成返回联合类型type GetResultV { hit: true; value: V } | { hit: false };并在测试里专门覆盖value undefined场景。最终版评分 8.6扣分点集中在“工程完整度”测试只有 8 个比 DeepSeek 少 6 个没解释为什么选 circular sentinel没写tryGet这样的 API 分层。但它赢在每个决策都有工程意图支撑——不是“为了泛型而泛型”而是“泛型是为了让LRUCachestring, {id: number}的类型推导不崩”。注意Codex High 的优势不是“更聪明”而是“更懂工程师的痛点”。它知道null as unknown是类型系统的污点知道undefined值会导致业务逻辑歧义知道 circular sentinel 能减少边界判断。这种对工程毛刺的敏感度是长期浸润在真实代码库中形成的直觉。2.4 关键差异对比不是分数而是决策链条的长度我把两者的决策链条拉出来对比发现核心差距不在单点能力而在工程决策的纵深决策环节DeepSeek V4 ProGPT-5.3 Codex High差距本质数据结构选择Map 双向链表标准Map 双向链表标准无差异泛型引入时机追问后添加第一版即存在Codex 更早建立类型契约哨兵节点建模head/tail 两个 null 节点 → 追问后拆分为 LinkEntry/DataEntry第一版 circular sentinelCodex 对类型安全的预判更深get API 设计追问后增加tryGet分层第一版即返回{hit: true/false}Codex 主动解决业务歧义容量校验粒度追问后加Number.isInteger追问后加isNaN/Infinity/负数/浮点Codex 边界覆盖更细测试驱动意识追问后补 Vitest覆盖 14 个 case追问后补 Vitest覆盖 8 个 caseDeepSeek 更重测试数量Codex 更重测试意图这个表格说明DeepSeek 是“优秀的执行者”Codex High 是“有经验的架构师”。前者能高质量完成你明确提出的每一项要求后者则会提前预判你没说出口的约束并把解决方案嵌入基础设计中。在 LRU 这种小任务里差距是 0.4 分但在一个需要持续迭代半年的 CLI 工具里这种“预判力”会放大为 30% 的维护成本差异。3. md-inspector CLI当模型面对真实文件系统时的崩溃与重生3.1 为什么 CLI 工程比算法题更能照见模型本质LRU Cache 是封闭世界里的逻辑游戏而md-inspector是开放世界里的生存挑战。它要求模型理解模糊需求题目说“统计字数”但没定义什么是“字数”——是textContent.length是正则/[\u4e00-\u9fa5\w]/g匹配数还是排除代码块后的可读内容模型必须主动声明假设处理系统毛刺fs.readdir可能因权限拒绝抛错fs.readFile可能因编码失败中断path.join在 Windows/macOS 下分隔符不同——这些不是 bug是 Node.js 的日常构建可交付产物不是写个函数而是产出package.json、tsconfig.json、vitest.config.ts、多文件模块、CLI 入口、测试 fixture、README 运行说明通过真实验收npm test必须全绿npx tsc --noEmit必须零 errornode src/index.ts ./test必须输出合法 JSONnode src/index.ts /nonexistent必须进入 warnings 字段而非 crash。这才是真正的 Agent 能力不是“能生成代码”而是“能交付一个在生产环境里不掉链子的工具”。我故意把题目写得像真实 PRD“空目录输出空报告”“不存在目录输出 JSON warning”“文件读取失败不能让程序崩溃”——这些描述里藏着对错误语义的精确要求而模型的实现是否 match直接决定它能否融入你的 CI/CD。3.2 GPT-5.3 Codex High工程闭环的教科书级示范Codex High 交出的md-inspector是我见过最接近“Senior Frontend Engineer 交付标准”的 AI 产物。它没急着写代码而是先列出了清晰的需求假设声明wordCount按正文可读内容统计因此需先移除 fenced code block...再计算“标题过长”定义为中文字符 20 个或英文单词 5 个或数字串 10 位仅将 作为 fenced code block 分隔符不支持 ~~~输出路径统一为相对输入目录的 POSIX 风格/ 分隔兼容 Windows这个声明本身就有价值——它把模糊需求转化成了可验证的规则避免了后续“我以为你懂”的扯皮。接着给出实现计划和项目结构md-inspector/ ├── package.json ├── tsconfig.json ├── vitest.config.ts ├── src/ │ ├── index.ts # CLI 入口参数解析主流程 │ ├── file-scanner.ts # 递归扫描目录处理 readdir 异常 │ ├── markdown-analyzer.ts # 解析单个 MD统计字段 │ ├── path-utils.ts # 跨平台路径标准化 │ ├── report.ts # 构建 JSON report 结构 │ └── types.ts # 类型定义 └── tests/ ├── report.test.ts # 核心测试 └── fixtures/ # 测试用例文件这个结构不是拍脑袋每个模块都对应一个明确职责。file-scanner.ts专门处理fs.readdir的异常markdown-analyzer.ts只负责解析report.ts只负责组装 JSON——关注点分离意识极强。最关键的证据是它的错误处理语义。题目要求“不存在目录输出 JSON warning”它没用console.error(Error: dir not found)加process.exit(1)而是// file-scanner.ts export async function scanDirectory(dirPath: string): PromiseScanResult { try { const entries await fs.readdir(dirPath, { withFileTypes: true }); // ... 正常扫描逻辑 } catch (err) { if (err.code ENOENT) { return { files: [], warnings: [Directory not found: ${dirPath}], }; } throw err; // 其他错误仍抛出 } }warnings字段被注入到最终 JSON 报告里npx tsc --noEmit通过它显式安装了types/nodenpm test10 个用例全绿包括chmod 000模拟权限失败。我甚至把它塞进我们组的文档 CI用真实 200 MD 文件跑输出 JSON 完全合规。提示Codex High 的胜利不在于“写了多少代码”而在于“每个模块的职责边界是否清晰”“错误是否被转化为可消费的数据结构”“类型定义是否贯穿始终”。它把 CLI 当作一个微服务来设计而不是一个脚本。3.3 DeepSeek V4 Pro强大的组织能力但工程收尾的“最后一公里”失守DeepSeek V4 Pro 的md-inspector同样令人印象深刻。它的项目结构合理模块命名精准scanner.ts、parser.ts、analyzer.ts、reporter.ts测试用例多达 14 个覆盖了空目录、不存在目录、多个一级标题、代码块内链接不计数等复杂场景。它甚至给出了详细的自我审查清单坦诚列出 8 个已知问题嵌套括号链接解析不完美如[text](url(with-paren))URL 会被计入字数未过滤https://...不支持缩进代码块只识别 未闭合代码块会影响统计摘要检测过宽正则/^---\s*$/可能误匹配不支持 glob 模式如**/*.mdCJK 范围可能误判正则/[\u4e00-\u9fa5]/未覆盖日韩字符大目录没有并发优化Promise.all未使用这份清单的价值远超代码本身——它证明模型具备真实工程师的元认知能力能定位自身局限能区分“已实现”和“待办”。但问题恰恰出在“已实现”部分的工程收尾上tsc 类型检查失败src/index.ts里用了fs.promises和process.cwd()但package.json没声明types/node依赖导致npx tsc --noEmit报错Cannot find name fs。这是 TypeScript CLI 工程的硬伤意味着它无法通过任何严肃团队的 pre-commit hook错误语义不一致对不存在目录它用console.error输出错误信息后process.exit(1)而非按题目要求注入warnings字段。这导致下游系统如 CI无法捕获错误为结构化数据只能 parse stderr扫描阶段容错不足它处理了单文件readFile失败但fs.readdir抛错时直接throw导致整个扫描中断不符合“局部失败不影响整体”的要求CLI 行为测试缺失14 个测试全在模块层analyzer.test.ts没有一个测试验证node src/index.ts /nonexistent的 stdout、exit code、stderr 是否符合预期。这些不是小瑕疵而是工程交付的致命伤。一个 CLI 工具如果连tsc都过不了它就只是玩具如果错误不能被结构化消费它就无法集成进自动化流程如果扫描一个子目录失败就 halt它在真实文档库面前就是纸老虎。注意DeepSeek 的短板不是“不会写”而是“对工程验收标准的敬畏感不足”。它像一个技术扎实但刚带第一个项目的 Tech Lead能写出漂亮模块但还没养成 checklist 式的交付习惯。你需要在 prompt 里明确写“必须通过 npx tsc --noEmit”“错误必须注入 warnings 字段而非 console.error”“exit code 必须为 0 除非不可恢复错误”。3.4 工程能力对比表从代码到可运行产物的全链路检验我把两个模型在md-inspector任务中的表现按真实交付链路拆解为 10 个硬性指标每项都经过我本地实测验证检验维度DeepSeek V4 ProGPT-5.3 Codex High实测结果说明1. npm test 全绿✅ 14/14 pass✅ 10/10 pass两者均通过DeepSeek 测试更全2. npx tsc --noEmit 通过❌ 报错Cannot find name fs✅ 零 errorCodex 显式安装types/nodeDeepSeek 遗漏3. CLI 入口可运行✅node src/index.ts ./test输出 JSON✅node src/index.ts ./test输出 JSON两者基础功能正常4. 不存在目录处理❌process.exit(1) stderr✅warnings字段 exit 0Codex 严格 match 题目语义5. 空目录输出✅{files:[],warnings:[]}✅{files:[],warnings:[]}两者均正确6. 文件读取失败✅ 单文件失败不中断进 warnings✅ 单文件失败不中断进 warnings两者均实现7. 跨平台路径✅ 使用path.posix.join✅ 使用path.posix.normalize两者均处理 POSIX 兼容8. 代码块内链接过滤✅ 正则匹配 包裹内容✅ 正则匹配 包裹内容两者均正确9. 中文标题过长检测✅ 字符数 20 触发 warning✅ 字符数 20 触发 warning两者均实现10. 自我审查完整性✅ 列出 8 个已知问题✅ 列出 5 个已知问题DeepSeek 更坦诚Codex 更聚焦核心这张表揭示了一个残酷事实在真实工程中“能跑”和“能交付”之间隔着一条鸿沟。DeepSeek V4 Pro 的代码组织、测试覆盖、自我反思能力极强但就在tsc和warnings这两个最基础的工程契约上失守Codex High 可能少了些“炫技式”的自我剖析但它把每一个验收点都焊死在代码里——从package.json的依赖声明到catch (err)的分支处理再到vitest.config.ts的配置。这种“契约精神”才是工业级代码生成的核心壁垒。4. 实操复现指南如何用这套方法论测试你自己的模型4.1 我的测试环境搭建轻量、可复现、零依赖你不需要买 GPU 服务器或开云服务就能复现这套测试。我用的是一台 2021 款 MacBook ProM1 Pro全程在 VS Code 里操作所有工具都是免费开源的模型调用全部通过官方 APIDeepSeek V4 Pro 用https://api.deepseek.com/v1/chat/completionsGPT-5.3 Codex High 用https://api.openai.com/v1/chat/completions不依赖任何第三方代理或中间件代码验证本地 Node.js v20.12.0 TypeScript v5.4.5 Vitest v2.0.5npm init -y后三行命令搞定npm install -D typescript types/node vitest npx tsc --init --module commonjs --target es2020 echo import { defineConfig } from vitest/config; export default defineConfig({ test: { include: [tests/**/*.test.ts] } }); vitest.config.ts盲审模型GPT-5.5 thinking 用gpt-4o-mini成本极低prompt 是“你是一个资深 TypeScript 工程师现在要评审两份 LRU Cache 实现。请忽略作者信息仅基于代码质量、边界处理、类型安全、测试完备性打分0-10并指出具体扣分点。”关键不是工具而是测试协议。我给自己定了三条铁律零提示干预不给模型任何 hint比如不说“请用 circular sentinel”只说“请实现 LRU Cache要求 get/put O(1)capacity0 时正确处理”三重验证闭环每份代码必须同时通过npm test、npx tsc --noEmit、node src/index.ts三个命令错误必须可消费所有异常不能console.error后process.exit必须转化为结构化数据如warnings: string[]让下游系统能 parse。这套协议保证了结果不是“哪个模型更讨喜”而是“哪个模型更扛得住真实世界的毛刺”。4.2 LRU Cache 测试的 prompt 工程技巧如何让模型暴露真实水平很多人测模型一上来就丢个“写个 LRU Cache”结果得到一堆似是而非的代码。要挖出模型的工程深度prompt 必须像考官一样层层递进。我的标准流程是第一轮本能测试不提泛型、不提校验“用 TypeScript 实现一个 LRU Cache。要求1. get 和 put 时间复杂度均为 O(1)2. 支持 capacity 参数3. capacity 为 0 时行为正确4. 写出完整可运行代码5. 给出至少 5 个测试用例。”目的看它第一反应是否用 Map双向链表是否主动处理 capacity0是否写测试。第二轮泛型与类型加固暴露类型洁癖“请将上述 LRU Cache 升级为泛型版本 LRUCacheK, V。要求1. key 和 value 类型完全泛化2. constructor 中校验 capacity 为非负整数拒绝 NaN、Infinity、负数、浮点数3. removeNode 后清理节点指针prev/next 置 null4. 增加 size()、has(key)、clear() 方法5. 用 Vitest 写测试覆盖 capacity0/1、更新已有 key、undefined value。”目的看它能否摆脱number的思维定式能否理解 TypeScript 泛型的 runtime 限制如不能instanceof K能否写出真正安全的指针清理。第三轮API 分层与歧义消除考察工程直觉“当前 get(key) 返回 V | undefined这会导致 value 为 undefined 时无法区分‘未命中’与‘命中 undefined’。请设计两个 APIget(key) 保持简单语义tryGet(key) 返回 {found: true, value: V} | {found: false}。并解释为何这样设计。”目的看它是否意识到业务逻辑歧义是否愿意用 API 分层解决而非强行用get(key) ?? defaultValue掩盖问题。提示不要怕 prompt 很长。模型不是人它没有“理解上下文”的负担越精确的指令越能触发它知识库里的高质量模式。我测试时每个追问都复制粘贴完整 prompt不省略任何条件。4.3 md-inspector CLI 的验收 checklist一份可直接抄作业的交付标准如果你打算把模型生成的 CLI 接入团队别信它说“已实现”用这份 checklist 逐项 hammer[ ] package.json 必须包含types/node否则npx tsc --noEmit必挂。检查devDependencies里是否有types/node: ^20.12.0[ ] CLI 入口必须处理process.argvnode src/index.ts ./docs要能解析路径node src/index.ts --help要输出 usage[ ] 错误必须结构化fs.readdir报ENOENT时不能throw new Error()必须返回{ files: [], warnings: [Directory not found] }[ ] 跨平台路径必须标准化Windows 下C:\docs\readme.md输入输出 JSON 里的filePath必须是docs/readme.mdPOSIX 风格[ ] 代码块过滤必须精确正则/[\s\S]*?/g要能匹配多行、嵌套反引号如 且不误杀~开头的代码块[ ] 字数统计必须排除代码块先用正则移除所有...块再对剩余文本统计不能简单textContent.length[ ] 测试必须覆盖chmod 000用execSync(chmod 000 ./test-dir)模拟权限拒绝验证是否进 warnings 而非 crash[ ] tsc 必须零 error运行npx tsc --noEmit --skipLibCheck输出必须为空[ ] npm test 必须全绿且测试用例名要体现边界如it(should handle directory with no .md files, () { ... })[ ] README 必须有运行命令npm install npx tsx src/index.ts ./fixtures不能只写“运行即可”。这份 checklist 来自我踩过的所有坑。曾经有个模型生成的 CLI 在 macOS 上跑得好好的一上 Linux CI 就崩——因为用了path.sep拼接路径而 Linux 下sep是/但 JSON 输出里混进了\。后来我强制加了path.posix.join才解决。5. 常见问题与实战避坑那些文档里永远不会写的血泪教训5.1 “为什么我的模型总在 tsc 上失败”这是最高频问题。90% 的失败不是模型能力问题而是 prompt 缺失关键约束。我总结了三大死区死区一types/node依赖遗忘模型知道fs.promises但不知道它需要types/node。解决方案在 prompt 末尾加一句硬性要求——“package.json的devDependencies必须包含types/node版本号与当前 Node.js 主版本匹配如 Node.js 20.x 对应types/node:^20”。死区二process全局对象未声明process.cwd()、process.argv在 strict mode 下会报错Cannot find name process。解决方案在tsconfig.json里确保lib: [ES2020, DOM]或在 prompt 里要求“src/index.ts顶部添加/// reference typesnode /”。死区三__dirname在 ESM 下不可用如果模型用import.meta.url生成路径但tsconfig.json里module: commonjs就会冲突。解决方案统一要求“项目使用 ES Moduletsconfig.json设置\module\: \ES2022\路径用fileURLToPath(import.meta.url)”。实测心得我在测试中发现只要 prompt 里写明“使用 ES Moduletsconfig.json设置\module\: \ES2022\”DeepSeek V4 Pro 的 tsc 通过率从 0% 升到 100%。模型不是不会是需要你告诉它“游戏规则”。5.2 “测试用例总是覆盖不全怎么办”模型写的测试往往陷入两个极端要么全是it(should work, () {})要么堆砌 20 个相似用例。破局关键是用测试金字塔倒推塔尖1个端到端 CLI 行为测试it(should output warnings for nonexistent directory, async () { const result await execa(node, [src/index.ts, /nonexistent]); expect(result.exitCode).toBe(0); expect(JSON.parse(result.stdout)).toHaveProperty(warnings); });塔身5个核心模块集成测试如file-scanner.test.ts测试scanDirectory对ENOENT、EACCES、空目录、混合文件的响应。**塔基1