oh-my-knowledge 0.29.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/README.md +12 -5
  2. package/README.zh.md +12 -5
  3. package/dist/src/analysis/report-diagnostics.js +2 -0
  4. package/dist/src/analysis/report-diagnostics.js.map +1 -1
  5. package/dist/src/authoring/evolver.d.ts +7 -1
  6. package/dist/src/authoring/evolver.d.ts.map +1 -1
  7. package/dist/src/authoring/evolver.js +8 -5
  8. package/dist/src/authoring/evolver.js.map +1 -1
  9. package/dist/src/authoring/generator.d.ts +21 -23
  10. package/dist/src/authoring/generator.d.ts.map +1 -1
  11. package/dist/src/authoring/generator.js +621 -40
  12. package/dist/src/authoring/generator.js.map +1 -1
  13. package/dist/src/authoring/sample-fixer.d.ts +45 -0
  14. package/dist/src/authoring/sample-fixer.d.ts.map +1 -0
  15. package/dist/src/authoring/sample-fixer.js +186 -0
  16. package/dist/src/authoring/sample-fixer.js.map +1 -0
  17. package/dist/src/cli/commands/evolve.d.ts.map +1 -1
  18. package/dist/src/cli/commands/evolve.js +17 -0
  19. package/dist/src/cli/commands/evolve.js.map +1 -1
  20. package/dist/src/cli/commands/observe.js +2 -1
  21. package/dist/src/cli/commands/observe.js.map +1 -1
  22. package/dist/src/cli/commands/sample.d.ts +13 -0
  23. package/dist/src/cli/commands/sample.d.ts.map +1 -1
  24. package/dist/src/cli/commands/sample.js +307 -13
  25. package/dist/src/cli/commands/sample.js.map +1 -1
  26. package/dist/src/cli/i18n-dict.d.ts +1 -1
  27. package/dist/src/cli/i18n-dict.d.ts.map +1 -1
  28. package/dist/src/cli/i18n-dict.js +64 -6
  29. package/dist/src/cli/i18n-dict.js.map +1 -1
  30. package/dist/src/cli/parse-run-config.d.ts +14 -2
  31. package/dist/src/cli/parse-run-config.d.ts.map +1 -1
  32. package/dist/src/cli/parse-run-config.js +62 -10
  33. package/dist/src/cli/parse-run-config.js.map +1 -1
  34. package/dist/src/doctor/health/builtin-dimensions.d.ts.map +1 -1
  35. package/dist/src/doctor/health/builtin-dimensions.js +20 -23
  36. package/dist/src/doctor/health/builtin-dimensions.js.map +1 -1
  37. package/dist/src/doctor/health/composer.d.ts.map +1 -1
  38. package/dist/src/doctor/health/composer.js +7 -3
  39. package/dist/src/doctor/health/composer.js.map +1 -1
  40. package/dist/src/doctor/health/dimension-spec.d.ts +1 -0
  41. package/dist/src/doctor/health/dimension-spec.d.ts.map +1 -1
  42. package/dist/src/doctor/health/parser.d.ts.map +1 -1
  43. package/dist/src/doctor/health/parser.js +1 -0
  44. package/dist/src/doctor/health/parser.js.map +1 -1
  45. package/dist/src/doctor/health/prompt-builder.js +25 -17
  46. package/dist/src/doctor/health/prompt-builder.js.map +1 -1
  47. package/dist/src/doctor/html-renderer.d.ts.map +1 -1
  48. package/dist/src/doctor/html-renderer.js +76 -66
  49. package/dist/src/doctor/html-renderer.js.map +1 -1
  50. package/dist/src/doctor/rules.d.ts.map +1 -1
  51. package/dist/src/doctor/rules.js +32 -0
  52. package/dist/src/doctor/rules.js.map +1 -1
  53. package/dist/src/eval-core/cache.d.ts +16 -2
  54. package/dist/src/eval-core/cache.d.ts.map +1 -1
  55. package/dist/src/eval-core/cache.js +86 -15
  56. package/dist/src/eval-core/cache.js.map +1 -1
  57. package/dist/src/eval-core/evaluation-execution.d.ts +11 -1
  58. package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -1
  59. package/dist/src/eval-core/evaluation-execution.js +78 -6
  60. package/dist/src/eval-core/evaluation-execution.js.map +1 -1
  61. package/dist/src/eval-core/evaluation-job.d.ts +2 -1
  62. package/dist/src/eval-core/evaluation-job.d.ts.map +1 -1
  63. package/dist/src/eval-core/evaluation-job.js +2 -1
  64. package/dist/src/eval-core/evaluation-job.js.map +1 -1
  65. package/dist/src/eval-core/evaluation-reporting.d.ts +7 -0
  66. package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -1
  67. package/dist/src/eval-core/evaluation-reporting.js +19 -2
  68. package/dist/src/eval-core/evaluation-reporting.js.map +1 -1
  69. package/dist/src/eval-core/execution-strategy.d.ts +1 -1
  70. package/dist/src/eval-core/execution-strategy.d.ts.map +1 -1
  71. package/dist/src/eval-core/execution-strategy.js +12 -1
  72. package/dist/src/eval-core/execution-strategy.js.map +1 -1
  73. package/dist/src/eval-core/mock-hook.cjs +203 -0
  74. package/dist/src/eval-core/mocks-runtime.d.ts +96 -0
  75. package/dist/src/eval-core/mocks-runtime.d.ts.map +1 -0
  76. package/dist/src/eval-core/mocks-runtime.js +323 -0
  77. package/dist/src/eval-core/mocks-runtime.js.map +1 -0
  78. package/dist/src/eval-core/schema.d.ts.map +1 -1
  79. package/dist/src/eval-core/schema.js +18 -5
  80. package/dist/src/eval-core/schema.js.map +1 -1
  81. package/dist/src/eval-core/task-planner.d.ts +9 -1
  82. package/dist/src/eval-core/task-planner.d.ts.map +1 -1
  83. package/dist/src/eval-core/task-planner.js +40 -1
  84. package/dist/src/eval-core/task-planner.js.map +1 -1
  85. package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts +5 -1
  86. package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts.map +1 -1
  87. package/dist/src/eval-workflows/batch-evaluation-workflow.js +2 -1
  88. package/dist/src/eval-workflows/batch-evaluation-workflow.js.map +1 -1
  89. package/dist/src/eval-workflows/evaluation-pipeline.d.ts +22 -1
  90. package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -1
  91. package/dist/src/eval-workflows/evaluation-pipeline.js +39 -12
  92. package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -1
  93. package/dist/src/eval-workflows/evaluation-preparation.d.ts +5 -0
  94. package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -1
  95. package/dist/src/eval-workflows/evaluation-preparation.js +3 -1
  96. package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -1
  97. package/dist/src/eval-workflows/run-evaluation.d.ts +12 -2
  98. package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -1
  99. package/dist/src/eval-workflows/run-evaluation.js +17 -5
  100. package/dist/src/eval-workflows/run-evaluation.js.map +1 -1
  101. package/dist/src/executors/claude-cli.d.ts +1 -1
  102. package/dist/src/executors/claude-cli.d.ts.map +1 -1
  103. package/dist/src/executors/claude-cli.js +57 -6
  104. package/dist/src/executors/claude-cli.js.map +1 -1
  105. package/dist/src/executors/claude-sdk-trace.d.ts.map +1 -1
  106. package/dist/src/executors/claude-sdk-trace.js +10 -4
  107. package/dist/src/executors/claude-sdk-trace.js.map +1 -1
  108. package/dist/src/executors/claude-sdk.d.ts +1 -1
  109. package/dist/src/executors/claude-sdk.d.ts.map +1 -1
  110. package/dist/src/executors/claude-sdk.js +25 -2
  111. package/dist/src/executors/claude-sdk.js.map +1 -1
  112. package/dist/src/executors/shared.d.ts +1 -1
  113. package/dist/src/executors/shared.d.ts.map +1 -1
  114. package/dist/src/executors/shared.js +6 -1
  115. package/dist/src/executors/shared.js.map +1 -1
  116. package/dist/src/grading/assertions.d.ts +5 -0
  117. package/dist/src/grading/assertions.d.ts.map +1 -1
  118. package/dist/src/grading/assertions.js +27 -1
  119. package/dist/src/grading/assertions.js.map +1 -1
  120. package/dist/src/grading/diagnostic.d.ts +40 -0
  121. package/dist/src/grading/diagnostic.d.ts.map +1 -0
  122. package/dist/src/grading/diagnostic.js +450 -0
  123. package/dist/src/grading/diagnostic.js.map +1 -0
  124. package/dist/src/grading/index.d.ts +5 -0
  125. package/dist/src/grading/index.d.ts.map +1 -1
  126. package/dist/src/grading/judge.d.ts.map +1 -1
  127. package/dist/src/grading/judge.js +54 -2
  128. package/dist/src/grading/judge.js.map +1 -1
  129. package/dist/src/grading/layered-scores.d.ts.map +1 -1
  130. package/dist/src/grading/layered-scores.js +1 -0
  131. package/dist/src/grading/layered-scores.js.map +1 -1
  132. package/dist/src/inputs/eval-config.js +19 -0
  133. package/dist/src/inputs/eval-config.js.map +1 -1
  134. package/dist/src/inputs/load-samples.d.ts +22 -2
  135. package/dist/src/inputs/load-samples.d.ts.map +1 -1
  136. package/dist/src/inputs/load-samples.js +193 -22
  137. package/dist/src/inputs/load-samples.js.map +1 -1
  138. package/dist/src/inputs/skill-loader.d.ts.map +1 -1
  139. package/dist/src/inputs/skill-loader.js +11 -3
  140. package/dist/src/inputs/skill-loader.js.map +1 -1
  141. package/dist/src/observability/experience.d.ts +260 -0
  142. package/dist/src/observability/experience.d.ts.map +1 -0
  143. package/dist/src/observability/experience.js +1233 -0
  144. package/dist/src/observability/experience.js.map +1 -0
  145. package/dist/src/observability/inbox-view-model.d.ts +11 -1
  146. package/dist/src/observability/inbox-view-model.d.ts.map +1 -1
  147. package/dist/src/observability/inbox-view-model.js +76 -3
  148. package/dist/src/observability/inbox-view-model.js.map +1 -1
  149. package/dist/src/observability/inbox.d.ts +27 -2
  150. package/dist/src/observability/inbox.d.ts.map +1 -1
  151. package/dist/src/observability/inbox.js +46 -8
  152. package/dist/src/observability/inbox.js.map +1 -1
  153. package/dist/src/observability/problem-patterns.d.ts +51 -0
  154. package/dist/src/observability/problem-patterns.d.ts.map +1 -0
  155. package/dist/src/observability/problem-patterns.js +205 -0
  156. package/dist/src/observability/problem-patterns.js.map +1 -0
  157. package/dist/src/observability/review-state.d.ts +54 -0
  158. package/dist/src/observability/review-state.d.ts.map +1 -0
  159. package/dist/src/observability/review-state.js +131 -0
  160. package/dist/src/observability/review-state.js.map +1 -0
  161. package/dist/src/observability/skill-chain-advisories.d.ts +25 -0
  162. package/dist/src/observability/skill-chain-advisories.d.ts.map +1 -0
  163. package/dist/src/observability/skill-chain-advisories.js +69 -0
  164. package/dist/src/observability/skill-chain-advisories.js.map +1 -0
  165. package/dist/src/observability/skill-chain.d.ts +61 -0
  166. package/dist/src/observability/skill-chain.d.ts.map +1 -0
  167. package/dist/src/observability/skill-chain.js +233 -0
  168. package/dist/src/observability/skill-chain.js.map +1 -0
  169. package/dist/src/observability/text-signals.d.ts +7 -0
  170. package/dist/src/observability/text-signals.d.ts.map +1 -0
  171. package/dist/src/observability/text-signals.js +22 -0
  172. package/dist/src/observability/text-signals.js.map +1 -0
  173. package/dist/src/observability/trace-adapter.d.ts +1 -1
  174. package/dist/src/observability/trace-adapter.d.ts.map +1 -1
  175. package/dist/src/observability/trace-adapter.js +1 -1
  176. package/dist/src/observability/trace-adapter.js.map +1 -1
  177. package/dist/src/observability/trace-attribution.d.ts +29 -1
  178. package/dist/src/observability/trace-attribution.d.ts.map +1 -1
  179. package/dist/src/observability/trace-attribution.js +106 -10
  180. package/dist/src/observability/trace-attribution.js.map +1 -1
  181. package/dist/src/observability/trace-segmenter.d.ts +11 -1
  182. package/dist/src/observability/trace-segmenter.d.ts.map +1 -1
  183. package/dist/src/observability/trace-segmenter.js +117 -28
  184. package/dist/src/observability/trace-segmenter.js.map +1 -1
  185. package/dist/src/observability/trace-source.d.ts +28 -1
  186. package/dist/src/observability/trace-source.d.ts.map +1 -1
  187. package/dist/src/observability/trace-source.js +356 -6
  188. package/dist/src/observability/trace-source.js.map +1 -1
  189. package/dist/src/renderer/html-renderer.d.ts.map +1 -1
  190. package/dist/src/renderer/html-renderer.js +229 -171
  191. package/dist/src/renderer/html-renderer.js.map +1 -1
  192. package/dist/src/renderer/layout.d.ts.map +1 -1
  193. package/dist/src/renderer/layout.js +108 -61
  194. package/dist/src/renderer/layout.js.map +1 -1
  195. package/dist/src/renderer/observation-inbox-renderer.d.ts.map +1 -1
  196. package/dist/src/renderer/observation-inbox-renderer.js +4567 -91
  197. package/dist/src/renderer/observation-inbox-renderer.js.map +1 -1
  198. package/dist/src/renderer/skill-detail-renderer.d.ts +15 -0
  199. package/dist/src/renderer/skill-detail-renderer.d.ts.map +1 -0
  200. package/dist/src/renderer/skill-detail-renderer.js +1234 -0
  201. package/dist/src/renderer/skill-detail-renderer.js.map +1 -0
  202. package/dist/src/renderer/skill-list-renderer.d.ts +4 -0
  203. package/dist/src/renderer/skill-list-renderer.d.ts.map +1 -0
  204. package/dist/src/renderer/skill-list-renderer.js +327 -0
  205. package/dist/src/renderer/skill-list-renderer.js.map +1 -0
  206. package/dist/src/renderer/summary.d.ts.map +1 -1
  207. package/dist/src/renderer/summary.js +78 -50
  208. package/dist/src/renderer/summary.js.map +1 -1
  209. package/dist/src/renderer/table.d.ts.map +1 -1
  210. package/dist/src/renderer/table.js +213 -167
  211. package/dist/src/renderer/table.js.map +1 -1
  212. package/dist/src/renderer/test-view.d.ts +66 -0
  213. package/dist/src/renderer/test-view.d.ts.map +1 -0
  214. package/dist/src/renderer/test-view.js +905 -0
  215. package/dist/src/renderer/test-view.js.map +1 -0
  216. package/dist/src/server/report-server.d.ts +4 -1
  217. package/dist/src/server/report-server.d.ts.map +1 -1
  218. package/dist/src/server/report-server.js +149 -4
  219. package/dist/src/server/report-server.js.map +1 -1
  220. package/dist/src/server/report-store.d.ts.map +1 -1
  221. package/dist/src/server/report-store.js +33 -1
  222. package/dist/src/server/report-store.js.map +1 -1
  223. package/dist/src/server/skill-index.d.ts +77 -0
  224. package/dist/src/server/skill-index.d.ts.map +1 -0
  225. package/dist/src/server/skill-index.js +331 -0
  226. package/dist/src/server/skill-index.js.map +1 -0
  227. package/dist/src/server/skill-insights.d.ts +92 -0
  228. package/dist/src/server/skill-insights.d.ts.map +1 -0
  229. package/dist/src/server/skill-insights.js +676 -0
  230. package/dist/src/server/skill-insights.js.map +1 -0
  231. package/dist/src/shared/hard-rules.d.ts +40 -0
  232. package/dist/src/shared/hard-rules.d.ts.map +1 -0
  233. package/dist/src/shared/hard-rules.js +200 -0
  234. package/dist/src/shared/hard-rules.js.map +1 -0
  235. package/dist/src/shared/time.d.ts +2 -0
  236. package/dist/src/shared/time.d.ts.map +1 -0
  237. package/dist/src/shared/time.js +10 -0
  238. package/dist/src/shared/time.js.map +1 -0
  239. package/dist/src/types/eval.d.ts +83 -0
  240. package/dist/src/types/eval.d.ts.map +1 -1
  241. package/dist/src/types/executor.d.ts +43 -0
  242. package/dist/src/types/executor.d.ts.map +1 -1
  243. package/dist/src/types/judge.d.ts +76 -0
  244. package/dist/src/types/judge.d.ts.map +1 -1
  245. package/dist/src/types/judge.js +3 -1
  246. package/dist/src/types/judge.js.map +1 -1
  247. package/dist/src/types/report.d.ts +63 -3
  248. package/dist/src/types/report.d.ts.map +1 -1
  249. package/dist/src/util/safe-slice.d.ts +23 -0
  250. package/dist/src/util/safe-slice.d.ts.map +1 -0
  251. package/dist/src/util/safe-slice.js +33 -0
  252. package/dist/src/util/safe-slice.js.map +1 -0
  253. package/package.json +5 -4
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Diagnostic — 功能性测试视角的"哪错了 + 怎么改"诊断。
3
+ *
4
+ * 与 Judge 评价(打分)彻底独立:
5
+ * - Judge 答"打几分",看 rubric + output 主观打 1-5。
6
+ * - Diagnostic 答"哪错了 + skill 怎么改",看 rubric + skill 原文 + 实际 trace + 失败断言。
7
+ * - --no-judge 不跑 judge,但 diagnostic 仍会跑(假设 sample 有 fail);
8
+ * --no-diagnostic 反之。
9
+ *
10
+ * 触发条件:sample 至少有 1 条 failed assertion(全过的 sample 不需要诊断,省成本)。
11
+ *
12
+ * 默认走 haiku(便宜 + 够用),典型成本 ~$0.005/失败样本。
13
+ */
14
+ import { FAILURE_MODES } from '../types/judge.js';
15
+ const SYSTEM_PROMPT = `你是 skill 评测诊断助手。基于失败用例的 expected/actual 差异,给 skill 作者具体可操作的改进建议。
16
+
17
+ **诱错样本(tripwire)规则 — 只看 sample 的显式标记,不要自己识别**:
18
+ "诱错样本"指 prompt 故意藏了跟 rubric / skill 矛盾的诱导指示,用来测 LLM 会不会
19
+ 盲从错误。这是 sample 作者的设计决策,**只有 sample 作者显式标 \`tripwire: true\` 才算**。
20
+
21
+ 判断逻辑(用户消息会告诉你 sample.tripwire 的值):
22
+ - sample.tripwire === true →
23
+ rootCause 必须**只**填 \`tripwire_intentional\`(不要叠加其它原因)
24
+ suggestion.skill / suggestion.sample 必须**留空字符串**
25
+ 只在 suggestion.none 解释为什么不用改
26
+ - sample.tripwire === false / undefined →
27
+ **绝对不要**输出 \`tripwire_intentional\` rootCause,**绝对不要**判断它是诱错
28
+ 即使 prompt 看起来像诱导,也按"非诱错"诊断,给出 skill / sample 改进建议
29
+ (如果你强烈怀疑应该是诱错,可以在 summary 末尾加一句"建议 sample 作者
30
+ 考虑显式标记 tripwire:true",但 rootCause 仍按非诱错走)
31
+
32
+ **绝对不要**在诱错样本(tripwire=true)场景下建议:
33
+ - "改 skill 加警告"(skill 已经清楚,LLM 失败是因为盲从 prompt 不是 skill 不清楚)
34
+ - "改 sample 删除错误指示"(那等于把诱错样本拆了,自废武功)
35
+
36
+ **措辞要求(重要)**:
37
+ - 用日常语言,像跟同事解释,**不要**用技术黑话或规范语言。
38
+ - 反例(❌): "断言验证失败,工具调用偏离 rubric 规定的调用链"
39
+ - 正例(✅): "LLM 没把 format 参数传给 skylark_doc_update,所以那条断言抓不到"
40
+ - summary 一句白话讲清楚 LLM 干啥事错了,**不要**罗列断言名 / mock 编号。
41
+ - expected / actual 用动作描述("应该先调 X 再传 Y" / "实际跳过了第一步,直接用了字符串"),
42
+ **不要**复述 rubric 原文。
43
+ - suggestion 给具体改动:引用章节标题 + 写明"加什么话"或"改成什么",
44
+ 避免"建议优化 / 建议明确"这种空话。
45
+ - workflowChecks / failureModes 的描述全部用中文,evidence 引用具体的工具调用编号([N] 这种),不要用英文枚举名以外的英文表达。
46
+
47
+ **工作流校验(workflowChecks)**:
48
+ 把 rubric / skill 规定的关键步骤拆成可勾选的清单,每条给:
49
+ - step: 中文描述这一步要干啥(如"调 code-host auth status 拿当前 username")
50
+ - passed: LLM 是否做了该步骤
51
+ - evidence: 引用 trace 里的具体证据。passed=true 时点名是哪一步工具调用做的;passed=false 时说明哪里偏离了(漏调 / 调错 / 参数错)
52
+ 不是工作流型任务(rubric 是开放式问答 / 单纯文本生成)就给空数组 []。
53
+
54
+ **失败模式标签(failureModes)**:
55
+ 从下面 7 个里选(可多选),用来一眼归类 LLM 是怎么错的:
56
+ ${FAILURE_MODES.map((m, i) => ` ${i + 1}. ${m}`).join('\n')}
57
+ 含义:
58
+ - 工作流跳步: 没按 rubric/skill 规定的步骤顺序执行
59
+ - 硬编码值: 该用前面变量传递的字段写死成具体值(如 namespace、id 直接写 testuser001)
60
+ - 幻觉输出: 声称完成 / 给出实际不存在的结果(虚构 commit hash、虚构文件路径、虚构 id)
61
+ - 工具误用: 选错工具 / 参数错 / 重复尝试同一失败动作
62
+ - 环境拦截: mock-strict 或工具不可用导致 LLM 行为正确但仍 fail(诊断要把这种和真错区分)
63
+ - 误读约束: skill 写清楚的约束被 LLM 漏掉 / 误读(常和 llm_misread rootCause 搭)
64
+ - 其他: 兜底,不属于以上任何类
65
+ 全过的 sample 给空数组 []。
66
+
67
+ 只返回 JSON,不要其他内容。`;
68
+ const TOOL_INPUT_PREVIEW_MAX = 350;
69
+ const SKILL_CONTENT_MAX = 12000;
70
+ const FULL_OUTPUT_MAX = 1500;
71
+ function previewToolCall(tc, idx) {
72
+ const inp = tc.input;
73
+ let inputRepr;
74
+ if (inp == null) {
75
+ inputRepr = '';
76
+ }
77
+ else if (typeof inp === 'object' && 'command' in inp && typeof inp.command === 'string') {
78
+ inputRepr = inp.command;
79
+ }
80
+ else {
81
+ inputRepr = typeof inp === 'string' ? inp : JSON.stringify(inp);
82
+ }
83
+ const truncated = inputRepr.length > TOOL_INPUT_PREVIEW_MAX
84
+ ? inputRepr.slice(0, TOOL_INPUT_PREVIEW_MAX) + '…'
85
+ : inputRepr;
86
+ const status = tc.success ? '' : ' [失败]';
87
+ return `[${idx + 1}] ${tc.tool}${status} → ${truncated}`;
88
+ }
89
+ function formatExpectedAssertion(a) {
90
+ const valueRepr = a.values
91
+ ? JSON.stringify(a.values)
92
+ : a.value !== undefined
93
+ ? String(a.value)
94
+ : a.pattern
95
+ ? `regex /${a.pattern}/${a.flags ?? ''}`
96
+ : '';
97
+ const w = typeof a.weight === 'number' ? ` (w=${a.weight})` : '';
98
+ return `${a.type} ${valueRepr}${w}`;
99
+ }
100
+ function formatFailedDetail(d) {
101
+ const valueRepr = typeof d.value === 'object' ? JSON.stringify(d.value) : String(d.value);
102
+ return `${d.type}: ${valueRepr}${d.message ? ` (${d.message})` : ''}`;
103
+ }
104
+ export function buildDiagnosticPrompt(opts) {
105
+ const { sample, skillContent, skillName, toolCalls, fullOutput, assertionDetails } = opts;
106
+ const expectedAssertions = (sample.assertions ?? []).map(formatExpectedAssertion).join('\n');
107
+ const failedDetails = assertionDetails.filter((d) => !d.passed).map(formatFailedDetail).join('\n');
108
+ const toolCallsBlock = (toolCalls ?? []).map(previewToolCall).join('\n');
109
+ const skillBlock = skillContent
110
+ ? skillContent.length > SKILL_CONTENT_MAX
111
+ ? skillContent.slice(0, SKILL_CONTENT_MAX) + '\n... [skill 内容截断,完整版需手动 review]'
112
+ : skillContent
113
+ : '(无 skill 内容,可能是 baseline 跑或 artifact.content 缺失)';
114
+ const outputBlock = fullOutput
115
+ ? fullOutput.length > FULL_OUTPUT_MAX
116
+ ? fullOutput.slice(0, FULL_OUTPUT_MAX) + '…'
117
+ : fullOutput
118
+ : '(无最终输出)';
119
+ // tripwire 状态显式传给 LLM:不允许它"自己识别",只能按 ground truth 处理。
120
+ // true → 强诱错提示(rootCause 必须 tripwire_intentional)
121
+ // false / undefined → 明确告知"不是诱错",绝不允许输出 tripwire_intentional
122
+ const tripwireHint = sample.tripwire === true
123
+ ? '\n\n**sample.tripwire = true(诱错样本,ground truth)**\nLLM 失败是预期。请评估失败的方式是否符合诱错设计意图:\n - 符合:rootCause 必须**只**填 tripwire_intentional,suggestion.skill / suggestion.sample 留空,suggestion.none 解释为什么不需要改\n - 不符合(LLM 以非预期方式 fail,例如真的工具错):rootCause 写实际原因(不要叠加 tripwire_intentional),suggestion 给改进建议'
124
+ : '\n\n**sample.tripwire = false(非诱错,ground truth)**\n这条 sample 不是诱错。**绝对不要**输出 tripwire_intentional rootCause。即使 prompt 看起来像诱导,也按"非诱错"诊断,给 skill / sample 改进建议。';
125
+ return `下面是 skill「${skillName}」的一条失败评测用例。请基于 skill 原文 + 实际执行 + 失败断言给出诊断。
126
+
127
+ # 用例 prompt
128
+ ${sample.prompt}
129
+
130
+ # 评分标准 (rubric)
131
+ ${sample.rubric ?? '(无 rubric)'}
132
+
133
+ # 期望的关键调用 / mock 命中 (assertions)
134
+ ${expectedAssertions || '(无 assertions)'}
135
+
136
+ # Skill 原文 (被评测对象)
137
+ \`\`\`
138
+ ${skillBlock}
139
+ \`\`\`
140
+
141
+ # LLM 实际工具调用轨迹
142
+ ${toolCallsBlock || '(无工具调用)'}
143
+
144
+ # LLM 最终回答
145
+ ${outputBlock}
146
+
147
+ # 失败的断言
148
+ ${failedDetails || '(无失败断言?)'}${tripwireHint}
149
+
150
+ 请基于以上信息给出诊断。**rootCause 必须从这 5 类里选(可多选)**:
151
+ - skill_doc_unclear: skill 文档某段写得模糊,LLM 不知道该怎么做
152
+ - skill_doc_missing: skill 完全没覆盖该场景 / 缺反例 / 缺约束
153
+ - llm_misread: skill 写清楚了但 LLM 误读(可能要改措辞 / 增加显眼提示)
154
+ - sample_design: sample 自身设计有 bug(rubric 跟 skill 矛盾 / mock match 太严 / 等)
155
+ - tripwire_intentional: 诱错样本 — sample 故意诱导反模式,LLM fail 是预期,不要建议改 skill
156
+
157
+ 返回 JSON(不要 markdown 代码块):
158
+ {
159
+ "summary": "<失败本质,1-2 句>",
160
+ "expected": "<rubric/assertions 期望什么具体行为>",
161
+ "actual": "<LLM 实际做了什么>",
162
+ "workflowChecks": [
163
+ {"step": "<rubric/skill 规定的一步,中文>", "passed": true, "evidence": "<引 trace 中 [N] 工具调用编号或简短中文证据>"}
164
+ ],
165
+ "failureModes": ["<从 7 个中文标签里选,可多选;无可归类则空数组>"],
166
+ "rootCause": ["<上述 5 选>"],
167
+ "suggestion": {
168
+ "skill": "<如归因到 skill,具体改哪段、加什么话(引用章节标题)。否则空字符串>",
169
+ "sample": "<如归因到 sample 设计,如何调整。否则空字符串>",
170
+ "none": "<如诱错样本 / LLM 行为本身不该改,解释为什么不用动 skill。否则空字符串>"
171
+ }
172
+ }`;
173
+ }
174
+ /**
175
+ * 字段级 salvage:LLM 诊断输出在字符串中间被截断时(unterminated string),
176
+ * JSON.parse 整条丢; 这里用正则按字段名抽取已写完(或截断到 EOF)的内容,
177
+ * 至少把 summary/expected/actual 露出来让用户看到。
178
+ *
179
+ * 策略:
180
+ * - 顶层字符串字段(summary/expected/actual):匹配 `"key"\s*:\s*"((?:[^"\\]|\\.)*)("|$)`,
181
+ * 允许字符串没有闭合引号(走 `$` 分支吃到 EOF)。
182
+ * - rootCause(数组):匹配方括号内容,按字符串元素逐个解析。
183
+ * - suggestion(嵌套对象):取出花括号内容后用相同策略递归提取 skill/sample/none。
184
+ *
185
+ * 不试图重建完整 JSON,只挑能挑出的字段。
186
+ */
187
+ function unescapeJsonString(s) {
188
+ // 单次扫描:顺序替换会导致 `\\t` 先被处理成 `\` + `t`,再被当成转义符二次处理。
189
+ // 对每个反斜杠序列只解码一次。截断到悬空 `\` 时按原样保留(避免吃掉合法尾字符)。
190
+ return s.replace(/\\(["\\/bnrt]|u[0-9a-fA-F]{4})/g, (_match, esc) => {
191
+ if (esc.startsWith('u')) {
192
+ return String.fromCharCode(parseInt(esc.slice(1), 16));
193
+ }
194
+ const map = {
195
+ '"': '"',
196
+ '\\': '\\',
197
+ '/': '/',
198
+ b: '\b',
199
+ n: '\n',
200
+ r: '\r',
201
+ t: '\t',
202
+ };
203
+ return map[esc] ?? esc;
204
+ });
205
+ }
206
+ function extractStringField(blob, key) {
207
+ // 匹配 "key": "...content..." 允许末尾没有闭合引号(被截断的情况)。
208
+ // 内容部分允许转义对(\\ 任意字符)和非引号非反斜杠字符。
209
+ const re = new RegExp(`"${key}"\\s*:\\s*"((?:[^"\\\\]|\\\\.)*?)(?:"|$)`, 's');
210
+ const m = blob.match(re);
211
+ if (!m)
212
+ return undefined;
213
+ return unescapeJsonString(m[1]);
214
+ }
215
+ function extractRootCause(blob) {
216
+ const re = /"rootCause"\s*:\s*\[([^\]]*)/s;
217
+ const m = blob.match(re);
218
+ if (!m)
219
+ return undefined;
220
+ const inner = m[1];
221
+ const valid = new Set(['skill_doc_unclear', 'skill_doc_missing', 'llm_misread', 'sample_design', 'tripwire_intentional']);
222
+ const items = [];
223
+ for (const sm of inner.matchAll(/"([^"]+)"/g)) {
224
+ if (valid.has(sm[1]))
225
+ items.push(sm[1]);
226
+ }
227
+ return items;
228
+ }
229
+ function extractSuggestion(blob) {
230
+ // suggestion 是嵌套对象。先抓 "suggestion": { ... 直到 EOF 或匹配的 } ,
231
+ // 然后在那段 blob 里按 key 抽 string 字段。
232
+ const start = blob.search(/"suggestion"\s*:\s*\{/);
233
+ if (start < 0)
234
+ return undefined;
235
+ const tail = blob.slice(start);
236
+ // 取从 "suggestion": { 后到 EOF / 闭合花括号 / 下一个顶层 key 之前的内容
237
+ const inner = tail;
238
+ const skill = extractStringField(inner, 'skill');
239
+ const sample = extractStringField(inner, 'sample');
240
+ const none = extractStringField(inner, 'none');
241
+ if (skill === undefined && sample === undefined && none === undefined)
242
+ return undefined;
243
+ return {
244
+ skill: skill ?? '',
245
+ sample: sample ?? '',
246
+ none: none ?? '',
247
+ };
248
+ }
249
+ function extractWorkflowChecks(blob) {
250
+ // 抓 "workflowChecks": [ ... ] 内部内容,容忍 ] 缺失(被截断的情况)。
251
+ const headIdx = blob.search(/"workflowChecks"\s*:\s*\[/);
252
+ if (headIdx < 0)
253
+ return undefined;
254
+ const tail = blob.slice(headIdx);
255
+ const innerStart = tail.indexOf('[');
256
+ if (innerStart < 0)
257
+ return undefined;
258
+ const innerBlob = tail.slice(innerStart + 1);
259
+ // 按对象边界拆 — 用括号深度计数从 { 到匹配的 } 切片。
260
+ // 截断在某个对象中间时,该对象丢弃,前面完整的保留。
261
+ const items = [];
262
+ let depth = 0, objStart = -1;
263
+ for (let i = 0; i < innerBlob.length; i++) {
264
+ const ch = innerBlob[i];
265
+ if (ch === '{') {
266
+ if (depth === 0)
267
+ objStart = i;
268
+ depth++;
269
+ }
270
+ else if (ch === '}') {
271
+ depth--;
272
+ if (depth === 0 && objStart >= 0) {
273
+ const objStr = innerBlob.slice(objStart, i + 1);
274
+ const step = extractStringField(objStr, 'step');
275
+ const evidence = extractStringField(objStr, 'evidence');
276
+ const passedMatch = objStr.match(/"passed"\s*:\s*(true|false)/);
277
+ if (step) {
278
+ items.push({
279
+ step,
280
+ passed: passedMatch?.[1] === 'true',
281
+ evidence: evidence ?? '',
282
+ });
283
+ }
284
+ objStart = -1;
285
+ }
286
+ }
287
+ else if (ch === ']' && depth === 0) {
288
+ break;
289
+ }
290
+ }
291
+ return items;
292
+ }
293
+ function extractFailureModes(blob) {
294
+ const re = /"failureModes"\s*:\s*\[([^\]]*)/s;
295
+ const m = blob.match(re);
296
+ if (!m)
297
+ return undefined;
298
+ const inner = m[1];
299
+ const valid = new Set(FAILURE_MODES);
300
+ const seen = new Set();
301
+ const items = [];
302
+ for (const sm of inner.matchAll(/"([^"]+)"/g)) {
303
+ if (valid.has(sm[1]) && !seen.has(sm[1])) {
304
+ seen.add(sm[1]);
305
+ items.push(sm[1]);
306
+ }
307
+ }
308
+ return items;
309
+ }
310
+ export function salvagePartialJson(blob) {
311
+ return {
312
+ summary: extractStringField(blob, 'summary'),
313
+ expected: extractStringField(blob, 'expected'),
314
+ actual: extractStringField(blob, 'actual'),
315
+ rootCause: extractRootCause(blob),
316
+ workflowChecks: extractWorkflowChecks(blob),
317
+ failureModes: extractFailureModes(blob),
318
+ suggestion: extractSuggestion(blob),
319
+ };
320
+ }
321
+ export async function runDiagnostic(opts) {
322
+ const prompt = buildDiagnosticPrompt(opts);
323
+ const result = await opts.executor({
324
+ model: opts.model,
325
+ system: SYSTEM_PROMPT,
326
+ prompt,
327
+ timeoutMs: opts.timeoutMs ?? 180_000,
328
+ lean: true, // 诊断也是纯文本生成,不需要工具循环
329
+ });
330
+ if (!result.ok) {
331
+ return {
332
+ ok: false,
333
+ error: result.error || 'diagnostic executor failed',
334
+ summary: '',
335
+ expected: '',
336
+ actual: '',
337
+ rootCause: [],
338
+ suggestion: { skill: '', sample: '', none: '' },
339
+ costUSD: result.costUSD,
340
+ };
341
+ }
342
+ const raw = (result.output || '').trim();
343
+ // 容错:lean 模式下偶尔仍带 markdown 围栏
344
+ let jsonStr = raw;
345
+ const fenceMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
346
+ if (fenceMatch)
347
+ jsonStr = fenceMatch[1].trim();
348
+ let parsed;
349
+ try {
350
+ parsed = JSON.parse(jsonStr);
351
+ }
352
+ catch (e) {
353
+ // LLM 输出可能在字符串中间被截断(例如 max_output_tokens 命中、模型 stop 早),
354
+ // 完整 JSON.parse 会失败但前面写完的字段可能已经有用。做字段级 salvage。
355
+ const salvaged = salvagePartialJson(jsonStr);
356
+ const hasContent = !!(salvaged.summary || salvaged.expected || salvaged.actual
357
+ || (salvaged.workflowChecks && salvaged.workflowChecks.length > 0));
358
+ if (hasContent) {
359
+ return {
360
+ ok: true,
361
+ // 把 parse error 放在 error 里,UI 仍能区分"完整诊断"和"截断 salvage";
362
+ // 但 ok=true 让 summary/expected/actual 正常展示给用户。
363
+ error: `partial: JSON parse failed (${e.message}), salvaged ${[
364
+ salvaged.summary && 'summary',
365
+ salvaged.expected && 'expected',
366
+ salvaged.actual && 'actual',
367
+ salvaged.workflowChecks?.length && 'workflowChecks',
368
+ salvaged.failureModes?.length && 'failureModes',
369
+ ].filter(Boolean).join('/')}`,
370
+ summary: salvaged.summary ?? '',
371
+ expected: salvaged.expected ?? '',
372
+ actual: salvaged.actual ?? '',
373
+ rootCause: salvaged.rootCause ?? [],
374
+ workflowChecks: salvaged.workflowChecks ?? [],
375
+ failureModes: salvaged.failureModes ?? [],
376
+ suggestion: salvaged.suggestion ?? { skill: '', sample: '', none: '' },
377
+ costUSD: result.costUSD,
378
+ };
379
+ }
380
+ return {
381
+ ok: false,
382
+ error: `JSON parse failed: ${e.message}; raw: ${raw.slice(0, 300)}`,
383
+ summary: raw.slice(0, 300), // 兜底:把原始文本当 summary 露出来
384
+ expected: '',
385
+ actual: '',
386
+ rootCause: [],
387
+ suggestion: { skill: '', sample: '', none: '' },
388
+ costUSD: result.costUSD,
389
+ };
390
+ }
391
+ const obj = parsed;
392
+ const sug = obj.suggestion || {};
393
+ const rootCauseRaw = obj.rootCause;
394
+ const rootCause = Array.isArray(rootCauseRaw)
395
+ ? rootCauseRaw.filter((c) => ['skill_doc_unclear', 'skill_doc_missing', 'llm_misread', 'sample_design', 'tripwire_intentional'].includes(String(c)))
396
+ : [];
397
+ const workflowChecks = parseWorkflowChecks(obj.workflowChecks);
398
+ const failureModes = parseFailureModes(obj.failureModes);
399
+ return {
400
+ ok: true,
401
+ summary: String(obj.summary ?? ''),
402
+ expected: String(obj.expected ?? ''),
403
+ actual: String(obj.actual ?? ''),
404
+ rootCause,
405
+ workflowChecks,
406
+ failureModes,
407
+ suggestion: {
408
+ skill: String(sug.skill ?? ''),
409
+ sample: String(sug.sample ?? ''),
410
+ none: String(sug.none ?? ''),
411
+ },
412
+ costUSD: result.costUSD,
413
+ };
414
+ }
415
+ function parseWorkflowChecks(raw) {
416
+ if (!Array.isArray(raw))
417
+ return [];
418
+ const out = [];
419
+ for (const item of raw) {
420
+ if (!item || typeof item !== 'object')
421
+ continue;
422
+ const r = item;
423
+ const step = typeof r.step === 'string' ? r.step.trim() : '';
424
+ const evidence = typeof r.evidence === 'string' ? r.evidence.trim() : '';
425
+ if (!step)
426
+ continue; // 没 step 描述就丢掉
427
+ out.push({
428
+ step,
429
+ passed: r.passed === true,
430
+ evidence,
431
+ });
432
+ }
433
+ return out;
434
+ }
435
+ function parseFailureModes(raw) {
436
+ if (!Array.isArray(raw))
437
+ return [];
438
+ const valid = new Set(FAILURE_MODES);
439
+ const seen = new Set();
440
+ const out = [];
441
+ for (const item of raw) {
442
+ const s = typeof item === 'string' ? item.trim() : '';
443
+ if (valid.has(s) && !seen.has(s)) {
444
+ seen.add(s);
445
+ out.push(s);
446
+ }
447
+ }
448
+ return out;
449
+ }
450
+ //# sourceMappingURL=diagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../../src/grading/diagnostic.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,11 @@ interface GradeOptions {
31
31
  numTurns?: number;
32
32
  toolCalls?: ToolCallInfo[];
33
33
  turns?: TurnInfo[];
34
+ mockStats?: {
35
+ hits: number;
36
+ misses: number;
37
+ perMock: Record<string, number>;
38
+ };
34
39
  };
35
40
  samplesDir?: string;
36
41
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/grading/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK9G,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC;IAC3H,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,aAAoB,EAAE,WAAgB,EAAE,UAAgB,EAAE,WAAe,EAAE,YAAmB,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAiI/M;AACD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/grading/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK9G,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;IAC1M,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,aAAoB,EAAE,WAAgB,EAAE,UAAgB,EAAE,WAAe,EAAE,YAAmB,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAiI/M;AACD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../../src/grading/judge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAuB,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAgF/I,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,UAAO,GAClB,MAAM,CA8BR;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,UAAO,GAAG,MAAM,CAO9D;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,IAAI,CA6C/F;AAED,wBAAsB,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA4CjJ;AA0BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAsC1B;AAMD,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEnD;AAkCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,GAAG,cAAc,CA8B7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,WAAW,EAAE,EACrB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,EAC5C,WAAW,SAAI,GACd,OAAO,CAAC,eAAe,CAAC,CA4D1B"}
1
+ {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../../src/grading/judge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAuB,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAkG/I,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,UAAO,GAClB,MAAM,CA8BR;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,UAAO,GAAG,MAAM,CAO9D;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA4BD,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,IAAI,CA0D/F;AAED,wBAAsB,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA4CjJ;AA0BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAsC1B;AAMD,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEnD;AAkCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,GAAG,cAAc,CA8B7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,WAAW,EAAE,EACrB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,EAC5C,WAAW,SAAI,GACd,OAAO,CAAC,eAAe,CAAC,CA4D1B"}
@@ -60,8 +60,26 @@ function salvageJudgeResponse(text) {
60
60
  * with the same hash are score-comparable; mismatched hashes mean "we changed how we
61
61
  * ask the judge to think" and should not be compared blind.
62
62
  */
63
- const JUDGE_PROMPT_VERSION_DEBIAS_OFF = 'v2-cot';
64
- const JUDGE_PROMPT_VERSION_DEBIAS_ON = 'v3-cot-length';
63
+ // 版本字符串内嵌"判官能看到什么"的语义。bump 时机:
64
+ // v2-cot : 仅看 output + rubric + 工具名分布(早期 buildTraceSummary)
65
+ // v3-cot-length : 加了 length-debias 指令(v0.21)
66
+ // v3-cot-toolargs : 加了 tool input 预览(本次,BREAKING-COMPARABILITY)
67
+ // v4-cot-len-args : v3-cot-length 的同步升级(BREAKING-COMPARABILITY)
68
+ // bump 原因:之前 trace 只给 tool 名 + 分布,wrapper-style skill(mcporter / code-host CLI 等)
69
+ // 被判官当成"只调了 Bash,没用 skill 指定的 MCP 工具"——结论事实错误。
70
+ // tool input 预览让判官能识别 `Bash: mcporter --tool skylark_xxx` 内的真实语义调用。
71
+ //
72
+ // ⚠️ 命名约定(下次 bump 时执行):
73
+ // 当前 debias OFF: v3-* / debias ON: v4-* 编号不对称(历史上 debias OFF 跑 v2→v3,
74
+ // debias ON 跑 v3→v4)。这次再 bump 会让两条线持续偏移 v4/v5、v5/v6、…
75
+ //
76
+ // 下次 bump 时统一为单一主序号 + features 后缀,如:
77
+ // JUDGE_PROMPT_VERSION_DEBIAS_OFF = 'v5-cot-<features>'
78
+ // JUDGE_PROMPT_VERSION_DEBIAS_ON = 'v5-cot-<features>-len'
79
+ // 这样 hash 测试自然分两条,主序号清晰对齐,features 字段独立描述差异。
80
+ // 本 PR 不在意命名,只是把约定写下来,避免下次又跟着错误偏移走。
81
+ const JUDGE_PROMPT_VERSION_DEBIAS_OFF = 'v3-cot-toolargs';
82
+ const JUDGE_PROMPT_VERSION_DEBIAS_ON = 'v4-cot-len-args';
65
83
  const JUDGE_SYSTEM_PROMPT = '你是一个严格的 AI 输出质量评审员。先逐条对照评分标准做推理,再给最终分数。只返回 JSON,不要其他内容。';
66
84
  const LENGTH_DEBIAS_INSTRUCTION = [
67
85
  '## 重要:长度不是质量信号',
@@ -117,6 +135,28 @@ export function getJudgePromptHash(lengthDebias = true) {
117
135
  function getErrorMessage(err) {
118
136
  return err instanceof Error ? err.message : String(err);
119
137
  }
138
+ /**
139
+ * Tool input 单行预览。Bash 命令(input.command)直接拿;其它 tool 走 JSON 序列化。
140
+ * 截断到 INPUT_PREVIEW_MAX 字符,避免 prompt 膨胀过头。
141
+ *
142
+ * 关键:wrapper-style skill(mcporter / code-host CLI / git CLI 等)的真实语义调用
143
+ * 编码在 Bash 命令字符串里(`mcporter --tool X` / `code-host pr show Y`),判官看不到
144
+ * 就会下"没调指定工具"的错误结论。这个预览是判官识别这层语义的唯一通道。
145
+ */
146
+ const INPUT_PREVIEW_MAX = 280;
147
+ const TOOL_DETAIL_MAX_CALLS = 12;
148
+ function previewToolInput(tc) {
149
+ const inp = tc.input;
150
+ if (inp == null)
151
+ return '';
152
+ // Bash 是 wrapper 大头,优先显示 command 字段
153
+ if (typeof inp === 'object' && 'command' in inp && typeof inp.command === 'string') {
154
+ const cmd = inp.command;
155
+ return cmd.length > INPUT_PREVIEW_MAX ? cmd.slice(0, INPUT_PREVIEW_MAX) + '…' : cmd;
156
+ }
157
+ const repr = typeof inp === 'string' ? inp : JSON.stringify(inp);
158
+ return repr.length > INPUT_PREVIEW_MAX ? repr.slice(0, INPUT_PREVIEW_MAX) + '…' : repr;
159
+ }
120
160
  export function buildTraceSummary(turns, toolCalls) {
121
161
  if ((!turns || turns.length === 0) && (!toolCalls || toolCalls.length === 0))
122
162
  return null;
@@ -137,6 +177,18 @@ export function buildTraceSummary(turns, toolCalls) {
137
177
  if (failedTools.length > 0) {
138
178
  lines.push(` 失败工具:${[...new Set(failedTools)].join(', ')}`);
139
179
  }
180
+ // Tool input 详情(critical for wrapper-style skill 的判官准确性,见 INPUT_PREVIEW_MAX 注释)。
181
+ // 截 TOOL_DETAIL_MAX_CALLS 条防止长 trace 膨胀 prompt。
182
+ lines.push(` 调用详情(注意:Bash 命令内的 \`mcporter --tool X\` / \`code-host Y\` 等才是真实语义调用):`);
183
+ const detailCap = Math.min(toolCalls.length, TOOL_DETAIL_MAX_CALLS);
184
+ for (let i = 0; i < detailCap; i++) {
185
+ const tc = toolCalls[i];
186
+ const status = tc.success ? '' : ' [失败]';
187
+ lines.push(` [${i + 1}] ${tc.tool}${status} → ${previewToolInput(tc)}`);
188
+ }
189
+ if (toolCalls.length > TOOL_DETAIL_MAX_CALLS) {
190
+ lines.push(` ... 还有 ${toolCalls.length - TOOL_DETAIL_MAX_CALLS} 次调用`);
191
+ }
140
192
  }
141
193
  if (turns && turns.length > 0) {
142
194
  lines.push('');