niceeval 0.13.1 → 0.13.2

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 (548) hide show
  1. package/INDEX.md +25 -2
  2. package/README.md +9 -10
  3. package/README.zh.md +9 -10
  4. package/dist/agents/ai-sdk.cjs.map +1 -1
  5. package/dist/agents/ai-sdk.d.cts +1 -1
  6. package/dist/agents/ai-sdk.d.mts +1 -1
  7. package/dist/agents/ai-sdk.d.ts +1 -1
  8. package/dist/agents/bub-install-spec.cjs +19 -5
  9. package/dist/agents/bub-install-spec.cjs.map +1 -1
  10. package/dist/agents/bub-install-spec.d.cts +9 -2
  11. package/dist/agents/bub-install-spec.d.mts +9 -2
  12. package/dist/agents/bub-install-spec.d.ts +9 -2
  13. package/dist/agents/bub-install-spec.js +14 -12
  14. package/dist/agents/bub.cjs +10 -6
  15. package/dist/agents/bub.cjs.map +1 -1
  16. package/dist/agents/bub.d.cts +2 -2
  17. package/dist/agents/bub.d.mts +2 -2
  18. package/dist/agents/bub.d.ts +2 -2
  19. package/dist/agents/claude-code.cjs.map +1 -1
  20. package/dist/agents/claude-code.d.cts +2 -2
  21. package/dist/agents/claude-code.d.mts +2 -2
  22. package/dist/agents/claude-code.d.ts +2 -2
  23. package/dist/agents/codex.cjs +4 -4
  24. package/dist/agents/codex.cjs.map +1 -1
  25. package/dist/agents/codex.d.cts +3 -3
  26. package/dist/agents/codex.d.mts +3 -3
  27. package/dist/agents/codex.d.ts +3 -3
  28. package/dist/agents/coding-cli-versions.cjs +10 -1
  29. package/dist/agents/coding-cli-versions.cjs.map +1 -1
  30. package/dist/agents/coding-cli-versions.d.cts +8 -3
  31. package/dist/agents/coding-cli-versions.d.mts +8 -3
  32. package/dist/agents/coding-cli-versions.d.ts +8 -3
  33. package/dist/agents/coding-cli-versions.js +18 -12
  34. package/dist/agents/deepseek-harness.cjs +151 -0
  35. package/dist/agents/deepseek-harness.cjs.map +1 -0
  36. package/dist/agents/deepseek-harness.d.cts +14 -0
  37. package/dist/agents/deepseek-harness.d.mts +14 -0
  38. package/dist/agents/deepseek-harness.d.ts +14 -0
  39. package/dist/agents/deepseek-harness.js +7 -0
  40. package/dist/agents/deepseek-harness.js.map +1 -0
  41. package/dist/agents/exact-npm-plugins.cjs +28 -0
  42. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  43. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  44. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  45. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  46. package/dist/agents/exact-npm-plugins.js +8 -0
  47. package/dist/agents/exact-npm-plugins.js.map +1 -0
  48. package/dist/agents/index.cjs +5 -1
  49. package/dist/agents/index.cjs.map +1 -1
  50. package/dist/agents/index.d.cts +4 -0
  51. package/dist/agents/index.d.mts +4 -0
  52. package/dist/agents/index.d.ts +4 -0
  53. package/dist/agents/index.js +54 -50
  54. package/dist/agents/index.mjs +54 -50
  55. package/dist/agents/omp.cjs +170 -0
  56. package/dist/agents/omp.cjs.map +1 -0
  57. package/dist/agents/omp.d.cts +14 -0
  58. package/dist/agents/omp.d.mts +14 -0
  59. package/dist/agents/omp.d.ts +14 -0
  60. package/dist/agents/omp.js +7 -0
  61. package/dist/agents/omp.js.map +1 -0
  62. package/dist/agents/openclaw.cjs +51 -2
  63. package/dist/agents/openclaw.cjs.map +1 -1
  64. package/dist/agents/openclaw.d.cts +2 -0
  65. package/dist/agents/openclaw.d.mts +2 -0
  66. package/dist/agents/openclaw.d.ts +2 -0
  67. package/dist/agents/types.cjs.map +1 -1
  68. package/dist/agents/types.d.cts +4 -4
  69. package/dist/agents/types.d.mts +4 -4
  70. package/dist/agents/types.d.ts +4 -4
  71. package/dist/agents/ui-message-stream.cjs +24 -7
  72. package/dist/agents/ui-message-stream.cjs.map +1 -1
  73. package/dist/analysis/api.cjs +28 -2
  74. package/dist/analysis/api.cjs.map +1 -1
  75. package/dist/analysis/api.d.cts +22 -1
  76. package/dist/analysis/api.d.mts +22 -1
  77. package/dist/analysis/api.d.ts +22 -1
  78. package/dist/analysis/api.js +8 -6
  79. package/dist/analysis/bindings.cjs +11 -18
  80. package/dist/analysis/bindings.cjs.map +1 -1
  81. package/dist/analysis/bindings.d.cts +177 -49
  82. package/dist/analysis/bindings.d.mts +177 -49
  83. package/dist/analysis/bindings.d.ts +177 -49
  84. package/dist/analysis/contracts.cjs +1 -0
  85. package/dist/analysis/contracts.cjs.map +1 -1
  86. package/dist/analysis/contracts.d.cts +43 -3
  87. package/dist/analysis/contracts.d.mts +43 -3
  88. package/dist/analysis/contracts.d.ts +43 -3
  89. package/dist/analysis/cost-projection.cjs +2 -1
  90. package/dist/analysis/cost-projection.cjs.map +1 -1
  91. package/dist/analysis/cost-projection.d.cts +1 -1
  92. package/dist/analysis/cost-projection.d.mts +1 -1
  93. package/dist/analysis/cost-projection.d.ts +1 -1
  94. package/dist/analysis/cost.cjs +13 -3
  95. package/dist/analysis/cost.cjs.map +1 -1
  96. package/dist/analysis/cost.d.cts +10 -3
  97. package/dist/analysis/cost.d.mts +10 -3
  98. package/dist/analysis/cost.d.ts +10 -3
  99. package/dist/analysis/experiment-groups.cjs +96 -0
  100. package/dist/analysis/experiment-groups.cjs.map +1 -0
  101. package/dist/analysis/experiment-groups.d.cts +9 -0
  102. package/dist/analysis/experiment-groups.d.mts +9 -0
  103. package/dist/analysis/experiment-groups.d.ts +9 -0
  104. package/dist/analysis/experiment-groups.js +10 -0
  105. package/dist/analysis/experiment-groups.js.map +1 -0
  106. package/dist/analysis/index.cjs +4 -1
  107. package/dist/analysis/index.cjs.map +1 -1
  108. package/dist/analysis/index.d.cts +4 -2
  109. package/dist/analysis/index.d.mts +4 -2
  110. package/dist/analysis/index.d.ts +4 -2
  111. package/dist/analysis/index.js +40 -36
  112. package/dist/analysis/index.mjs +40 -36
  113. package/dist/assertions/limits.cjs +4 -0
  114. package/dist/assertions/limits.cjs.map +1 -1
  115. package/dist/assertions/limits.d.cts +4 -0
  116. package/dist/assertions/limits.d.mts +4 -0
  117. package/dist/assertions/limits.d.ts +4 -0
  118. package/dist/assertions/match.cjs +63 -25
  119. package/dist/assertions/match.cjs.map +1 -1
  120. package/dist/assertions/match.d.cts +7 -0
  121. package/dist/assertions/match.d.mts +7 -0
  122. package/dist/assertions/match.d.ts +7 -0
  123. package/dist/assertions/record/attachment.cjs +32 -4
  124. package/dist/assertions/record/attachment.cjs.map +1 -1
  125. package/dist/assertions/record/diff.cjs +10 -4
  126. package/dist/assertions/record/diff.cjs.map +1 -1
  127. package/dist/assertions/record/producer.cjs +101 -4
  128. package/dist/assertions/record/producer.cjs.map +1 -1
  129. package/dist/assertions/record/producer.d.cts +4 -1
  130. package/dist/assertions/record/producer.d.mts +4 -1
  131. package/dist/assertions/record/producer.d.ts +4 -1
  132. package/dist/assertions/runtime.cjs +45 -5
  133. package/dist/assertions/runtime.cjs.map +1 -1
  134. package/dist/cli/record.cjs +113 -8
  135. package/dist/cli/record.cjs.map +1 -1
  136. package/dist/cli/record.d.cts +20 -1
  137. package/dist/cli/record.d.mts +20 -1
  138. package/dist/cli/record.d.ts +20 -1
  139. package/dist/cli/record.js +4 -2
  140. package/dist/cli.cjs +386 -31
  141. package/dist/cli.cjs.map +1 -1
  142. package/dist/cli.d.cts +10 -2
  143. package/dist/cli.d.mts +10 -2
  144. package/dist/cli.d.ts +10 -2
  145. package/dist/context/send-retry.cjs +4 -4
  146. package/dist/context/send-retry.cjs.map +1 -1
  147. package/dist/coordination/host/runtime.cjs +8 -30
  148. package/dist/coordination/host/runtime.cjs.map +1 -1
  149. package/dist/coordination/host/runtime.d.cts +3 -3
  150. package/dist/coordination/host/runtime.d.mts +3 -3
  151. package/dist/coordination/host/runtime.d.ts +3 -3
  152. package/dist/coordination/host/types.cjs.map +1 -1
  153. package/dist/coordination/host/types.d.cts +0 -5
  154. package/dist/coordination/host/types.d.mts +0 -5
  155. package/dist/coordination/host/types.d.ts +0 -5
  156. package/dist/coordination/platform/node.cjs +90 -9
  157. package/dist/coordination/platform/node.cjs.map +1 -1
  158. package/dist/define.cjs +25 -1
  159. package/dist/define.cjs.map +1 -1
  160. package/dist/experiment/host/index.cjs +1 -0
  161. package/dist/experiment/host/index.cjs.map +1 -1
  162. package/dist/i18n/en.cjs +26 -8
  163. package/dist/i18n/en.cjs.map +1 -1
  164. package/dist/i18n/en.d.cts +19 -6
  165. package/dist/i18n/en.d.mts +19 -6
  166. package/dist/i18n/en.d.ts +19 -6
  167. package/dist/index.cjs.map +1 -1
  168. package/dist/index.d.cts +1 -1
  169. package/dist/index.d.mts +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/o11y/parsers/hermes.cjs +1 -1
  172. package/dist/o11y/parsers/hermes.cjs.map +1 -1
  173. package/dist/o11y/prices.json +1 -1
  174. package/dist/o11y/record/families.cjs +12 -3
  175. package/dist/o11y/record/families.cjs.map +1 -1
  176. package/dist/o11y/record/families.d.cts +8 -8
  177. package/dist/o11y/record/families.d.mts +8 -8
  178. package/dist/o11y/record/families.d.ts +8 -8
  179. package/dist/o11y/record/family-projectors.d.cts +66 -18
  180. package/dist/o11y/record/family-projectors.d.mts +66 -18
  181. package/dist/o11y/record/family-projectors.d.ts +66 -18
  182. package/dist/o11y/record/family-writers.d.cts +11 -3
  183. package/dist/o11y/record/family-writers.d.mts +11 -3
  184. package/dist/o11y/record/family-writers.d.ts +11 -3
  185. package/dist/o11y/record/runner-producer.cjs +14 -4
  186. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  187. package/dist/record/codec/core.d.cts +2 -2
  188. package/dist/record/codec/core.d.mts +2 -2
  189. package/dist/record/codec/core.d.ts +2 -2
  190. package/dist/record/family/catalog.d.cts +44 -12
  191. package/dist/record/family/catalog.d.mts +44 -12
  192. package/dist/record/family/catalog.d.ts +44 -12
  193. package/dist/record/family/index.js +128 -124
  194. package/dist/record/family/observability-v1.cjs +35 -0
  195. package/dist/record/family/observability-v1.cjs.map +1 -0
  196. package/dist/record/family/observability-v1.d.cts +3 -0
  197. package/dist/record/family/observability-v1.d.mts +3 -0
  198. package/dist/record/family/observability-v1.d.ts +3 -0
  199. package/dist/record/family/observability-v1.js +6 -0
  200. package/dist/record/family/observability-v1.js.map +1 -0
  201. package/dist/record/family/observability.cjs +58 -9
  202. package/dist/record/family/observability.cjs.map +1 -1
  203. package/dist/record/family/observability.d.cts +1014 -15
  204. package/dist/record/family/observability.d.mts +1014 -15
  205. package/dist/record/family/observability.d.ts +1014 -15
  206. package/dist/record/family/observability.js +22 -18
  207. package/dist/record/host/runtime.cjs +600 -31
  208. package/dist/record/host/runtime.cjs.map +1 -1
  209. package/dist/record/host/types.cjs.map +1 -1
  210. package/dist/record/host/types.d.cts +33 -9
  211. package/dist/record/host/types.d.mts +33 -9
  212. package/dist/record/host/types.d.ts +33 -9
  213. package/dist/record/maintenance/runtime.cjs +1 -2
  214. package/dist/record/maintenance/runtime.cjs.map +1 -1
  215. package/dist/record/model/core.cjs.map +1 -1
  216. package/dist/record/model/core.d.cts +1 -1
  217. package/dist/record/model/core.d.mts +1 -1
  218. package/dist/record/model/core.d.ts +1 -1
  219. package/dist/record/model/definition.d.cts +6 -6
  220. package/dist/record/model/definition.d.mts +6 -6
  221. package/dist/record/model/definition.d.ts +6 -6
  222. package/dist/record/model/identifiers.cjs +1 -1
  223. package/dist/record/model/identifiers.cjs.map +1 -1
  224. package/dist/record/model/identifiers.d.cts +1 -1
  225. package/dist/record/model/identifiers.d.mts +1 -1
  226. package/dist/record/model/identifiers.d.ts +1 -1
  227. package/dist/record/platform/node.cjs +159 -23
  228. package/dist/record/platform/node.cjs.map +1 -1
  229. package/dist/record/platform/services.cjs.map +1 -1
  230. package/dist/record/platform/services.d.cts +15 -2
  231. package/dist/record/platform/services.d.mts +15 -2
  232. package/dist/record/platform/services.d.ts +15 -2
  233. package/dist/record/reader/errors.cjs +37 -1
  234. package/dist/record/reader/errors.cjs.map +1 -1
  235. package/dist/record/reader/errors.d.cts +49 -1
  236. package/dist/record/reader/errors.d.mts +49 -1
  237. package/dist/record/reader/errors.d.ts +49 -1
  238. package/dist/record/reader/errors.js +22 -12
  239. package/dist/record/reader/format.cjs +76 -17
  240. package/dist/record/reader/format.cjs.map +1 -1
  241. package/dist/record/reader/format.d.cts +11 -4
  242. package/dist/record/reader/format.d.mts +11 -4
  243. package/dist/record/reader/format.d.ts +11 -4
  244. package/dist/record/reader/format.js +2 -0
  245. package/dist/record/reader/index.js +32 -18
  246. package/dist/record/reader/runtime.cjs +64 -0
  247. package/dist/record/reader/runtime.cjs.map +1 -1
  248. package/dist/record/reader/runtime.d.cts +15 -0
  249. package/dist/record/reader/runtime.d.mts +15 -0
  250. package/dist/record/reader/runtime.d.ts +15 -0
  251. package/dist/record/reader/runtime.js +2 -0
  252. package/dist/report/assets/styles.css +53 -29
  253. package/dist/report/built-in/analysis-values.cjs +21 -13
  254. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  255. package/dist/report/built-in/analysis-values.d.cts +11 -22
  256. package/dist/report/built-in/analysis-values.d.mts +11 -22
  257. package/dist/report/built-in/analysis-values.d.ts +11 -22
  258. package/dist/report/built-in/analysis-values.js +4 -6
  259. package/dist/report/built-in/index.cjs +1 -3
  260. package/dist/report/built-in/index.cjs.map +1 -1
  261. package/dist/report/built-in/index.d.cts +1 -1
  262. package/dist/report/built-in/index.d.mts +1 -1
  263. package/dist/report/built-in/index.d.ts +1 -1
  264. package/dist/report/built-in/index.js +4 -8
  265. package/dist/report/built-in/index.mjs +4 -8
  266. package/dist/report/built-in/machine.cjs +0 -2
  267. package/dist/report/built-in/machine.cjs.map +1 -1
  268. package/dist/report/built-in/machine.d.cts +0 -2
  269. package/dist/report/built-in/machine.d.mts +0 -2
  270. package/dist/report/built-in/machine.d.ts +0 -2
  271. package/dist/report/built-in/result-components.cjs +49 -51
  272. package/dist/report/built-in/result-components.cjs.map +1 -1
  273. package/dist/report/built-in/result-components.d.cts +16 -17
  274. package/dist/report/built-in/result-components.d.mts +16 -17
  275. package/dist/report/built-in/result-components.d.ts +16 -17
  276. package/dist/report/built-in/result-components.js +0 -4
  277. package/dist/report/built-in/run-membership-overview.cjs +126 -17
  278. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  279. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  280. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  281. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  282. package/dist/report/built-in/run-membership-overview.js +4 -2
  283. package/dist/report/built-in/standard.cjs +80 -45
  284. package/dist/report/built-in/standard.cjs.map +1 -1
  285. package/dist/report/built-in/standard.d.cts +19 -41
  286. package/dist/report/built-in/standard.d.mts +19 -41
  287. package/dist/report/built-in/standard.d.ts +19 -41
  288. package/dist/report/built-in/standard.js +6 -6
  289. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  290. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  291. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  292. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  293. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  294. package/dist/report/components/attempt-detail/content.cjs +1 -1
  295. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  296. package/dist/report/components/entity-lists/compute.cjs +42 -5
  297. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  298. package/dist/report/components/entity-lists/compute.d.cts +10 -8
  299. package/dist/report/components/entity-lists/compute.d.mts +10 -8
  300. package/dist/report/components/entity-lists/compute.d.ts +10 -8
  301. package/dist/report/components/entity-lists/content.cjs +31 -6
  302. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  303. package/dist/report/components/entity-lists/index.cjs +9 -4
  304. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  305. package/dist/report/components/entity-lists/index.d.cts +4 -7
  306. package/dist/report/components/entity-lists/index.d.mts +4 -7
  307. package/dist/report/components/entity-lists/index.d.ts +4 -7
  308. package/dist/report/components/summaries/compute.cjs +8 -1
  309. package/dist/report/components/summaries/compute.cjs.map +1 -1
  310. package/dist/report/components/summaries/compute.d.cts +9 -1
  311. package/dist/report/components/summaries/compute.d.mts +9 -1
  312. package/dist/report/components/summaries/compute.d.ts +9 -1
  313. package/dist/report/components/summaries/index.cjs +48 -4
  314. package/dist/report/components/summaries/index.cjs.map +1 -1
  315. package/dist/report/components/summaries/index.d.cts +7 -4
  316. package/dist/report/components/summaries/index.d.mts +7 -4
  317. package/dist/report/components/summaries/index.d.ts +7 -4
  318. package/dist/report/definition/cell.cjs +3 -0
  319. package/dist/report/definition/cell.cjs.map +1 -1
  320. package/dist/report/definition/cell.d.cts +2 -0
  321. package/dist/report/definition/cell.d.mts +2 -0
  322. package/dist/report/definition/cell.d.ts +2 -0
  323. package/dist/report/definition/primitives/chart.cjs +8 -5
  324. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  325. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  326. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  327. package/dist/report/definition/primitives.cjs +15 -2
  328. package/dist/report/definition/primitives.cjs.map +1 -1
  329. package/dist/report/definition/report.cjs +27 -3
  330. package/dist/report/definition/report.cjs.map +1 -1
  331. package/dist/report/definition/report.d.cts +8 -0
  332. package/dist/report/definition/report.d.mts +8 -0
  333. package/dist/report/definition/report.d.ts +8 -0
  334. package/dist/report/execution/machine.cjs +30 -14
  335. package/dist/report/execution/machine.cjs.map +1 -1
  336. package/dist/report/execution/machine.d.cts +20 -10
  337. package/dist/report/execution/machine.d.mts +20 -10
  338. package/dist/report/execution/machine.d.ts +20 -10
  339. package/dist/report/execution/machine.js +6 -6
  340. package/dist/report/host/execute.cjs +25 -16
  341. package/dist/report/host/execute.cjs.map +1 -1
  342. package/dist/report/host/execute.d.cts +4 -0
  343. package/dist/report/host/execute.d.mts +4 -0
  344. package/dist/report/host/execute.d.ts +4 -0
  345. package/dist/report/host/from-record.cjs +22 -5
  346. package/dist/report/host/from-record.cjs.map +1 -1
  347. package/dist/report/host/machine.cjs +53 -11
  348. package/dist/report/host/machine.cjs.map +1 -1
  349. package/dist/report/host/site-runtime.cjs +9 -8
  350. package/dist/report/host/site-runtime.cjs.map +1 -1
  351. package/dist/report/host/site-runtime.d.cts +1 -1
  352. package/dist/report/host/site-runtime.d.mts +1 -1
  353. package/dist/report/host/site-runtime.d.ts +1 -1
  354. package/dist/report/host/static.cjs +56 -9
  355. package/dist/report/host/static.cjs.map +1 -1
  356. package/dist/report/index.cjs.map +1 -1
  357. package/dist/report/index.d.cts +1 -1
  358. package/dist/report/index.d.mts +1 -1
  359. package/dist/report/index.d.ts +1 -1
  360. package/dist/report/model/dataset.cjs +7 -2
  361. package/dist/report/model/dataset.cjs.map +1 -1
  362. package/dist/report/model/locale.cjs +2 -0
  363. package/dist/report/model/locale.cjs.map +1 -1
  364. package/dist/report/model/locale.d.cts +1 -0
  365. package/dist/report/model/locale.d.mts +1 -0
  366. package/dist/report/model/locale.d.ts +1 -0
  367. package/dist/report/model/metrics.cjs +3 -1
  368. package/dist/report/model/metrics.cjs.map +1 -1
  369. package/dist/report/model/pricing.cjs +16 -11
  370. package/dist/report/model/pricing.cjs.map +1 -1
  371. package/dist/report/react/styles.css +53 -29
  372. package/dist/runner/adoption.cjs +1 -0
  373. package/dist/runner/adoption.cjs.map +1 -1
  374. package/dist/runner/attempt.cjs +44 -5
  375. package/dist/runner/attempt.cjs.map +1 -1
  376. package/dist/runner/attempt.d.cts +13 -1
  377. package/dist/runner/attempt.d.mts +13 -1
  378. package/dist/runner/attempt.d.ts +13 -1
  379. package/dist/runner/config-identity.cjs +10 -2
  380. package/dist/runner/config-identity.cjs.map +1 -1
  381. package/dist/runner/config-identity.d.cts +4 -2
  382. package/dist/runner/config-identity.d.mts +4 -2
  383. package/dist/runner/config-identity.d.ts +4 -2
  384. package/dist/runner/feedback/human.cjs +298 -59
  385. package/dist/runner/feedback/human.cjs.map +1 -1
  386. package/dist/runner/feedback/json.cjs +14 -6
  387. package/dist/runner/feedback/json.cjs.map +1 -1
  388. package/dist/runner/feedback/json.d.cts +3 -2
  389. package/dist/runner/feedback/json.d.mts +3 -2
  390. package/dist/runner/feedback/json.d.ts +3 -2
  391. package/dist/runner/feedback/reducer.cjs +2 -0
  392. package/dist/runner/feedback/reducer.cjs.map +1 -1
  393. package/dist/runner/judge-config.cjs +1 -1
  394. package/dist/runner/judge-config.cjs.map +1 -1
  395. package/dist/runner/ledger.cjs +124 -12
  396. package/dist/runner/ledger.cjs.map +1 -1
  397. package/dist/runner/project-current.cjs +13 -5
  398. package/dist/runner/project-current.cjs.map +1 -1
  399. package/dist/runner/run.cjs +564 -256
  400. package/dist/runner/run.cjs.map +1 -1
  401. package/dist/runner/sandbox-pool.cjs +161 -30
  402. package/dist/runner/sandbox-pool.cjs.map +1 -1
  403. package/dist/runner/sandbox-pool.d.cts +34 -2
  404. package/dist/runner/sandbox-pool.d.mts +34 -2
  405. package/dist/runner/sandbox-pool.d.ts +34 -2
  406. package/dist/runner/shared-state-lease.cjs +803 -0
  407. package/dist/runner/shared-state-lease.cjs.map +1 -0
  408. package/dist/runner/shared-state-lease.d.cts +121 -0
  409. package/dist/runner/shared-state-lease.d.mts +121 -0
  410. package/dist/runner/shared-state-lease.d.ts +121 -0
  411. package/dist/runner/shared-state-lease.js +24 -0
  412. package/dist/runner/shared-state-lease.js.map +1 -0
  413. package/dist/runner/teardown-registry.cjs +97 -34
  414. package/dist/runner/teardown-registry.cjs.map +1 -1
  415. package/dist/runner/teardown-registry.d.cts +27 -1
  416. package/dist/runner/teardown-registry.d.mts +27 -1
  417. package/dist/runner/teardown-registry.d.ts +27 -1
  418. package/dist/runner/teardown-registry.js +20 -16
  419. package/dist/runner/types.cjs.map +1 -1
  420. package/dist/runner/types.d.cts +31 -5
  421. package/dist/runner/types.d.mts +31 -5
  422. package/dist/runner/types.d.ts +31 -5
  423. package/dist/sample/analysis.cjs +249 -459
  424. package/dist/sample/analysis.cjs.map +1 -1
  425. package/dist/sample/capability.cjs +138 -7
  426. package/dist/sample/capability.cjs.map +1 -1
  427. package/dist/sample/capability.d.cts +3 -1
  428. package/dist/sample/capability.d.mts +3 -1
  429. package/dist/sample/capability.d.ts +3 -1
  430. package/dist/sample/capability.js +8 -6
  431. package/dist/sandbox/docker-agent-image.cjs +5 -1
  432. package/dist/sandbox/docker-agent-image.cjs.map +1 -1
  433. package/dist/sandbox/docker-agent-image.d.cts +2 -0
  434. package/dist/sandbox/docker-agent-image.d.mts +2 -0
  435. package/dist/sandbox/docker-agent-image.d.ts +2 -0
  436. package/dist/sandbox/docker-agent-image.js +14 -10
  437. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  438. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  439. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  440. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  441. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  442. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  443. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  444. package/dist/sandbox/index.cjs +4 -2
  445. package/dist/sandbox/index.cjs.map +1 -1
  446. package/dist/sandbox/index.d.cts +1 -1
  447. package/dist/sandbox/index.d.mts +1 -1
  448. package/dist/sandbox/index.d.ts +1 -1
  449. package/dist/sandbox/index.js +120 -116
  450. package/dist/sandbox/index.mjs +120 -116
  451. package/dist/sandbox/keep-registry.cjs +28 -66
  452. package/dist/sandbox/keep-registry.cjs.map +1 -1
  453. package/dist/sandbox/types.cjs.map +1 -1
  454. package/dist/sandbox/types.d.cts +1 -1
  455. package/dist/sandbox/types.d.mts +1 -1
  456. package/dist/sandbox/types.d.ts +1 -1
  457. package/dist/shared/aggregate.cjs +16 -6
  458. package/dist/shared/aggregate.cjs.map +1 -1
  459. package/dist/shared/aggregate.d.cts +12 -4
  460. package/dist/shared/aggregate.d.mts +12 -4
  461. package/dist/shared/aggregate.d.ts +12 -4
  462. package/dist/shared/turn-label.cjs +20 -2
  463. package/dist/shared/turn-label.cjs.map +1 -1
  464. package/dist/shared/turn-label.d.cts +2 -0
  465. package/dist/shared/turn-label.d.mts +2 -0
  466. package/dist/shared/turn-label.d.ts +2 -0
  467. package/dist/shared/turn-label.js +4 -2
  468. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  469. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  470. package/dist/vendor/remark/remark-parse.cjs +12 -12
  471. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  472. package/dist/vendor/remark/remark.cjs +13 -13
  473. package/dist/vendor/remark/remark.cjs.map +1 -1
  474. package/dist/view/server.cjs +6 -0
  475. package/dist/view/server.cjs.map +1 -1
  476. package/docs-site/images/hitl-handshake-zh.svg +3 -3
  477. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  478. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  479. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +4 -3
  480. package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
  481. package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
  482. package/docs-site/zh/examples/integrations/langgraph.mdx +4 -4
  483. package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
  484. package/docs-site/zh/explanation/adapter.mdx +5 -5
  485. package/docs-site/zh/explanation/assert.mdx +7 -7
  486. package/docs-site/zh/explanation/drive.mdx +4 -2
  487. package/docs-site/zh/explanation/evals.mdx +10 -8
  488. package/docs-site/zh/explanation/experiment.mdx +2 -2
  489. package/docs-site/zh/explanation/hitl.mdx +9 -9
  490. package/docs-site/zh/explanation/judge.mdx +5 -5
  491. package/docs-site/zh/explanation/overview.mdx +3 -3
  492. package/docs-site/zh/explanation/runner.mdx +1 -1
  493. package/docs-site/zh/index.mdx +3 -3
  494. package/docs-site/zh/reference/builtin-agents.mdx +13 -13
  495. package/docs-site/zh/reference/capabilities.mdx +1 -1
  496. package/docs-site/zh/reference/cli.mdx +18 -12
  497. package/docs-site/zh/reference/define-agent.mdx +130 -5
  498. package/docs-site/zh/reference/define-config.mdx +2 -2
  499. package/docs-site/zh/reference/define-eval.mdx +4 -4
  500. package/docs-site/zh/reference/events.mdx +11 -11
  501. package/docs-site/zh/reference/official-adapters.mdx +6 -6
  502. package/docs-site/zh/reference/results-data.mdx +6 -0
  503. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  504. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  505. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  506. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  507. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  508. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  509. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  510. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  511. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  512. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  513. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  514. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  515. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  516. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  517. package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -43
  518. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  519. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  520. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  521. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  522. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  523. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
  524. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  525. package/docs-site/zh/tutorials/rerun-and-cache.mdx +4 -2
  526. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  527. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  528. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  529. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  530. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  531. package/docs-site/zh/tutorials/viewing-results.mdx +38 -1
  532. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  533. package/docs-site/zh/tutorials/write-send.mdx +9 -8
  534. package/package.json +9 -5
  535. package/dist/report/built-in/overview.cjs +0 -44
  536. package/dist/report/built-in/overview.cjs.map +0 -1
  537. package/dist/report/built-in/overview.d.cts +0 -6
  538. package/dist/report/built-in/overview.d.mts +0 -6
  539. package/dist/report/built-in/overview.d.ts +0 -6
  540. package/dist/report/built-in/overview.js +0 -9
  541. package/dist/report/built-in/overview.js.map +0 -1
  542. package/dist/runner/gate-lease.cjs +0 -283
  543. package/dist/runner/gate-lease.cjs.map +0 -1
  544. package/dist/runner/gate-lease.d.cts +0 -62
  545. package/dist/runner/gate-lease.d.mts +0 -62
  546. package/dist/runner/gate-lease.d.ts +0 -62
  547. package/dist/runner/gate-lease.js +0 -22
  548. package/dist/runner/gate-lease.js.map +0 -1
@@ -43,9 +43,9 @@ turn.calledTool("read_file", { count: 2 }).label("读取两次");
43
43
 
44
44
  `calledTool` 的第二参数只控制 `count`。`input`、`output` 与 `status` 条件写进 `toolMatch`;JSON 结构交给 `jsonMatch`,命令 token 交给 `commandMatch`。`notCalledTool` 直接接收同一类 matcher。
45
45
 
46
- ## 两种 Eval
46
+ ## 两种评估用例
47
47
 
48
- `defineEval` 创建 Pass Eval。Boolean `matched` 进入 Attempt Verdict;`mismatched` 使最终 Verdict 为 `failed`,但不会阻止后续检查继续登记。连续 evaluator 与 Judge recipe 给出 `[0,1]` measurement;Pass Eval 使用 `.gate(n)` 才把它纳入 failed;`.atLeast(n)` 只记录局部 condition。
48
+ `defineEval` 创建通过制评估。Boolean `matched` 进入 Attempt Verdict;`mismatched` 使最终 Verdict 为 `failed`,但不会阻止后续检查继续登记。连续 evaluator 与 Judge recipe 给出 `[0,1]` measurement;通过制评估使用 `.gate(n)` 才把它纳入 failed;`.atLeast(n)` 只记录局部 condition。
49
49
 
50
50
  ```ts
51
51
  turn.judge.autoevals.closedQA("回答是否给出可执行步骤?")
@@ -53,7 +53,7 @@ turn.judge.autoevals.closedQA("回答是否给出可执行步骤?")
53
53
  .label("步骤可执行");
54
54
  ```
55
55
 
56
- `defineScoreEval` 创建 Score Eval。它只有累计 `score`,没有 Attempt Verdict、总分、百分比或另一种数值单位。Assertion 默认只保存 evaluation,不计分;用 `.score(n)` 才让已有 Assertion 贡献 score。Boolean matched 贡献 `n`,mismatched 贡献 `0`;measurement `m` 贡献 `m * n`。`t.score(n)` 直接登记 contribution,返回的 handle 只能配置 `key` 与 `label`。
56
+ `defineScoreEval` 创建计分制评估。它只有累计 `score`,没有 Attempt Verdict、总分、百分比或另一种数值单位。Assertion 默认只保存 evaluation,不计分;用 `.score(n)` 才让已有 Assertion 贡献 score。Boolean matched 贡献 `n`,mismatched 贡献 `0`;measurement `m` 贡献 `m * n`。`t.score(n)` 直接登记 contribution,返回的 handle 只能配置 `key` 与 `label`。
57
57
 
58
58
  ```ts
59
59
  turn.calledTool("search"); // 只保存 evaluation
@@ -62,7 +62,7 @@ turn.judge.autoevals.closedQA("回答完整").score(5); // measurement 0.8 时 +
62
62
  t.score(5); // 直接 +5
63
63
  ```
64
64
 
65
- Score Eval 的 measurement 不必 threshold 就能封口。`.atLeast(n)` 只增加局部 `met` / `below` condition,不改变 contribution。没有 `.score()` 的 Assertion 不显示 `+0`;正常没有计分项的 Score Eval 得到正式且可排名的 `score: 0`。
65
+ 计分制评估的 measurement 不必 threshold 就能封口。`.atLeast(n)` 只增加局部 `met` / `below` condition,不改变 contribution。没有 `.score()` 的 Assertion 不显示 `+0`;正常没有计分项的计分制评估得到正式且可排名的 `score: 0`。
66
66
 
67
67
  ## 控制流
68
68
 
@@ -74,17 +74,17 @@ await turn.succeeded().orStop();
74
74
  const search = await t.check(turn.message, includes("结论")).orStop();
75
75
  ```
76
76
 
77
- 正常 stop 后,Pass Eval 仍按触发 Assertion 得到 `failed` Verdict;Score Eval 仍是 `scored`,保留正式 score 和 stop cause,因此可以排名。
77
+ 正常 stop 后,通过制评估仍按触发 Assertion 得到 `failed` Verdict;计分制评估仍是 `scored`,保留正式 score 和 stop cause,因此可以排名。
78
78
 
79
79
  ## Judge
80
80
 
81
- Judge recipe 调用时直接登记 measurement Assertion。Pass Eval 对同一 handle 用 `.gate(n)`,Score Eval 用 `.score(n)`;两种配置都只运行一次 Judge evaluator。材料、配置和失败语义见 [Judge](/zh/explanation/judge)。
81
+ Judge recipe 调用时直接登记 measurement Assertion。通过制评估对同一 handle 用 `.gate(n)`,计分制评估用 `.score(n)`;两种配置都只运行一次 Judge evaluator。材料、配置和失败语义见 [Judge](/zh/explanation/judge)。
82
82
 
83
83
  ## 不可用与读取
84
84
 
85
85
  缺少 evidence 不能伪装成普通 mismatch。`unavailable` 与 `errored` 保留原因与脱敏 evidence。
86
86
 
87
- AssertionResult 也不是只保存成功或失败。所有入口都遵循同一个 `check(a, b)` 模型:每条结果保存 subject `a` 的安全结构化内容或稳定引用、evaluator / Match `b` 的 identity 与完整安全 config,以及 evaluation、policy 和显示所需的结构化结果。显式 `t.check(a, b)` 由作者提供两者;`loadedSkill`、`calledTool`、`succeeded` 与 Judge recipe 只是替作者取得 `a` 并构造 `b` 的特例,保存规则不变。
87
+ AssertionResult 也不是只保存成功或失败。所有入口都遵循同一个 `check(a, b)` 模型:每条结果保存 subject `a` 的安全结构化内容或稳定引用、evaluator / Match `b` 的 identity 与完整安全 config,以及 evaluation、policy 和显示所需的结构化结果。显式 `t.check(a, b)` 由作者提供两者;`calledTool`、`succeeded` 与 Judge recipe 只是替作者取得 `a` 并构造 `b` 的特例,保存规则不变。
88
88
 
89
89
  例如 `t.check(await t.sandbox.runCommand(...), commandSucceeded())` 会保留已求值 `CommandResult` 的命令、参数、退出状态、运行时间以及脱敏 stdout / stderr 内容或引用。`calledTool(...)` 会保留其 scope 中归一化的 tool occurrence context。context 包括 operation / event identity、脱敏 input、status、output / error refs、coverage 与匹配 event refs。没有命中时也保留观察范围与候选 occurrence refs,而不是只存 `false`。
90
90
 
@@ -8,7 +8,7 @@ description: "t.send() 和它返回的 Turn、t.sendFile()、多轮对话、t.ne
8
8
 
9
9
  ## `t.send()` 和它返回的 `Turn`
10
10
 
11
- `t.send(input)` 是唯一的动词。它底层调用 Adapter 的 `send(input, ctx)`,把返回值归一成一个 `Turn`:
11
+ `t.send(input)` Adapter 的基础执行动词。它底层调用 Adapter 的 `send(input, ctx)`,把返回值归一成一个 `Turn`:
12
12
 
13
13
  ```ts
14
14
  const turn = await t.send("布鲁克林今天天气怎么样?");
@@ -86,8 +86,10 @@ t.check(fresh.reply, satisfies("没有记忆泄漏", (r) => !r.includes("小明"
86
86
  有些 agent 会在一轮执行中间停下来,等审批或缺失信息,而不是直接跑完。这时这一轮以 `status: "waiting"` 结束,并带一条或多条 `input.requested` 事件说明在等什么。完整的心智模型(握手时序、Adapter 侧义务、rejected 语义)见 [HITL](/zh/explanation/hitl),这里讲评估侧怎么用。
87
87
 
88
88
  ```ts
89
+ import { equals } from "niceeval/expect";
90
+
89
91
  const draft = await t.send("拟一封跟进邮件,但先别发,等我确认。");
90
- draft.parked().label("停在审批上");
92
+ t.check(draft.status, equals("waiting")).label("停在审批上");
91
93
 
92
94
  const request = t.requireInputRequest({
93
95
  prompt: /是否发送/,
@@ -4,7 +4,7 @@ sidebarTitle: "评估"
4
4
  description: "评估用例是一个测试用例:描述和 test 函数,agent-neutral。了解评估用例如何被发现、调度、评分和报告。"
5
5
  ---
6
6
 
7
- 一个 eval 是一个可运行的测试用例。它通常由一个 `*.eval.ts` 文件导出,通过 `defineEval` 声明。
7
+ 一个评估用例是一个可运行的测试用例。它通常由一个 `*.eval.ts` 文件导出,通过 `defineEval` 声明。
8
8
 
9
9
  ## 评估用例的组成
10
10
 
@@ -31,7 +31,7 @@ export default defineEval({
31
31
  | 字段 | 说明 |
32
32
  |---|---|
33
33
  | `description` | 给人看的描述,出现在报告里 |
34
- | `environment` | 可选的环境需求 profile,由 sandbox spec `environments` 表映射到具体预制环境 |
34
+ | `sandbox` | 评估用例拥有的可选 Sandbox layer;Experiment 提供 template-bearing layer 时省略 |
35
35
  | `test(t)` | 交互和断言逻辑 |
36
36
 
37
37
  评估用例本身不声明用哪个 Agent——它默认保持 agent-neutral,同一个评估用例可以在不同 experiment 下跑不同 Agent。选哪个 Agent 是 experiment 的字段,不由 CLI 临时覆盖。
@@ -67,7 +67,7 @@ npx niceeval exp local weather/brooklyn
67
67
  [NiceEval](https://niceeval.com/) 收集值断言、作用域断言与 Judge measurement,并登记 score contribution。
68
68
  </Step>
69
69
  <Step title="终态">
70
- Pass Eval 把断言结果折叠成最终 Verdict;Score Eval 累计正式 score。
70
+ 通过制评估把断言结果折叠成最终 Verdict;计分制评估累计正式 score。
71
71
  </Step>
72
72
  <Step title="Report">
73
73
  控制台和 reporters 输出结果,事实同时提交进 `.niceeval/` Record 根。
@@ -76,14 +76,14 @@ npx niceeval exp local weather/brooklyn
76
76
 
77
77
  ## Verdict 类型
78
78
 
79
- Pass Eval 的 Attempt 终态只有四种:
79
+ 通过制评估的 Attempt 终态只有四种:
80
80
 
81
81
  <CardGroup cols={2}>
82
82
  <Card title="passed" icon="circle-check" color="#22c55e">
83
- 所有 Boolean Assertion 都 matched,所有 measurement 都达到 `atLeast` 阈值,并且没有执行错误。
83
+ 所有 Boolean Assertion 都 matched,所有 gated measurement 都达到 `.gate(n)` 阈值,并且没有执行错误。
84
84
  </Card>
85
85
  <Card title="failed" icon="circle-xmark" color="#ef4444">
86
- 至少一个 Boolean condition mismatched,或 measurement 低于阈值。
86
+ 至少一个 Boolean condition mismatched,或 measurement 低于明确的 `.gate(n)` 阈值。
87
87
  </Card>
88
88
  <Card title="errored" icon="triangle-exclamation" color="#f59e0b">
89
89
  执行异常、超时或作者错误,本次执行无法形成可信结论。
@@ -93,11 +93,13 @@ Pass Eval 的 Attempt 终态只有四种:
93
93
  </Card>
94
94
  </CardGroup>
95
95
 
96
- Score Eval 没有 Verdict;它只有累计 `score`,分数越高越好。正常没有计分项时 score 为 `0`。
96
+ 计分制评估的主读数是累计 earned score,分数越高越好。正常没有计分项时 score 为 `0`。默认报告显示 earned score,不把正常封口状态算进通过率。
97
+
98
+ `.score(points)` 中的 `points` 是单项贡献权重,不是固定总分。默认报告不会把 earned score 自动换算成百分比。一个 Experiment 同时包含通过制评估与计分制评估时,报告分别显示两种主读数。
97
99
 
98
100
  ## 判定与测量值
99
101
 
100
- Boolean `matched` 默认进入 Verdict。连续测量值与 Judge 输出是 `[0, 1]` 的 measurement;Pass Eval 使用 `.gate(n)` 才把它纳入 failed,`.atLeast(n)` 只记录局部 condition。完整规则见 [Assert](/zh/explanation/assert)。
102
+ Boolean `matched` 默认进入 Verdict。连续测量值与 Judge 输出是 `[0, 1]` 的 measurement;通过制评估使用 `.gate(n)` 才把它纳入 failed,`.atLeast(n)` 只记录局部 condition。完整规则见 [Assert](/zh/explanation/assert)。
101
103
 
102
104
  ## `*.eval.ts` 约定
103
105
 
@@ -31,11 +31,11 @@ Experiment 还有一对实验级 Hook `setup` / `teardown`:整个实验只跑
31
31
 
32
32
  要按实验在 Sandbox 里准备环境,把操作挂在 `sandbox` 字段的 spec 上。`dockerSandbox({ source: { type: "image", image: "node:24-slim" } })` 等工厂返回的对象可以链 `.setup()` / `.teardown()`。两者的边界与写法见[写实验 · 启动 Experiment 共享服务](/zh/tutorials/write-experiment#启动-experiment-共享服务)与[Sandbox provider · 生命周期](/zh/tutorials/sandbox-providers#生命周期)。
33
33
 
34
- 同一实验里的评估用例需要不同预制环境时,评估用例只声明 provider-neutral `environment` profile。sandbox spec `environments` 表再把 profile 映射到 Docker image、E2B template Vercel Sandbox snapshot。这样任务需求留在评估用例,provider 产物留在 spec,一个实验仍覆盖全部评估用例、对比不拆分。写法见[写实验 · 让不同评估用例使用不同预制环境](/zh/tutorials/write-experiment#让不同评估用例使用不同预制环境)。
34
+ 同一实验里的评估用例需要不同预制环境时,把对应的 template-bearing `sandbox` layer 直接放在各评估用例上,并让 Experiment 不再提供 template。重复 layer 用普通 TypeScript 辅助函数复用;这里没有 environment profile registry。同一个 Experiment 仍能覆盖全部评估用例,因为 link planning 会逐条把评估用例 layer Experiment layer 配对。写法见[写实验 · 让不同评估用例使用不同预制环境](/zh/tutorials/write-experiment#让不同评估用例使用不同预制环境)。
35
35
 
36
36
  ## 矩阵对比
37
37
 
38
- 要比较的每个变体写一个 experiment 文件:两个模型就是两个文件,只差 `model` 一行。prompt A/B 就是只差一个参数。同一批 eval 在多个 experiment 下各跑一遍,pass rate、成本、延迟就有了可比的横截面——`niceeval view` 里叠着看。适合比什么、结果怎么读,见[实验矩阵](/zh/tutorials/experiments)。
38
+ 要比较的每个变体写一个 experiment 文件:两个模型就是两个文件,只差 `model` 一行。prompt A/B 就是只差一个参数。同一批评估用例在多个 experiment 下各跑一遍,pass rate、成本、延迟就有了可比的横截面——`niceeval view` 里叠着看。适合比什么、结果怎么读,见[实验矩阵](/zh/tutorials/experiments)。
39
39
 
40
40
  ## 相关阅读
41
41
 
@@ -14,13 +14,13 @@ HITL(human-in-the-loop,人工介入)指 agent 在执行中间停下来,
14
14
  - **Codex**:审批模式(suggest / auto-edit 等)决定哪些动作要先经人确认,本质是同一扇门。
15
15
  - **AI SDK 应用**:工具不带 `execute` 时,工具调用会浮到前端,由界面上的人确认后把结果交回(`addToolResult`),模型再继续——这是自研应用里最常见的审批门写法。
16
16
 
17
- 对被测对象来说,这条"停下来等人"的分支和别的行为一样需要回归:批准后该发生的事发生了吗?拒绝后真的没做吗?问错了人、停错了地方呢?但评估用例是自动跑的,里面没有人。[NiceEval](https://niceeval.com/) 的做法是把"人"折叠成三个可编排的动作:看到 agent 停了(`t.parked()`)、检查它在等什么(`t.requireInputRequest()`)、替人回答(`t.respond()`)。批准、拒绝、补充信息,从此都是能写进评估用例的路径。
17
+ 对被测对象来说,这条"停下来等人"的分支和别的行为一样需要回归:批准后该发生的事发生了吗?拒绝后真的没做吗?问错了人、停错了地方呢?但评估用例是自动跑的,里面没有人。[NiceEval](https://niceeval.com/) 的做法是把"人"折叠成三个可编排的动作:用 `t.check(turn.status, equals("waiting"))` 确认 agent 停下、用 `t.requireInputRequest()` 检查它在等什么、再用 `t.respond()` 替人回答。批准、拒绝、补充信息,从此都是能写进评估用例的路径。
18
18
 
19
19
  ## 停轮如何表达:waiting + input.requested
20
20
 
21
21
  `send` 返回的 `Turn.status` 有三个值:`"completed"`(跑完了)、`"failed"`(出错了)、`"waiting"`——**这一轮没跑完,agent 停在等人输入上**。waiting 不是失败,是挂起:回答到达后同一轮接着跑,不重发请求、不开新对话。
22
22
 
23
- 停下的轮次还要同时说明"在等什么":每个待回答的问题吐一条 `input.requested` 事件,带一个稳定的请求 `id`、停在哪个动作上(`action`)、可选的裁决项(`options`,如 approve / deny)。状态和事件缺一不可——`waiting` 让 eval 知道该回答了,`input.requested` 让回答有的放矢。
23
+ 停下的轮次还要同时说明"在等什么":每个待回答的问题吐一条 `input.requested` 事件,带一个稳定的请求 `id`、停在哪个动作上(`action`)、可选的裁决项(`options`,如 approve / deny)。状态和事件缺一不可——`waiting` 让评估用例知道该回答了,`input.requested` 让回答有的放矢。
24
24
 
25
25
  ## 一次完整握手
26
26
 
@@ -36,10 +36,10 @@ HITL(human-in-the-loop,人工介入)指 agent 在执行中间停下来,
36
36
  ## 评估侧:三个动作
37
37
 
38
38
  ```ts
39
- import { toolMatch } from "niceeval/expect";
39
+ import { equals, toolMatch } from "niceeval/expect";
40
40
 
41
41
  const draft = await t.send("给老板发一封周报邮件。");
42
- draft.parked(); // ① 断言这一轮停下了
42
+ t.check(draft.status, equals("waiting")); // ① 断言这一轮停下了
43
43
 
44
44
  const req = t.requireInputRequest({ action: "send_email" }); // ② 取出待答请求
45
45
 
@@ -47,7 +47,7 @@ await t.respond({ request: req, optionId: "approve" }); // ③ 替人回答,发
47
47
  t.calledTool(toolMatch("send_email", { status: "completed" }));
48
48
  ```
49
49
 
50
- - `t.parked()` 断言这一轮确实以 waiting 停下。反过来 `t.succeeded()` 在 waiting 轮上会失败——停轮是显式状态,不会被当成"跑完了"。
50
+ - `t.check(draft.status, equals("waiting"))` 断言这一轮确实以 waiting 停下。反过来 `draft.succeeded()` 在 waiting 轮上会失败——停轮是显式状态,不会被当成"跑完了"。
51
51
  - `t.requireInputRequest(filter)` 从待处理请求里精确取一个(按 `id` / `prompt` / `action` / `optionIds` 等字段匹配),匹配到 0 个或超过 1 个都会抛,多个请求并停时靠它消歧。
52
52
  - `t.respond(...)` 回答并发出下一轮。同类请求要给同一个答案时(比如逐个批准一批改动),`t.respondAll(optionId)` 一次处理完。
53
53
 
@@ -57,13 +57,13 @@ t.calledTool(toolMatch("send_email", { status: "completed" }));
57
57
 
58
58
  HITL 对 Adapter 的全部要求就三件事——前两件发生在停下的那一轮,第三件发生在回答到达的下一轮:
59
59
 
60
- 1. **停轮时如实返回 `status: "waiting"`**,不要把挂起报成 `"completed"`,否则 `parked()` 失效、`succeeded()` 假通过。
60
+ 1. **停轮时如实返回 `status: "waiting"`**,不要把挂起报成 `"completed"`,否则 `t.check(turn.status, equals("waiting"))` 会失败、`succeeded()` 可能假通过。
61
61
  2. **每个待回答的问题吐一条 `input.requested`**,`id` 稳定、字段尽量填全——评估侧的检查和对位全靠它们。
62
62
  3. **下一次 `send` 先交裁决、再续跑**:从 `input.responses` 按 `requestId` 把裁决交回应用(不要按顺序猜),然后接着上一轮挂起的地方继续,而不是重发请求。
63
63
 
64
64
  "挂起的现场"(比如读了一半的 SSE 流)存在本会话线的 `ctx.session` 上。Adapter 用 `createSessionSlot<Pending>()` 声明私有 slot,停轮时 `ctx.session.set(slot, pending)`,回答轮 `ctx.session.take(slot)` 取回,取到即清除。怎么和流式驱动拼起来,见[写 send](/zh/tutorials/write-send#第五步:hitl) 第五步的完整骨架。
65
65
 
66
- 和 [NiceEval](https://niceeval.com/) 的其它能力一样,HITL 没有布尔声明:**做到了就是有**。send 返回过 `"waiting"` 并吐了 `input.requested`,`t.respond` 就能工作。没做到,eval 会在第一个 `parked()` 或 `requireInputRequest()` 上明确失败,而不是静默假通过。能力如何从构造中来,见 [Adapter](/zh/explanation/adapter#能力从哪来:构造证明,不是问卷)。
66
+ 和 [NiceEval](https://niceeval.com/) 的其它能力一样,HITL 没有布尔声明:**做到了就是有**。send 返回过 `"waiting"` 并吐了 `input.requested`,`t.respond` 就能工作。没做到,评估用例会在状态检查或 `requireInputRequest()` 上明确失败,而不是静默假通过。能力如何从构造中来,见 [Adapter](/zh/explanation/adapter#能力从哪来:构造证明,不是问卷)。
67
67
 
68
68
  ## 拒绝不是故障
69
69
 
@@ -71,7 +71,7 @@ HITL 对 Adapter 的全部要求就三件事——前两件发生在停下的那
71
71
 
72
72
  ## 哪些 agent 用不到 HITL
73
73
 
74
- 不是每个 agent 都有这条分支,没有就整个跳过——Adapter 不用管 `waiting`,eval 里也不会出现 `t.respond`:
74
+ 不是每个 agent 都有这条分支,没有就整个跳过——Adapter 不用管 `waiting`,评估用例里也不会出现 `t.respond`:
75
75
 
76
76
  - **每轮一口气跑完的 agent**:问答、检索、翻译这类单发即回的服务,执行中没有等人的环节。
77
77
  - **审批门被关掉的运行形态**:Claude Code、Codex 产品本身是 HITL 的,但作为被测对象在 Sandbox 里通常全自动跑(跳过权限确认)——内置的 `claude-code` / `codex` / `bub` sandbox agent 就是这样,所以它们都不做 HITL。
@@ -81,7 +81,7 @@ HITL 对 Adapter 的全部要求就三件事——前两件发生在停下的那
81
81
 
82
82
  ## 相关阅读
83
83
 
84
- - [Drive](/zh/explanation/drive#人工介入-hitl) — 评估侧的完整用法:`t.parked()`、`t.requireInputRequest()`、`t.respond()` / `t.respondAll()`。
84
+ - [Drive](/zh/explanation/drive#人工介入-hitl) — 评估侧的完整用法:状态检查、`t.requireInputRequest()`、`t.respond()` / `t.respondAll()`。
85
85
  - [Adapter](/zh/explanation/adapter#不同回答的入参) — 回答到 Adapter 的结构化入参,四种典型形态。
86
86
  - [写 send](/zh/tutorials/write-send) — Adapter 侧实操:typed session slot 与流式 + HITL 的完整骨架。
87
87
  - [接入你的 Agent](/zh/tutorials/connect-your-agent) — 接入全景:最小接入、参数通道与增量地图。
@@ -44,7 +44,7 @@ t.judge.autoevals.closedQA("文档是否说明了安装和回滚?", {
44
44
 
45
45
  ## 声明 capability 和配置
46
46
 
47
- 只有 eval 声明了 `judge` 才能创建 Judge Assertion:
47
+ 只有评估用例声明了 `judge` 才能创建 Judge Assertion:
48
48
 
49
49
  ```ts
50
50
  export default defineEval({
@@ -72,12 +72,12 @@ export default defineConfig({
72
72
  });
73
73
  ```
74
74
 
75
- 字段优先级是 Eval 对象、Experiment、项目配置。未指定时,`baseUrl` 为 OpenAI 兼容端点,`apiKeyEnv` 为 `OPENAI_API_KEY`,`timeoutMs` 为 180000 毫秒。
75
+ 字段优先级是评估用例对象、Experiment、项目配置。未指定时,`baseUrl` 为 OpenAI 兼容端点,`apiKeyEnv` 为 `OPENAI_API_KEY`,`timeoutMs` 为 180000 毫秒。
76
76
  运行器把解析结果冻结一次,并将同一份配置用于指纹、预检和实际 evaluator。
77
77
 
78
78
  ## 阈值与分数
79
79
 
80
- Pass Eval 用 `.gate(n)` 把 Judge measurement 纳入 failed;`.atLeast(n)` 只记录局部 condition。
80
+ 通过制评估用 `.gate(n)` 把 Judge measurement 纳入 failed;`.atLeast(n)` 只记录局部 condition。
81
81
 
82
82
  ```ts
83
83
  const quality = turn.judge.autoevals.closedQA("回答是否准确且完整?")
@@ -88,7 +88,7 @@ await quality.orStop();
88
88
 
89
89
  `.orStop()` 是同一 handle 的 async barrier。低于阈值时它停止当前 continuation;正常 stop 后 Attempt 仍得到 `failed` Verdict。
90
90
 
91
- Score Eval 直接调用 `.score(n)`:measurement `m` 贡献 `m * n`。`.atLeast(n)` 只增加局部 condition,可以单独配置,也可以与 `.score(n)` 同一条 Assertion 共存。
91
+ 计分制评估直接调用 `.score(n)`:measurement `m` 贡献 `m * n`。`.atLeast(n)` 只增加局部 condition,可以单独配置,也可以与 `.score(n)` 同一条 Assertion 共存。
92
92
 
93
93
  ```ts
94
94
  turn.judge.autoevals.closedQA("回答质量如何?").score(20).atLeast(0.5);
@@ -110,6 +110,6 @@ Judge 给出的理由写入通用 `explanation`。`evidence` 只保存裁剪、
110
110
 
111
111
  ## 相关阅读
112
112
 
113
- - [Assertion 与 Match](/zh/explanation/assert) — 调用即登记与两种 Eval。
113
+ - [Assertion 与 Match](/zh/explanation/assert) — 调用即登记与两种评估用例。
114
114
  - [通过制与计分制](/zh/tutorials/evaluation-kinds) — `atLeast` 与 `score` 的选择。
115
115
  - [驱动](/zh/explanation/drive) — Turn、session 与跨轮材料。
@@ -7,7 +7,7 @@ description: "理解 Experiment、Record、Analysis 与 Report 如何组成一
7
7
  NiceEval 把评估定义、运行、已发布结果和报告分成清楚的职责。你定义评估用例与 Experiment,Runner 执行它们;完整 Run 发布到 Record;查看和分享时,Analysis 从选中的结果形成闭合值,Report 再把这些值组织成页面。
8
8
 
9
9
  ```text
10
- Eval Experiment
10
+ 评估用例与 Experiment
11
11
 
12
12
  Runner
13
13
 
@@ -24,7 +24,7 @@ Report
24
24
 
25
25
  ## 评估如何运行
26
26
 
27
- Eval 定义任务、断言和需要的 Fixture。Experiment 选择 Eval,并声明 Agent、模型、并发、预算与其他运行条件。Adapter 连接被测系统;Sandbox 提供隔离的执行位置。
27
+ 评估用例定义任务、断言和需要的 Fixture。Experiment 选择评估用例,并声明 Agent、模型、并发、预算与其他运行条件。Adapter 连接被测系统;Sandbox 提供隔离的执行位置。
28
28
 
29
29
  Runner 为每个选中的 Experiment 建立一个 Run。Run 列出本次应有的位置,因此它定义结果计算的分母。每个位置最多有一个 Member。
30
30
 
@@ -40,7 +40,7 @@ Record 是可携带、可复制并可进入 Git 的已发布结果集。应用
40
40
 
41
41
  用户用不带 locator 或 `--run` 的命令选择仍匹配当前项目的结果,或用 locator、`--run` 选择历史事实。NiceEval 根据这个选择形成 `Sample`,它保留完整的预期范围和分母,但不允许页面重新选择或重新打开结果。
42
42
 
43
- `project-current` 扫描所有已发布 Run,只保留 Experiment、Eval 和执行身份仍匹配当前项目的位置。它不按时间只留一个 Run。
43
+ `project-current` 扫描所有已发布 Run,只保留 Experiment、评估用例和执行身份仍匹配当前项目的位置。它不按时间只留一个 Run。
44
44
 
45
45
  `--run` 保留具名 Run 的完整预期范围。每个已选位置都是 `included`、`not-recorded`、`core-invalid` 或 `excluded`。选择建立框架后,缺少分析输入不会悄悄缩小分母。
46
46
 
@@ -4,7 +4,7 @@ sidebarTitle: "运行器"
4
4
  description: "了解 Runner 怎样建立 Run、选择执行或采用 Attempt,并返回可供后续读取的 receipt。"
5
5
  ---
6
6
 
7
- Runner 把选中的 Experiment Eval 排成一次 Invocation。它在当前进程中安排执行、显示进度,并把停稳后的业务事实写入 Record。
7
+ Runner 把选中的 Experiment 和评估用例排成一次 Invocation。它在当前进程中安排执行、显示进度,并把停稳后的业务事实写入 Record。
8
8
 
9
9
  ## Invocation、Run 与 Attempt
10
10
 
@@ -15,11 +15,11 @@ import { DirectMode } from '/snippets/diagram-direct-mode.jsx';
15
15
 
16
16
  </div>
17
17
 
18
- [NiceEval](https://niceeval.com/) 是一个受 [eve](https://eve.dev) 启发的 Agent-Native 评估框架与 Harness:`defineEval` 负责写清楚测什么,Harness 负责连被测对象、跑、打分、出报告——两者合在一起,就是从写 Eval 到看结果、优化 Agent 的完整闭环。它首先追求良好的开发体验:一个项目可以在 10 分钟左右接入,评估用例文件足够直观,结果也足够容易读。
18
+ [NiceEval](https://niceeval.com/) 是一个受 [eve](https://eve.dev) 启发的 Agent-Native 评估框架与 Harness:`defineEval` 负责写清楚测什么,Harness 负责连接被测对象、运行、评分并生成报告。两者合在一起,就是从编写评估用例到查看结果、优化 Agent 的完整闭环。它首先追求良好的开发体验:一个项目可以在 10 分钟左右接入,评估用例文件足够直观,结果也足够容易读。
19
19
 
20
- 它也框架无关、足够通用:可以用来评估给 Claude Code / Codex 写的 coding-agent 插件、Hook 和 Skill,也可以评估你自己的 AI Agent 应用。无论你的应用基于 AI SDK、LangGraph、Pi,还是自研 agent loop,都可以通过 Adapter 接入。
20
+ 它也框架无关、足够通用:可以用来评估给 Claude Code / Codex 写的 Coding Agent 插件、Hook 和 Skill,也可以评估你自己的 AI Agent 应用。无论你的应用基于 AI SDK、LangGraph、Pi,还是自研 Agent loop,都可以通过 Adapter 接入。
21
21
 
22
- 评估运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告和结构化 artifacts,让你能查看 agent 的行为细节,调试失败原因,并持续优化 pass rate、成本和延迟。
22
+ 评估运行完成后,[NiceEval](https://niceeval.com/) 会生成易读报告和结构化 Artifact,让你能查看 Agent 的行为细节,调试失败原因,并持续优化通过率、成本和延迟。
23
23
 
24
24
  <CardGroup cols={3}>
25
25
  <Card title="Agent Framework 接入" icon="code-branch" href="/zh/examples">
@@ -10,17 +10,17 @@ description: "NiceEval 内置的 claude-code、codex、bub 适配器分别做到
10
10
 
11
11
  | 能力 | 对应的断言 / API |
12
12
  |---|---|
13
- | 收发消息(基础契约) | `t.send()`(可多次调用)、`t.reply`、`turn.outputEquals` / `outputMatches`、按状态判断的 `t.succeeded()` |
14
- | 事件流完整性 | `calledTool` / `toolOrder` / `usedNoTools` / `maxToolCalls` / `messageIncludes` / `noFailedActions` / `event` / `eventOrder` 等整套作用域断言。**负断言(`notCalledTool` 等)有完整事件流才可信** |
13
+ | 收发消息(基础契约) | `t.send()`(可多次调用)、`t.reply`、`t.check(turn.data, equals(...))` / `matches(...)`、按状态判断的 `t.succeeded()` |
14
+ | 事件流完整性 | `calledTool` / `usedNoTools` / `maxToolCalls` / `noFailedActions` / `event` 等作用域断言;`toolOrder` / `eventOrder` 只在 Turn 或 Session 上接收 matcher。消息用 `t.check(turn.message, includes(...))` `t.check(turn.message, pattern(...))`。**负断言(`notCalledTool` 等)有完整事件流才可信** |
15
15
  | 会话续接 | 跨轮记忆断言、`t.newSession()` 会话隔离 |
16
- | HITL(人工介入) | `t.parked()`、`t.requireInputRequest()`、`t.respond()` / `t.respondAll()` |
16
+ | HITL(人工介入) | `t.check(turn.status, equals("waiting"))`、`t.requireInputRequest()`、`t.respond()` / `t.respondAll()` |
17
17
  | `tracing` | trace decoding、`niceeval view` 的调用瀑布图 |
18
18
 
19
19
  ## 三个内置 agent 分别做到哪
20
20
 
21
21
  | Agent | 收发 | 事件流 | 会话续接 | HITL | tracing | 备注 |
22
22
  |---|---|---|---|---|---|---|
23
- | `claude-code` | ✅ | ✅ | ✅(`claude --resume <id>`) | ❌ | ✅(`http/protobuf` → OTLP,beta 开关) | 内置 parser 自动吐 `compaction` 事件,`t.event("compaction")` 可用 |
23
+ | `claude-code` | ✅ | ✅ | ✅(`claude --resume <id>`) | ❌ | ✅(`http/protobuf` → OTLP,beta 开关) | 内置 parser 自动吐 `compaction` 原始事件,供报告和诊断读取;当前没有公开 `eventMatch` selector |
24
24
  | `codex` | ✅ | ✅ | ✅(`codex exec resume <id>`) | ❌ | ✅(`http/json` → OTLP) | 内置 parser 自动吐 `compaction` 事件 |
25
25
  | `bub` | ✅ | ✅ | ✅(`--session-id` + tape 续接) | ❌ | ✅(`http/protobuf` → OTLP) | 内置 parser 自动吐 `compaction` 事件 |
26
26
 
@@ -44,13 +44,13 @@ description: "NiceEval 内置的 claude-code、codex、bub 适配器分别做到
44
44
  ### codex
45
45
 
46
46
  - 连接方式:Sandbox 里跑 `codex exec --json`(续接时是 `codex exec resume <id> --json`),stdout JSONL 当 transcript。命令带 `--dangerously-bypass-approvals-and-sandbox` 与 `--dangerously-bypass-hook-trust`:Sandbox 里没人能回答 codex 的交互确认,插件或 `postSetup` 装好的 hook 因此不需要交互授信就能生效。
47
- - 鉴权:`CODEX_API_KEY`(不是 `OPENAI_API_KEY`),可选 `CODEX_BASE_URL` 接 OpenAI 兼容代理。配置项见下方 `CodexConfig`。
47
+ - 鉴权:`OPENAI_API_KEY`,可选 `OPENAI_BASE_URL` 接 OpenAI 兼容代理。配置项见下方 `CodexConfig`。
48
48
  - `tracing` 通过 `~/.codex/config.toml` 的 `[otel.trace_exporter.otlp-http]` 段配置,协议 `http/json`。
49
49
 
50
50
  ### bub
51
51
 
52
52
  - 连接方式:Sandbox 里跑 `bub run` + `--session-id`,从 `~/.bub/tapes/<hash>.jsonl` 读 tape 当 transcript。
53
- - 鉴权:`BUB_API_KEY` + `BUB_API_BASE`(OpenAI 兼容代理)。配置项见下方 `BubConfig`。
53
+ - 鉴权:`OPENAI_API_KEY` + `OPENAI_BASE_URL`(OpenAI 兼容代理)。配置项见下方 `BubConfig`。
54
54
  - `tracing` 通过环境变量注入(`OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` 等),协议 `http/protobuf`。
55
55
  - 安装走 `uv tool install`(非 npm 包),首次安装带 checkpoint 缓存以加速后续 Sandbox。
56
56
 
@@ -85,8 +85,8 @@ baseUrl?: string;
85
85
  env?: Readonly<globalThis.Record<string, string>>;
86
86
  ```
87
87
 
88
- Extra process environment for Claude Code. Values stay private runtime data and do not enter carry identity.
89
- Mirror behavior-changing non-secret values into Experiment flags or the owning Plugin identity.
88
+ Claude Code 进程的额外环境变量。值只保留在运行时,不进入结果沿用身份。
89
+ 会改变行为的非敏感值应同时写入 Experiment flags 或所属 Plugin 的身份。
90
90
 
91
91
  #### `maxTurns`
92
92
 
@@ -168,7 +168,7 @@ preTeardown?: readonly SandboxCommand[];
168
168
  apiKey?: string;
169
169
  ```
170
170
 
171
- 代理 / OpenAI API key。省略时读 CODEX_API_KEY env。
171
+ 代理 / OpenAI API key。省略时读 OPENAI_API_KEY env。
172
172
 
173
173
  #### `baseUrl`
174
174
 
@@ -176,7 +176,7 @@ apiKey?: string;
176
176
  baseUrl?: string;
177
177
  ```
178
178
 
179
- OpenAI 兼容代理 base URL(如 `https://s2a.example.com/v1`)。省略时读 CODEX_BASE_URL env。
179
+ OpenAI 兼容代理 base URL(如 `https://s2a.example.com/v1`)。省略时读 OPENAI_BASE_URL env。
180
180
 
181
181
  #### `env`
182
182
 
@@ -187,7 +187,7 @@ env?: Readonly<globalThis.Record<string, string>>;
187
187
  注入每次 Codex CLI 进程的额外环境变量。首轮 `codex exec` 与续轮 `codex exec resume`
188
188
  使用同一份声明;Codex 启动的 lifecycle Hook、MCP 动态 header 与命令子进程都会继承。
189
189
  值只经 Sandbox command options 传入,不拼进 shell 文本或写入 setup manifest,并全部按
190
- 潜在敏感值从 timing / execution / error 证据中脱敏。`CODEX_API_KEY` 仍由 `apiKey` 或
190
+ 潜在敏感值从 timing / execution / error 证据中脱敏。`OPENAI_API_KEY` 仍由 `apiKey` 或
191
191
  宿主同名环境变量提供,Adapter 的鉴权值会覆盖这里的同名键。
192
192
  env value 不进入 carry 身份。会改变被测行为的非敏感值必须同时声明在 Experiment flags
193
193
  或所属 Plugin identity;只轮换凭据不会让旧结果失效。
@@ -267,7 +267,7 @@ preTeardown?: readonly SandboxCommand[];
267
267
  apiKey?: string;
268
268
  ```
269
269
 
270
- OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。
270
+ OpenAI 兼容代理的 API key。省略时读 OPENAI_API_KEY env。
271
271
 
272
272
  #### `apiBase`
273
273
 
@@ -275,7 +275,7 @@ OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。
275
275
  apiBase?: string;
276
276
  ```
277
277
 
278
- OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。
278
+ OpenAI 兼容代理的 base URL。省略时读 OPENAI_BASE_URL env。
279
279
 
280
280
  #### `skills`
281
281
 
@@ -19,7 +19,7 @@ description: "Agent 的构造方式、运行时行为与必填的六通道 evide
19
19
  | `tracing`(OTLP 接收 → `niceeval view` 瀑布图) | CLI 型 Agent 配置 `tracing`。长驻应用在 config 配置固定的 `telemetry` 端口 | Span 只进时间瀑布图,不能填补行为证据缺口 |
20
20
  | 跨轮续接与 `t.newSession()` 隔离 | 用 `ctx.session.id` / `capture` 续接后端会话,或用 `ctx.session.get` / `set` 保存 Adapter 私有的强类型历史 | 会话接法决定实际行为,不从一个 evidence bit 推断 |
21
21
  | HITL(`t.respond()`) | `send` 返回 `status: "waiting"` 和 `input.requested` | 下一轮回答按结构化 request ID 对位 |
22
- | Compaction 可见 | 官方 parser 或完整的手写映射发出 `compaction` 事件 | `t.event("compaction")` 还要受下方 `events` 覆盖声明约束 |
22
+ | Compaction 可见 | 官方 parser 或完整的手写映射发出 `compaction` 事件 | 原始事件进入报告与诊断;当前没有公开 `eventMatch` selector |
23
23
 
24
24
  ## 必填的六通道声明
25
25
 
@@ -71,7 +71,7 @@ npx niceeval exp list compare/codex
71
71
  npx niceeval exp list --json
72
72
  ```
73
73
 
74
- 默认输出每个配置的 `experimentId`、描述、agent、model、attempts、选中的 eval 数和 labels。`--json` 输出单个 `niceeval.experiments` 文档,并在每项附上完整的 `selectedEvalIds`。
74
+ 默认输出每个配置的 `experimentId`、描述、agent、model、attempts、选中的评估用例数和 labels。`--json` 输出单个 `niceeval.experiments` 文档,并在每项附上完整的 `selectedEvalIds`。
75
75
 
76
76
  ### 查看一个配对的完整 Shell 与 lifecycle
77
77
 
@@ -80,7 +80,7 @@ npx niceeval debug compare/codex memory/commit0
80
80
  npx niceeval debug compare/codex memory/commit0 --json
81
81
  ```
82
82
 
83
- 两个 selector 都必须唯一。精确 ID 优先,否则可以使用唯一前缀。Eval 只能从 Experiment 自己选中的范围里匹配;零命中或多命中会列出精确候选。
83
+ 两个 selector 都必须唯一。精确 ID 优先,否则可以使用唯一前缀。评估用例只能从 Experiment 自己选中的范围里匹配;零命中或多命中会列出精确候选。
84
84
 
85
85
  计划包含 Plugin lifecycle、author prepare、Agent ensure/setup/teardown、test、cleanup 与 Provider finalizer。能静态声明的 `shell()` / `command()` 展开为实际命令,普通 callback 标为 `opaque`。
86
86
 
@@ -136,7 +136,7 @@ E2B template name 与 Vercel snapshot ID 是 Provider 管理的任意字符串
136
136
 
137
137
  ## 常用 flags
138
138
 
139
- 下表由 CLI 的 flag 解析表生成,表外的 flag 一律按未知 flag 报错并以非零状态退出。**没有**用于选择 Sandbox provider 的 CLI flag,也没有项目级默认 provider。请在 Eval 或 Experiment 上声明 template-bearing `SandboxLayer`,并从 `niceeval/sandbox` 导入下列工厂之一:
139
+ 下表由 CLI 的 flag 解析表生成,表外的 flag 一律按未知 flag 报错并以非零状态退出。**没有**用于选择 Sandbox provider 的 CLI flag,也没有项目级默认 provider。请在评估用例或 Experiment 上声明 template-bearing `SandboxLayer`,并从 `niceeval/sandbox` 导入下列工厂之一:
140
140
 
141
141
  - `dockerSandbox({ source: { type: "image", image } })`
142
142
  - `dockerComposeSandbox({ file, workspaceService })`
@@ -174,15 +174,19 @@ E2B template name 与 Vercel snapshot ID 是 Provider 管理的任意字符串
174
174
  | `--experiment` | string[] | `show` / `view` 命令专用:按完整 ExperimentId 收窄当前项目结果;可重复,不接受前缀或逗号列表。 |
175
175
  | `--record` | string | `show` / `view` / `accept` / `sandbox enter\|list\|stop` 共用:指定实际 Record root;CLI 不补接 `.niceeval/record` 或其它后缀。 |
176
176
  | `--run` | string[] | `show` / `view` 可重复传入 `--run`;每次按完整 RunId 增加一个显式 Run,重复 identity 去重。 |
177
- | `--report` | string | `show` / `view` 命令专用:内建 `overview` 或受信任的 Report module 路径。 |
177
+ | `--report` | string | `show` / `view` 命令专用:内建 `standard` 或受信任的 Report module 路径。 |
178
178
  | `--page` | string | `show` / `view` 命令专用:选择报告的初始页;`show` 渲染该页并在尾部附其余页索引,`view` 以它作初始路由。未命中的页 id 按用法错误退出并列出可用页 id。 |
179
179
  | `--teardown` | boolean | `exp` 命令专用:补齐被强杀打断的实验级 teardown——只对选中的实验各执行一次 teardown(新进程语义),不派发 attempt、不跑 setup;没有遗留登记也照常执行。与 eval 前缀位置参数组合是用法错误。 |
180
+ | `--recover-shared-state` | string | `exp --teardown` 专用:显式恢复一个永不自动接管的 sharedState lease;必须同时提供 --owner-token、--confirm-owner-terminated 和 --confirm-remote-quiesced。 |
181
+ | `--owner-token` | string | `--recover-shared-state` 专用:要恢复的不可变 owner token;错误或过期 token 不会修改 lease。 |
182
+ | `--confirm-owner-terminated` | boolean | `--recover-shared-state` 专用:确认原 owner 已终止。 |
183
+ | `--confirm-remote-quiesced` | boolean | `--recover-shared-state` 专用:确认远端外部状态已静止。 |
180
184
  | `--dry` | boolean | 只打印本次会匹配到的 eval × 运行配置,不实际执行(人读文本或 `--json` 单文档,见「机器怎么读:--json」)。 |
181
185
  | `--force` | boolean | `sandbox prune` 专用:除 orphan 外也销毁 unverified 实例;`exp` 明确拒绝此 flag,重跑失败项或全部项请用 `--rerun` / `--rerun all`。 |
182
186
  | `--rerun` | boolean | `exp` 命令专用:重新运行失败项(裸写/failed)或全部项(all),不改变长期指纹。 |
183
187
  | `--early-exit` / `--no-early-exit` | boolean | 某个 eval 的一次 attempt 通过后,停止该 eval 剩余的 attempts;省略默认关(`attempts` 默认跑满、测完整通过率)。 |
184
188
  | `--open` / `--no-open` | boolean | `view` 命令专用:启动后自动打开浏览器(默认行为)。 |
185
- | `--yes` | boolean | `clean` / `migrate` 专用:确认不可逆 maintenance 动作或没有 Git restore point migration。 |
189
+ | `--yes` | boolean | `clean` / `migrate` 专用:确认不可逆 maintenance 动作或在 clean Git restore point 下执行 migration。 |
186
190
  | `--help` | boolean | 打印用法说明并退出。 |
187
191
  | `--version` | boolean | 打印 niceeval 的版本号并退出。 |
188
192
 
@@ -235,7 +239,7 @@ pnpm exec niceeval view --host 192.168.0.199
235
239
 
236
240
  打开本地结果查看器。它和 `show` 共用默认 Report 与选择规则。不带 locator 或 `--run` 的命令读取所有身份仍匹配当前项目的结果;精确 `@<AttemptLocator>` 显示该 Attempt 的默认概览;`--run` 读取指定历史 Run。NiceEval 随后形成固定 Sample、枚举全部 Page 与参数实例,并构建完整站点。
237
241
 
238
- 没有显式 `--report` 时,`--run` 使用内建 `run-membership-overview`,精确 locator 使用 `attempt-overview`。`project-current` 才使用配置里的 Report,并在没有配置时回退到通用 `default-overview`。显式 `--report` 始终优先。Config 仍会为 Theme 和 `view` rebuild 加载;这里只说明配置里的 Report 不参与显式 Run 的默认选择。
242
+ 没有显式 `--report` 时,`--run` 使用内建 `run-membership-overview`,精确 locator 使用 `attempt-overview`。`project-current` 才使用配置里的 Report,并在没有配置时回退到内建 `standard`。显式 `--report` 始终优先。Config 仍会为 Theme 和 `view` rebuild 加载;这里只说明配置里的 Report 不参与显式 Run 的默认选择。
239
243
 
240
244
  省略 `--host` 时,`view` 只监听 `127.0.0.1`。传入具体 hostname / IP 会显式监听该地址;只写 `--host` 时则监听全部 IPv4 接口。wildcard listener 先打印 loopback URL,再打印可用接口 URL;`--page` 应用到每条 URL,自动打开浏览器只使用第一条。
241
245
 
@@ -259,23 +263,25 @@ pnpm exec niceeval show --run 01H... --report ./reports/summary.tsx --json
259
263
 
260
264
  参数 Page 的 show 路径只对请求 key 调用 `decode()`、canonical `encode()`、`load()` 与 `render()`。它不调用 `enumerate()`,也不为了查找成员资格而执行其它 Page。通过 Page 的关闭 Evidence 边界验证的 locator、identity 或 key 不属于当前 Sample 时,命令返回类型化错误。
261
265
 
262
- 不带 locator 或 `--run` 的 `show` 规划当前项目身份,并扫描默认 Record 中全部 published Run。只有 Experiment、Eval、Attempt 序号、evaluation kind、input identity 与 config identity 仍匹配的 slot 才进入 Sample;命令不会按时间只留一个 Run。没有匹配结果时显示空 Sample,过期结果仍可用完整 `--run` 读取。
266
+ 不带 locator 或 `--run` 的 `show` 规划当前项目身份,并扫描默认 Record 中全部 published Run。只有 Experiment、评估用例、Attempt 序号、evaluation kind、input identity 与 config identity 仍匹配的 slot 才进入 Sample;命令不会按时间只留一个 Run。没有匹配结果时显示空 Sample,过期结果仍可用完整 `--run` 读取。
263
267
 
264
268
  `--run` 可重复,只读取这些显式历史 Run。`--experiment <id>` 可重复,按完整 ExperimentId 收窄当前项目目标,不能与 `--run` 合用。`exp`、不带 `--record` 的 `show` 与 `view` 默认使用同一份结果集。
265
269
 
266
- 单个 `--run` 用于核对这一轮的 expected-slot 分母与 membership;多个 `--run` 用同一表形状比较多个固定历史边界。即使两个 Run 指向同一个 Attempt,它们也可能分别由实际执行、自动沿用或人工采用形成。`exp --json` 最后一条 receipt 的 `runIds` 是机器稳定出口;TTY 完成反馈也显示 Run ID。`accept` 的成功反馈会显示新 Run ID,但这行人读文本不是 JSON receipt 或自动化输入契约。
270
+ 单个 `--run` 用于核对这一轮计划的 Attempt 与结果;多个 `--run` 比较多个固定历史边界。即使两个 Run 指向同一个 Attempt,它们也可能分别由实际执行、自动沿用或人工采用形成。`exp --json` 最后一条 receipt 的 `runIds` 是机器稳定出口;TTY 完成反馈也显示 Run ID。`accept` 的成功反馈会显示新 Run ID,但这行人读文本不是 JSON receipt 或自动化输入契约。
267
271
 
268
272
  内建 `run-membership-overview` 固定使用 `reportId: "run-membership-overview"`、`pageId: "run-membership"` 和 route `/`。
269
273
 
270
- `Run membership` 表的稳定 column keys 分成三组:
274
+ 默认 Human 页使用 `Experiment`、`Eval`、`Attempt`、`Result` 与 `Details`。如果 Run 在创建 Attempt 前失败,页面先显示真实 `Run errors` `N attempts not started`,不显示空通过率、空 evidence、空 Analysis notes 或内部 membership 字段。
275
+
276
+ `show --json` 继续保留机器 membership 字段,稳定 column keys 分成三组:
271
277
 
272
278
  - row identity:`runId`、`slotId`。
273
279
  - Core 与 provenance:`slotState`、`memberRelation`、`sourceAttemptLocator`、`membershipState`、`membershipOutcome`。
274
280
  - Attempt 事实:`verdictState`、`verdict`。
275
281
 
276
- 单 Run 和多 Run 都按 `runId`、`slotId` 排序;表在排序后最多显示 200 rows,并显示省略数量。
282
+ 单 Run 和多 Run 的机器 rows 都按 `runId`、`slotId` 排序;Human 的 planned attempts 与机器 rows 都最多显示 200 项,并显示省略数量。
277
283
 
278
- `membershipOutcome` 是内建报告给出的来源结果,值为 `carried`、`accepted`、`executed`、`not-dispatched` 或 `interrupted`。它用于说明本次位置如何得到结果。内建表是 bounded summary;已知 Attempt 的身份与证据用 `show @<AttemptLocator>` 下钻,需要其它 Run 字段时显式选择自定义 Report。
284
+ `membershipOutcome` 是机器面给出的来源结果,值为 `carried`、`accepted`、`executed`、`not-dispatched` 或 `interrupted`。它用于说明本次位置如何得到结果。已知 Attempt 的身份与证据用 Human 页的 `Details` locator 或 `show @<AttemptLocator>` 下钻,需要其它 Run 字段时显式选择自定义 Report。
279
285
 
280
286
  选择完成后,`show` 只执行目标 Page 需要的 Measure 与领域视图。`partial`、`unsupported`、`failed` 等 Analysis 状态会随结果显示;未使用的数据问题不影响当前页面。`show --json` 是同一个单目标读取:内建 Report 返回 Host-owned 领域文档,自定义 Report 返回一个 Page 的 rendered text manifest。完整契约见[查看结果](/zh/tutorials/viewing-results)。
281
287
 
@@ -302,4 +308,4 @@ view 与静态导出都从同一完整站点版本读取 bytes。运行中的 vi
302
308
  | `2` | 运行时崩溃(未捕获异常),CLI 顶层捕获后退出。 |
303
309
  | `130` | 收到中断信号(Ctrl-C / SIGTERM)后退出。 |
304
310
 
305
- CI 的退出码直接来自 Pass Eval 的 Boolean conditions 与最终 Verdict;JUnit 使用同一份已封口的断言结果。
311
+ CI 的退出码直接来自通过制评估的 Boolean conditions 与最终 Verdict;JUnit 使用同一份已封口的断言结果。