@openwop/openwop-conformance 2.46.26 → 2.46.28

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.
package/requirements.json CHANGED
@@ -2,11 +2,11 @@
2
2
  "$comment": "GENERATED by conformance/scripts/generate-requirement-registry.mjs — do not edit. One record per it()/test() in src/scenarios. Ids: openwop.it.<file-stem>.<title-slug>[~n] (src/lib/requirement-ids.ts). A record with id null has an interpolated title; its run-time row is keyed by the rendered title and maps here by file+line only. Renamed ids need a row in requirement-aliases.json.",
3
3
  "generatedFrom": "src/scenarios/*.test.ts",
4
4
  "counts": {
5
- "files": 749,
6
- "tests": 2846,
7
- "withStableId": 2846,
5
+ "files": 750,
6
+ "tests": 2855,
7
+ "withStableId": 2855,
8
8
  "interpolatedTitles": 0,
9
- "explicitIds": 2719
9
+ "explicitIds": 2728
10
10
  },
11
11
  "records": [
12
12
  {
@@ -31089,10 +31089,87 @@
31089
31089
  }
31090
31090
  ]
31091
31091
  },
31092
+ {
31093
+ "id": "openwop.it.v2-eval-regression-baseline.the-baselineselection-member-and-the-createrun-eval-properties-are-in-the-derive",
31094
+ "file": "v2-eval-regression-baseline.test.ts",
31095
+ "line": 131,
31096
+ "title": "the baselineSelection member and the createRun eval properties are in the derived contract",
31097
+ "explicitId": "openwop.requirement.0251.shape",
31098
+ "citations": [
31099
+ {
31100
+ "section": "agents.schema.json §evalSuite.baselineSelection, createRun evalModes / baselineRunId (RFC 0251)",
31101
+ "requirement": "baselineSelection: true MUST validate"
31102
+ },
31103
+ {
31104
+ "section": "agents.schema.json §evalSuite.baselineSelection, createRun evalModes / baselineRunId (RFC 0251)",
31105
+ "requirement": "baselineSelection MUST be a boolean"
31106
+ },
31107
+ {
31108
+ "section": "agents.schema.json §evalSuite.baselineSelection, createRun evalModes / baselineRunId (RFC 0251)",
31109
+ "requirement": "createRun MUST carry evalModes over the RFC 0081 §D modes"
31110
+ },
31111
+ {
31112
+ "section": "agents.schema.json §evalSuite.baselineSelection, createRun evalModes / baselineRunId (RFC 0251)",
31113
+ "requirement": "evalModes MUST be non-empty and distinct"
31114
+ },
31115
+ {
31116
+ "section": "agents.schema.json §evalSuite.baselineSelection, createRun evalModes / baselineRunId (RFC 0251)",
31117
+ "requirement": "createRun MUST carry baselineRunId as a runId"
31118
+ }
31119
+ ]
31120
+ },
31121
+ {
31122
+ "id": "openwop.it.v2-eval-regression-baseline.the-candidate-run-names-the-baseline-it-was-given-and-scoredelta-is-the-aggregat",
31123
+ "file": "v2-eval-regression-baseline.test.ts",
31124
+ "line": 146,
31125
+ "title": "the candidate run names the baseline it was given, and scoreDelta is the aggregate difference",
31126
+ "explicitId": "openwop.requirement.0251.baseline-echoed",
31127
+ "citations": []
31128
+ },
31129
+ {
31130
+ "id": "openwop.it.v2-eval-regression-baseline.only-the-tasks-in-both-runs-are-paired-rfc-0244-f",
31131
+ "file": "v2-eval-regression-baseline.test.ts",
31132
+ "line": 154,
31133
+ "title": "only the tasks in both runs are paired (RFC 0244 §F)",
31134
+ "explicitId": "openwop.requirement.0244.regression-paired",
31135
+ "citations": []
31136
+ },
31137
+ {
31138
+ "id": "openwop.it.v2-eval-regression-baseline.equal-paired-scores-never-yield-improved-or-regressed-rfc-0244-f",
31139
+ "file": "v2-eval-regression-baseline.test.ts",
31140
+ "line": 163,
31141
+ "title": "equal paired scores never yield improved or regressed (RFC 0244 §F)",
31142
+ "explicitId": "openwop.requirement.0244.regression-no-false-verdict",
31143
+ "citations": []
31144
+ },
31145
+ {
31146
+ "id": "openwop.it.v2-eval-regression-baseline.an-unknown-baseline-and-a-run-of-another-suite-are-refused-without-the-id",
31147
+ "file": "v2-eval-regression-baseline.test.ts",
31148
+ "line": 172,
31149
+ "title": "an unknown baseline, and a run of another suite, are refused without the id",
31150
+ "explicitId": "openwop.requirement.0251.baseline-refused",
31151
+ "citations": []
31152
+ },
31153
+ {
31154
+ "id": "openwop.it.v2-eval-regression-baseline.another-tenant-s-run-is-refused-exactly-as-an-id-that-never-existed",
31155
+ "file": "v2-eval-regression-baseline.test.ts",
31156
+ "line": 186,
31157
+ "title": "another tenant's run is refused exactly as an id that never existed",
31158
+ "explicitId": "openwop.requirement.0251.baseline-uniform",
31159
+ "citations": []
31160
+ },
31161
+ {
31162
+ "id": "openwop.it.v2-eval-regression-baseline.a-baseline-without-regression-and-regression-without-a-baseline-are-refused",
31163
+ "file": "v2-eval-regression-baseline.test.ts",
31164
+ "line": 203,
31165
+ "title": "a baseline without regression, and regression without a baseline, are refused",
31166
+ "explicitId": "openwop.requirement.0251.fields-refused",
31167
+ "citations": []
31168
+ },
31092
31169
  {
31093
31170
  "id": "openwop.it.v2-eval-trajectory-trials.the-rfc-0244-suite-summary-and-event-fields-validate-and-the-negatives-are-refus",
31094
31171
  "file": "v2-eval-trajectory-trials.test.ts",
31095
- "line": 196,
31172
+ "line": 211,
31096
31173
  "title": "the RFC 0244 suite, summary and event fields validate and the negatives are refused",
31097
31174
  "explicitId": "openwop.requirement.0244.wire-shape",
31098
31175
  "citations": [
@@ -31131,7 +31208,7 @@
31131
31208
  {
31132
31209
  "id": "openwop.it.v2-eval-trajectory-trials.the-rfc-0244-additions-are-content-free-eval-summary-no-content-leak",
31133
31210
  "file": "v2-eval-trajectory-trials.test.ts",
31134
- "line": 219,
31211
+ "line": 234,
31135
31212
  "title": "the RFC 0244 additions are content-free (eval-summary-no-content-leak)",
31136
31213
  "explicitId": "openwop.requirement.0244.content-free",
31137
31214
  "citations": [
@@ -31148,7 +31225,7 @@
31148
31225
  {
31149
31226
  "id": "openwop.it.v2-eval-trajectory-trials.the-eval-suite-fixtures-validate-against-the-v2-suite-schema",
31150
31227
  "file": "v2-eval-trajectory-trials.test.ts",
31151
- "line": 226,
31228
+ "line": 241,
31152
31229
  "title": "the eval-suite fixtures validate against the v2 suite schema",
31153
31230
  "explicitId": "openwop.requirement.0244.fixtures-valid",
31154
31231
  "citations": [
@@ -31162,7 +31239,7 @@
31162
31239
  {
31163
31240
  "id": "openwop.it.v2-eval-trajectory-trials.the-rfc-0246-gating-fields-validate-and-stay-in-0-1",
31164
31241
  "file": "v2-eval-trajectory-trials.test.ts",
31165
- "line": 233,
31242
+ "line": 248,
31166
31243
  "title": "the RFC 0246 gating fields validate and stay in 0–1",
31167
31244
  "explicitId": "openwop.requirement.0246.gated-fields-shape",
31168
31245
  "citations": [
@@ -31184,7 +31261,7 @@
31184
31261
  {
31185
31262
  "id": "openwop.it.v2-eval-trajectory-trials.a-fixture-entry-may-be-marked-iserror-and-only-as-a-boolean-rfc-0245-a",
31186
31263
  "file": "v2-eval-trajectory-trials.test.ts",
31187
- "line": 241,
31264
+ "line": 256,
31188
31265
  "title": "a fixture entry may be marked isError, and only as a boolean (RFC 0245 §A)",
31189
31266
  "explicitId": "openwop.requirement.0245.fixture-error-shape",
31190
31267
  "citations": [
@@ -31206,7 +31283,7 @@
31206
31283
  {
31207
31284
  "id": "openwop.it.v2-eval-trajectory-trials.a-trajectory-suite-is-graded-per-the-reference-grader",
31208
31285
  "file": "v2-eval-trajectory-trials.test.ts",
31209
- "line": 251,
31286
+ "line": 266,
31210
31287
  "title": "a trajectory suite is graded per the reference grader",
31211
31288
  "explicitId": "openwop.requirement.0244.trajectory-graded",
31212
31289
  "citations": [
@@ -31240,7 +31317,7 @@
31240
31317
  {
31241
31318
  "id": "openwop.it.v2-eval-trajectory-trials.an-eval-run-brackets-its-scores-with-one-eval-started-and-one-eval-completed-rfc",
31242
31319
  "file": "v2-eval-trajectory-trials.test.ts",
31243
- "line": 285,
31320
+ "line": 300,
31244
31321
  "title": "an eval run brackets its scores with one eval.started and one eval.completed (RFC 0081 §C)",
31245
31322
  "explicitId": "openwop.requirement.0081.eval-envelope",
31246
31323
  "citations": [
@@ -31254,7 +31331,7 @@
31254
31331
  {
31255
31332
  "id": "openwop.it.v2-eval-trajectory-trials.the-served-evalsummary-validates-and-its-counts-match-its-rows-rfc-0081-c",
31256
31333
  "file": "v2-eval-trajectory-trials.test.ts",
31257
- "line": 293,
31334
+ "line": 308,
31258
31335
  "title": "the served EvalSummary validates and its counts match its rows (RFC 0081 §C)",
31259
31336
  "explicitId": "openwop.requirement.0081.summary-served",
31260
31337
  "citations": [
@@ -31268,7 +31345,7 @@
31268
31345
  {
31269
31346
  "id": "openwop.it.v2-eval-trajectory-trials.repeated-trials-emit-one-eval-scored-per-task-per-trial",
31270
31347
  "file": "v2-eval-trajectory-trials.test.ts",
31271
- "line": 314,
31348
+ "line": 329,
31272
31349
  "title": "repeated trials emit one eval.scored per task per trial",
31273
31350
  "explicitId": "openwop.requirement.0244.trials-per-task",
31274
31351
  "citations": [
@@ -31286,7 +31363,7 @@
31286
31363
  {
31287
31364
  "id": "openwop.it.v2-eval-trajectory-trials.the-per-task-trials-block-and-trialstats-follow-the-b-formulas",
31288
31365
  "file": "v2-eval-trajectory-trials.test.ts",
31289
- "line": 325,
31366
+ "line": 340,
31290
31367
  "title": "the per-task trials block and trialStats follow the §B formulas",
31291
31368
  "explicitId": "openwop.requirement.0244.trial-stats-formula",
31292
31369
  "citations": [
@@ -31325,7 +31402,7 @@
31325
31402
  {
31326
31403
  "id": "openwop.it.v2-eval-trajectory-trials.efficiency-toolcallcount-counts-the-scripted-agent-tool-called-events-c",
31327
31404
  "file": "v2-eval-trajectory-trials.test.ts",
31328
- "line": 348,
31405
+ "line": 363,
31329
31406
  "title": "efficiency.toolCallCount counts the scripted agent.tool-called events (§C)",
31330
31407
  "explicitId": "openwop.requirement.0244.efficiency-tool-calls",
31331
31408
  "citations": [
@@ -31339,7 +31416,7 @@
31339
31416
  {
31340
31417
  "id": "openwop.it.v2-eval-trajectory-trials.efficiency-model-and-token-counts-match-the-agent-s-provider-usage-c",
31341
31418
  "file": "v2-eval-trajectory-trials.test.ts",
31342
- "line": 360,
31419
+ "line": 375,
31343
31420
  "title": "efficiency model and token counts match the agent's provider.usage (§C)",
31344
31421
  "explicitId": "openwop.requirement.0244.efficiency-model-usage",
31345
31422
  "citations": [
@@ -31353,7 +31430,7 @@
31353
31430
  {
31354
31431
  "id": "openwop.it.v2-eval-trajectory-trials.totalcostusd-counts-every-trial-b",
31355
31432
  "file": "v2-eval-trajectory-trials.test.ts",
31356
- "line": 371,
31433
+ "line": 386,
31357
31434
  "title": "totalCostUsd counts every trial (§B)",
31358
31435
  "explicitId": "openwop.requirement.0244.cost-every-trial",
31359
31436
  "citations": [
@@ -31364,10 +31441,38 @@
31364
31441
  }
31365
31442
  ]
31366
31443
  },
31444
+ {
31445
+ "id": "openwop.it.v2-eval-trajectory-trials.a-host-does-not-fail-a-task-or-a-suite-on-efficiency-c",
31446
+ "file": "v2-eval-trajectory-trials.test.ts",
31447
+ "line": 394,
31448
+ "title": "a host does not fail a task or a suite on efficiency (§C)",
31449
+ "explicitId": "openwop.requirement.0244.efficiency-never-gated",
31450
+ "citations": [
31451
+ {
31452
+ "section": "eval-summary.schema.json efficiency (RFC 0244 §C)",
31453
+ "requirement": null,
31454
+ "interpolated": true
31455
+ }
31456
+ ]
31457
+ },
31458
+ {
31459
+ "id": "openwop.it.v2-eval-trajectory-trials.memory-one-trial-writes-is-not-visible-to-another-trial-b",
31460
+ "file": "v2-eval-trajectory-trials.test.ts",
31461
+ "line": 409,
31462
+ "title": "memory one trial writes is not visible to another trial (§B)",
31463
+ "explicitId": "openwop.requirement.0244.trial-memory-isolated",
31464
+ "citations": [
31465
+ {
31466
+ "section": "agent-eval-suite.schema.json trials, fixtures.md memory contract (RFC 0244 §B)",
31467
+ "requirement": null,
31468
+ "interpolated": true
31469
+ }
31470
+ ]
31471
+ },
31367
31472
  {
31368
31473
  "id": "openwop.it.v2-eval-trajectory-trials.a-miss-under-onmiss-live-reaches-the-live-counter-and-is-counted-d",
31369
31474
  "file": "v2-eval-trajectory-trials.test.ts",
31370
- "line": 401,
31475
+ "line": 447,
31371
31476
  "title": "a miss under onMiss \"live\" reaches the live counter and is counted (§D)",
31372
31477
  "explicitId": "openwop.requirement.0244.live-miss-counted",
31373
31478
  "citations": [
@@ -31381,7 +31486,7 @@
31381
31486
  {
31382
31487
  "id": "openwop.it.v2-eval-trajectory-trials.repeated-calls-are-served-the-first-unconsumed-fixture-entry-once-each-d",
31383
31488
  "file": "v2-eval-trajectory-trials.test.ts",
31384
- "line": 409,
31489
+ "line": 455,
31385
31490
  "title": "repeated calls are served the first unconsumed fixture entry, once each (§D)",
31386
31491
  "explicitId": "openwop.requirement.0244.first-unconsumed",
31387
31492
  "citations": [
@@ -31395,7 +31500,7 @@
31395
31500
  {
31396
31501
  "id": "openwop.it.v2-eval-trajectory-trials.a-miss-under-onmiss-fail-never-reaches-the-live-counter-d",
31397
31502
  "file": "v2-eval-trajectory-trials.test.ts",
31398
- "line": 417,
31503
+ "line": 463,
31399
31504
  "title": "a miss under onMiss \"fail\" never reaches the live counter (§D)",
31400
31505
  "explicitId": "openwop.requirement.0244.miss-no-live-call",
31401
31506
  "citations": [
@@ -31409,7 +31514,7 @@
31409
31514
  {
31410
31515
  "id": "openwop.it.v2-eval-trajectory-trials.a-fixture-miss-under-onmiss-fail-fails-the-trial-and-is-counted",
31411
31516
  "file": "v2-eval-trajectory-trials.test.ts",
31412
- "line": 425,
31517
+ "line": 471,
31413
31518
  "title": "a fixture miss under onMiss \"fail\" fails the trial and is counted",
31414
31519
  "explicitId": "openwop.requirement.0244.fixture-miss-fails",
31415
31520
  "citations": [
@@ -31446,7 +31551,7 @@
31446
31551
  {
31447
31552
  "id": "openwop.it.v2-eval-trajectory-trials.a-suite-using-an-unadvertised-rfc-0244-feature-is-refused-at-createrun",
31448
31553
  "file": "v2-eval-trajectory-trials.test.ts",
31449
- "line": 445,
31554
+ "line": 491,
31450
31555
  "title": "a suite using an unadvertised RFC 0244 feature is refused at createRun",
31451
31556
  "explicitId": "openwop.requirement.0244.unadvertised-feature-refused",
31452
31557
  "citations": [
@@ -31464,7 +31569,7 @@
31464
31569
  {
31465
31570
  "id": "openwop.it.v2-eval-trajectory-trials.under-passrule-mean-a-task-whose-trials-failed-their-trajectory-does-not-pass-rf",
31466
31571
  "file": "v2-eval-trajectory-trials.test.ts",
31467
- "line": 461,
31572
+ "line": 507,
31468
31573
  "title": "under passRule \"mean\" a task whose trials failed their trajectory does not pass (RFC 0246)",
31469
31574
  "explicitId": "openwop.requirement.0246.mean-gated",
31470
31575
  "citations": [
@@ -31478,7 +31583,7 @@
31478
31583
  {
31479
31584
  "id": "openwop.it.v2-eval-trajectory-trials.a-suite-whose-tasks-failed-their-trajectory-does-not-pass-on-the-output-scores-r",
31480
31585
  "file": "v2-eval-trajectory-trials.test.ts",
31481
- "line": 474,
31586
+ "line": 520,
31482
31587
  "title": "a suite whose tasks failed their trajectory does not pass on the output scores (RFC 0246)",
31483
31588
  "explicitId": "openwop.requirement.0246.suite-gated",
31484
31589
  "citations": [
@@ -31492,7 +31597,7 @@
31492
31597
  {
31493
31598
  "id": "openwop.it.v2-eval-trajectory-trials.a-fixture-entry-marked-iserror-is-replayed-as-a-tool-error-not-a-success-rfc-024",
31494
31599
  "file": "v2-eval-trajectory-trials.test.ts",
31495
- "line": 485,
31600
+ "line": 531,
31496
31601
  "title": "a fixture entry marked isError is replayed as a tool error, not a success (RFC 0245)",
31497
31602
  "explicitId": "openwop.requirement.0245.fixture-error-replayed",
31498
31603
  "citations": [
@@ -31506,7 +31611,7 @@
31506
31611
  {
31507
31612
  "id": "openwop.it.v2-eval-trajectory-trials.a-suite-using-iserror-is-refused-at-createrun-without-fixtureerrors-rfc-0245-c",
31508
31613
  "file": "v2-eval-trajectory-trials.test.ts",
31509
- "line": 499,
31614
+ "line": 545,
31510
31615
  "title": "a suite using isError is refused at createRun without fixtureErrors (RFC 0245 §C)",
31511
31616
  "explicitId": "openwop.requirement.0245.unadvertised-refused",
31512
31617
  "citations": [
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "$comment": "GENERATED by conformance/scripts/generate-scenario-majors.mjs (RFC 0168 §D.3). Do not edit; add a file to BOTH_MAJORS in the generator to target both majors.",
3
3
  "counts": {
4
- "files": 661,
4
+ "files": 662,
5
5
  "v1": 455,
6
- "v2": 221
6
+ "v2": 222
7
7
  },
8
8
  "majors": {
9
9
  "a2a-1-0-agent-card.test.ts": [
@@ -1482,6 +1482,9 @@
1482
1482
  "v2-eval-mode-unadvertised-refused.test.ts": [
1483
1483
  2
1484
1484
  ],
1485
+ "v2-eval-regression-baseline.test.ts": [
1486
+ 2
1487
+ ],
1485
1488
  "v2-eval-trajectory-trials.test.ts": [
1486
1489
  2
1487
1490
  ],
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "_comment": "Provenance of @openwop/spec-artifacts (RFC 0168 §D.2). files: SHA-256 per file; the conformance suite compares the installed peer against dist/spec-artifacts.lock.json at start.",
3
3
  "package": "@openwop/spec-artifacts",
4
- "version": "2.46.26",
5
- "corpusTag": "v2.46.26",
4
+ "version": "2.46.28",
5
+ "corpusTag": "v2.46.28",
6
6
  "files": {
7
7
  "api/.redocly.lint-ignore.yaml": "bf5a8350b88a72fa43f59605ed8d903ed24b6cfccda5e45509c9f6ed9ee4e712",
8
8
  "api/asyncapi.yaml": "d5ecb9ee6114582be3b1f662c84bfac9ae96dae7bacb853e461168f70a8e1c7d",
9
9
  "api/grpc/openwop.proto": "c3e72bb17cba514ee98feb6434e6c9b6ea6795bfd086489ec69fd882dd1ad977",
10
10
  "api/openapi.yaml": "ac6de5303872664b78ff419c035915593e01599e02835e777a0123de1baeb398",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "fc5aaff321913531e04b13522de92a9a8fa3f61be836696e9ab83fbc563caa87",
13
- "api/v2/asyncapi.yaml": "0ea85f3cb0af276cd7ed82e14810c1093917f0d1daa80bc0226b78e127c4e17d",
14
- "api/v2/openapi.yaml": "7c7cd37cc0cabcd37285502594977f6ddc5a59f30938d7aede36f69e05322244",
12
+ "api/seams-v2.yaml": "1281524c0152c77a87db9bfdc01440aed092421619b377cdf85f862af41a3ae5",
13
+ "api/v2/asyncapi.yaml": "58ded9e1117f35837dc0eea8a44438a1def186e8fad0046cb8edacd07cb4906e",
14
+ "api/v2/openapi.yaml": "0fb51374a913d05366ddc721ef7dc872ba5489f8eabdd587c13b28561089c170",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "276fc1d51eb08e14e9127b9fd27761d7046ee33c12000f3a64a801322db8bf58",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -117,7 +117,7 @@
117
117
  "schemas/v2/artifact.schema.json": "85b9dc284d39b99d2a66fa8cbf47f2dd3d8526d3bd6cc411ad315b372de38975",
118
118
  "schemas/v2/audit-verify-result.schema.json": "14af8e9283510f0a40e48a2059c929ee44e0fc9fa3cc66a95bfbe90b17c48297",
119
119
  "schemas/v2/budget-policy.schema.json": "1de68095db0beb5c7a4be629de26e79f62ebbe748a88d46f36e768edfd1f0d68",
120
- "schemas/v2/capabilities.schema.json": "6ca940cc38ec7f4b582def52c18337fd1e9ea03d627a5446766230a19af1a8ab",
120
+ "schemas/v2/capabilities.schema.json": "b06b8142d288e839fe871bdddde35ca08d38d00da2a510fb9cb4ab201f37aa99",
121
121
  "schemas/v2/certification-bundle.schema.json": "5cfa7fb5247160333e33a58b60d42bcd4e5269d8391d6a112d301e14828892ed",
122
122
  "schemas/v2/channel-presence-payload.schema.json": "fc03df0c20cc12a25f7ee6a47503a4c5931d79fe3d5ff24815e8fd7c1bcb9a87",
123
123
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
@@ -212,14 +212,14 @@
212
212
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
213
213
  "spec/v1/alias-detectors.json": "22444c22bb88c568339ef512553f9fc38146e22b566d11ab8608f655d688d19c",
214
214
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
215
- "spec/v1/core-standard-manifest.json": "580b853bb37383d5acea488fba6747193d1db4e6e63025255433dababf008d60",
215
+ "spec/v1/core-standard-manifest.json": "ec3b1a7322067f80dd5562428fd2963a210d73da347eeb29661637745f2f7825",
216
216
  "spec/v1/deprecations.json": "e723bc11d7272c71789ad1303bb7f21809a8a024abf57594f9d5c35dc199ece9",
217
217
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
218
218
  "spec/v1/end-of-support.json": "35f0bf3b70fe78b16e2a2fd81a153fc27e703f6c16376c6fe7cdf1f4f2c4e6d4",
219
219
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
220
220
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
221
221
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
222
- "spec/v1/gaps.json": "21d53eee36f47b3cd44ba54802acc5cdc810d242d1fd929b1e76167da8566957",
222
+ "spec/v1/gaps.json": "23f953428b6609c68917d2201f0b289fe855033452e895028dd1b6f9aae45e62",
223
223
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
224
224
  "spec/v1/migrations.json": "4c50760be70cb644d02427bcaf5749606700edf4513f423903cf3b1d12f5c300",
225
225
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -285,7 +285,7 @@
285
285
  "spec/v2/ext/sandbox-runtime-notes/README.md": "0d1290fb1e20b2e35c0b15051541ab6546e4e2a6f693b4f912cb3f7d6a65e92c",
286
286
  "spec/v2/ext/webResearch/README.md": "b675e6f6646128d781b661f754c2393eed86e5935d16c3a22df582a5ce025b9b",
287
287
  "spec/v2/facets/a2a.schema.json": "b68bf5e29e455e46c2ad7cfcccf5963730ec2310ff9db81884550d8df30fd6ef",
288
- "spec/v2/facets/agents.schema.json": "0eb1172ea140607cb46d164af8bf405b32f5b47aa54baac7844e2c4161290025",
288
+ "spec/v2/facets/agents.schema.json": "198c01fdbb09deeb84f8f45f9f47976e696ac35ef087a2bc5c6f3c4fbb2ac370",
289
289
  "spec/v2/facets/aiProviders.schema.json": "6e4327bcd48110686cc1adfd26ddd6fbbf4ff529c476dcc74eeff8c5ae9965ce",
290
290
  "spec/v2/facets/auditLogIntegrity.schema.json": "9a7f81320c8f940c6f4129bc7dd895a4063231c5458a717a08c2cbf9bb886c46",
291
291
  "spec/v2/facets/auth.schema.json": "7d98bc81a0f7d307460d039eebfebd21388091bfe1d538762583940f94c0bd2a",
@@ -318,9 +318,9 @@
318
318
  "spec/v2/path-manifest.json": "20f598f56df460ad3ed50aba3d6bc2933ea16a3c96ce125da1c5dd6989d4155c",
319
319
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
320
320
  "spec/v2/profiles.json": "b382b261c7844798575f7c1b37c934f0da19846016a2337d883d4f5ef6e05479",
321
- "spec/v2/release.json": "e2a9a7d13015eb3ca85bdbcd6ec422b6e91780fb9019b0e75e2855b826728b1d",
321
+ "spec/v2/release.json": "4bc3da43c14c5c1fa31fc3f7fda0a342d073dfbd5d053ff8557300d3bb67f067",
322
322
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
323
- "spec/v2/surface-baseline.json": "4a1e5ab2349349eeeb9fa173e392627d49c2bee77ac8a42897aeacf2c3a4d784"
323
+ "spec/v2/surface-baseline.json": "7d7a3073bfa01345b7560caffa0b6e382b0e82a205d53119c92fe98d4233d5b8"
324
324
  },
325
- "corpusCommit": "e5e8306a4f9c8c41394cfbe63fb58a08a74fe5b9"
325
+ "corpusCommit": "cb64bb3fe9bf7c37a6432da5207026e0d556cb32"
326
326
  }
@@ -12,7 +12,8 @@
12
12
  * agent calls a model, which the fixture contract leaves to the host.
13
13
  *
14
14
  * `efficiency` is optional on a summary entry, so a run whose entries carry
15
- * none is not evidence either way (`applicable: false`).
15
+ * none is not evidence either way (`applicable: false`). The never-gated rule
16
+ * (`judgeNeverGated`) holds whether or not a host reports `efficiency`.
16
17
  *
17
18
  * @see RFCS/0244-eval-trajectories-trials-and-recorded-fixtures.md §C
18
19
  */
@@ -137,3 +138,30 @@ export function judgeCostEveryTrial(summary: Rec, log: { bracketed: boolean; usa
137
138
  const sum = (costs as number[]).reduce((a, b) => a + b, 0);
138
139
  return { applicable: true, findings: [{ ok: total >= sum || close(total, sum), message: `totalCostUsd MUST count every trial: it MUST be at least the ${sum} costEstimateUsd of the agent's ${log.usage.length} provider.usage events across all trials (got ${total})` }] };
139
140
  }
141
+
142
+ /**
143
+ * §C "MUST NOT fail a task or a suite on" efficiency, on
144
+ * `conformance-eval-efficiency-ungated`: `lean` and `busy` share an output and
145
+ * an expectation and differ only in their scripted call counts, so efficiency
146
+ * is the only thing that can tell them apart. `busy` MUST pass and score what
147
+ * `lean` scores, and the suite (`passScore` 1) MUST pass. The verdict is
148
+ * `blocked` unless the log carries every scripted call (otherwise the
149
+ * difference was never produced) and `lean` passes (otherwise a failing `busy`
150
+ * could have another cause).
151
+ */
152
+ export function judgeNeverGated(summary: Rec, lean: ScriptedTask, busy: ScriptedTask, toolCallsInLog: number): { blocked: string } | EfficiencyVerdict {
153
+ const want = lean.scriptLength + busy.scriptLength;
154
+ if (toolCallsInLog !== want) return { blocked: `the log carries ${toolCallsInLog} agent.tool-called events, not the ${want} scripted calls, so the two tasks' efficiency never differed` };
155
+ const entries = (Array.isArray(summary['tasks']) ? (summary['tasks'] as unknown[]) : []).filter(isRec);
156
+ const l = entries.find((e) => e['taskId'] === lean.taskId);
157
+ const b = entries.find((e) => e['taskId'] === busy.taskId);
158
+ if (l?.['passed'] !== true) return { blocked: `the control task ${lean.taskId} did not pass, so a failing ${busy.taskId} could have a cause other than efficiency` };
159
+ return {
160
+ applicable: true,
161
+ findings: [
162
+ { ok: b?.['passed'] === true, message: `task ${busy.taskId} (${busy.scriptLength} tool calls) MUST pass like ${lean.taskId} (${lean.scriptLength}): a host MUST NOT fail a task on efficiency (got passed ${String(b?.['passed'])})` },
163
+ { ok: typeof b?.['score'] === 'number' && b['score'] === l['score'], message: `task ${busy.taskId} MUST score what ${lean.taskId} scores (${String(l['score'])}): efficiency is informational (got ${String(b?.['score'])})` },
164
+ { ok: summary['passed'] === true, message: `the suite MUST pass at passScore 1 when both tasks pass: a host MUST NOT fail a suite on efficiency (got passed ${String(summary['passed'])})` },
165
+ ],
166
+ };
167
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * RFC 0244 §B, G3 — trial isolation: each trial starts from the same
3
+ * `memorySeed` snapshot, and memory one trial writes is not visible to another
4
+ * trial of the same eval run. The suite-owned memory tool
5
+ * `conformance.eval:memory` makes both observable from outside. A pure judge
6
+ * over one eval run of `conformance-eval-memory-isolation`, for
7
+ * `v2-eval-trajectory-trials.test.ts`.
8
+ *
9
+ * The tool reads and writes the trial's own agent memory, the store
10
+ * `memorySeed` seeds (contract in `fixtures.md` §Eval-suite fixtures):
11
+ * `write {id, content}` stores an entry, `read {id}` returns `{id, content}`,
12
+ * with `content: null` for an entry the trial's memory does not hold. Every
13
+ * trial runs the same script:
14
+ * 1. read `seeded` — the seed, in every trial;
15
+ * 2. read `trial-note` — nothing yet, unless another trial's write leaked;
16
+ * 3. write `trial-note` = `written`;
17
+ * 4. read `trial-note` — `written`, the positive control.
18
+ *
19
+ * Trials may run concurrently (scheduling is host-internal), so the judge
20
+ * never groups calls by trial. Over n trials a conforming host returns n
21
+ * `null` and n `written` reads of `trial-note`. A leak turns a step-2 `null`
22
+ * into `written`, so the run reads fewer than n `null`. A host whose writes
23
+ * never read back (fewer than n `written`) shows nothing about isolation, and
24
+ * the verdict is `blocked`, never a pass.
25
+ *
26
+ * @see RFCS/0244-eval-trajectories-trials-and-recorded-fixtures.md §B
27
+ */
28
+
29
+ export const MEMORY_TOOL = 'conformance.eval:memory';
30
+ export const SEEDED = { id: 'seeded', content: 'seed' } as const;
31
+ export const NOTE = { id: 'trial-note', content: 'written' } as const;
32
+
33
+ export interface MemoryFinding { readonly ok: boolean; readonly message: string }
34
+ export type MemoryVerdict =
35
+ | { readonly kind: 'blocked'; readonly reason: string }
36
+ | { readonly kind: 'judged'; readonly findings: readonly MemoryFinding[] };
37
+
38
+ type Rec = Record<string, unknown>;
39
+ export interface MemoryEvent { readonly type: string; readonly payload: Rec }
40
+ export interface MemoryCall { readonly op: unknown; readonly id: unknown; readonly outcome: unknown; readonly returned: boolean }
41
+
42
+ const isRec = (v: unknown): v is Rec => typeof v === 'object' && v !== null && !Array.isArray(v);
43
+
44
+ /** The memory-tool calls of one run, in log order, each paired with its return by `callId`. */
45
+ export function memoryCalls(events: readonly MemoryEvent[], agentId: string): MemoryCall[] {
46
+ const returns = new Map<string, Rec>();
47
+ for (const e of events) {
48
+ if (e.type === 'agent.tool-returned' && e.payload['toolName'] === MEMORY_TOOL && typeof e.payload['callId'] === 'string') returns.set(e.payload['callId'], e.payload);
49
+ }
50
+ const out: MemoryCall[] = [];
51
+ for (const e of events) {
52
+ if (e.type !== 'agent.tool-called' || e.payload['toolName'] !== MEMORY_TOOL || e.payload['agentId'] !== agentId) continue;
53
+ const inputs = isRec(e.payload['inputs']) ? e.payload['inputs'] : {};
54
+ const r = typeof e.payload['callId'] === 'string' ? returns.get(e.payload['callId']) : undefined;
55
+ out.push({ op: inputs['op'], id: inputs['id'], outcome: r?.['outcome'], returned: r !== undefined });
56
+ }
57
+ return out;
58
+ }
59
+
60
+ const content = (c: MemoryCall): unknown => (isRec(c.outcome) ? c.outcome['content'] : undefined);
61
+
62
+ /** §B isolation over `trials` trials of the four-step script. */
63
+ export function judgeTrialMemoryIsolated(calls: readonly MemoryCall[], trials: number): MemoryVerdict {
64
+ if (calls.length !== 4 * trials || !calls.every((c) => c.returned)) {
65
+ return { kind: 'blocked', reason: `the run MUST log the ${4 * trials} scripted memory calls (four per trial), each with an agent.tool-returned (got ${calls.length}, ${calls.filter((c) => c.returned).length} returned)` };
66
+ }
67
+ const reads = calls.filter((c) => c.op === 'read');
68
+ const seeded = reads.filter((c) => c.id === SEEDED.id);
69
+ const note = reads.filter((c) => c.id === NOTE.id);
70
+ const written = note.filter((c) => content(c) === NOTE.content).length;
71
+ if (written < trials) {
72
+ return { kind: 'blocked', reason: `only ${written} of ${trials} trials read back their own write of ${NOTE.id}, so the memory tool does not reach the trial's memory (fixtures.md memory contract) and isolation is not observable` };
73
+ }
74
+ const empty = note.filter((c) => content(c) === null).length;
75
+ return {
76
+ kind: 'judged',
77
+ findings: [
78
+ { ok: seeded.length === trials && seeded.every((c) => content(c) === SEEDED.content), message: `every trial MUST start from the memorySeed snapshot: each of the ${trials} reads of ${SEEDED.id} MUST return content "${SEEDED.content}" (got ${JSON.stringify(seeded.map(content))})` },
79
+ { ok: empty === trials && note.length === 2 * trials, message: `memory one trial writes MUST NOT be visible to another trial: each trial's first read of ${NOTE.id} MUST find nothing, so ${trials} of the ${note.length} reads return content null (got ${empty})` },
80
+ ],
81
+ };
82
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * RFC 0251 — an eval run names its modes and its regression baseline — and
3
+ * RFC 0244 §F pairing, which RFC 0251 makes causable. Pure judges over two
4
+ * eval runs and the refusals, for `v2-eval-regression-baseline.test.ts`.
5
+ *
6
+ * The fixtures share one `suiteId`. The base run (1.0.0) holds `base-only`
7
+ * (fails), `shared-a` and `shared-b` (pass); the candidate (1.1.0) holds the
8
+ * two shared tasks, unchanged, and `candidate-only` (passes). So the
9
+ * aggregates differ by 1/3 while every paired score is equal: a host that
10
+ * compares aggregates, not paired tasks, would call the candidate `improved`.
11
+ *
12
+ * @see RFCS/0251-eval-run-mode-and-baseline-selection.md
13
+ * @see RFCS/0244-eval-trajectories-trials-and-recorded-fixtures.md §F
14
+ */
15
+
16
+ import { readErrorCode } from './error-envelope.js';
17
+
18
+ export interface RegressionFinding { readonly ok: boolean; readonly message: string }
19
+ type Rec = Record<string, unknown>;
20
+ const isRec = (v: unknown): v is Rec => typeof v === 'object' && v !== null && !Array.isArray(v);
21
+ const close = (a: number, b: number): boolean => Math.abs(a - b) <= 1e-9 * Math.max(1, Math.abs(b));
22
+
23
+ export const SHARED_TASKS = ['shared-a', 'shared-b'] as const;
24
+
25
+ /** §D: both carriers name the requested baseline, and `scoreDelta` is the aggregate difference. */
26
+ export function judgeBaselineEchoed(baselineRunId: string, events: readonly { type: string; payload: Rec }[], candidate: Rec, base: Rec): RegressionFinding[] {
27
+ const started = events.filter((e) => e.type === 'eval.started');
28
+ const reg = isRec(candidate['regression']) ? candidate['regression'] : {};
29
+ const want = typeof candidate['aggregateScore'] === 'number' && typeof base['aggregateScore'] === 'number' ? candidate['aggregateScore'] - base['aggregateScore'] : undefined;
30
+ const delta = reg['scoreDelta'];
31
+ return [
32
+ { ok: started.length === 1 && started[0]!.payload['baselineRunId'] === baselineRunId, message: `eval.started MUST carry baselineRunId ${baselineRunId} (got ${JSON.stringify(started.map((e) => e.payload['baselineRunId']))})` },
33
+ { ok: reg['baselineRunId'] === baselineRunId, message: `EvalSummary.regression.baselineRunId MUST be ${baselineRunId} (got ${JSON.stringify(reg['baselineRunId'])})` },
34
+ { ok: want !== undefined && typeof delta === 'number' && close(delta, want), message: `regression.scoreDelta MUST be this run's aggregateScore minus the baseline's, ${String(want)} (got ${JSON.stringify(delta)})` },
35
+ ];
36
+ }
37
+
38
+ /** RFC 0244 §F: only the tasks in both runs are paired, and the host says how many. */
39
+ export function judgePaired(candidate: Rec): RegressionFinding[] {
40
+ const reg = isRec(candidate['regression']) ? candidate['regression'] : {};
41
+ return [{ ok: reg['pairedTaskCount'] === SHARED_TASKS.length, message: `regression.pairedTaskCount MUST count the ${SHARED_TASKS.length} tasks present in both runs, paired by taskId (got ${JSON.stringify(reg['pairedTaskCount'])})` }];
42
+ }
43
+
44
+ /**
45
+ * RFC 0244 §F: every paired score is equal, so no method can distinguish the
46
+ * runs. The verdict MUST be present (the host advertises `regressionVerdict`)
47
+ * and MUST NOT be `improved` or `regressed`.
48
+ */
49
+ export function judgeNoFalseVerdict(candidate: Rec): RegressionFinding[] {
50
+ const reg = isRec(candidate['regression']) ? candidate['regression'] : {};
51
+ const v = reg['verdict'];
52
+ return [
53
+ { ok: typeof v === 'string', message: `a host advertising regressionVerdict MUST report regression.verdict (got ${JSON.stringify(v)})` },
54
+ { ok: v !== 'improved' && v !== 'regressed', message: `with every paired task scoring the same, the verdict MUST NOT be improved or regressed: comparing aggregates is not pairing (got ${JSON.stringify(v)})` },
55
+ ];
56
+ }
57
+
58
+ export interface Answer { readonly status: number; readonly json: unknown; readonly text: string }
59
+
60
+ /** §B / §C: a refused create answers `400 validation_error` and does not echo the supplied id. */
61
+ export function judgeRefused(a: Answer, suppliedId: string | undefined, what: string): RegressionFinding[] {
62
+ const out: RegressionFinding[] = [
63
+ { ok: a.status === 400, message: `${what} MUST be refused 400 before the run starts (got ${a.status})` },
64
+ { ok: readErrorCode(a.json) === 'validation_error', message: `${what} MUST be refused with validation_error (got ${JSON.stringify(readErrorCode(a.json))})` },
65
+ ];
66
+ if (suppliedId !== undefined) out.push({ ok: !a.text.includes(suppliedId), message: `the refusal of ${what} MUST NOT echo the supplied baselineRunId` });
67
+ return out;
68
+ }
69
+
70
+ /** §C: another tenant's real run is refused exactly as an id that never existed. */
71
+ export function judgeUniform(unknown: Answer, foreign: Answer, foreignId: string): RegressionFinding[] {
72
+ return [
73
+ { ok: foreign.status === unknown.status, message: `another tenant's run MUST be refused with the same status as an unknown id (${foreign.status} vs ${unknown.status})` },
74
+ { ok: readErrorCode(foreign.json) === readErrorCode(unknown.json), message: `another tenant's run MUST be refused with the same code as an unknown id (${JSON.stringify(readErrorCode(foreign.json))} vs ${JSON.stringify(readErrorCode(unknown.json))})` },
75
+ { ok: !foreign.text.includes(foreignId), message: "the refusal MUST NOT echo another tenant's run id" },
76
+ ];
77
+ }