agentv 5.0.0-next.1 → 5.2.0-next.1

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 (108) hide show
  1. package/README.md +239 -53
  2. package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js → agentv-provider-AYXH7WLW-6YZKZ7PS.js} +2 -2
  3. package/dist/{artifact-writer-QD52FC56.js → artifact-writer-SN6UNL5G.js} +15 -8
  4. package/dist/{chunk-GZJMODLW.js → chunk-3S6A2RKR.js} +45880 -30542
  5. package/dist/chunk-3S6A2RKR.js.map +1 -0
  6. package/dist/{chunk-6Q56CEXV.js → chunk-3X357HS4.js} +7900 -8985
  7. package/dist/chunk-3X357HS4.js.map +1 -0
  8. package/dist/{chunk-6JVM4GJI.js → chunk-46K2OET3.js} +187 -80
  9. package/dist/chunk-46K2OET3.js.map +1 -0
  10. package/dist/{chunk-IJEZFZJR.js → chunk-7BGERE6L.js} +2 -2
  11. package/dist/chunk-7BGERE6L.js.map +1 -0
  12. package/dist/{chunk-UG4JHZYM.js → chunk-ALVZQUZP.js} +670 -1427
  13. package/dist/chunk-ALVZQUZP.js.map +1 -0
  14. package/dist/{chunk-RCIEHFQ2.js → chunk-PEUTJS7B.js} +3 -3
  15. package/dist/{chunk-5H446C7X.js → chunk-QMRVH5ZP.js} +2 -8
  16. package/dist/{chunk-IBI7A5RP.js → chunk-T4AD3H3Y.js} +3444 -2251
  17. package/dist/chunk-T4AD3H3Y.js.map +1 -0
  18. package/dist/cli.js +8 -9
  19. package/dist/cli.js.map +1 -1
  20. package/dist/dashboard/assets/{index-D5_8DE_B.js → index-DNgf3qJ2.js} +1 -1
  21. package/dist/dashboard/assets/index-D_bokML8.css +1 -0
  22. package/dist/dashboard/assets/index-r_jSJmlw.js +121 -0
  23. package/dist/dashboard/index.html +2 -2
  24. package/dist/{dist-KJ6PELQY.js → dist-DEPJOMCA.js} +74 -60
  25. package/dist/{docker-workspace-ZJ2ESVBI-6UDETQII.js → docker-workspace-NNK4Z6FR-QRTIG6TM.js} +3 -3
  26. package/dist/{exec-MYPAJJP7-C5HD5WG5.js → exec-4HFFRQ3B-AXDMJNLJ.js} +3 -3
  27. package/dist/index.js +8 -9
  28. package/dist/{interactive-2WMVAASS.js → interactive-36ZNMQB2.js} +13 -29
  29. package/dist/interactive-36ZNMQB2.js.map +1 -0
  30. package/dist/skills/agentv-bench/SKILL.md +38 -34
  31. package/dist/skills/agentv-bench/agents/analyzer.md +6 -6
  32. package/dist/skills/agentv-bench/agents/comparator.md +4 -5
  33. package/dist/skills/agentv-bench/agents/grader.md +4 -4
  34. package/dist/skills/agentv-bench/references/autoresearch.md +3 -3
  35. package/dist/skills/agentv-bench/references/description-optimization.md +2 -2
  36. package/dist/skills/agentv-bench/references/environment-adaptation.md +10 -10
  37. package/dist/skills/agentv-bench/references/eval-yaml-spec.md +51 -30
  38. package/dist/skills/agentv-bench/references/migrating-from-skill-creator.md +4 -4
  39. package/dist/skills/agentv-bench/references/subagent-pipeline.md +13 -12
  40. package/dist/skills/agentv-eval-migrations/SKILL.md +33 -0
  41. package/dist/skills/agentv-eval-migrations/references/breaking-changes.md +1012 -0
  42. package/dist/skills/agentv-eval-review/SKILL.md +6 -3
  43. package/dist/skills/agentv-eval-review/scripts/lint_eval.py +1 -1
  44. package/dist/skills/agentv-eval-writer/SKILL.md +380 -246
  45. package/dist/skills/agentv-eval-writer/references/{config-schema.json → config.schema.json} +6 -5
  46. package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +23 -18
  47. package/dist/skills/agentv-eval-writer/references/eval.schema.json +9852 -0
  48. package/dist/skills/agentv-eval-writer/references/python-helpers.md +8 -8
  49. package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +21 -22
  50. package/dist/skills/agentv-trace-analyst/SKILL.md +4 -4
  51. package/dist/templates/.agentv/targets.yaml +41 -40
  52. package/dist/{ts-eval-loader-RE43OAGX-AMRCUKBZ.js → ts-eval-loader-OMG2JBHP-OP5RR7A3.js} +5 -4
  53. package/package.json +19 -4
  54. package/dist/chunk-6JVM4GJI.js.map +0 -1
  55. package/dist/chunk-6Q56CEXV.js.map +0 -1
  56. package/dist/chunk-76FOHROU.js +0 -96
  57. package/dist/chunk-76FOHROU.js.map +0 -1
  58. package/dist/chunk-GZJMODLW.js.map +0 -1
  59. package/dist/chunk-HSHTTN6C.js +0 -565
  60. package/dist/chunk-HSHTTN6C.js.map +0 -1
  61. package/dist/chunk-IBI7A5RP.js.map +0 -1
  62. package/dist/chunk-IJEZFZJR.js.map +0 -1
  63. package/dist/chunk-LRULMAAA.js +0 -1711
  64. package/dist/chunk-LRULMAAA.js.map +0 -1
  65. package/dist/chunk-R3CXYNTN.js +0 -1238
  66. package/dist/chunk-R3CXYNTN.js.map +0 -1
  67. package/dist/chunk-UG4JHZYM.js.map +0 -1
  68. package/dist/chunk-VQ2ZO7XJ.js +0 -2098
  69. package/dist/chunk-VQ2ZO7XJ.js.map +0 -1
  70. package/dist/chunk-XALGXSKB.js +0 -21
  71. package/dist/chunk-XALGXSKB.js.map +0 -1
  72. package/dist/dashboard/assets/index-BVMrdN8a.js +0 -119
  73. package/dist/dashboard/assets/index-DZWXfWsv.css +0 -1
  74. package/dist/esm-NNMQYIKT.js +0 -32
  75. package/dist/esm-R77SNOF5.js +0 -65
  76. package/dist/esm-RVQPUGWH.js +0 -1207
  77. package/dist/esm-RVQPUGWH.js.map +0 -1
  78. package/dist/esm-TTEMJEVV.js +0 -933
  79. package/dist/esm-TTEMJEVV.js.map +0 -1
  80. package/dist/esm-ZADQ4XQH-QUFGGZL4.js +0 -924
  81. package/dist/esm-ZADQ4XQH-QUFGGZL4.js.map +0 -1
  82. package/dist/exec-MYPAJJP7-C5HD5WG5.js.map +0 -1
  83. package/dist/getMachineId-bsd-HSK5LZMG.js +0 -41
  84. package/dist/getMachineId-bsd-HSK5LZMG.js.map +0 -1
  85. package/dist/getMachineId-darwin-4DP6CCJV.js +0 -41
  86. package/dist/getMachineId-darwin-4DP6CCJV.js.map +0 -1
  87. package/dist/getMachineId-linux-44LJ5UJB.js +0 -33
  88. package/dist/getMachineId-linux-44LJ5UJB.js.map +0 -1
  89. package/dist/getMachineId-unsupported-NVK6IATM.js +0 -24
  90. package/dist/getMachineId-unsupported-NVK6IATM.js.map +0 -1
  91. package/dist/getMachineId-win-YZ36S7VA.js +0 -43
  92. package/dist/getMachineId-win-YZ36S7VA.js.map +0 -1
  93. package/dist/interactive-2WMVAASS.js.map +0 -1
  94. package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js +0 -9
  95. package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js.map +0 -1
  96. package/dist/skills/agentv-eval-writer/references/eval-schema.json +0 -17295
  97. package/dist/skills/agentv-eval-writer/references/experiment-schema.json +0 -278
  98. package/dist/src-76ISS3LH.js +0 -1733
  99. package/dist/src-76ISS3LH.js.map +0 -1
  100. package/dist/ts-eval-loader-RE43OAGX-AMRCUKBZ.js.map +0 -1
  101. /package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js.map → agentv-provider-AYXH7WLW-6YZKZ7PS.js.map} +0 -0
  102. /package/dist/{artifact-writer-QD52FC56.js.map → artifact-writer-SN6UNL5G.js.map} +0 -0
  103. /package/dist/{chunk-RCIEHFQ2.js.map → chunk-PEUTJS7B.js.map} +0 -0
  104. /package/dist/{chunk-5H446C7X.js.map → chunk-QMRVH5ZP.js.map} +0 -0
  105. /package/dist/{dist-KJ6PELQY.js.map → dist-DEPJOMCA.js.map} +0 -0
  106. /package/dist/{docker-workspace-ZJ2ESVBI-6UDETQII.js.map → docker-workspace-NNK4Z6FR-QRTIG6TM.js.map} +0 -0
  107. /package/dist/{esm-NNMQYIKT.js.map → exec-4HFFRQ3B-AXDMJNLJ.js.map} +0 -0
  108. /package/dist/{esm-R77SNOF5.js.map → ts-eval-loader-OMG2JBHP-OP5RR7A3.js.map} +0 -0
@@ -0,0 +1,1012 @@
1
+ # AgentV Eval YAML Breaking Changes From v4.42.4
2
+
3
+ This reference is for migrating eval YAML authored against AgentV v4.42.4 to
4
+ the current schema. It is intentionally migration-specific: each section states
5
+ the v4.42.4-era shape, the current shape, migration steps, verification, and
6
+ compatibility notes.
7
+
8
+ Evidence audited for this guide:
9
+
10
+ - v4.42.4 docs under `apps/web/src/content/docs/docs/v4.42.4/`.
11
+ - Current docs under `apps/web/src/content/docs/docs/next/`.
12
+ - v4.42.4 source from the local `v4.42.4` git tag.
13
+ - Current parser, validator, and schema code in `packages/core/src/evaluation/`.
14
+
15
+ Use the current clone as the final source of truth. Do not claim a migration is
16
+ required only because the current docs prefer a newer convention; require it
17
+ only when the current schema, validator, or loader rejects the old shape or the
18
+ old shape no longer means the same thing.
19
+
20
+ ## Quick Migration Checklist
21
+
22
+ For a v4.42.4-era eval:
23
+
24
+ 1. Move top-level `execution.target` to top-level `target`.
25
+ 2. Move top-level `execution.targets` to top-level `targets`, and rename target
26
+ object `name` to `label`.
27
+ 3. Rename suite/test/turn `assertions` to `assert`.
28
+ 4. If a test uses `tests[].execution.assertions` or
29
+ `tests[].execution.evaluators`, rename that nested list to
30
+ `tests[].execution.assert`; prefer top-level or per-test `assert` for normal
31
+ grader authoring.
32
+ 5. Replace `type: rubrics` or `type: rubric` with `type: llm-rubric` and move
33
+ rubric arrays from `criteria`/`rubrics` to `value`.
34
+ 6. Replace `type: code-grader` and `type: code-judge` with `type: script`.
35
+ 7. Move repeat/trial policy from `execution.trials` to
36
+ `evaluate_options.repeat`.
37
+ 8. Move suite budget from `execution.budget_usd` to
38
+ `evaluate_options.budget_usd`.
39
+ 9. Move authored suite concurrency from `execution.workers` or
40
+ `execution.max_concurrency` to `evaluate_options.max_concurrency`, or leave
41
+ it to `--workers` / project config if it is operator policy.
42
+ 10. Remove top-level `execution`; current eval YAML rejects it.
43
+ 11. Move authored coding-agent testbed setup from public `workspace` fields to
44
+ `environment`.
45
+ 12. Remove `workspace.mode` and `workspace.path` from committed eval YAML.
46
+ Use `--workspace-path` or `.agentv/config.local.yaml` for local static
47
+ directories.
48
+ 13. Move lifecycle hooks to top-level `extensions`.
49
+ 14. Put reset policy and portable testbed setup under `environment`; keep
50
+ provider environment overrides under top-level `env`.
51
+ 15. Replace authored `preprocessors` and deprecated Promptfoo `postprocess`
52
+ with `transform` at `default_test.options`, `tests[].options`, or the
53
+ assertion that needs the shaped output.
54
+ 16. Keep raw cases under `tests` / `tests: file://...`; run full eval suites
55
+ directly with CLI multi-file selection and tags.
56
+ 17. Validate with `bun apps/cli/src/cli.ts validate <eval-file>`.
57
+
58
+ ## Assertions Renamed To `assert`
59
+
60
+ ### v4.42.4 Shape
61
+
62
+ v4.42.4 docs and schema used `assertions` for suite-level and per-test graders:
63
+
64
+ ```yaml
65
+ assertions:
66
+ - name: correctness
67
+ type: llm-grader
68
+ prompt: ./graders/correctness.md
69
+
70
+ tests:
71
+ - id: addition
72
+ criteria: Correctly calculates 15 + 27 = 42
73
+ input: What is 15 + 27?
74
+ expected_output: "42"
75
+ assertions:
76
+ - type: contains
77
+ value: "42"
78
+ ```
79
+
80
+ v4.42.4 also accepted `execution.assertions`, `execution.evaluators`, and
81
+ case-level `evaluators` as legacy grader lists.
82
+
83
+ ### Current Shape
84
+
85
+ Current eval YAML uses `assert`:
86
+
87
+ ```yaml
88
+ assert:
89
+ - name: correctness
90
+ type: llm-rubric
91
+ prompt: ./graders/correctness.md
92
+
93
+ tests:
94
+ - id: addition
95
+ input: What is 15 + 27?
96
+ expected_output: "42"
97
+ assert:
98
+ - type: contains
99
+ value: "42"
100
+ - Correctly calculates the answer
101
+ ```
102
+
103
+ Current `EvalFileSchema` has top-level `assert` and test-level `assert`; it
104
+ does not define top-level or test-level `assertions`. Current parser code reads
105
+ case `assert` and `execution.assert`; assertion template files are expected to
106
+ contain top-level `assert`.
107
+
108
+ ### Migration Steps
109
+
110
+ - Rename top-level `assertions:` to `assert:`.
111
+ - Rename every test-level `assertions:` to `assert:`.
112
+ - Rename conversation turn `assertions:` to `assert:`.
113
+ - Rename assertion template files from:
114
+
115
+ ```yaml
116
+ assertions:
117
+ - type: is-json
118
+ ```
119
+
120
+ to:
121
+
122
+ ```yaml
123
+ assert:
124
+ - type: is-json
125
+ ```
126
+
127
+ - Replace `evaluators:` with `assert:`.
128
+ - If a test had `execution.skip_defaults: true`, keep it; that flag still
129
+ controls whether suite-level defaults are appended.
130
+
131
+ ### Verification
132
+
133
+ ```bash
134
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
135
+ rg -n "assertions:|evaluators:" path/to/evals path/to/.agentv/templates
136
+ ```
137
+
138
+ ### Compatibility Notes
139
+
140
+ Result artifacts and grader stdout still contain `assertions` arrays. Do not
141
+ rename result JSON or script-grader output fields to `assert`; this migration is
142
+ for authored eval YAML and assertion template YAML.
143
+
144
+ `criteria` remains a valid optional case field, but it is no longer the
145
+ preferred way to express the whole semantic contract. Put actual grading checks
146
+ in `assert`, usually as plain strings.
147
+
148
+ ## `criteria` Is Optional, Reference Answers Live In Vars
149
+
150
+ ### v4.42.4 Shape
151
+
152
+ v4.42.4 docs treated `criteria` as required. Older AgentV YAML also allowed
153
+ `expected_output` as a sibling field on test cases:
154
+
155
+ ```yaml
156
+ tests:
157
+ - id: simple-eval
158
+ criteria: Assistant correctly explains the bug and proposes a fix
159
+ input: "Debug this function..."
160
+ expected_output: The answer explains the root cause and fix.
161
+ ```
162
+
163
+ ### Current Shape
164
+
165
+ Current docs and schema make `criteria` optional. Authored graders live under
166
+ `assert`. Plain strings in `assert` become an `llm-rubric` check.
167
+ Promptfoo-aligned reference answers live in `vars.expected_output`, and only
168
+ affect grading when an explicit assertion consumes them.
169
+
170
+ ```yaml
171
+ default_test:
172
+ assert:
173
+ - type: llm-rubric
174
+ value: "Matches the reference answer: {{ expected_output }}"
175
+ prompts:
176
+ - "{{ input }}"
177
+ tests:
178
+ - id: simple-eval
179
+ vars:
180
+ input: "Debug this function..."
181
+ expected_output: The answer explains the root cause and fix.
182
+ ```
183
+
184
+ ### Migration Steps
185
+
186
+ - If old `criteria` is the only grading contract, move or copy it into
187
+ `assert` as one or more plain strings.
188
+ - Keep `criteria` only when multiple graders need shared context that is not
189
+ itself the asserted checklist.
190
+ - Move `tests[].expected_output` or `default_test.expected_output` to
191
+ `vars.expected_output`.
192
+ - Add or keep an explicit assertion strategy. Use `llm-rubric` with
193
+ `{{ expected_output }}` for semantic reference-answer checks, or deterministic
194
+ assertion `value: "{{ expected_output }}"` when the grader type compares a
195
+ concrete value.
196
+
197
+ ### Verification
198
+
199
+ ```bash
200
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
201
+ rg -n "expected_output:" path/to/evals
202
+ ```
203
+
204
+ For any remaining `criteria`, confirm it is shared grader context and not a
205
+ duplicate of `assert`.
206
+
207
+ ### Compatibility Notes
208
+
209
+ Current runtime still carries `EvalTest.criteria` internally because prompt
210
+ templates and custom graders can consume it. The breaking authoring change is
211
+ that workers should not depend on missing `assert` plus `criteria` to define
212
+ the whole grading contract for new migrated YAML.
213
+
214
+ ## Authored `input` Moved To `prompts` Plus Vars
215
+
216
+ ### v4.42.4 Shape
217
+
218
+ Older AgentV eval YAML allowed top-level `input` and inline `tests[].input` as
219
+ the public task authoring surface:
220
+
221
+ ```yaml
222
+ input: Read AGENTS.md before answering.
223
+
224
+ tests:
225
+ - id: addition
226
+ input: What is 15 + 27?
227
+ assert:
228
+ - type: contains
229
+ value: "42"
230
+ ```
231
+
232
+ ### Current Shape
233
+
234
+ Current normal eval YAML uses top-level `prompts` rendered with
235
+ `default_test.vars` and `tests[].vars`:
236
+
237
+ ```yaml
238
+ prompts:
239
+ - - role: system
240
+ content: "{{ system_instruction }}"
241
+ - role: user
242
+ content: "{{ question }}"
243
+
244
+ default_test:
245
+ vars:
246
+ system_instruction: Read AGENTS.md before answering.
247
+
248
+ tests:
249
+ - id: addition
250
+ vars:
251
+ question: What is 15 + 27?
252
+ assert:
253
+ - type: contains
254
+ value: "42"
255
+ ```
256
+
257
+ ### Migration Steps
258
+
259
+ - Replace simple top-level `input: <text>` with a prompt entry or
260
+ `default_test.vars.system_instruction` rendered from a chat prompt.
261
+ - Replace simple `tests[].input: <text>` with `tests[].vars.input: <text>` and
262
+ a top-level prompt such as `"{{ input }}"` or `"{{ vars.input }}"`.
263
+ - Replace message-array input with a top-level chat prompt entry. Move any
264
+ per-row values into `tests[].vars` and render them from the message content.
265
+ - Replace `input_files` plus string input with a chat prompt content array that
266
+ contains `{type: file, value: "{{ file_path }}"}` and a text block. Store file
267
+ paths in `default_test.vars` or `tests[].vars`.
268
+ - Keep `input` only in external raw-case files imported through
269
+ `tests: file://...` when preserving existing raw datasets.
270
+ Do not copy that compatibility shape back into normal eval YAML.
271
+
272
+ ### Verification
273
+
274
+ ```bash
275
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
276
+ rg -n "^[[:space:]]*input:|input_files:" path/to/evals
277
+ ```
278
+
279
+ ### Compatibility Notes
280
+
281
+ The runtime `EvalTest.input` representation remains internal after prompts are
282
+ rendered. External raw-case loaders may still ingest `input` rows for imported
283
+ datasets, but authored eval YAML now hard-errors on top-level `input` and inline
284
+ `tests[].input`.
285
+
286
+ ## Top-Level `execution` Removed From Eval YAML
287
+
288
+ ### v4.42.4 Shape
289
+
290
+ v4.42.4 docs used top-level `execution` for target selection, workers, error
291
+ tolerance, thresholds, budgets, trials, and suite-level graders:
292
+
293
+ ```yaml
294
+ execution:
295
+ target: azure-base
296
+ workers: 4
297
+ fail_on_error: false
298
+ threshold: 0.8
299
+ budget_usd: 2.00
300
+ trials:
301
+ count: 3
302
+ strategy: pass_at_k
303
+
304
+ assertions:
305
+ - type: contains
306
+ value: READY
307
+ ```
308
+
309
+ ### Current Shape
310
+
311
+ Current eval YAML rejects top-level `execution`. Move run controls to their
312
+ dedicated fields:
313
+
314
+ ```yaml
315
+ target: azure-base
316
+ threshold: 0.8
317
+ evaluate_options:
318
+ max_concurrency: 4
319
+ budget_usd: 2.00
320
+ repeat:
321
+ count: 3
322
+ strategy: pass_any
323
+
324
+ assert:
325
+ - type: contains
326
+ value: READY
327
+ ```
328
+
329
+ ### Migration Steps
330
+
331
+ - `execution.target` -> top-level `target`.
332
+ - `execution.targets` -> top-level `targets`.
333
+ - `execution.threshold` -> top-level `threshold`.
334
+ - `execution.budget_usd` -> `evaluate_options.budget_usd`.
335
+ - `execution.workers` and `execution.max_concurrency` ->
336
+ `evaluate_options.max_concurrency` when authored suite concurrency is part of
337
+ the eval. If it is operator policy, use `--workers` or `.agentv/config.yaml`
338
+ / `agentv.config.*` `execution.max_concurrency` instead.
339
+ - `execution.fail_on_error` has no current eval-YAML home. Treat it as
340
+ operational policy; do not commit it into migrated eval YAML.
341
+ - `execution.cache` has no current eval-YAML home. Use project/operator config
342
+ if cache policy is needed.
343
+ - Delete top-level `execution` after moving supported fields.
344
+
345
+ ### Verification
346
+
347
+ ```bash
348
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
349
+ rg -n "^execution:|fail_on_error:|cache:" path/to/evals
350
+ ```
351
+
352
+ ### Compatibility Notes
353
+
354
+ Per-test `execution` still exists, but it is narrow: current schema allows
355
+ case-level `execution.assert`, `skip_defaults`, cache/fail fields, budget, and
356
+ threshold, while target selection belongs at top level or CLI. Do not keep
357
+ target selection under `tests[].execution.target` when migrating.
358
+
359
+ ## Repeat Policy Replaces `trials`, `runs`, And `early_exit`
360
+
361
+ ### v4.42.4 Shape
362
+
363
+ v4.42.4 used `execution.trials` with strategies such as `pass_at_k`:
364
+
365
+ ```yaml
366
+ execution:
367
+ trials:
368
+ count: 3
369
+ strategy: pass_at_k
370
+ cost_limit_usd: 1.00
371
+ ```
372
+
373
+ Some stale evals from later intermediate branches may instead have top-level
374
+ `runs`, `repeat`, or `early_exit`.
375
+
376
+ ### Current Shape
377
+
378
+ Current authoring uses `evaluate_options.repeat`:
379
+
380
+ ```yaml
381
+ evaluate_options:
382
+ repeat:
383
+ count: 3
384
+ strategy: pass_any
385
+ early_exit: true
386
+ cost_limit_usd: 1.00
387
+ ```
388
+
389
+ The shorthand is also accepted:
390
+
391
+ ```yaml
392
+ evaluate_options:
393
+ repeat: 3
394
+ ```
395
+
396
+ ### Migration Steps
397
+
398
+ - `execution.trials.count` -> `evaluate_options.repeat.count`.
399
+ - `execution.trials.strategy: pass_at_k` -> `pass_any`.
400
+ - `execution.trials.strategy: mean` -> `mean`.
401
+ - `execution.trials.strategy: confidence_interval` -> `confidence_interval`.
402
+ - `execution.trials.cost_limit_usd` -> `evaluate_options.repeat.cost_limit_usd`.
403
+ - Top-level `runs` -> `evaluate_options.repeat.count`.
404
+ - Top-level `repeat` -> `evaluate_options.repeat`.
405
+ - Top-level `early_exit` -> `evaluate_options.repeat.early_exit`.
406
+
407
+ ### Verification
408
+
409
+ ```bash
410
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
411
+ rg -n "trials:|pass_at_k|^runs:|^repeat:|^early_exit:" path/to/evals
412
+ ```
413
+
414
+ ### Compatibility Notes
415
+
416
+ Runtime types and some result artifacts still use the internal word `trials`.
417
+ Authored YAML should use `repeat`; produced executions are attempts.
418
+
419
+ ## `experiment` Is A Label, Not A Runtime Container
420
+
421
+ ### v4.42.4 Shape
422
+
423
+ v4.42.4 public eval docs did not use a top-level `experiment` object for eval
424
+ runtime policy; runtime policy lived mostly under top-level `execution`. Some
425
+ stale evals from later development snapshots may have an object like:
426
+
427
+ ```yaml
428
+ experiment:
429
+ target: codex
430
+ model: gpt-5
431
+ runs: 3
432
+ timeout_seconds: 600
433
+ ```
434
+
435
+ ### Current Shape
436
+
437
+ Current schema accepts top-level `experiment` only as a non-empty string run
438
+ grouping label. Current docs also support promptfoo-shaped `tags.experiment`.
439
+
440
+ ```yaml
441
+ experiment: with-skills
442
+ target: codex
443
+ timeout_seconds: 600
444
+ evaluate_options:
445
+ repeat:
446
+ count: 3
447
+ strategy: pass_any
448
+ ```
449
+
450
+ or:
451
+
452
+ ```yaml
453
+ tags:
454
+ experiment: with-skills
455
+ target: codex
456
+ ```
457
+
458
+ ### Migration Steps
459
+
460
+ - If `experiment` is an object, move runtime fields out:
461
+ - target identity -> top-level `target` or `targets`
462
+ - repeat/runs -> `evaluate_options.repeat`
463
+ - budget -> `evaluate_options.budget_usd`
464
+ - timeout -> top-level `timeout_seconds`
465
+ - threshold -> top-level `threshold`
466
+ - Keep only a string label in `experiment`, or use `tags.experiment`.
467
+
468
+ ### Verification
469
+
470
+ ```bash
471
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
472
+ rg -n "^experiment:" path/to/evals
473
+ ```
474
+
475
+ ### Compatibility Notes
476
+
477
+ Do not describe a v4.42.4 eval as if `experiment:` was already the main runtime
478
+ object unless you verified that exact file or commit. For v4.42.4 migrations,
479
+ the common source shape is `execution:`.
480
+
481
+ ## Workspace Lifetime: `isolation` To `scope`
482
+
483
+ ### v4.42.4 Shape
484
+
485
+ v4.42.4 workspace docs used `isolation`:
486
+
487
+ ```yaml
488
+ workspace:
489
+ repos:
490
+ - path: ./repo
491
+ repo: org/repo
492
+ commit: main
493
+ hooks:
494
+ after_each:
495
+ reset: fast
496
+ isolation: shared # shared | per_test
497
+ ```
498
+
499
+ ### Current Shape
500
+
501
+ Current workspace docs and schema use `scope`:
502
+
503
+ ```yaml
504
+ workspace:
505
+ repos:
506
+ - path: ./repo
507
+ repo: org/repo
508
+ commit: main
509
+ hooks:
510
+ after_each:
511
+ reset: fast
512
+ scope: suite # suite | attempt
513
+ ```
514
+
515
+ ### Migration Steps
516
+
517
+ - `workspace.isolation: shared` -> `workspace.scope: suite`.
518
+ - `workspace.isolation: per_test` -> `workspace.scope: attempt`.
519
+ - If `isolation` is omitted, preserve behavior by omitting `scope` or setting
520
+ `scope: suite`.
521
+
522
+ ### Verification
523
+
524
+ ```bash
525
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
526
+ rg -n "isolation:" path/to/evals
527
+ ```
528
+
529
+ ### Compatibility Notes
530
+
531
+ `scope: attempt` means a clean workspace for each resolved execution attempt:
532
+ prompt/target/test/repeat expansion. Docker configuration does not replace
533
+ workspace lifetime; use `workspace.scope` even when `workspace.docker` exists.
534
+
535
+ ## Local Workspace Modes Removed From Eval YAML
536
+
537
+ ### v4.42.4 Shape
538
+
539
+ v4.42.4 workspace docs allowed `mode` and `path`:
540
+
541
+ ```yaml
542
+ workspace:
543
+ mode: static # pooled | temp | static
544
+ path: /tmp/my-ws
545
+ ```
546
+
547
+ ### Current Shape
548
+
549
+ Current committed eval YAML must keep portable workspace setup under
550
+ `workspace` and put machine-local existing directories outside the eval:
551
+
552
+ ```yaml
553
+ workspace:
554
+ repos:
555
+ - path: ./repo
556
+ repo: org/repo
557
+ commit: main
558
+ scope: suite
559
+ ```
560
+
561
+ One-off local binding:
562
+
563
+ ```bash
564
+ bun apps/cli/src/cli.ts eval path/to/eval.eval.yaml --workspace-path /tmp/my-ws
565
+ ```
566
+
567
+ Persistent local binding:
568
+
569
+ ```yaml
570
+ # .agentv/config.local.yaml
571
+ execution:
572
+ workspace_path: /tmp/my-ws
573
+ ```
574
+
575
+ ### Migration Steps
576
+
577
+ - Remove `workspace.mode`.
578
+ - Remove `workspace.path`, `workspace.static_path`, `workspace.static`, and
579
+ `workspace.pool` if present.
580
+ - Convert portable setup to `workspace.template`, `workspace.repos`,
581
+ `workspace.hooks.after_each.reset`, `workspace.env`, and `workspace.scope`.
582
+ - Put existing local paths in `--workspace-path` or `.agentv/config.local.yaml`.
583
+
584
+ ### Verification
585
+
586
+ ```bash
587
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
588
+ rg -n "workspace:|mode:|path:|static_path:|pool:" path/to/evals
589
+ ```
590
+
591
+ Inspect matches manually because `repos[].path` is still valid.
592
+
593
+ ### Compatibility Notes
594
+
595
+ Current project config intentionally strips `execution.workspace_path` from
596
+ committed `.agentv/config.yaml`; it is only supported in `config.local.yaml`.
597
+
598
+ ## Workspace Hooks And Lifecycle Extensions
599
+
600
+ ### v4.42.4 Shape
601
+
602
+ v4.42.4 workspace hooks allowed `command` and `script` fields, and docs used
603
+ workspace hooks for executable setup:
604
+
605
+ ```yaml
606
+ workspace:
607
+ hooks:
608
+ before_all:
609
+ script: ["bun", "run", "setup.ts"]
610
+ after_each:
611
+ command: ["bun", "run", "reset.ts"]
612
+ reset: fast
613
+ ```
614
+
615
+ ### Current Shape
616
+
617
+ Current hook configs reject `script`; use `command`. Current docs prefer
618
+ top-level `extensions` for executable setup and keep
619
+ `workspace.hooks.after_each.reset` for reset policy:
620
+
621
+ ```yaml
622
+ extensions:
623
+ - file://scripts/setup.mjs:beforeAll
624
+
625
+ workspace:
626
+ hooks:
627
+ after_each:
628
+ reset: fast
629
+ ```
630
+
631
+ Legacy command hooks still parse for existing suites when they use `command`:
632
+
633
+ ```yaml
634
+ workspace:
635
+ hooks:
636
+ before_all:
637
+ command: ["bun", "run", "setup.ts"]
638
+ ```
639
+
640
+ ### Migration Steps
641
+
642
+ - Rename any hook `script:` field to `command:`.
643
+ - Prefer moving setup/fixture/build/install commands to top-level
644
+ `extensions`.
645
+ - Keep `workspace.hooks.after_each.reset` for `none`, `fast`, or `strict`.
646
+ - Extension file references must use `file://path/to/hook.ts:beforeAll` style
647
+ and a Promptfoo-compatible hook name: `beforeAll`, `beforeEach`,
648
+ `afterEach`, or `afterAll`.
649
+
650
+ ### Verification
651
+
652
+ ```bash
653
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
654
+ rg -n "script:|extensions:" path/to/evals
655
+ ```
656
+
657
+ ### Compatibility Notes
658
+
659
+ `workspace.hooks` and `target.hooks` use snake_case lifecycle keys such as
660
+ `before_all`; top-level `extensions` use Promptfoo-compatible camel-case hook
661
+ suffixes in `file://...:beforeAll`.
662
+
663
+ ## Repository Entries Are Provenance Only
664
+
665
+ ### v4.42.4 Shape
666
+
667
+ v4.42.4 documented `workspace.repos[].repo`, `commit`, `base_commit`,
668
+ `ancestor`, and `sparse` as repo provenance. Treat `base_commit` as a legacy
669
+ authoring alias during migration; normalize it to `commit` instead of carrying
670
+ it forward. The v4.42.4 parser rejected some acquisition fields such as
671
+ `source`, `checkout`, and `clone`.
672
+
673
+ ### Current Shape
674
+
675
+ Current parser continues to keep acquisition out of eval YAML and additionally
676
+ rejects `type`, `resolve`, and `resolver`:
677
+
678
+ ```yaml
679
+ workspace:
680
+ repos:
681
+ - path: ./repo
682
+ repo: org/repo
683
+ commit: abc123def
684
+ ancestor: 1
685
+ sparse:
686
+ - packages/core
687
+ ```
688
+
689
+ ### Migration Steps
690
+
691
+ - `workspace.repos[].source` -> `workspace.repos[].repo`.
692
+ - `workspace.repos[].checkout.ref` or similar -> `commit`.
693
+ - `workspace.repos[].base_commit` -> `commit`.
694
+ - `workspace.repos[].clone.sparse` -> top-level `sparse`.
695
+ - Remove `type`, `resolve`, and `resolver` from repo entries.
696
+ - Configure acquisition policy in repo resolver/project config, not in eval
697
+ YAML.
698
+
699
+ ### Verification
700
+
701
+ ```bash
702
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
703
+ rg -n "source:|checkout:|clone:|base_commit:|type:|resolve:|resolver:" path/to/evals
704
+ ```
705
+
706
+ Inspect `type:` matches manually because grader entries still use `type`.
707
+
708
+ ### Compatibility Notes
709
+
710
+ `repos[].path` remains valid and means the target directory inside the
711
+ materialized workspace. It is not the removed local `workspace.path`.
712
+ Current eval YAML accepts a single checkout pin field, `commit`, so workers
713
+ should not preserve a second spelling in examples or generated evals.
714
+
715
+ ## Target And Runtime Separation
716
+
717
+ ### v4.42.4 Shape
718
+
719
+ v4.42.4 docs selected targets under `execution` and used `name` in target
720
+ objects:
721
+
722
+ ```yaml
723
+ execution:
724
+ target: azure-base
725
+ targets:
726
+ - baseline
727
+ - name: with-skills
728
+ use_target: default
729
+ hooks:
730
+ before_each:
731
+ command: ["setup-plugins.sh", "skills"]
732
+ ```
733
+
734
+ v4.42.4 `.agentv/targets.yaml` examples also used `name` and provider settings
735
+ as top-level target fields:
736
+
737
+ ```yaml
738
+ targets:
739
+ - name: azure-base
740
+ provider: azure
741
+ endpoint: ${{ AZURE_OPENAI_ENDPOINT }}
742
+ api_key: ${{ AZURE_OPENAI_API_KEY }}
743
+ model: ${{ AZURE_DEPLOYMENT_NAME }}
744
+ ```
745
+
746
+ ### Current Shape
747
+
748
+ Current eval YAML uses top-level `target` or `targets`. Target references use
749
+ `label`; `id` is reserved for provider/backend identity when needed:
750
+
751
+ ```yaml
752
+ target: azure-base
753
+
754
+ targets:
755
+ - label: with-skills
756
+ use_target: default
757
+ hooks:
758
+ before_each:
759
+ command: ["setup-plugins.sh", "skills"]
760
+ ```
761
+
762
+ Current `.agentv/targets.yaml` uses `label` and nests provider settings under
763
+ `config`:
764
+
765
+ ```yaml
766
+ targets:
767
+ - label: azure-base
768
+ provider: azure
769
+ config:
770
+ endpoint: ${{ AZURE_OPENAI_ENDPOINT }}
771
+ api_key: ${{ AZURE_OPENAI_API_KEY }}
772
+ model: ${{ AZURE_DEPLOYMENT_NAME }}
773
+ ```
774
+
775
+ ### Migration Steps
776
+
777
+ - Eval YAML: `execution.target` -> top-level `target`.
778
+ - Eval YAML: `execution.targets` -> top-level `targets`.
779
+ - Eval target object `name` -> `label`.
780
+ - If an eval-local target object has provider configuration, include a
781
+ `label`; use `extends` to derive from a base target.
782
+ - Targets file: rename `name` to `label` and move provider-specific settings
783
+ into `config`.
784
+ - Keep AgentV target extensions such as `grader_target`, `use_target`,
785
+ `fallback_targets`, `workers`, and `batch_requests` as top-level fields on
786
+ target objects.
787
+
788
+ ### Verification
789
+
790
+ ```bash
791
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
792
+ bun apps/cli/src/cli.ts validate .agentv/targets.yaml
793
+ rg -n "execution:|name:|endpoint:|api_key:|model:" path/to/evals .agentv/targets.yaml
794
+ ```
795
+
796
+ Inspect `name:` matches manually because grader names still exist.
797
+
798
+ ### Compatibility Notes
799
+
800
+ Do not put target selection in test cases when migrating. Split
801
+ target-specific cases into separate eval suites, use tags/filters, or run the
802
+ same eval with different `--target` values.
803
+
804
+ ## Grader Type And Rubric Shape Changes
805
+
806
+ ### v4.42.4 Shape
807
+
808
+ v4.42.4 docs used:
809
+
810
+ ```yaml
811
+ assertions:
812
+ - type: rubrics
813
+ criteria:
814
+ - id: accuracy
815
+ outcome: Correctly identifies the denied party
816
+ weight: 5
817
+
818
+ - type: code-grader
819
+ command: ["python", "check.py"]
820
+ ```
821
+
822
+ v4.42.4 accepted snake_case grader types such as `is_json`.
823
+
824
+ ### Current Shape
825
+
826
+ Current authored grader types are kebab-case. Semantic rubric grading uses
827
+ plain assertion strings or `llm-rubric`:
828
+
829
+ ```yaml
830
+ assert:
831
+ - type: llm-rubric
832
+ value:
833
+ - id: accuracy
834
+ outcome: Correctly identifies the denied party
835
+ weight: 5
836
+
837
+ - type: script
838
+ command: ["python", "check.py"]
839
+ ```
840
+
841
+ ### Migration Steps
842
+
843
+ - `type: rubrics` or `type: rubric` -> `type: llm-rubric`.
844
+ - `criteria:` / `rubrics:` / `rubric_item:` under `llm-rubric` ->
845
+ `value:`.
846
+ - `type: g-eval` -> `type: llm-rubric`.
847
+ - `type: code-grader`, `code-judge`, `code_grader`, or `code_judge` ->
848
+ `type: script`.
849
+ - `type: llm_judge` or `llm_grader` -> `type: llm-grader`.
850
+ - Convert multi-word snake_case deterministic types to kebab-case:
851
+ `is_json` -> `is-json`, `contains_all` -> `contains-all`,
852
+ `starts_with` -> `starts-with`, and so on.
853
+
854
+ ### Verification
855
+
856
+ ```bash
857
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
858
+ rg -n "type: (rubrics|rubric|g-eval|code-grader|code-judge|code_grader|code_judge|llm_judge|llm_grader|.*_.*)" path/to/evals
859
+ ```
860
+
861
+ ### Compatibility Notes
862
+
863
+ Current `grader-parser.ts` contains replacement hints for several removed type
864
+ names, but current schema and generated references are stricter than v4.42.4.
865
+ Migrate authored YAML instead of relying on parser leniency.
866
+
867
+ Script grader output still returns JSON with an `assertions` array; do not
868
+ rename grader output to `assert`.
869
+
870
+ ## Prompt File Paths And `file://`
871
+
872
+ ### v4.42.4 Shape
873
+
874
+ v4.42.4 LLM grader docs allowed both:
875
+
876
+ ```yaml
877
+ assertions:
878
+ - type: llm-grader
879
+ prompt: ./graders/correctness.md
880
+ - type: llm-grader
881
+ prompt: file://graders/correctness.md
882
+ ```
883
+
884
+ ### Current Shape
885
+
886
+ Current LLM grader docs keep the same prompt path behavior:
887
+
888
+ ```yaml
889
+ assert:
890
+ - type: llm-rubric
891
+ prompt: ./graders/correctness.md
892
+ - type: llm-rubric
893
+ prompt: file://graders/correctness.md
894
+ ```
895
+
896
+ Other current file-reference surfaces are stricter:
897
+
898
+ ```yaml
899
+ extensions:
900
+ - file://scripts/setup.mjs:beforeAll
901
+
902
+ default_test: file://defaults.yaml
903
+
904
+ tests:
905
+ - file://cases.yaml
906
+ ```
907
+
908
+ ### Migration Steps
909
+
910
+ - Do not add `file://` to ordinary `prompt: ./path.md` only for migration; the
911
+ current prompt resolver still treats path-like strings as file references.
912
+ - Keep `file://` when you need explicit file-reference resolution.
913
+ - Add `file://` for top-level `extensions` entries.
914
+ - Use `file://` or `ref://` for `default_test` string references.
915
+ - In `tests` arrays, use `file://...` for file include entries. A top-level
916
+ `tests: ./cases.yaml` string remains accepted for raw case files.
917
+
918
+ ### Verification
919
+
920
+ ```bash
921
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
922
+ rg -n "prompt:|extensions:|default_test:|file://" path/to/evals
923
+ ```
924
+
925
+ ### Compatibility Notes
926
+
927
+ This is partly a non-breaking area: v4.42.4 and current docs both allow
928
+ relative prompt paths. The breaking part is the newer surfaces that require
929
+ `file://`, especially `extensions`.
930
+
931
+ ## Imports, Raw Cases, And Suite Ownership
932
+
933
+ ### v4.42.4 Shape
934
+
935
+ v4.42.4 eval files used `tests` for inline cases or external raw case files:
936
+
937
+ ```yaml
938
+ name: my-eval
939
+ execution:
940
+ target: default
941
+ tests: ./cases.yaml
942
+ ```
943
+
944
+ The external file contained raw case rows.
945
+
946
+ ### Current Shape
947
+
948
+ Current eval YAML accepts inline `tests`, `tests: ./cases.yaml`, and field-local
949
+ file refs for raw case data. Run multiple full eval suites directly with CLI
950
+ selection and tags:
951
+
952
+ ```yaml
953
+ prompts: file://../prompts/refund.yaml
954
+ default_test: file://../defaults/refund.yaml
955
+ tests:
956
+ - file://../cases/refund-smoke.cases.yaml
957
+ - id: local-edge-case
958
+ vars:
959
+ question: Can a final-sale item be refunded after damage in transit?
960
+ assert:
961
+ - Explains the final-sale exception
962
+ ```
963
+
964
+ ### Migration Steps
965
+
966
+ - Keep `tests: ./cases.yaml` when the file is a raw case array, JSONL, CSV,
967
+ directory, glob, or script-backed dataset.
968
+ - Use `tests: file://...` or string entries inside `tests` for raw rows that run
969
+ in the parent suite context.
970
+ - Run full eval suites directly with CLI multi-file selection and tags. Do not
971
+ add wrapper-suite import semantics.
972
+ - Use `prompts: file://...`, `default_test: file://...`, and
973
+ `environment: file://...` to share reusable config locally at the field that
974
+ consumes it.
975
+ - Use `run:` on individual tests only for scoped overrides: `threshold`,
976
+ `repeat`, `timeout_seconds`, and `budget_usd`.
977
+
978
+ ### Verification
979
+
980
+ ```bash
981
+ bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
982
+ rg -n "include:|tests:" path/to/evals
983
+ ```
984
+
985
+ ### Compatibility Notes
986
+
987
+ `eval_cases` remains a deprecated alias in the current schema, but migrated
988
+ YAML should use `tests`. The current convention is that runnable suites use
989
+ `*.eval.yaml`; reusable raw case files commonly use `*.cases.yaml` or JSONL.
990
+
991
+ ## Result Artifact Path Changes Are Not Eval YAML Migrations
992
+
993
+ v4.42.4 docs described local run workspaces under
994
+ `.agentv/results/runs/<experiment>/<run-id>/`. Current docs describe v2 run
995
+ workspaces under `.agentv/results/<run_id>/`, with experiment metadata stored
996
+ in `summary.json` / rows rather than inferred from the path.
997
+
998
+ Within each run bundle, the per-run index is `.internal/index.jsonl` and
999
+ `summary.json` points to it with `index_path`. Per-sample execution folders are
1000
+ named `sample-N`; use row fields such as `sample_index` and `retry_index` for
1001
+ semantics. New writers emit `metrics.json` for duration, tokens, cost,
1002
+ execution, and trajectory data; they do not emit `timing.json`, `timing_path`,
1003
+ or nested `metrics.timing`.
1004
+
1005
+ Do not edit eval YAML just to chase result artifact path changes. Migrate only
1006
+ authored fields that the eval parser reads. Use:
1007
+
1008
+ ```bash
1009
+ bun apps/cli/src/cli.ts results validate path/to/run-dir
1010
+ ```
1011
+
1012
+ for existing run artifacts.