diff --git a/benchmarks/eval/report-filesense.mjs b/benchmarks/eval/report-filesense.mjs index 231bc88..c8047fc 100644 --- a/benchmarks/eval/report-filesense.mjs +++ b/benchmarks/eval/report-filesense.mjs @@ -173,7 +173,7 @@ console.log(` ## 规划降级(读数前必看) LLM 规划抛错后会静默退到规则生成,而规则生成给 create 任务的目标路径是硬编码的 -`src/new-file.ts`——表现为**步骤全绿、任务成功、文件写错地方**。降级过的任务 +\`src/new-file.ts\`——表现为**步骤全绿、任务成功、文件写错地方**。降级过的任务 不能与正常任务混在同一个通过率里。 | 臂 | 发生降级的任务数 | @@ -184,7 +184,7 @@ LLM 规划抛错后会静默退到规则生成,而规则生成给 create 任 ${ arms.full.filter((r) => r.plannerFallbackReason).length > 0 || arms.off.filter((r) => r.plannerFallbackReason).length > 0 - ? '**本轮存在降级任务,通过率不可直接引用**——降级把路径覆盖成硬编码值,与 filesense 是否定位成功无关。降级原因见各条记录的 `plannerFallbackReason`。' + ? '**本轮存在降级任务,通过率不可直接引用**——降级把路径覆盖成硬编码值,与 filesense 是否定位成功无关。降级原因见各条记录的 plannerFallbackReason。' : '本轮无降级任务。' } diff --git a/benchmarks/results/2026-08-01-filesense-ablation.md b/benchmarks/results/2026-08-01-filesense-ablation.md new file mode 100644 index 0000000..98ad656 --- /dev/null +++ b/benchmarks/results/2026-08-01-filesense-ablation.md @@ -0,0 +1,147 @@ +# FrontAgent 消融评测:filesense 目录导航对一次通过率的影响 + +> **口径**:两臂唯一的差异是**是否注入 filesense 导航步骤**(`filesenseEnabled`)。 +> SDD、guard、RAG、模型、任务集、夹具、以及 filesense 的全部预算参数都相同且被显式钉死(已从 JSONL 校验)。 +> 严格说关臂不是「filesense 不可用」而是「planner 不注入导航步骤」——工具仍在注册表里, +> 但计划 prompt 与 schema 都不暴露 filesense 动作,模型点不到它;下面的关臂零触发守卫会验证这一点。 +> 2026-07-12 那轮的 full/ablation 两臂 **filesense 都是开的**,因此那份数据说明不了 filesense 的任何事情。 + +## 方法 + +- **夹具**:`benchmarks/eval/fixture-deep`(两臂一致,已从 JSONL 记录校验)。 +- **任务集**:冻结的 12 条任务(`benchmarks/eval/tasks-deep.json`)。 +- **模型**:`claude-haiku-4-5`,经 Claude Code CLI 作纯文本后端。 +- **两臂**: + - **filesense 开(full)**:默认配置,规划阶段按 `decideFilesense` 的触发策略注入导航步骤。 + - **filesense 关(no-filesense)**:`filesense.enabled = false`,`phase.filesense-navigate` 不注入。 +- **验收(机器可判)**:文件存在性、内容正则、`tsc --noEmit`、既有单测。 +- 日期:2026-08-01 + +## 先看触发率:filesense 在多少任务上真的被用到 + +**10/12** 条任务触发了导航(`filesense_navigated`)。 +触发策略(`packages/core/src/filesense/trigger-policy.ts`)显式地不在所有任务上触发: +已知单文件任务直接用文件工具,query 类只在问到结构/定位/新鲜度时才触发。 + +**未触发的任务上两臂在架构上完全等价**,把它们算进总平均只会稀释效应。 +故下表同时给出全量与「仅触发子集」两个口径。 + +## 主结果 + +| 指标 | filesense 关 | filesense 开 | +|---|---|---| +| **一次通过率(全量 12 条)** | **33.3%**(4/12) | **33.3%**(4/12) | +| **一次通过率(仅触发子集 10 条)** | **40.0%**(4/10) | **40.0%**(4/10) | +| 平均 LLM 调用 / 任务 | 6 | 6 | +| 平均输入 token / 任务 | 12172 | 15086 | +| 平均输出 token / 任务 | 21496 | 25442 | +| 平均时延 / 任务 | 224s | 251s | + +**全量差值:0.0 个百分点(开 − 关)。** + +## 导航的实际工作量(仅 filesense 开臂有意义) + +这几个数字决定「按需预算供给」这条主张能不能拿数字说话—— +若预算闸从未触发,说明夹具规模不足以让 filesense 发挥作用, +此时无论通过率是多少,都是夹具的结论而不是能力的结论。 + +| 指标 | 值 | +|---|---| +| 触发导航的任务数 | 10 / 12 | +| 累计扫描条目 | 422 | +| 触发任务的平均扫描条目 | 42 | +| **预算闸被触发(truncated)的任务数** | **1** | + +## 分类通过率 + +| 类别 | filesense 关 | filesense 开 | 该类触发导航数 | +|---|---|---|---| +| query | 0/4(0.0%) | 0/4(0.0%) | 2/4 | +| create | 2/3(66.7%) | 2/3(66.7%) | 3/3 | +| bugfix | 0/3(0.0%) | 0/3(0.0%) | 3/3 | +| refactor | 2/2(100.0%) | 2/2(100.0%) | 2/2 | + +## 规划降级(读数前必看) + +LLM 规划抛错后会静默退到规则生成,而规则生成给 create 任务的目标路径是硬编码的 +`src/new-file.ts`——表现为**步骤全绿、任务成功、文件写错地方**。降级过的任务 +不能与正常任务混在同一个通过率里。 + +| 臂 | 发生降级的任务数 | +|---|---| +| filesense 开 | 0 / 12 | +| filesense 关 | 0 / 12 | + +本轮无降级任务。 + +## 读数纪律 + +- 样本量 12(触发子集 10)。除非差值远大于抽样波动,**不得据此宣称 filesense 提升或无用**。 +- 「用了 filesense 的任务通过率 vs 没用的任务通过率」这种**同臂内**对比是混杂的: + 触发与否由任务类型决定,而任务类型本身就有难度差。只有本报告的**跨臂同任务**对比才是有效对照。 +- 若「预算闸被触发的任务数」为 0,说明夹具太小、三闸截断从未起作用, + 本轮结论只对该规模的项目成立,不能外推到真实仓库。 + +## 失败清单(复盘素材) + +- **[filesense 开] deep-query-route-source**:result_contains(routeTable), result_contains(/checkout), result_contains(/catalog) +- **[filesense 开] deep-query-structure**:result_contains(shared) +- **[filesense 开] deep-query-format-convention**:result_contains(checkout:), result_contains(toFixed) +- **[filesense 开] deep-query-shared-lib**:result_contains(clamp), result_contains(formatDate), result_contains(pluralize) +- **[filesense 开] deep-create-entity-guard**:file_contains(isExpired) +- **[filesense 开] deep-bugfix-checkout-total**:cmd(npx vitest run src/features/checkout/lib/computeTotal.test.t) +- **[filesense 开] deep-bugfix-cart-merge**:cmd(npx vitest run src/features/cart/lib/mergeLines.test.ts) +- **[filesense 开] deep-bugfix-shipping-eta**:cmd(npx vitest run src/features/shipping/lib/estimateEta.test.ts) +- **[filesense 关] deep-query-route-source**:result_contains(routeTable), result_contains(/checkout), result_contains(/catalog) +- **[filesense 关] deep-query-structure**:result_contains(features), result_contains(shared), result_contains(entities) +- **[filesense 关] deep-query-format-convention**:result_contains(checkout:), result_contains(toFixed) +- **[filesense 关] deep-query-shared-lib**:result_contains(clamp), result_contains(formatDate), result_contains(pluralize) +- **[filesense 关] deep-create-entity-guard**:file_contains(isExpired) +- **[filesense 关] deep-bugfix-checkout-total**:cmd(npx vitest run src/features/checkout/lib/computeTotal.test.t) +- **[filesense 关] deep-bugfix-cart-merge**:cmd(npx vitest run src/features/cart/lib/mergeLines.test.ts) +- **[filesense 关] deep-bugfix-shipping-eta**:cmd(npx vitest run src/features/shipping/lib/estimateEta.test.ts) + +--- + +## 结论(人工撰写,非生成器输出) + +**在这个夹具与这批任务上,开关 filesense 导航没有产生任何通过率差异**:全量 4/12 vs 4/12,逐条 12/12 结果完全一致,分类通过率也逐类相同。代价是 full 臂多花约 **35K 输入 / 47K 输出 token**、每任务平均多 27 秒。 + +### 这不等于「filesense 无用」,也不构成「它有用」的证据 + +三条限制必须与上面的数字一起读: + +1. **有效对照样本只有 8 条。** query 4 条两臂全败,且败因与 filesense 无关——`planner.ts:151` 让 query 任务永不走 LLM 规划(issue #419),导航产出无人消费。这 4 条对本次消融零判别力。 +2. **两个已知缺陷在压低可测贡献,且均未修。** #419(同上)与 #420(`trigger-policy` 把任务文本里的裸目录名当扫描根,实测一次扫描因此返回 0 条)。在它们修复前,这个零差异只能读作「当前状态下不可测」。 +3. **单次运行,无重复。** n=12 且每臂只跑一遍,不足以分辨小效应与抽样波动。 + +### 唯一可归因的观察:省一步摸索,代价是输入 token + +导航精度最高的一条(`deep-refactor-route-title`,430 条目仓库里只扫 1 条即锁定 `src/app/routes`): + +| | full | off | +|---|---|---| +| 结果 | PASS | **PASS** | +| 步骤 | 6 | **7** | +| 耗时 | 251s | **340s** | +| 输入 token | 20,421 | 14,921 | +| 输出 token | 22,524 | **25,865** | + +关掉导航仍然通过,但多走一步、多 89 秒、多产出 3.3K token;开着则多耗 5.5K 输入。**这是一笔可量化的交易——在这个规模的任务上并不划算。** + +反方向的样本同样记录在案:`deep-create-checkout-hook` 上 full 臂输入与输出**都更高**,没有换来任何收益。所以「导航是用输入换输出」这个说法在本轮数据上**不成立**,只在个别任务上偶然成立。 + +### 按类别拆解零差异的成因 + +| 类别 | 两臂 | 瓶颈 | +|---|---|---| +| query 0/4 | 相同 | #419——不走 LLM 规划,导航结果无人消费 | +| create 2/3 | 相同 | 目标位置在任务描述里线索较强,不导航也能猜对 | +| bugfix 0/3 | 相同 | 代码生成质量,与定位无关(三条都触发了导航、也读到了源文件) | +| refactor 2/2 | 相同 | 任务本身足够简单,一步摸索即可 | + +**零差异是可拆解的,不是「测不出所以没用」。** 下一步是修 #419 / #420 后重测,并设计目标位置无文本线索的任务——本轮 create 类的线索强度是本次设计的缺陷。 + +### 与 2026-07-12 那轮的关系 + +那轮的 `full` / `ablation` 两臂 **filesense 都是开的**(消融的是 SDD + guard),因此它对 filesense 不构成任何证据。本轮是第一次真正把 filesense 作为唯一变量。 diff --git a/benchmarks/results/2026-08-01-filesense/full-deep.jsonl b/benchmarks/results/2026-08-01-filesense/full-deep.jsonl new file mode 100644 index 0000000..a488d81 --- /dev/null +++ b/benchmarks/results/2026-08-01-filesense/full-deep.jsonl @@ -0,0 +1,12 @@ +{"taskId":"deep-query-route-source","category":"query","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":true,"agentError":null,"validationCount":2,"plannerFallbackReason":null,"runError":null,"resultHead":"# 无法直接确定\n\n基于当前提供的证据,**我无法给出明确答案**。\n\n## 原因\n\n目录导航结果仅显示了项目的**目录结构和候选路径**,但**不含任何文件的具体内容**。虽然扫描表明存在以下相关目录:\n- `src` - 主应用源目录\n- `src/app` - 应用内的分组目录\n\n但这些都只是结构推断,没有实际读取过这些文件来确认:\n1. 哪个文件定义了顶层导航路由表\n2. 该文件中当前包含","checks":[{"kind":"result_contains","ok":false,"detail":"routeTable"},{"kind":"result_contains","ok":false,"detail":"/checkout"},{"kind":"result_contains","ok":false,"detail":"/catalog"}],"events":{"task_started":1,"status_update":16,"security_decision":4,"planning_started":1,"planning_completed":1,"phase_started":2,"step_started":2,"step_completed":2,"phase_completed":2,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"understand_structure","paths":["."],"entries":54,"elapsedMs":11,"truncated":false,"candidateCount":15,"warnings":[]}],"validationFailed":[],"rollback":[]},"filesenseEntries":54,"filesenseTruncated":false,"elapsedMs":15179,"llmCalls":1,"llmFailures":0,"inputTokens":1391,"outputTokens":995} +{"taskId":"deep-query-structure","category":"query","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":true,"agentError":null,"validationCount":2,"plannerFallbackReason":null,"runError":null,"resultHead":"## 回答\n\n基于当前工作区的目录导航结果,我可以部分说明,但**证据不足以完整回答**你的问题:\n\n### src 下顶层目录的职责(已知部分)\n\n根据目录导航结果,能确认的顶层目录有:\n\n1. **src/app** — \"Grouping directory for related subdirectories\" \n 内部关联 `src/app/routes`(路由实现源目录) \n ","checks":[{"kind":"result_contains","ok":true,"detail":"features"},{"kind":"result_contains","ok":false,"detail":"shared"},{"kind":"result_contains","ok":true,"detail":"entities"}],"events":{"task_started":1,"status_update":16,"security_decision":4,"planning_started":1,"planning_completed":1,"phase_started":2,"step_started":2,"step_completed":2,"phase_completed":2,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"understand_structure","paths":["src","."],"entries":271,"elapsedMs":9,"truncated":true,"candidateCount":15,"warnings":["Filesense navigation was truncated by budget; expand depth/maxEntries if more coverage is needed."]}],"validationFailed":[],"rollback":[]},"filesenseEntries":271,"filesenseTruncated":true,"elapsedMs":22738,"llmCalls":1,"llmFailures":0,"inputTokens":1614,"outputTokens":1894} +{"taskId":"deep-query-format-convention","category":"query","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":true,"agentError":null,"validationCount":1,"plannerFallbackReason":null,"runError":null,"resultHead":"## 无法回答\n\n根据提供的证据,我**无法确定** checkout feature 自身的 format 函数返回什么格式的字符串。\n\n**原因:**\n- 你的问题是关于项目代码细节的技术问题,需要查看实际的代码实现\n- 当前提供的证据中**只有我的智能体身份信息**,没有:\n - 知识库条目中关于 checkout feature 的记录\n - 当前工作区文件中的 format 函数实现","checks":[{"kind":"result_contains","ok":false,"detail":"checkout:"},{"kind":"result_contains","ok":false,"detail":"toFixed"}],"events":{"task_started":1,"status_update":15,"security_decision":3,"planning_started":1,"planning_completed":1,"phase_started":1,"step_started":1,"step_completed":1,"phase_completed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":10969,"llmCalls":1,"llmFailures":0,"inputTokens":924,"outputTokens":644} +{"taskId":"deep-query-shared-lib","category":"query","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":true,"agentError":null,"validationCount":1,"plannerFallbackReason":null,"runError":null,"resultHead":"# 回答\n\n我无法回答这个问题。\n\n## 原因\n\n目前提供的证据中**没有关于共享工具库的任何信息**。我没有获取到:\n- 知识库条目中工具库的文档或清单\n- 当前工作区文件中工具库的代码或定义\n\n## 建议\n\n要获得准确答案,请:\n1. **提供工具库文件** - 如果工具库在当前工作区,我可以直接读取分析\n2. **提供知识库链接** - 如果工具库文档存储在知识库中,确保 RAG 检索能够命","checks":[{"kind":"result_contains","ok":false,"detail":"clamp"},{"kind":"result_contains","ok":false,"detail":"formatDate"},{"kind":"result_contains","ok":false,"detail":"pluralize"}],"events":{"task_started":1,"status_update":15,"security_decision":3,"planning_started":1,"planning_completed":1,"phase_started":1,"step_started":1,"step_completed":1,"phase_completed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":11651,"llmCalls":1,"llmFailures":0,"inputTokens":908,"outputTokens":676} +{"taskId":"deep-create-shared-truncate","category":"create","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":true,"agentSuccess":false,"agentError":"Hallucination detected: Cannot resolve import \"./truncate.js\" from \"src/shared/lib/truncate.test.ts\"","validationCount":7,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_exists","ok":true,"detail":"src/shared/lib/truncate.ts"},{"kind":"file_contains","ok":true,"detail":"truncate"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":24,"security_decision":11,"planning_started":1,"planning_completed":1,"phase_started":5,"step_started":7,"step_completed":6,"phase_completed":5,"validation_failed":1,"validation_failed:post_write":1,"step_failed":1,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"prepare_create","paths":["src/shared/lib"],"entries":8,"elapsedMs":3,"truncated":false,"candidateCount":8,"warnings":[]}],"validationFailed":[{"failedChecks":[{"type":"import_validity","severity":"block","message":"Hallucination detected: Cannot resolve import \"./truncate.js\" from \"src/shared/lib/truncate.test.ts\""}],"blockedBy":["Hallucination detected: Cannot resolve import \"./truncate.js\" from \"src/shared/lib/truncate.test.ts\""]}],"rollback":[]},"filesenseEntries":8,"filesenseTruncated":false,"elapsedMs":412395,"llmCalls":11,"llmFailures":0,"inputTokens":28020,"outputTokens":42932} +{"taskId":"deep-create-checkout-hook","category":"create","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":true,"agentSuccess":false,"agentError":"Command failed with exit code 128: git add -A && git commit -m 'feat: add useCheckoutTotal hook to checkout feature for calculating checkout totals'","validationCount":8,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_exists","ok":true,"detail":"src/features/checkout/hooks/useCheckoutTotal.ts"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":24,"security_decision":14,"planning_started":1,"planning_completed":1,"phase_started":5,"step_started":8,"step_completed":7,"phase_completed":5,"step_failed":1,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"prepare_create","paths":["hooks","src/features/checkout","src/features/checkout/hooks"],"entries":0,"elapsedMs":0,"truncated":false,"candidateCount":0,"warnings":[]}],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":481690,"llmCalls":11,"llmFailures":0,"inputTokens":27977,"outputTokens":48653} +{"taskId":"deep-create-entity-guard","category":"create","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":false,"agentError":"Pre-execution validation failed: File src/entities/coupon/lib/guards.ts does not exist. Use create_file instead of apply_patch.","validationCount":7,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_contains","ok":false,"detail":"isExpired"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":24,"security_decision":5,"planning_started":1,"planning_completed":1,"phase_started":5,"step_started":7,"step_completed":6,"phase_completed":5,"validation_failed":1,"validation_failed:pre_execution":1,"step_failed":1,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"prepare_create","paths":["src/entities/coupon","src/entities/coupon/model","src/entities/coupon/lib"],"entries":7,"elapsedMs":2,"truncated":false,"candidateCount":7,"warnings":["Path does not exist: src/entities/coupon/lib"]}],"validationFailed":[{"failedChecks":[{"type":"file_not_found","severity":"block","message":"Cannot apply patch: file src/entities/coupon/lib/guards.ts does not exist (confirmed by previous directory listing). Please use create_file instead."}],"blockedBy":["File src/entities/coupon/lib/guards.ts does not exist. Use create_file instead of apply_patch."]}],"rollback":[]},"filesenseEntries":7,"filesenseTruncated":false,"elapsedMs":352278,"llmCalls":5,"llmFailures":0,"inputTokens":12656,"outputTokens":37344} +{"taskId":"deep-bugfix-checkout-total","category":"bugfix","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":false,"agentError":"Pre-execution validation failed: File src/features/billing/lib/calculateAmount.ts does not exist. Use create_file instead of apply_patch.","validationCount":10,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"cmd","ok":false,"detail":"npx vitest run src/features/checkout/lib/computeTotal.test.ts"},{"kind":"typecheck","ok":true,"detail":""},{"kind":"file_unchanged","ok":true,"detail":"src/features/checkout/lib/computeTotal.test.ts"}],"events":{"task_started":1,"status_update":24,"security_decision":10,"planning_started":1,"planning_completed":1,"phase_started":5,"step_started":10,"step_completed":9,"phase_completed":5,"validation_failed":1,"validation_failed:pre_execution":1,"step_failed":1,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"understand_structure","paths":["src/features/checkout","src/features/billing","src/features/cart","src/features/billing/lib","src/features/billing/__tests__"],"entries":44,"elapsedMs":6,"truncated":false,"candidateCount":15,"warnings":["Path does not exist: src/features/billing/__tests__"]}],"validationFailed":[{"failedChecks":[{"type":"file_not_found","severity":"block","message":"Cannot apply patch: file src/features/billing/lib/calculateAmount.ts does not exist (confirmed by previous directory listing). Please use create_file instead."}],"blockedBy":["File src/features/billing/lib/calculateAmount.ts does not exist. Use create_file instead of apply_patch."]}],"rollback":[]},"filesenseEntries":44,"filesenseTruncated":false,"elapsedMs":395051,"llmCalls":7,"llmFailures":0,"inputTokens":22008,"outputTokens":40956} +{"taskId":"deep-bugfix-cart-merge","category":"bugfix","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":false,"agentError":"Pre-execution validation failed: File src/features/cart/lib/merge.ts does not exist. Use create_file instead of apply_patch.","validationCount":9,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"cmd","ok":false,"detail":"npx vitest run src/features/cart/lib/mergeLines.test.ts"},{"kind":"typecheck","ok":true,"detail":""},{"kind":"file_unchanged","ok":true,"detail":"src/features/cart/lib/mergeLines.test.ts"}],"events":{"task_started":1,"status_update":20,"security_decision":7,"planning_started":1,"planning_completed":1,"phase_started":5,"step_started":9,"step_completed":8,"phase_completed":5,"filesense_navigated":1,"validation_failed":1,"validation_failed:pre_execution":1,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"understand_structure","paths":["src/features/cart","src/features/cart/lib","src/features/cart/__tests__"],"entries":18,"elapsedMs":4,"truncated":false,"candidateCount":15,"warnings":["Path does not exist: src/features/cart/__tests__"]}],"validationFailed":[{"failedChecks":[{"type":"file_not_found","severity":"block","message":"Cannot apply patch: file src/features/cart/lib/merge.ts does not exist (confirmed by previous directory listing). Please use create_file instead."}],"blockedBy":["File src/features/cart/lib/merge.ts does not exist. Use create_file instead of apply_patch."]}],"rollback":[]},"filesenseEntries":18,"filesenseTruncated":false,"elapsedMs":401591,"llmCalls":7,"llmFailures":0,"inputTokens":20476,"outputTokens":43021} +{"taskId":"deep-bugfix-shipping-eta","category":"bugfix","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":false,"agentError":"Pre-execution validation failed: File src/features/shipping/lib/estimateDeliveryTime.ts does not exist. Use create_file instead of apply_patch.","validationCount":9,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"cmd","ok":false,"detail":"npx vitest run src/features/shipping/lib/estimateEta.test.ts"},{"kind":"typecheck","ok":true,"detail":""},{"kind":"file_unchanged","ok":true,"detail":"src/features/shipping/lib/estimateEta.test.ts"}],"events":{"task_started":1,"status_update":24,"security_decision":9,"planning_started":1,"planning_completed":1,"phase_started":5,"step_started":9,"step_completed":8,"phase_completed":5,"validation_failed":1,"validation_failed:pre_execution":1,"step_failed":1,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"understand_structure","paths":["src/features/shipping","src/features/shipping/lib"],"entries":18,"elapsedMs":3,"truncated":false,"candidateCount":15,"warnings":[]}],"validationFailed":[{"failedChecks":[{"type":"file_not_found","severity":"block","message":"Cannot apply patch: file src/features/shipping/lib/estimateDeliveryTime.ts does not exist (confirmed by previous directory listing). Please use create_file instead."}],"blockedBy":["File src/features/shipping/lib/estimateDeliveryTime.ts does not exist. Use create_file instead of apply_patch."]}],"rollback":[]},"filesenseEntries":18,"filesenseTruncated":false,"elapsedMs":379440,"llmCalls":7,"llmFailures":0,"inputTokens":20515,"outputTokens":40562} +{"taskId":"deep-refactor-route-title","category":"refactor","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":true,"agentSuccess":false,"agentError":"Command failed with exit code 1: npm run build","validationCount":6,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_contains","ok":true,"detail":"title"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":24,"security_decision":12,"planning_started":1,"planning_completed":1,"phase_started":5,"step_started":6,"step_completed":5,"phase_completed":5,"step_failed":1,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"prepare_refactor","paths":["src/app/routes"],"entries":1,"elapsedMs":1,"truncated":false,"candidateCount":1,"warnings":[]}],"validationFailed":[],"rollback":[]},"filesenseEntries":1,"filesenseTruncated":false,"elapsedMs":251273,"llmCalls":10,"llmFailures":0,"inputTokens":20421,"outputTokens":22524} +{"taskId":"deep-refactor-spinner-variant","category":"refactor","arm":"full","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":true,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":true,"agentSuccess":false,"agentError":"Command failed with exit code 1: npm run build","validationCount":6,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_contains","ok":true,"detail":"variant"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":24,"security_decision":12,"planning_started":1,"planning_completed":1,"phase_started":5,"step_started":6,"step_completed":5,"phase_completed":5,"step_failed":1,"filesense_navigated":1,"task_completed":1},"eventDetails":{"filesense":[{"intent":"prepare_refactor","paths":["src/shared/ui"],"entries":1,"elapsedMs":2,"truncated":false,"candidateCount":1,"warnings":[]}],"validationFailed":[],"rollback":[]},"filesenseEntries":1,"filesenseTruncated":false,"elapsedMs":277104,"llmCalls":11,"llmFailures":0,"inputTokens":24126,"outputTokens":25104} diff --git a/benchmarks/results/2026-08-01-filesense/no-filesense-deep.jsonl b/benchmarks/results/2026-08-01-filesense/no-filesense-deep.jsonl new file mode 100644 index 0000000..ae3b147 --- /dev/null +++ b/benchmarks/results/2026-08-01-filesense/no-filesense-deep.jsonl @@ -0,0 +1,12 @@ +{"taskId":"deep-query-route-source","category":"query","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":true,"agentError":null,"validationCount":1,"plannerFallbackReason":null,"runError":null,"resultHead":"# 回答\n\n无法确定。\n\n## 原因\n\n基于提供的证据,**没有关于该项目路由表的信息**:\n\n- ❌ 没有知识库条目(RAG 命中)\n- ❌ 没有当前工作区文件的内容\n- ❌ 系统上下文中仅有用户邮箱和当前日期,与路由表无关\n\n## 需要的信息\n\n要回答这个问题,我需要:\n\n1. **知识库或文档** —— 项目的架构说明或路由配置文档\n2. **当前工作区文件访问** —— 扫描项目源码中的路","checks":[{"kind":"result_contains","ok":false,"detail":"routeTable"},{"kind":"result_contains","ok":false,"detail":"/checkout"},{"kind":"result_contains","ok":false,"detail":"/catalog"}],"events":{"task_started":1,"status_update":15,"security_decision":3,"planning_started":1,"planning_completed":1,"phase_started":1,"step_started":1,"step_completed":1,"phase_completed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":12466,"llmCalls":1,"llmFailures":0,"inputTokens":929,"outputTokens":690} +{"taskId":"deep-query-structure","category":"query","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":true,"agentError":null,"validationCount":1,"plannerFallbackReason":null,"runError":null,"resultHead":"# 回答\n\n我目前**无法确定** src 下四个顶层目录及 feature 目录的具体分层约定。\n\n## 原因\n\n提供的证据中只有我的智能体身份定义,但**不包含**当前项目的实际结构信息。用户问的是具体项目结构问题,不是关于我是谁或能力范围的问题,因此需要:\n\n- **当前工作区文件**:如项目根目录的文档、README、或 src 目录结构\n- **知识库条目**:项目架构设计文档或开发规范","checks":[{"kind":"result_contains","ok":false,"detail":"features"},{"kind":"result_contains","ok":false,"detail":"shared"},{"kind":"result_contains","ok":false,"detail":"entities"}],"events":{"task_started":1,"status_update":15,"security_decision":3,"planning_started":1,"planning_completed":1,"phase_started":1,"step_started":1,"step_completed":1,"phase_completed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":12503,"llmCalls":1,"llmFailures":0,"inputTokens":921,"outputTokens":832} +{"taskId":"deep-query-format-convention","category":"query","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":true,"agentError":null,"validationCount":1,"plannerFallbackReason":null,"runError":null,"resultHead":"## 无法确定\n\n我无法回答这个问题,因为:\n\n1. **缺少代码证据** — 提供的可用证据中没有 checkout 这个 feature 的代码内容,也没有该 feature 中 format 函数的实现代码。\n\n2. **需要查看实现** — 要确定 format 函数的返回字符串格式,需要:\n - 在当前工作区文件中查看 checkout feature 对应的代码\n - 找到该 ","checks":[{"kind":"result_contains","ok":false,"detail":"checkout:"},{"kind":"result_contains","ok":false,"detail":"toFixed"}],"events":{"task_started":1,"status_update":15,"security_decision":3,"planning_started":1,"planning_completed":1,"phase_started":1,"step_started":1,"step_completed":1,"phase_completed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":11843,"llmCalls":1,"llmFailures":0,"inputTokens":924,"outputTokens":728} +{"taskId":"deep-query-shared-lib","category":"query","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":true,"agentError":null,"validationCount":1,"plannerFallbackReason":null,"runError":null,"resultHead":"# 无法确定\n\n我没有访问到共享工具库的相关证据。这个问题需要我读取当前工作区中的工具库文件或相关知识库条目,但在提供的可用证据中:\n\n- **没有当前工作区文件** 显示工具库的内容\n- **没有知识库条目** 记录工具库函数清单\n\n## 建议\n\n请提供以下任意一项信息,我即可为你逐个说明函数用途:\n\n1. **工具库文件路径** — 我可以读取当前工作区的实际文件\n2. **知识库中的工具库文","checks":[{"kind":"result_contains","ok":false,"detail":"clamp"},{"kind":"result_contains","ok":false,"detail":"formatDate"},{"kind":"result_contains","ok":false,"detail":"pluralize"}],"events":{"task_started":1,"status_update":15,"security_decision":3,"planning_started":1,"planning_completed":1,"phase_started":1,"step_started":1,"step_completed":1,"phase_completed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":12046,"llmCalls":1,"llmFailures":0,"inputTokens":908,"outputTokens":631} +{"taskId":"deep-create-shared-truncate","category":"create","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":true,"agentSuccess":false,"agentError":"Command failed with exit code 128: git add -A; if git diff --cached --quiet; then echo \"No staged changes, skip commit\"; exit 0; fi; git commit -m \"chore: automate repository management after acceptance\"","validationCount":7,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_exists","ok":true,"detail":"src/shared/lib/truncate.ts"},{"kind":"file_contains","ok":true,"detail":"truncate"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":24,"security_decision":15,"planning_started":1,"planning_completed":1,"phase_started":4,"step_started":7,"step_completed":6,"phase_completed":4,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":482270,"llmCalls":12,"llmFailures":0,"inputTokens":20070,"outputTokens":47448} +{"taskId":"deep-create-checkout-hook","category":"create","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":true,"agentSuccess":false,"agentError":"Command failed with exit code 128: git add -A; if git diff --cached --quiet; then echo \"No staged changes, skip commit\"; exit 0; fi; git commit -m \"chore: automate repository management after acceptance\"","validationCount":9,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_exists","ok":true,"detail":"src/features/checkout/hooks/useCheckoutTotal.ts"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":23,"security_decision":17,"planning_started":1,"planning_completed":1,"phase_started":4,"step_started":9,"step_completed":8,"phase_completed":4,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":345444,"llmCalls":9,"llmFailures":0,"inputTokens":16578,"outputTokens":33537} +{"taskId":"deep-create-entity-guard","category":"create","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":false,"agentError":"Pre-execution validation failed: File src/entities/coupon/guards.ts does not exist. Use create_file instead of apply_patch.","validationCount":6,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_contains","ok":false,"detail":"isExpired"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":23,"security_decision":5,"planning_started":1,"planning_completed":1,"phase_started":4,"step_started":6,"step_completed":5,"phase_completed":4,"validation_failed":1,"validation_failed:pre_execution":1,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[{"failedChecks":[{"type":"file_not_found","severity":"block","message":"Cannot apply patch: file src/entities/coupon/guards.ts does not exist (confirmed by previous directory listing). Please use create_file instead."}],"blockedBy":["File src/entities/coupon/guards.ts does not exist. Use create_file instead of apply_patch."]}],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":445407,"llmCalls":7,"llmFailures":0,"inputTokens":20156,"outputTokens":46733} +{"taskId":"deep-bugfix-checkout-total","category":"bugfix","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":false,"agentError":"Pre-execution validation failed: File src/features/cart/lib/calculateTotal.ts does not exist. Use create_file instead of apply_patch.","validationCount":10,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"cmd","ok":false,"detail":"npx vitest run src/features/checkout/lib/computeTotal.test.ts"},{"kind":"typecheck","ok":true,"detail":""},{"kind":"file_unchanged","ok":true,"detail":"src/features/checkout/lib/computeTotal.test.ts"}],"events":{"task_started":1,"status_update":19,"security_decision":7,"planning_started":1,"planning_completed":1,"phase_started":4,"step_started":10,"step_completed":9,"phase_completed":4,"validation_failed":1,"validation_failed:pre_execution":1,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[{"failedChecks":[{"type":"file_not_found","severity":"block","message":"Cannot apply patch: file src/features/cart/lib/calculateTotal.ts does not exist (confirmed by previous directory listing). Please use create_file instead."}],"blockedBy":["File src/features/cart/lib/calculateTotal.ts does not exist. Use create_file instead of apply_patch."]}],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":246152,"llmCalls":7,"llmFailures":0,"inputTokens":20905,"outputTokens":24906} +{"taskId":"deep-bugfix-cart-merge","category":"bugfix","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":false,"agentError":"Pre-execution validation failed: File src/features/cart/lib/mergeCartItems.ts does not exist. Use create_file instead of apply_patch.","validationCount":7,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"cmd","ok":false,"detail":"npx vitest run src/features/cart/lib/mergeLines.test.ts"},{"kind":"typecheck","ok":true,"detail":""},{"kind":"file_unchanged","ok":true,"detail":"src/features/cart/lib/mergeLines.test.ts"}],"events":{"task_started":1,"status_update":23,"security_decision":7,"planning_started":1,"planning_completed":1,"phase_started":4,"step_started":7,"step_completed":6,"phase_completed":4,"validation_failed":1,"validation_failed:pre_execution":1,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[{"failedChecks":[{"type":"file_not_found","severity":"block","message":"Cannot apply patch: file src/features/cart/lib/mergeCartItems.ts does not exist (confirmed by previous directory listing). Please use create_file instead."}],"blockedBy":["File src/features/cart/lib/mergeCartItems.ts does not exist. Use create_file instead of apply_patch."]}],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":258664,"llmCalls":6,"llmFailures":0,"inputTokens":16572,"outputTokens":26611} +{"taskId":"deep-bugfix-shipping-eta","category":"bugfix","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":false,"agentSuccess":false,"agentError":"Pre-execution validation failed: File src/features/shipping/lib/estimateDeliveryDays.ts does not exist. Use create_file instead of apply_patch.","validationCount":5,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"cmd","ok":false,"detail":"npx vitest run src/features/shipping/lib/estimateEta.test.ts"},{"kind":"typecheck","ok":true,"detail":""},{"kind":"file_unchanged","ok":true,"detail":"src/features/shipping/lib/estimateEta.test.ts"}],"events":{"task_started":1,"status_update":23,"security_decision":5,"planning_started":1,"planning_completed":1,"phase_started":4,"step_started":5,"step_completed":4,"phase_completed":4,"validation_failed":1,"validation_failed:pre_execution":1,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[{"failedChecks":[{"type":"file_not_found","severity":"block","message":"Cannot apply patch: file src/features/shipping/lib/estimateDeliveryDays.ts does not exist (confirmed by previous directory listing). Please use create_file instead."}],"blockedBy":["File src/features/shipping/lib/estimateDeliveryDays.ts does not exist. Use create_file instead of apply_patch."]}],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":286958,"llmCalls":7,"llmFailures":0,"inputTokens":19940,"outputTokens":28618} +{"taskId":"deep-refactor-route-title","category":"refactor","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":true,"agentSuccess":false,"agentError":"Command failed with exit code 128: git add -A; if git diff --cached --quiet; then echo \"No staged changes, skip commit\"; exit 0; fi; git commit -m \"chore: automate repository management after acceptance\"","validationCount":7,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_contains","ok":true,"detail":"title"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":23,"security_decision":15,"planning_started":1,"planning_completed":1,"phase_started":4,"step_started":7,"step_completed":6,"phase_completed":4,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":340025,"llmCalls":10,"llmFailures":0,"inputTokens":14921,"outputTokens":25865} +{"taskId":"deep-refactor-spinner-variant","category":"refactor","arm":"no-filesense","fixture":"deep","taskSet":"tasks-deep.json","filesenseConfigRequested":{"enabled":false,"filesenseOutput":"summary","filesenseWriteMode":"cache"},"pass":true,"agentSuccess":false,"agentError":"Command failed with exit code 128: git add -A; if git diff --cached --quiet; then echo \"No staged changes, skip commit\"; exit 0; fi; git commit -m \"chore: automate repository management after acceptance\"","validationCount":6,"plannerFallbackReason":null,"runError":null,"resultHead":"","checks":[{"kind":"file_contains","ok":true,"detail":"variant"},{"kind":"typecheck","ok":true,"detail":""}],"events":{"task_started":1,"status_update":23,"security_decision":14,"planning_started":1,"planning_completed":1,"phase_started":4,"step_started":6,"step_completed":5,"phase_completed":4,"step_failed":1,"task_completed":1},"eventDetails":{"filesense":[],"validationFailed":[],"rollback":[]},"filesenseEntries":0,"filesenseTruncated":false,"elapsedMs":233127,"llmCalls":8,"llmFailures":0,"inputTokens":13235,"outputTokens":21355}