@openwop/openwop-conformance 2.37.0 → 2.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +3 -3
  3. package/dist/cli.js +8 -18
  4. package/dist/lib/certification-bundle-v3.js +46 -18
  5. package/dist/lib/jcs.js +274 -0
  6. package/dist/lib/requirement-ledger.js +44 -3
  7. package/dist/lib/scenario-disposition.js +37 -8
  8. package/dist/spec-artifacts.lock.json +2 -2
  9. package/package.json +2 -2
  10. package/requirements.json +323 -57
  11. package/scenario-majors.json +7 -3
  12. package/schemas/CORPUS-STAMP.json +30 -30
  13. package/src/cli.ts +8 -16
  14. package/src/lib/certification-bundle-v3.ts +42 -17
  15. package/src/lib/front-mux.ts +44 -2
  16. package/src/lib/jcs.ts +229 -0
  17. package/src/lib/llm-cache-key-recipe.ts +10 -20
  18. package/src/lib/requirement-ledger.ts +82 -4
  19. package/src/lib/scenario-disposition.ts +41 -3
  20. package/src/lib/scoped-receiver.ts +223 -0
  21. package/src/lib/triggerBridge.ts +49 -0
  22. package/src/scenarios/auth-subject-link.test.ts +18 -1
  23. package/src/scenarios/jcs-vectors.test.ts +108 -0
  24. package/src/scenarios/semantic-digest-vectors.test.ts +8 -0
  25. package/src/scenarios/trigger-bridge-delivery.test.ts +17 -2
  26. package/src/scenarios/trigger-stream-cdc-sources.test.ts +17 -2
  27. package/src/scenarios/v2-a2a-operation-map.test.ts +28 -0
  28. package/src/scenarios/v2-a2ui-v09-surface.test.ts +18 -4
  29. package/src/scenarios/v2-bound-id-kinds.test.ts +35 -22
  30. package/src/scenarios/v2-content-locale-keys.test.ts +10 -1
  31. package/src/scenarios/v2-idempotency-in-flight.test.ts +81 -26
  32. package/src/scenarios/v2-mrtr-rounds-ceiling.test.ts +7 -1
  33. package/src/scenarios/v2-oauth-client-pkce-state-iss.test.ts +7 -1
  34. package/src/scenarios/v2-webhook-delivery-shape.test.ts +31 -34
  35. package/src/scenarios/v2-webhook-durable-delivery.test.ts +63 -47
  36. package/src/scenarios/webhook-signed-delivery.test.ts +55 -42
  37. package/src/setup.ts +24 -4
  38. package/vectors/jcs-v1.json +294 -0
  39. package/vectors/semantic-request-digest-v2.json +52 -0
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": 628,
6
- "tests": 2401,
7
- "withStableId": 2401,
5
+ "files": 632,
6
+ "tests": 2415,
7
+ "withStableId": 2415,
8
8
  "interpolatedTitles": 0,
9
- "explicitIds": 2291
9
+ "explicitIds": 2304
10
10
  },
11
11
  "records": [
12
12
  {
@@ -5956,7 +5956,7 @@
5956
5956
  {
5957
5957
  "id": "openwop.it.auth-subject-link.subjectlinking-true-is-only-claimed-alongside-both-saml-and-scim-profiles",
5958
5958
  "file": "auth-subject-link.test.ts",
5959
- "line": 61,
5959
+ "line": 62,
5960
5960
  "title": "subjectLinking:true is only claimed alongside both SAML and SCIM profiles",
5961
5961
  "explicitId": "openwop.it.auth-subject-link.subjectlinking-true-is-only-claimed-alongside-both-saml-and-scim-profiles",
5962
5962
  "citations": [
@@ -5969,7 +5969,7 @@
5969
5969
  {
5970
5970
  "id": "openwop.it.auth-subject-link.advertising-both-profiles-requires-subjectlinking-true-a-subjectlinkkey-rfc-0164",
5971
5971
  "file": "auth-subject-link.test.ts",
5972
- "line": 76,
5972
+ "line": 77,
5973
5973
  "title": "advertising BOTH profiles REQUIRES subjectLinking:true + a subjectLinkKey (RFC 0164 — the vulnerable shape fails, never inapplicable)",
5974
5974
  "explicitId": "openwop.it.auth-subject-link.advertising-both-profiles-requires-subjectlinking-true-a-subjectlinkkey-rfc-0164",
5975
5975
  "citations": [
@@ -5987,7 +5987,7 @@
5987
5987
  {
5988
5988
  "id": "openwop.it.auth-subject-link.a-scim-deactivation-fail-closes-the-linked-saml-identity",
5989
5989
  "file": "auth-subject-link.test.ts",
5990
- "line": 106,
5990
+ "line": 107,
5991
5991
  "title": "a SCIM deactivation fail-closes the linked SAML identity",
5992
5992
  "explicitId": "openwop.it.auth-subject-link.a-scim-deactivation-fail-closes-the-linked-saml-identity",
5993
5993
  "citations": [
@@ -6012,7 +6012,7 @@
6012
6012
  {
6013
6013
  "id": "openwop.it.auth-subject-link.a-mutable-pii-link-key-email-never-produces-a-cross-lane-pass",
6014
6014
  "file": "auth-subject-link.test.ts",
6015
- "line": 152,
6015
+ "line": 169,
6016
6016
  "title": "a mutable/PII link key (email) never produces a cross-lane pass",
6017
6017
  "explicitId": "openwop.it.auth-subject-link.a-mutable-pii-link-key-email-never-produces-a-cross-lane-pass",
6018
6018
  "citations": [
@@ -6029,7 +6029,7 @@
6029
6029
  {
6030
6030
  "id": "openwop.it.auth-subject-link.a-scim-deactivation-does-not-deny-a-saml-login-whose-run-subject-is-legacy-issue",
6031
6031
  "file": "auth-subject-link.test.ts",
6032
- "line": 202,
6032
+ "line": 219,
6033
6033
  "title": "a SCIM deactivation does not deny a SAML login whose run subject is legacy-issued",
6034
6034
  "explicitId": null,
6035
6035
  "citations": []
@@ -15228,6 +15228,97 @@
15228
15228
  }
15229
15229
  ]
15230
15230
  },
15231
+ {
15232
+ "id": "openwop.it.jcs-vectors.the-vector-set-is-present-and-non-trivial",
15233
+ "file": "jcs-vectors.test.ts",
15234
+ "line": 59,
15235
+ "title": "the vector set is present and non-trivial",
15236
+ "explicitId": "openwop.it.jcs-vectors.the-vector-set-is-present-and-non-trivial",
15237
+ "citations": [
15238
+ {
15239
+ "section": "RFC 0212 · spec/v2/core/conformance.md §\"Canonical JSON\"",
15240
+ "requirement": "the vectors MUST cover RFC 8785 Appendix B numbers, documents and every §B refusal kind"
15241
+ }
15242
+ ]
15243
+ },
15244
+ {
15245
+ "id": "openwop.it.jcs-vectors.number-s-serializes-per-rfc-8785-appendix-b",
15246
+ "file": "jcs-vectors.test.ts",
15247
+ "line": 66,
15248
+ "title": "number %s serializes per RFC 8785 Appendix B",
15249
+ "explicitId": "openwop.it.jcs-vectors.number-s-serializes-per-rfc-8785-appendix-b",
15250
+ "citations": [
15251
+ {
15252
+ "section": "RFC 0212 · spec/v2/core/conformance.md §\"Canonical JSON\"",
15253
+ "requirement": "numbers MUST serialize as ECMAScript Number::toString (RFC 8785 §3.2.2.3)"
15254
+ }
15255
+ ]
15256
+ },
15257
+ {
15258
+ "id": "openwop.it.jcs-vectors.document-s-canonicalizes-and-hashes",
15259
+ "file": "jcs-vectors.test.ts",
15260
+ "line": 70,
15261
+ "title": "document %s canonicalizes and hashes",
15262
+ "explicitId": "openwop.it.jcs-vectors.document-s-canonicalizes-and-hashes",
15263
+ "citations": [
15264
+ {
15265
+ "section": "RFC 0212 · spec/v2/core/conformance.md §\"Canonical JSON\"",
15266
+ "requirement": null,
15267
+ "interpolated": true
15268
+ },
15269
+ {
15270
+ "section": "RFC 0212 · spec/v2/core/conformance.md §\"Canonical JSON\"",
15271
+ "requirement": null,
15272
+ "interpolated": true
15273
+ }
15274
+ ]
15275
+ },
15276
+ {
15277
+ "id": "openwop.it.jcs-vectors.text-s-is-refused-not-coerced",
15278
+ "file": "jcs-vectors.test.ts",
15279
+ "line": 78,
15280
+ "title": "text %s is refused, not coerced",
15281
+ "explicitId": "openwop.it.jcs-vectors.text-s-is-refused-not-coerced",
15282
+ "citations": [
15283
+ {
15284
+ "section": "RFC 0212 · spec/v2/core/conformance.md §\"Canonical JSON\"",
15285
+ "requirement": null,
15286
+ "interpolated": true
15287
+ }
15288
+ ]
15289
+ },
15290
+ {
15291
+ "id": "openwop.it.jcs-vectors.a-non-i-json-native-value-is-refused-at-the-value-boundary",
15292
+ "file": "jcs-vectors.test.ts",
15293
+ "line": 83,
15294
+ "title": "a non-I-JSON native value is refused at the value boundary",
15295
+ "explicitId": "openwop.it.jcs-vectors.a-non-i-json-native-value-is-refused-at-the-value-boundary",
15296
+ "citations": [
15297
+ {
15298
+ "section": "RFC 0212 · spec/v2/core/conformance.md §\"Canonical JSON\"",
15299
+ "requirement": null,
15300
+ "interpolated": true
15301
+ }
15302
+ ]
15303
+ },
15304
+ {
15305
+ "id": "openwop.it.jcs-vectors.member-names-and-certification-rows-sort-by-utf-16-code-units-not-by-locale",
15306
+ "file": "jcs-vectors.test.ts",
15307
+ "line": 99,
15308
+ "title": "member names and certification rows sort by UTF-16 code units, not by locale",
15309
+ "explicitId": "openwop.it.jcs-vectors.member-names-and-certification-rows-sort-by-utf-16-code-units-not-by-locale",
15310
+ "citations": [
15311
+ {
15312
+ "section": "RFC 0212 · spec/v2/core/conformance.md §\"Canonical JSON\"",
15313
+ "requirement": null,
15314
+ "interpolated": true
15315
+ },
15316
+ {
15317
+ "section": "RFC 0212 · spec/v2/core/conformance.md §\"Canonical JSON\"",
15318
+ "requirement": "witnessSha256 rows MUST sort by id in UTF-16 code-unit order; a locale-sensitive comparator MUST NOT be used"
15319
+ }
15320
+ ]
15321
+ },
15231
15322
  {
15232
15323
  "id": "openwop.it.kv-atomic-increment.capabilities-kvstorage-is-either-absent-or-a-well-formed-object",
15233
15324
  "file": "kv-atomic-increment.test.ts",
@@ -24404,9 +24495,26 @@
24404
24495
  ]
24405
24496
  },
24406
24497
  {
24407
- "id": "openwop.it.semantic-digest-vectors.message-order-is-semantic-reversing-changes-the-digest",
24498
+ "id": "openwop.it.semantic-digest-vectors.tool-order-uses-utf-16-code-units-where-a-locale-comparator-disagrees",
24408
24499
  "file": "semantic-digest-vectors.test.ts",
24409
24500
  "line": 113,
24501
+ "title": "tool order uses UTF-16 code units, where a locale comparator disagrees",
24502
+ "explicitId": "openwop.it.semantic-digest-vectors.tool-order-uses-utf-16-code-units-where-a-locale-comparator-disagrees",
24503
+ "citations": [
24504
+ {
24505
+ "section": "RFC 0212 §D · RFC 0150 §C",
24506
+ "requirement": "tools[] MUST sort by name in UTF-16 code-unit order"
24507
+ },
24508
+ {
24509
+ "section": "RFC 0212 §D · RFC 0150 §C",
24510
+ "requirement": "getWeather (0x57) MUST precede get_weather (0x5F)"
24511
+ }
24512
+ ]
24513
+ },
24514
+ {
24515
+ "id": "openwop.it.semantic-digest-vectors.message-order-is-semantic-reversing-changes-the-digest",
24516
+ "file": "semantic-digest-vectors.test.ts",
24517
+ "line": 121,
24410
24518
  "title": "message order IS semantic — reversing changes the digest",
24411
24519
  "explicitId": "openwop.it.semantic-digest-vectors.message-order-is-semantic-reversing-changes-the-digest",
24412
24520
  "citations": [
@@ -24419,7 +24527,7 @@
24419
24527
  {
24420
24528
  "id": "openwop.it.semantic-digest-vectors.the-two-unicode-forms-do-not-collide-because-jcs-does-not-apply-nfc",
24421
24529
  "file": "semantic-digest-vectors.test.ts",
24422
- "line": 120,
24530
+ "line": 128,
24423
24531
  "title": "the two Unicode forms do not collide, because JCS does not apply NFC",
24424
24532
  "explicitId": "openwop.it.semantic-digest-vectors.the-two-unicode-forms-do-not-collide-because-jcs-does-not-apply-nfc",
24425
24533
  "citations": [
@@ -24432,7 +24540,7 @@
24432
24540
  {
24433
24541
  "id": "openwop.it.semantic-digest-vectors.each-field-v1-excluded-now-changes-the-digest",
24434
24542
  "file": "semantic-digest-vectors.test.ts",
24435
- "line": 133,
24543
+ "line": 141,
24436
24544
  "title": "each field v1 excluded now changes the digest",
24437
24545
  "explicitId": "openwop.it.semantic-digest-vectors.each-field-v1-excluded-now-changes-the-digest",
24438
24546
  "citations": [
@@ -25733,7 +25841,7 @@
25733
25841
  {
25734
25842
  "id": "openwop.it.trigger-bridge-delivery.de-dups-by-dedupkey-retries-to-dead-letter-and-links-delivery-run-causation",
25735
25843
  "file": "trigger-bridge-delivery.test.ts",
25736
- "line": 54,
25844
+ "line": 55,
25737
25845
  "title": "de-dups by dedupKey, retries to dead-letter, and links delivery→run causation",
25738
25846
  "explicitId": "openwop.it.trigger-bridge-delivery.de-dups-by-dedupkey-retries-to-dead-letter-and-links-delivery-run-causation",
25739
25847
  "citations": [
@@ -26494,7 +26602,7 @@
26494
26602
  {
26495
26603
  "id": "openwop.it.v2-a2a-operation-map.a-message-carrying-taskid-without-contextid-is-answered-with-the-task-s-contexti",
26496
26604
  "file": "v2-a2a-operation-map.test.ts",
26497
- "line": 134,
26605
+ "line": 135,
26498
26606
  "title": "a message carrying taskId without contextId is answered with the task's contextId",
26499
26607
  "explicitId": null,
26500
26608
  "citations": [
@@ -26525,7 +26633,7 @@
26525
26633
  {
26526
26634
  "id": "openwop.it.v2-a2a-operation-map.a-message-whose-contextid-is-not-its-task-s-is-refused-invalid-parameters-and-ch",
26527
26635
  "file": "v2-a2a-operation-map.test.ts",
26528
- "line": 148,
26636
+ "line": 149,
26529
26637
  "title": "a message whose contextId is not its task's is refused invalid-parameters and changes nothing",
26530
26638
  "explicitId": null,
26531
26639
  "citations": [
@@ -26552,7 +26660,7 @@
26552
26660
  {
26553
26661
  "id": "openwop.it.v2-a2a-operation-map.a-message-to-a-retained-terminal-task-is-refused-unsupportedoperationerror-and-a",
26554
26662
  "file": "v2-a2a-operation-map.test.ts",
26555
- "line": 163,
26663
+ "line": 164,
26556
26664
  "title": "a message to a retained terminal task is refused UnsupportedOperationError, and appends no event",
26557
26665
  "explicitId": null,
26558
26666
  "citations": [
@@ -26579,7 +26687,7 @@
26579
26687
  {
26580
26688
  "id": "openwop.it.v2-a2a-operation-map.an-unknown-task-and-another-tenant-s-task-are-answered-by-the-same-tasknotfounde",
26581
26689
  "file": "v2-a2a-operation-map.test.ts",
26582
- "line": 178,
26690
+ "line": 179,
26583
26691
  "title": "an unknown task and another tenant's task are answered by the same TaskNotFoundError",
26584
26692
  "explicitId": null,
26585
26693
  "citations": [
@@ -26612,7 +26720,7 @@
26612
26720
  {
26613
26721
  "id": "openwop.it.v2-a2a-operation-map.task-status-state-is-the-map-s-projection-of-the-run-status-at-every-observed-st",
26614
26722
  "file": "v2-a2a-operation-map.test.ts",
26615
- "line": 200,
26723
+ "line": 201,
26616
26724
  "title": "Task.status.state is the map's projection of the run status at every observed state",
26617
26725
  "explicitId": null,
26618
26726
  "citations": [
@@ -26635,7 +26743,7 @@
26635
26743
  {
26636
26744
  "id": "openwop.it.v2-a2a-operation-map.the-json-rpc-error-codes-the-suite-can-cause-are-the-a2a-1-0-1-codes",
26637
26745
  "file": "v2-a2a-operation-map.test.ts",
26638
- "line": 225,
26746
+ "line": 226,
26639
26747
  "title": "the JSON-RPC error codes the suite can cause are the A2A 1.0.1 codes",
26640
26748
  "explicitId": null,
26641
26749
  "citations": [
@@ -26658,7 +26766,7 @@
26658
26766
  {
26659
26767
  "id": "openwop.it.v2-a2a-operation-map.a-row-whose-requires-facet-is-not-advertised-is-refused-with-the-row-s-error",
26660
26768
  "file": "v2-a2a-operation-map.test.ts",
26661
- "line": 239,
26769
+ "line": 240,
26662
26770
  "title": "a row whose requires facet is not advertised is refused with the row's error",
26663
26771
  "explicitId": null,
26664
26772
  "citations": [
@@ -26673,10 +26781,34 @@
26673
26781
  }
26674
26782
  ]
26675
26783
  },
26784
+ {
26785
+ "id": "openwop.it.v2-a2a-operation-map.a-host-not-advertising-a2a-pushnotifications-refuses-all-four-push-config-operat",
26786
+ "file": "v2-a2a-operation-map.test.ts",
26787
+ "line": 253,
26788
+ "title": "a host not advertising a2a.pushNotifications refuses all four push-config operations with PushNotificationNotSupportedError",
26789
+ "explicitId": null,
26790
+ "citations": [
26791
+ {
26792
+ "section": "spec/v2/core/interop.md §\"The operation mappings\" (RFC 0208)",
26793
+ "requirement": null,
26794
+ "interpolated": true
26795
+ },
26796
+ {
26797
+ "section": "a2a.operations GetTask",
26798
+ "requirement": null,
26799
+ "interpolated": true
26800
+ },
26801
+ {
26802
+ "section": null,
26803
+ "requirement": null,
26804
+ "interpolated": true
26805
+ }
26806
+ ]
26807
+ },
26676
26808
  {
26677
26809
  "id": "openwop.it.v2-a2a-operation-map.listtasks-returns-only-what-listruns-returns-to-the-same-subject-tenant-and-cont",
26678
26810
  "file": "v2-a2a-operation-map.test.ts",
26679
- "line": 252,
26811
+ "line": 280,
26680
26812
  "title": "ListTasks returns only what listRuns returns to the same Subject; tenant and contextId never select",
26681
26813
  "explicitId": null,
26682
26814
  "citations": [
@@ -26713,7 +26845,7 @@
26713
26845
  {
26714
26846
  "id": "openwop.it.v2-a2a-operation-map.an-a2a-error-s-data-is-an-array-carrying-one-errorinfo-with-the-map-row-s-reason",
26715
26847
  "file": "v2-a2a-operation-map.test.ts",
26716
- "line": 285,
26848
+ "line": 313,
26717
26849
  "title": "an A2A error's data is an array carrying one ErrorInfo with the map row's reason and the A2A domain",
26718
26850
  "explicitId": null,
26719
26851
  "citations": [
@@ -26747,7 +26879,7 @@
26747
26879
  {
26748
26880
  "id": "openwop.it.v2-a2a-operation-map.no-response-on-the-card-s-json-rpc-interface-url-is-the-openwop-error-envelope",
26749
26881
  "file": "v2-a2a-operation-map.test.ts",
26750
- "line": 306,
26882
+ "line": 334,
26751
26883
  "title": "no response on the card's JSON-RPC interface URL is the OpenWOP error envelope",
26752
26884
  "explicitId": null,
26753
26885
  "citations": [
@@ -26765,7 +26897,7 @@
26765
26897
  {
26766
26898
  "id": "openwop.it.v2-a2a-operation-map.versionnotsupportederror-carries-errorinfo-version-not-supported-and-supportedve",
26767
26899
  "file": "v2-a2a-operation-map.test.ts",
26768
- "line": 326,
26900
+ "line": 354,
26769
26901
  "title": "VersionNotSupportedError carries ErrorInfo VERSION_NOT_SUPPORTED, and supportedVersions is a comma-joined subset of the card",
26770
26902
  "explicitId": null,
26771
26903
  "citations": [
@@ -26789,7 +26921,7 @@
26789
26921
  {
26790
26922
  "id": "openwop.it.v2-a2a-operation-map.an-http-json-interface-answers-an-a2a-error-with-google-rpc-status-carrying-the",
26791
26923
  "file": "v2-a2a-operation-map.test.ts",
26792
- "line": 344,
26924
+ "line": 372,
26793
26925
  "title": "an HTTP+JSON interface answers an A2A error with google.rpc.Status carrying the ErrorInfo",
26794
26926
  "explicitId": null,
26795
26927
  "citations": [
@@ -26808,7 +26940,7 @@
26808
26940
  {
26809
26941
  "id": "openwop.it.v2-a2a-operation-map.a-run-suspended-on-a-credential-interrupt-projects-to-task-state-auth-required-n",
26810
26942
  "file": "v2-a2a-operation-map.test.ts",
26811
- "line": 359,
26943
+ "line": 387,
26812
26944
  "title": "a run suspended on a credential interrupt projects to TASK_STATE_AUTH_REQUIRED, naming the provider and carrying connectUrl",
26813
26945
  "explicitId": null,
26814
26946
  "citations": [
@@ -26844,7 +26976,7 @@
26844
26976
  {
26845
26977
  "id": "openwop.it.v2-a2ui-v09-surface.a-version-2-envelope-carrying-a-version-1-body-is-refused-the-positive-is-admitt",
26846
26978
  "file": "v2-a2ui-v09-surface.test.ts",
26847
- "line": 128,
26979
+ "line": 129,
26848
26980
  "title": "a version-2 envelope carrying a version-1 body is refused; the positive is admitted; above the floor is refused; below it follows envelopeStrictness",
26849
26981
  "explicitId": "openwop.requirement.0209.version-selects-branch",
26850
26982
  "citations": [
@@ -26888,7 +27020,7 @@
26888
27020
  {
26889
27021
  "id": "openwop.it.v2-a2ui-v09-surface.no-first-createsurface-a-message-after-deletesurface-and-a-second-createsurface",
26890
27022
  "file": "v2-a2ui-v09-surface.test.ts",
26891
- "line": 154,
27023
+ "line": 155,
26892
27024
  "title": "no first createSurface, a message after deleteSurface, and a second createSurface are each refused; the valid steps are admitted",
26893
27025
  "explicitId": "openwop.requirement.0209.fold-guarded",
26894
27026
  "citations": [
@@ -26902,7 +27034,7 @@
26902
27034
  {
26903
27035
  "id": "openwop.it.v2-a2ui-v09-surface.a-createsurface-catalogid-differing-from-the-payload-catalogid-is-refused",
26904
27036
  "file": "v2-a2ui-v09-surface.test.ts",
26905
- "line": 179,
27037
+ "line": 180,
26906
27038
  "title": "a createSurface.catalogId differing from the payload catalogId is refused",
26907
27039
  "explicitId": "openwop.requirement.0209.catalog-equality",
26908
27040
  "citations": [
@@ -26920,7 +27052,7 @@
26920
27052
  {
26921
27053
  "id": "openwop.it.v2-a2ui-v09-surface.a-message-whose-surfaceid-differs-from-the-payload-surfaceid-is-refused",
26922
27054
  "file": "v2-a2ui-v09-surface.test.ts",
26923
- "line": 193,
27055
+ "line": 194,
26924
27056
  "title": "a message whose surfaceId differs from the payload surfaceId is refused",
26925
27057
  "explicitId": "openwop.it.v2-a2ui-v09-surface.surface-id-equality",
26926
27058
  "citations": [
@@ -26938,7 +27070,7 @@
26938
27070
  {
26939
27071
  "id": "openwop.it.v2-a2ui-v09-surface.a-recorded-version-2-surface-is-returned-byte-equal-on-poll-and-carried-by-a-for",
26940
27072
  "file": "v2-a2ui-v09-surface.test.ts",
26941
- "line": 209,
27073
+ "line": 210,
26942
27074
  "title": "a recorded version-2 surface is returned byte-equal on poll and carried by a fork at a later fromSeq",
26943
27075
  "explicitId": "openwop.it.v2-a2ui-v09-surface.recorded-as-recorded",
26944
27076
  "citations": [
@@ -26951,6 +27083,16 @@
26951
27083
  "section": "RFC 0209 §C.11",
26952
27084
  "requirement": "the run's poll MUST return the recorded surface payload byte-equal — no surface is regenerated"
26953
27085
  },
27086
+ {
27087
+ "section": "RFC 0209 §C.9",
27088
+ "requirement": null,
27089
+ "interpolated": true
27090
+ },
27091
+ {
27092
+ "section": "api/seams-v2.yaml emitA2uiSurface",
27093
+ "requirement": null,
27094
+ "interpolated": true
27095
+ },
26954
27096
  {
26955
27097
  "section": "RFC 0209 §C.11",
26956
27098
  "requirement": null,
@@ -26965,7 +27107,7 @@
26965
27107
  {
26966
27108
  "id": "openwop.it.v2-a2ui-v09-surface.a-version-1-surface-recorded-at-floor-1-is-returned-byte-equal-on-poll-and-carri",
26967
27109
  "file": "v2-a2ui-v09-surface.test.ts",
26968
- "line": 228,
27110
+ "line": 237,
26969
27111
  "title": "a version-1 surface recorded at floor 1 is returned byte-equal on poll and carried by a fork",
26970
27112
  "explicitId": "openwop.requirement.0209.legacy-readable",
26971
27113
  "citations": [
@@ -26983,6 +27125,16 @@
26983
27125
  "requirement": null,
26984
27126
  "interpolated": true
26985
27127
  },
27128
+ {
27129
+ "section": "api/seams-v2.yaml emitA2uiSurface",
27130
+ "requirement": null,
27131
+ "interpolated": true
27132
+ },
27133
+ {
27134
+ "section": "RFC 0209 §C.11",
27135
+ "requirement": null,
27136
+ "interpolated": true
27137
+ },
26986
27138
  {
26987
27139
  "section": "RFC 0209 §C.11",
26988
27140
  "requirement": "a fork at a later fromSeq MUST carry the version-1 surface unchanged"
@@ -26992,7 +27144,7 @@
26992
27144
  {
26993
27145
  "id": "openwop.it.v2-a2ui-v09-surface.one-untrusted-update-taints-a-trusted-surface-a-later-trusted-update-does-not-la",
26994
27146
  "file": "v2-a2ui-v09-surface.test.ts",
26995
- "line": 247,
27147
+ "line": 261,
26996
27148
  "title": "one untrusted update taints a trusted surface, a later trusted update does not launder it, and the approval does not advance; an all-trusted surface does",
26997
27149
  "explicitId": "openwop.requirement.0209.taint-sticky",
26998
27150
  "citations": [
@@ -27265,7 +27417,7 @@
27265
27417
  {
27266
27418
  "id": "openwop.it.v2-bound-id-kinds.subscriptionid-the-webhookid-a-host-emits-on-a-delivery-is-the-one-it-minted",
27267
27419
  "file": "v2-bound-id-kinds.test.ts",
27268
- "line": 132,
27420
+ "line": 140,
27269
27421
  "title": "subscriptionId: the webhookId a host EMITS on a delivery is the one it minted",
27270
27422
  "explicitId": "openwop.requirement.0187.bound-id-kinds.webhook-emitted",
27271
27423
  "citations": [
@@ -27284,7 +27436,7 @@
27284
27436
  {
27285
27437
  "id": "openwop.it.v2-bound-id-kinds.interruptid-the-id-a-suspension-puts-on-the-wire-is-bound",
27286
27438
  "file": "v2-bound-id-kinds.test.ts",
27287
- "line": 179,
27439
+ "line": 192,
27288
27440
  "title": "interruptId: the id a suspension puts on the wire is bound",
27289
27441
  "explicitId": null,
27290
27442
  "citations": []
@@ -27292,7 +27444,7 @@
27292
27444
  {
27293
27445
  "id": "openwop.it.v2-bound-id-kinds.effectid-every-row-get-runs-runid-effects-serves-is-bound",
27294
27446
  "file": "v2-bound-id-kinds.test.ts",
27295
- "line": 200,
27447
+ "line": 213,
27296
27448
  "title": "effectId: every row GET /runs/{runId}/effects serves is bound",
27297
27449
  "explicitId": "openwop.requirement.0187.bound-id-kinds.per-kind",
27298
27450
  "citations": [
@@ -27305,7 +27457,7 @@
27305
27457
  {
27306
27458
  "id": "openwop.it.v2-bound-id-kinds.deliveryid-every-record-in-the-dead-letter-read-carries-a-bound-id-in-the-caller",
27307
27459
  "file": "v2-bound-id-kinds.test.ts",
27308
- "line": 215,
27460
+ "line": 228,
27309
27461
  "title": "deliveryId: every record in the dead-letter read carries a bound id in the caller's tenant",
27310
27462
  "explicitId": "openwop.requirement.0187.bound-id-kinds.per-kind",
27311
27463
  "citations": [
@@ -27815,7 +27967,7 @@
27815
27967
  {
27816
27968
  "id": "openwop.it.v2-content-locale-keys.an-advertised-extended-content-locale-is-written-and-delivered",
27817
27969
  "file": "v2-content-locale-keys.test.ts",
27818
- "line": 51,
27970
+ "line": 56,
27819
27971
  "title": "an advertised extended content locale is written and delivered",
27820
27972
  "explicitId": "openwop.requirement.0206.delivery-extended-locale",
27821
27973
  "citations": [
@@ -28883,10 +29035,10 @@
28883
29035
  ]
28884
29036
  },
28885
29037
  {
28886
- "id": "openwop.it.v2-idempotency-in-flight.concurrent-same-key-creates-yield-one-run-each-loser-is-a-marked-replay-of-a-fin",
29038
+ "id": "openwop.it.v2-idempotency-in-flight.concurrent-same-key-creates-yield-exactly-one-run",
28887
29039
  "file": "v2-idempotency-in-flight.test.ts",
28888
- "line": 47,
28889
- "title": "concurrent same-key creates yield one run; each loser is a marked replay of a final outcome or 409 idempotency_in_flight with no retry timing in details",
29040
+ "line": 101,
29041
+ "title": "concurrent same-key creates yield exactly one run",
28890
29042
  "explicitId": "openwop.requirement.0213.in-flight-one-winner",
28891
29043
  "citations": [
28892
29044
  {
@@ -28898,7 +29050,16 @@
28898
29050
  "section": "spec/v2/core/idempotency.md Concurrency",
28899
29051
  "requirement": null,
28900
29052
  "interpolated": true
28901
- },
29053
+ }
29054
+ ]
29055
+ },
29056
+ {
29057
+ "id": "openwop.it.v2-idempotency-in-flight.each-loser-is-a-marked-replay-of-a-final-outcome-or-409-idempotency-in-flight-wi",
29058
+ "file": "v2-idempotency-in-flight.test.ts",
29059
+ "line": 109,
29060
+ "title": "each loser is a marked replay of a final outcome, or 409 idempotency_in_flight with no retry timing in details",
29061
+ "explicitId": "openwop.requirement.0213.in-flight-loser-outcome",
29062
+ "citations": [
28902
29063
  {
28903
29064
  "section": "spec/v2/core/idempotency.md Concurrency",
28904
29065
  "requirement": null,
@@ -30566,7 +30727,7 @@
30566
30727
  {
30567
30728
  "id": "openwop.it.v2-oauth-client-pkce-state-iss.a-callback-authenticated-as-another-subject-makes-no-token-request-and-stores-no",
30568
30729
  "file": "v2-oauth-client-pkce-state-iss.test.ts",
30569
- "line": 123,
30730
+ "line": 129,
30570
30731
  "title": "a callback authenticated as another Subject makes no token request and stores nothing",
30571
30732
  "explicitId": null,
30572
30733
  "citations": [
@@ -30589,7 +30750,7 @@
30589
30750
  {
30590
30751
  "id": "openwop.it.v2-oauth-client-pkce-state-iss.a-wrong-or-missing-iss-with-authorization-response-iss-parameter-supported-makes",
30591
30752
  "file": "v2-oauth-client-pkce-state-iss.test.ts",
30592
- "line": 145,
30753
+ "line": 151,
30593
30754
  "title": "a wrong or missing iss (with authorization_response_iss_parameter_supported) makes no token request",
30594
30755
  "explicitId": null,
30595
30756
  "citations": [
@@ -30613,7 +30774,7 @@
30613
30774
  {
30614
30775
  "id": "openwop.it.v2-oauth-client-pkce-state-iss.issuer-less-providers-get-redirect-uris-no-other-provider-shares",
30615
30776
  "file": "v2-oauth-client-pkce-state-iss.test.ts",
30616
- "line": 173,
30777
+ "line": 179,
30617
30778
  "title": "issuer-less providers get redirect URIs no other provider shares",
30618
30779
  "explicitId": null,
30619
30780
  "citations": [
@@ -30631,7 +30792,7 @@
30631
30792
  {
30632
30793
  "id": "openwop.it.v2-oauth-client-pkce-state-iss.the-redirect-uri-is-fixed-per-provider-whatever-the-request-carries",
30633
30794
  "file": "v2-oauth-client-pkce-state-iss.test.ts",
30634
- "line": 189,
30795
+ "line": 195,
30635
30796
  "title": "the redirect URI is fixed per provider whatever the request carries",
30636
30797
  "explicitId": null,
30637
30798
  "citations": [
@@ -32718,7 +32879,7 @@
32718
32879
  {
32719
32880
  "id": "openwop.it.v2-webhook-delivery-shape.a-major-2-subscriber-receives-the-v2-rendering-the-delivery-validates-and-run-st",
32720
32881
  "file": "v2-webhook-delivery-shape.test.ts",
32721
- "line": 220,
32882
+ "line": 217,
32722
32883
  "title": "a major-2 subscriber receives the v2 rendering: the delivery validates, and run.started.owner carries subject, never principal",
32723
32884
  "explicitId": "openwop.requirement.0171.webhook-delivery-shape",
32724
32885
  "citations": [
@@ -32749,7 +32910,7 @@
32749
32910
  {
32750
32911
  "id": "openwop.it.v2-webhook-delivery-shape.a-major-1-subscriber-still-receives-the-v1-rendering-the-v1-wire-does-not-move-m",
32751
32912
  "file": "v2-webhook-delivery-shape.test.ts",
32752
- "line": 240,
32913
+ "line": 237,
32753
32914
  "title": "a major-1 subscriber still receives the v1 rendering — the v1 wire does not move mid-overlap",
32754
32915
  "explicitId": "openwop.requirement.0171.webhook-delivery-shape",
32755
32916
  "citations": [
@@ -32767,7 +32928,7 @@
32767
32928
  {
32768
32929
  "id": "openwop.it.v2-webhook-delivery-shape.a-seeded-era-2-run-is-delivered-projected-too-the-fan-out-branch-a-fresh-run-can",
32769
32930
  "file": "v2-webhook-delivery-shape.test.ts",
32770
- "line": 264,
32931
+ "line": 261,
32771
32932
  "title": "a seeded era-2 run is delivered projected too — the fan-out branch a fresh run cannot reach (seam-gated)",
32772
32933
  "explicitId": "openwop.requirement.0171.webhook-delivery-shape",
32773
32934
  "citations": [
@@ -32785,7 +32946,7 @@
32785
32946
  {
32786
32947
  "id": "openwop.it.v2-webhook-durable-delivery.a-failed-attempt-is-retried-and-the-event-is-delivered-at-least-once",
32787
32948
  "file": "v2-webhook-durable-delivery.test.ts",
32788
- "line": 235,
32949
+ "line": 238,
32789
32950
  "title": "a failed attempt is retried and the event is delivered at least once",
32790
32951
  "explicitId": "openwop.requirement.0173.webhook-durable-delivery",
32791
32952
  "citations": [
@@ -32795,7 +32956,8 @@
32795
32956
  },
32796
32957
  {
32797
32958
  "section": "webhooks.md §Durability",
32798
- "requirement": "the host MUST attempt delivery of run.completed for THIS run to the registered subscriber"
32959
+ "requirement": null,
32960
+ "interpolated": true
32799
32961
  },
32800
32962
  {
32801
32963
  "section": "webhooks.md §Durability",
@@ -32816,7 +32978,7 @@
32816
32978
  {
32817
32979
  "id": "openwop.it.v2-webhook-durable-delivery.an-exhausted-delivery-is-dead-lettered-never-dropped",
32818
32980
  "file": "v2-webhook-durable-delivery.test.ts",
32819
- "line": 323,
32981
+ "line": 339,
32820
32982
  "title": "an exhausted delivery is dead-lettered, never dropped",
32821
32983
  "explicitId": "openwop.requirement.0173.webhook-durable-delivery.dead-letter",
32822
32984
  "citations": [
@@ -32850,7 +33012,7 @@
32850
33012
  {
32851
33013
  "id": "openwop.it.v2-webhook-durable-delivery.the-dead-letter-read-is-served-and-its-records-carry-no-payload",
32852
33014
  "file": "v2-webhook-durable-delivery.test.ts",
32853
- "line": 417,
33015
+ "line": 433,
32854
33016
  "title": "the dead-letter read is served and its records carry no payload",
32855
33017
  "explicitId": "openwop.requirement.0188.dead-letter-read",
32856
33018
  "citations": [
@@ -32863,7 +33025,7 @@
32863
33025
  {
32864
33026
  "id": "openwop.it.v2-webhook-durable-delivery.a-dead-letter-record-carries-no-delivered-payload",
32865
33027
  "file": "v2-webhook-durable-delivery.test.ts",
32866
- "line": 438,
33028
+ "line": 454,
32867
33029
  "title": "a dead-letter record carries no delivered payload",
32868
33030
  "explicitId": "openwop.requirement.0188.dead-letter-content-free",
32869
33031
  "citations": [
@@ -33990,7 +34152,7 @@
33990
34152
  {
33991
34153
  "id": "openwop.it.webhook-signed-delivery.host-posts-run-events-to-subscriber-with-valid-x-openwop-signature",
33992
34154
  "file": "webhook-signed-delivery.test.ts",
33993
- "line": 169,
34155
+ "line": 168,
33994
34156
  "title": "host POSTs run events to subscriber with valid X-openwop-Signature",
33995
34157
  "explicitId": "openwop.it.webhook-signed-delivery.host-posts-run-events-to-subscriber-with-valid-x-openwop-signature",
33996
34158
  "citations": [
@@ -34041,7 +34203,7 @@
34041
34203
  {
34042
34204
  "id": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
34043
34205
  "file": "webhook-signed-delivery.test.ts",
34044
- "line": 410,
34206
+ "line": 423,
34045
34207
  "title": "control: with a tunnel wired, the host still refuses the loopback receiver",
34046
34208
  "explicitId": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
34047
34209
  "citations": [
@@ -40412,6 +40574,48 @@
40412
40574
  }
40413
40575
  ]
40414
40576
  },
40577
+ {
40578
+ "id": "openwop.it.v1-webhook-unregister-contract.the-tenantid-the-v1-prose-requires-on-unregister-is-a-required-query-parameter-o",
40579
+ "file": "v1-webhook-unregister-contract.test.ts",
40580
+ "line": 68,
40581
+ "title": "the tenantId the v1 prose requires on unregister is a required query parameter of api/openapi.yaml unregisterWebhook",
40582
+ "explicitId": "openwop.requirement.webhooks.v1-unregister-tenantid-in-contract",
40583
+ "citations": [
40584
+ {
40585
+ "section": "spec/v1/webhooks.md §Unregister",
40586
+ "requirement": "spec/v1/webhooks.md §Unregister MUST still require the tenantId query parameter — this leg is only meaningful while it does"
40587
+ },
40588
+ {
40589
+ "section": "spec/v1/webhooks.md §Unregister",
40590
+ "requirement": "api/openapi.yaml MUST define DELETE /v1/webhooks/{webhookId}"
40591
+ },
40592
+ {
40593
+ "section": "spec/v1/webhooks.md §Unregister",
40594
+ "requirement": "the v1 operation is unregisterWebhook"
40595
+ },
40596
+ {
40597
+ "section": "spec/v1/webhooks.md §Unregister",
40598
+ "requirement": "unregisterWebhook MUST declare `tenantId` as a REQUIRED query parameter — the prose requires it, and a client generated from a contract that omits it cannot issue a conforming request"
40599
+ }
40600
+ ]
40601
+ },
40602
+ {
40603
+ "id": "openwop.it.v1-webhook-unregister-contract.the-v2-twin-carries-the-tenant-in-its-id-and-does-not-grow-the-v1-query-paramete",
40604
+ "file": "v1-webhook-unregister-contract.test.ts",
40605
+ "line": 87,
40606
+ "title": "the v2 twin carries the tenant in its id and does not grow the v1 query parameter",
40607
+ "explicitId": "openwop.requirement.webhooks.v2-unregister-no-tenantid-query",
40608
+ "citations": [
40609
+ {
40610
+ "section": "api/v2/openapi.yaml unregisterWebhook",
40611
+ "requirement": "api/v2/openapi.yaml MUST define DELETE /webhooks/{webhookId}"
40612
+ },
40613
+ {
40614
+ "section": "identity.md §5 (RFC 0187 §A.1)",
40615
+ "requirement": "the v2 unregisterWebhook MUST NOT declare a tenantId parameter — v2 carries the tenant inside the tenant-bound webhookId, and a second tenant source could disagree with it"
40616
+ }
40617
+ ]
40618
+ },
40415
40619
  {
40416
40620
  "id": "openwop.it.v2-alias-covers-reword.the-corpus-gate-script-exits-0",
40417
40621
  "file": "v2-alias-covers-reword.test.ts",
@@ -40502,6 +40706,50 @@
40502
40706
  }
40503
40707
  ]
40504
40708
  },
40709
+ {
40710
+ "id": "openwop.it.v2-bundle-witness-preimage.every-committed-v3-bundle-re-derives-its-witnesssha256-from-the-prose-preimage",
40711
+ "file": "v2-bundle-witness-preimage.test.ts",
40712
+ "line": 66,
40713
+ "title": "every committed v3 bundle re-derives its witnessSha256 from the prose preimage",
40714
+ "explicitId": "openwop.it.v2-bundle-witness-preimage.every-committed-v3-bundle-re-derives-its-witnesssha256-from-the-prose-preimage",
40715
+ "citations": [
40716
+ {
40717
+ "section": "RFC 0212 §C · spec/v2/core/conformance.md §\"Canonical JSON\"",
40718
+ "requirement": "the spec repo MUST carry committed v3 bundles for this census to mean anything"
40719
+ },
40720
+ {
40721
+ "section": "RFC 0212 §C · spec/v2/core/conformance.md §\"Canonical JSON\"",
40722
+ "requirement": "the census MUST cover every committed v3 bundle"
40723
+ },
40724
+ {
40725
+ "section": "RFC 0212 §C · spec/v2/core/conformance.md §\"Canonical JSON\"",
40726
+ "requirement": null,
40727
+ "interpolated": true
40728
+ },
40729
+ {
40730
+ "section": "RFC 0212 §C · spec/v2/core/conformance.md §\"Canonical JSON\"",
40731
+ "requirement": null,
40732
+ "interpolated": true
40733
+ }
40734
+ ]
40735
+ },
40736
+ {
40737
+ "id": "openwop.it.v2-bundle-witness-preimage.the-row-comparator-is-code-unit-order-which-a-locale-collation-contradicts",
40738
+ "file": "v2-bundle-witness-preimage.test.ts",
40739
+ "line": 80,
40740
+ "title": "the row comparator is code-unit order, which a locale collation contradicts",
40741
+ "explicitId": "openwop.it.v2-bundle-witness-preimage.the-row-comparator-is-code-unit-order-which-a-locale-collation-contradicts",
40742
+ "citations": [
40743
+ {
40744
+ "section": "RFC 0212 §C · spec/v2/core/conformance.md §\"Canonical JSON\"",
40745
+ "requirement": "the fixture ids MUST order differently under code units and Czech collation, or this leg proves nothing"
40746
+ },
40747
+ {
40748
+ "section": "RFC 0212 §C · spec/v2/core/conformance.md §\"Canonical JSON\"",
40749
+ "requirement": "witnessSha256 rows MUST sort by UTF-16 code units; a locale-sensitive comparator MUST NOT be used"
40750
+ }
40751
+ ]
40752
+ },
40505
40753
  {
40506
40754
  "id": "openwop.it.v2-corpus-tag-pinned.every-vendoring-consumer-in-the-cross-repo-inventory-records-a-published-corpus",
40507
40755
  "file": "v2-corpus-tag-pinned.test.ts",
@@ -40886,7 +41134,7 @@
40886
41134
  {
40887
41135
  "id": "openwop.it.v2-lane-exp-only-schema.the-gate-refuses-an-enum-member-with-no-2-2-row-and-a-suite-map-the-table-does-n",
40888
41136
  "file": "v2-lane-exp-only-schema.test.ts",
40889
- "line": 117,
41137
+ "line": 127,
40890
41138
  "title": "the gate refuses an enum member with no §2.2 row, and a suite map the table does not license",
40891
41139
  "explicitId": null,
40892
41140
  "citations": [
@@ -41152,6 +41400,24 @@
41152
41400
  }
41153
41401
  ]
41154
41402
  },
41403
+ {
41404
+ "id": "openwop.it.v2-push-credential-coherent.the-push-credential-exception-is-stated-wherever-the-rule-it-excepts-is-read-and",
41405
+ "file": "v2-push-credential-coherent.test.ts",
41406
+ "line": 71,
41407
+ "title": "the push-credential exception is stated wherever the rule it excepts is read, and each regression is refused",
41408
+ "explicitId": "openwop.requirement.0214.push-credential-coherent",
41409
+ "citations": [
41410
+ {
41411
+ "section": "RFCS/0214 §A–§B; spec/v2/core/security-defaults.md §\"Onward hops\"; spec/v2/core/interop.md §\"A2A push delivery\"",
41412
+ "requirement": "every clause of the RFC 0214 correction is present in the tracked corpus"
41413
+ },
41414
+ {
41415
+ "section": "RFCS/0214 §A–§B; spec/v2/core/security-defaults.md §\"Onward hops\"; spec/v2/core/interop.md §\"A2A push delivery\"",
41416
+ "requirement": null,
41417
+ "interpolated": true
41418
+ }
41419
+ ]
41420
+ },
41155
41421
  {
41156
41422
  "id": "openwop.it.v2-release-identity.the-corpus-gate-script-exits-0",
41157
41423
  "file": "v2-release-identity.test.ts",