@openwop/openwop-conformance 2.36.1 → 2.37.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.
- package/CHANGELOG.md +11 -0
- package/README.md +4 -3
- package/coverage.md +1 -0
- package/dist/spec-artifacts.lock.json +2 -2
- package/package.json +2 -2
- package/requirements.json +438 -53
- package/scenario-majors.json +14 -2
- package/schemas/CORPUS-STAMP.json +27 -27
- package/src/lib/a2a-error-info.ts +44 -0
- package/src/lib/a2a-fake-peer.ts +50 -7
- package/src/lib/effect-receiver.ts +135 -0
- package/src/lib/front-mux.ts +95 -0
- package/src/lib/mcp-fake-server.ts +15 -4
- package/src/lib/oidc-issuer.ts +15 -5
- package/src/scenarios/a2a-1-0-agent-card.test.ts +19 -7
- package/src/scenarios/v2-a2a-client-error-details.test.ts +70 -0
- package/src/scenarios/v2-a2a-operation-map.test.ts +84 -2
- package/src/scenarios/v2-durability-recovery.test.ts +83 -35
- package/src/scenarios/v2-idempotency-in-flight.test.ts +77 -0
- package/src/scenarios/v2-interrupt-resolve-terminal.test.ts +107 -0
- package/src/scenarios/v2-mcp-mount-map.test.ts +41 -0
- package/src/scenarios/v2-negotiation-authenticated.test.ts +13 -0
- package/src/scenarios/v2-sse-last-event-id-cursor.test.ts +133 -0
- package/src/scenarios/v2-terminal-event-once.test.ts +15 -21
package/requirements.json
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
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":
|
|
6
|
-
"tests":
|
|
7
|
-
"withStableId":
|
|
5
|
+
"files": 628,
|
|
6
|
+
"tests": 2401,
|
|
7
|
+
"withStableId": 2401,
|
|
8
8
|
"interpolatedTitles": 0,
|
|
9
|
-
"explicitIds":
|
|
9
|
+
"explicitIds": 2291
|
|
10
10
|
},
|
|
11
11
|
"records": [
|
|
12
12
|
{
|
|
13
13
|
"id": "openwop.it.a2a-1-0-agent-card.the-agent-card-is-1-0-shaped-supportedinterfaces-no-top-level-url-protocolversio",
|
|
14
14
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
15
|
-
"line":
|
|
15
|
+
"line": 66,
|
|
16
16
|
"title": "the Agent Card is 1.0-shaped: supportedInterfaces[], no top-level url/protocolVersion",
|
|
17
17
|
"explicitId": "openwop.it.a2a-1-0-agent-card.the-agent-card-is-1-0-shaped-supportedinterfaces-no-top-level-url-protocolversio",
|
|
18
18
|
"citations": [
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
{
|
|
43
43
|
"id": "openwop.it.a2a-1-0-agent-card.the-card-shape-follows-the-era-asked-for-a2a-version-0-3-on-the-get-returns-the",
|
|
44
44
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
45
|
-
"line":
|
|
45
|
+
"line": 85,
|
|
46
46
|
"title": "the card shape follows the era asked for: A2A-Version: 0.3 on the GET returns the 0.3 card from the same peer",
|
|
47
47
|
"explicitId": "openwop.it.a2a-1-0-agent-card.the-card-shape-follows-the-era-asked-for-a2a-version-0-3-on-the-get-returns-the",
|
|
48
48
|
"citations": [
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
{
|
|
56
56
|
"id": "openwop.it.a2a-1-0-agent-card.a-legacy-only-peer-serves-the-0-3-card-shape-follows-revision-not-calendar",
|
|
57
57
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
58
|
-
"line":
|
|
58
|
+
"line": 104,
|
|
59
59
|
"title": "a legacy-only peer serves the 0.3 card — shape follows revision, not calendar",
|
|
60
60
|
"explicitId": "openwop.it.a2a-1-0-agent-card.a-legacy-only-peer-serves-the-0-3-card-shape-follows-revision-not-calendar",
|
|
61
61
|
"citations": [
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
{
|
|
69
69
|
"id": "openwop.it.a2a-1-0-agent-card.a2a-version-absent-0-3-semantics-message-send-returns-a-0-3-task",
|
|
70
70
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
71
|
-
"line":
|
|
71
|
+
"line": 117,
|
|
72
72
|
"title": "A2A-Version absent ⇒ 0.3 semantics; message/send returns a 0.3 task",
|
|
73
73
|
"explicitId": "openwop.it.a2a-1-0-agent-card.a2a-version-absent-0-3-semantics-message-send-returns-a-0-3-task",
|
|
74
74
|
"citations": [
|
|
@@ -81,20 +81,24 @@
|
|
|
81
81
|
{
|
|
82
82
|
"id": "openwop.it.a2a-1-0-agent-card.an-unsupported-version-fails-32009-version-not-supported-with-supportedversions",
|
|
83
83
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
84
|
-
"line":
|
|
84
|
+
"line": 124,
|
|
85
85
|
"title": "an unsupported version fails -32009 VERSION_NOT_SUPPORTED with supportedVersions[] (HTTP 400)",
|
|
86
86
|
"explicitId": "openwop.it.a2a-1-0-agent-card.an-unsupported-version-fails-32009-version-not-supported-with-supportedversions",
|
|
87
87
|
"citations": [
|
|
88
88
|
{
|
|
89
89
|
"section": "RFC 0152 §A/§B/§C/§D",
|
|
90
90
|
"requirement": "an unsupported version fails -32009 VERSION_NOT_SUPPORTED with supportedVersions[] (HTTP 400)"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"section": "RFC 0152 §A/§B/§C/§D; A2A 1.0.1 §9.5",
|
|
94
|
+
"requirement": "error.data is an array of Any carrying google.rpc.ErrorInfo"
|
|
91
95
|
}
|
|
92
96
|
]
|
|
93
97
|
},
|
|
94
98
|
{
|
|
95
99
|
"id": "openwop.it.a2a-1-0-agent-card.a-1-0-only-peer-rejects-a-header-less-request-which-is-0-3-by-rule",
|
|
96
100
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
97
|
-
"line":
|
|
101
|
+
"line": 134,
|
|
98
102
|
"title": "a 1.0-only peer rejects a header-less request (which is 0.3 by rule)",
|
|
99
103
|
"explicitId": "openwop.it.a2a-1-0-agent-card.a-1-0-only-peer-rejects-a-header-less-request-which-is-0-3-by-rule",
|
|
100
104
|
"citations": [
|
|
@@ -107,7 +111,7 @@
|
|
|
107
111
|
{
|
|
108
112
|
"id": "openwop.it.a2a-1-0-agent-card.sendmessage-1-0-returns-task-with-task-state-role-part-oneof-no-kind-status-time",
|
|
109
113
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
110
|
-
"line":
|
|
114
|
+
"line": 146,
|
|
111
115
|
"title": "SendMessage @1.0 returns { task } with TASK_STATE_*, ROLE_*, Part oneof, no kind, status.timestamp",
|
|
112
116
|
"explicitId": "openwop.it.a2a-1-0-agent-card.sendmessage-1-0-returns-task-with-task-state-role-part-oneof-no-kind-status-time",
|
|
113
117
|
"citations": [
|
|
@@ -128,7 +132,7 @@
|
|
|
128
132
|
{
|
|
129
133
|
"id": "openwop.it.a2a-1-0-agent-card.gettask-canceltask-listtasks-per-d-1-incl-task-not-cancelable-on-a-terminal-task",
|
|
130
134
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
131
|
-
"line":
|
|
135
|
+
"line": 164,
|
|
132
136
|
"title": "GetTask / CancelTask / ListTasks per §D.1, incl. TASK_NOT_CANCELABLE on a terminal task",
|
|
133
137
|
"explicitId": "openwop.it.a2a-1-0-agent-card.gettask-canceltask-listtasks-per-d-1-incl-task-not-cancelable-on-a-terminal-task",
|
|
134
138
|
"citations": [
|
|
@@ -141,7 +145,7 @@
|
|
|
141
145
|
{
|
|
142
146
|
"id": "openwop.it.a2a-1-0-agent-card.a-0-3-method-name-under-a-1-0-header-is-method-not-found-loudly",
|
|
143
147
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
144
|
-
"line":
|
|
148
|
+
"line": 182,
|
|
145
149
|
"title": "a 0.3 method name under a 1.0 header is method-not-found — loudly",
|
|
146
150
|
"explicitId": "openwop.it.a2a-1-0-agent-card.a-0-3-method-name-under-a-1-0-header-is-method-not-found-loudly",
|
|
147
151
|
"citations": [
|
|
@@ -154,7 +158,7 @@
|
|
|
154
158
|
{
|
|
155
159
|
"id": "openwop.it.a2a-1-0-agent-card.streaming-is-honestly-unsupported-subscribetotask-unsupported-operation-matching",
|
|
156
160
|
"file": "a2a-1-0-agent-card.test.ts",
|
|
157
|
-
"line":
|
|
161
|
+
"line": 188,
|
|
158
162
|
"title": "streaming is honestly unsupported: SubscribeToTask ⇒ UNSUPPORTED_OPERATION, matching capabilities.streaming=false",
|
|
159
163
|
"explicitId": "openwop.it.a2a-1-0-agent-card.streaming-is-honestly-unsupported-subscribetotask-unsupported-operation-matching",
|
|
160
164
|
"citations": [
|
|
@@ -26473,10 +26477,24 @@
|
|
|
26473
26477
|
}
|
|
26474
26478
|
]
|
|
26475
26479
|
},
|
|
26480
|
+
{
|
|
26481
|
+
"id": "openwop.it.v2-a2a-client-error-details.a-peer-s-version-error-projects-to-interop-version-unsupported-whether-error-dat",
|
|
26482
|
+
"file": "v2-a2a-client-error-details.test.ts",
|
|
26483
|
+
"line": 45,
|
|
26484
|
+
"title": "a peer's version error projects to interop_version_unsupported whether error.data is an array or a legacy object",
|
|
26485
|
+
"explicitId": "openwop.requirement.0211.a2a-client-reads-either-shape",
|
|
26486
|
+
"citations": [
|
|
26487
|
+
{
|
|
26488
|
+
"section": "spec/v2/core/interop.md §\"The operation mappings\", A2A error details (RFC 0211 §F)",
|
|
26489
|
+
"requirement": null,
|
|
26490
|
+
"interpolated": true
|
|
26491
|
+
}
|
|
26492
|
+
]
|
|
26493
|
+
},
|
|
26476
26494
|
{
|
|
26477
26495
|
"id": "openwop.it.v2-a2a-operation-map.a-message-carrying-taskid-without-contextid-is-answered-with-the-task-s-contexti",
|
|
26478
26496
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26479
|
-
"line":
|
|
26497
|
+
"line": 134,
|
|
26480
26498
|
"title": "a message carrying taskId without contextId is answered with the task's contextId",
|
|
26481
26499
|
"explicitId": null,
|
|
26482
26500
|
"citations": [
|
|
@@ -26507,7 +26525,7 @@
|
|
|
26507
26525
|
{
|
|
26508
26526
|
"id": "openwop.it.v2-a2a-operation-map.a-message-whose-contextid-is-not-its-task-s-is-refused-invalid-parameters-and-ch",
|
|
26509
26527
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26510
|
-
"line":
|
|
26528
|
+
"line": 148,
|
|
26511
26529
|
"title": "a message whose contextId is not its task's is refused invalid-parameters and changes nothing",
|
|
26512
26530
|
"explicitId": null,
|
|
26513
26531
|
"citations": [
|
|
@@ -26534,7 +26552,7 @@
|
|
|
26534
26552
|
{
|
|
26535
26553
|
"id": "openwop.it.v2-a2a-operation-map.a-message-to-a-retained-terminal-task-is-refused-unsupportedoperationerror-and-a",
|
|
26536
26554
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26537
|
-
"line":
|
|
26555
|
+
"line": 163,
|
|
26538
26556
|
"title": "a message to a retained terminal task is refused UnsupportedOperationError, and appends no event",
|
|
26539
26557
|
"explicitId": null,
|
|
26540
26558
|
"citations": [
|
|
@@ -26561,7 +26579,7 @@
|
|
|
26561
26579
|
{
|
|
26562
26580
|
"id": "openwop.it.v2-a2a-operation-map.an-unknown-task-and-another-tenant-s-task-are-answered-by-the-same-tasknotfounde",
|
|
26563
26581
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26564
|
-
"line":
|
|
26582
|
+
"line": 178,
|
|
26565
26583
|
"title": "an unknown task and another tenant's task are answered by the same TaskNotFoundError",
|
|
26566
26584
|
"explicitId": null,
|
|
26567
26585
|
"citations": [
|
|
@@ -26581,15 +26599,20 @@
|
|
|
26581
26599
|
"interpolated": true
|
|
26582
26600
|
},
|
|
26583
26601
|
{
|
|
26584
|
-
"section": "interop.md §\"The operation mappings\"
|
|
26585
|
-
"requirement":
|
|
26602
|
+
"section": "spec/v2/core/interop.md §\"The operation mappings\", A2A error details (RFC 0211)",
|
|
26603
|
+
"requirement": null,
|
|
26604
|
+
"interpolated": true
|
|
26605
|
+
},
|
|
26606
|
+
{
|
|
26607
|
+
"section": "interop.md §\"The operation mappings\" Isolation; RFC 0211 §D (A2A 1.0.1 §3.3.2)",
|
|
26608
|
+
"requirement": "the foreign-tenant answer MUST be indistinguishable from the unknown-id answer: same HTTP status and the same normalised error details (@type, reason, domain, sorted metadata keys, minus an echo of the requested id)"
|
|
26586
26609
|
}
|
|
26587
26610
|
]
|
|
26588
26611
|
},
|
|
26589
26612
|
{
|
|
26590
26613
|
"id": "openwop.it.v2-a2a-operation-map.task-status-state-is-the-map-s-projection-of-the-run-status-at-every-observed-st",
|
|
26591
26614
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26592
|
-
"line":
|
|
26615
|
+
"line": 200,
|
|
26593
26616
|
"title": "Task.status.state is the map's projection of the run status at every observed state",
|
|
26594
26617
|
"explicitId": null,
|
|
26595
26618
|
"citations": [
|
|
@@ -26612,7 +26635,7 @@
|
|
|
26612
26635
|
{
|
|
26613
26636
|
"id": "openwop.it.v2-a2a-operation-map.the-json-rpc-error-codes-the-suite-can-cause-are-the-a2a-1-0-1-codes",
|
|
26614
26637
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26615
|
-
"line":
|
|
26638
|
+
"line": 225,
|
|
26616
26639
|
"title": "the JSON-RPC error codes the suite can cause are the A2A 1.0.1 codes",
|
|
26617
26640
|
"explicitId": null,
|
|
26618
26641
|
"citations": [
|
|
@@ -26635,7 +26658,7 @@
|
|
|
26635
26658
|
{
|
|
26636
26659
|
"id": "openwop.it.v2-a2a-operation-map.a-row-whose-requires-facet-is-not-advertised-is-refused-with-the-row-s-error",
|
|
26637
26660
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26638
|
-
"line":
|
|
26661
|
+
"line": 239,
|
|
26639
26662
|
"title": "a row whose requires facet is not advertised is refused with the row's error",
|
|
26640
26663
|
"explicitId": null,
|
|
26641
26664
|
"citations": [
|
|
@@ -26653,7 +26676,7 @@
|
|
|
26653
26676
|
{
|
|
26654
26677
|
"id": "openwop.it.v2-a2a-operation-map.listtasks-returns-only-what-listruns-returns-to-the-same-subject-tenant-and-cont",
|
|
26655
26678
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26656
|
-
"line":
|
|
26679
|
+
"line": 252,
|
|
26657
26680
|
"title": "ListTasks returns only what listRuns returns to the same Subject; tenant and contextId never select",
|
|
26658
26681
|
"explicitId": null,
|
|
26659
26682
|
"citations": [
|
|
@@ -26687,10 +26710,105 @@
|
|
|
26687
26710
|
}
|
|
26688
26711
|
]
|
|
26689
26712
|
},
|
|
26713
|
+
{
|
|
26714
|
+
"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
|
+
"file": "v2-a2a-operation-map.test.ts",
|
|
26716
|
+
"line": 285,
|
|
26717
|
+
"title": "an A2A error's data is an array carrying one ErrorInfo with the map row's reason and the A2A domain",
|
|
26718
|
+
"explicitId": null,
|
|
26719
|
+
"citations": [
|
|
26720
|
+
{
|
|
26721
|
+
"section": "spec/v2/core/interop.md §\"The operation mappings\" (RFC 0208)",
|
|
26722
|
+
"requirement": null,
|
|
26723
|
+
"interpolated": true
|
|
26724
|
+
},
|
|
26725
|
+
{
|
|
26726
|
+
"section": null,
|
|
26727
|
+
"requirement": null,
|
|
26728
|
+
"interpolated": true
|
|
26729
|
+
},
|
|
26730
|
+
{
|
|
26731
|
+
"section": null,
|
|
26732
|
+
"requirement": null,
|
|
26733
|
+
"interpolated": true
|
|
26734
|
+
},
|
|
26735
|
+
{
|
|
26736
|
+
"section": "spec/v2/core/interop.md §\"The operation mappings\", A2A error details (RFC 0211)",
|
|
26737
|
+
"requirement": null,
|
|
26738
|
+
"interpolated": true
|
|
26739
|
+
},
|
|
26740
|
+
{
|
|
26741
|
+
"section": null,
|
|
26742
|
+
"requirement": null,
|
|
26743
|
+
"interpolated": true
|
|
26744
|
+
}
|
|
26745
|
+
]
|
|
26746
|
+
},
|
|
26747
|
+
{
|
|
26748
|
+
"id": "openwop.it.v2-a2a-operation-map.no-response-on-the-card-s-json-rpc-interface-url-is-the-openwop-error-envelope",
|
|
26749
|
+
"file": "v2-a2a-operation-map.test.ts",
|
|
26750
|
+
"line": 306,
|
|
26751
|
+
"title": "no response on the card's JSON-RPC interface URL is the OpenWOP error envelope",
|
|
26752
|
+
"explicitId": null,
|
|
26753
|
+
"citations": [
|
|
26754
|
+
{
|
|
26755
|
+
"section": null,
|
|
26756
|
+
"requirement": null,
|
|
26757
|
+
"interpolated": true
|
|
26758
|
+
},
|
|
26759
|
+
{
|
|
26760
|
+
"section": "spec/v2/core/interop.md §\"The operation mappings\", A2A error details (RFC 0211)",
|
|
26761
|
+
"requirement": "every probe reached the interface"
|
|
26762
|
+
}
|
|
26763
|
+
]
|
|
26764
|
+
},
|
|
26765
|
+
{
|
|
26766
|
+
"id": "openwop.it.v2-a2a-operation-map.versionnotsupportederror-carries-errorinfo-version-not-supported-and-supportedve",
|
|
26767
|
+
"file": "v2-a2a-operation-map.test.ts",
|
|
26768
|
+
"line": 326,
|
|
26769
|
+
"title": "VersionNotSupportedError carries ErrorInfo VERSION_NOT_SUPPORTED, and supportedVersions is a comma-joined subset of the card",
|
|
26770
|
+
"explicitId": null,
|
|
26771
|
+
"citations": [
|
|
26772
|
+
{
|
|
26773
|
+
"section": "a2a.errors VersionNotSupportedError",
|
|
26774
|
+
"requirement": null,
|
|
26775
|
+
"interpolated": true
|
|
26776
|
+
},
|
|
26777
|
+
{
|
|
26778
|
+
"section": "spec/v2/core/interop.md §\"The operation mappings\", A2A error details (RFC 0211)",
|
|
26779
|
+
"requirement": null,
|
|
26780
|
+
"interpolated": true
|
|
26781
|
+
},
|
|
26782
|
+
{
|
|
26783
|
+
"section": null,
|
|
26784
|
+
"requirement": null,
|
|
26785
|
+
"interpolated": true
|
|
26786
|
+
}
|
|
26787
|
+
]
|
|
26788
|
+
},
|
|
26789
|
+
{
|
|
26790
|
+
"id": "openwop.it.v2-a2a-operation-map.an-http-json-interface-answers-an-a2a-error-with-google-rpc-status-carrying-the",
|
|
26791
|
+
"file": "v2-a2a-operation-map.test.ts",
|
|
26792
|
+
"line": 344,
|
|
26793
|
+
"title": "an HTTP+JSON interface answers an A2A error with google.rpc.Status carrying the ErrorInfo",
|
|
26794
|
+
"explicitId": null,
|
|
26795
|
+
"citations": [
|
|
26796
|
+
{
|
|
26797
|
+
"section": null,
|
|
26798
|
+
"requirement": null,
|
|
26799
|
+
"interpolated": true
|
|
26800
|
+
},
|
|
26801
|
+
{
|
|
26802
|
+
"section": null,
|
|
26803
|
+
"requirement": "the Status details MUST carry the ErrorInfo TASK_NOT_FOUND",
|
|
26804
|
+
"interpolated": true
|
|
26805
|
+
}
|
|
26806
|
+
]
|
|
26807
|
+
},
|
|
26690
26808
|
{
|
|
26691
26809
|
"id": "openwop.it.v2-a2a-operation-map.a-run-suspended-on-a-credential-interrupt-projects-to-task-state-auth-required-n",
|
|
26692
26810
|
"file": "v2-a2a-operation-map.test.ts",
|
|
26693
|
-
"line":
|
|
26811
|
+
"line": 359,
|
|
26694
26812
|
"title": "a run suspended on a credential interrupt projects to TASK_STATE_AUTH_REQUIRED, naming the provider and carrying connectUrl",
|
|
26695
26813
|
"explicitId": null,
|
|
26696
26814
|
"citations": [
|
|
@@ -28096,7 +28214,7 @@
|
|
|
28096
28214
|
{
|
|
28097
28215
|
"id": "openwop.it.v2-durability-recovery.accepted-work-survives-a-kill-before-dispatch-and-dispatches-on-resume",
|
|
28098
28216
|
"file": "v2-durability-recovery.test.ts",
|
|
28099
|
-
"line":
|
|
28217
|
+
"line": 280,
|
|
28100
28218
|
"title": "accepted work survives a kill before dispatch and dispatches on resume",
|
|
28101
28219
|
"explicitId": "openwop.requirement.0158.kill-after-accept",
|
|
28102
28220
|
"citations": [
|
|
@@ -28110,7 +28228,7 @@
|
|
|
28110
28228
|
{
|
|
28111
28229
|
"id": "openwop.it.v2-durability-recovery.work-executing-at-a-real-process-death-is-never-reported-complete-and-resumes",
|
|
28112
28230
|
"file": "v2-durability-recovery.test.ts",
|
|
28113
|
-
"line":
|
|
28231
|
+
"line": 334,
|
|
28114
28232
|
"title": "work executing at a real process death is never reported complete, and resumes",
|
|
28115
28233
|
"explicitId": "openwop.requirement.0158.kill-during-execution",
|
|
28116
28234
|
"citations": [
|
|
@@ -28129,7 +28247,7 @@
|
|
|
28129
28247
|
{
|
|
28130
28248
|
"id": "openwop.it.v2-durability-recovery.the-same-accepted-work-delivered-twice-fires-each-effect-exactly-once",
|
|
28131
28249
|
"file": "v2-durability-recovery.test.ts",
|
|
28132
|
-
"line":
|
|
28250
|
+
"line": 390,
|
|
28133
28251
|
"title": "the same accepted work delivered twice fires each effect exactly once",
|
|
28134
28252
|
"explicitId": "openwop.requirement.0158.duplicate-delivery",
|
|
28135
28253
|
"citations": [
|
|
@@ -28148,7 +28266,7 @@
|
|
|
28148
28266
|
{
|
|
28149
28267
|
"id": "openwop.it.v2-durability-recovery.the-declared-recovery-bound-is-derived-from-the-mechanism-that-enforces-it",
|
|
28150
28268
|
"file": "v2-durability-recovery.test.ts",
|
|
28151
|
-
"line":
|
|
28269
|
+
"line": 524,
|
|
28152
28270
|
"title": "the declared recovery bound is derived from the mechanism that enforces it",
|
|
28153
28271
|
"explicitId": "openwop.requirement.0158.bound-is-derived",
|
|
28154
28272
|
"citations": [
|
|
@@ -28162,7 +28280,7 @@
|
|
|
28162
28280
|
{
|
|
28163
28281
|
"id": "openwop.it.v2-durability-recovery.deterministically-failing-work-reaches-a-terminal-state-and-stops-being-retried",
|
|
28164
28282
|
"file": "v2-durability-recovery.test.ts",
|
|
28165
|
-
"line":
|
|
28283
|
+
"line": 555,
|
|
28166
28284
|
"title": "deterministically failing work reaches a terminal state and stops being retried",
|
|
28167
28285
|
"explicitId": "openwop.requirement.0158.poison-exhaustion",
|
|
28168
28286
|
"citations": [
|
|
@@ -28764,6 +28882,45 @@
|
|
|
28764
28882
|
}
|
|
28765
28883
|
]
|
|
28766
28884
|
},
|
|
28885
|
+
{
|
|
28886
|
+
"id": "openwop.it.v2-idempotency-in-flight.concurrent-same-key-creates-yield-one-run-each-loser-is-a-marked-replay-of-a-fin",
|
|
28887
|
+
"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",
|
|
28890
|
+
"explicitId": "openwop.requirement.0213.in-flight-one-winner",
|
|
28891
|
+
"citations": [
|
|
28892
|
+
{
|
|
28893
|
+
"section": "spec/v2/core/idempotency.md Concurrency",
|
|
28894
|
+
"requirement": null,
|
|
28895
|
+
"interpolated": true
|
|
28896
|
+
},
|
|
28897
|
+
{
|
|
28898
|
+
"section": "spec/v2/core/idempotency.md Concurrency",
|
|
28899
|
+
"requirement": null,
|
|
28900
|
+
"interpolated": true
|
|
28901
|
+
},
|
|
28902
|
+
{
|
|
28903
|
+
"section": "spec/v2/core/idempotency.md Concurrency",
|
|
28904
|
+
"requirement": null,
|
|
28905
|
+
"interpolated": true
|
|
28906
|
+
},
|
|
28907
|
+
{
|
|
28908
|
+
"section": "spec/v2/core/idempotency.md Concurrency",
|
|
28909
|
+
"requirement": null,
|
|
28910
|
+
"interpolated": true
|
|
28911
|
+
},
|
|
28912
|
+
{
|
|
28913
|
+
"section": "spec/v2/core/errors.md §Retry timing",
|
|
28914
|
+
"requirement": null,
|
|
28915
|
+
"interpolated": true
|
|
28916
|
+
},
|
|
28917
|
+
{
|
|
28918
|
+
"section": "spec/v2/core/idempotency.md Concurrency",
|
|
28919
|
+
"requirement": null,
|
|
28920
|
+
"interpolated": true
|
|
28921
|
+
}
|
|
28922
|
+
]
|
|
28923
|
+
},
|
|
28767
28924
|
{
|
|
28768
28925
|
"id": "openwop.it.v2-idempotency-key-grammar.a-22-character-key-inside-the-grammar-is-accepted",
|
|
28769
28926
|
"file": "v2-idempotency-key-grammar.test.ts",
|
|
@@ -28944,6 +29101,48 @@
|
|
|
28944
29101
|
}
|
|
28945
29102
|
]
|
|
28946
29103
|
},
|
|
29104
|
+
{
|
|
29105
|
+
"id": "openwop.it.v2-interrupt-resolve-terminal.a-run-scoped-resolve-after-the-run-was-cancelled-is-409-interrupt-already-resolv",
|
|
29106
|
+
"file": "v2-interrupt-resolve-terminal.test.ts",
|
|
29107
|
+
"line": 70,
|
|
29108
|
+
"title": "a run-scoped resolve after the run was cancelled is 409 interrupt_already_resolved",
|
|
29109
|
+
"explicitId": "openwop.requirement.0213.resolve-after-cancel",
|
|
29110
|
+
"citations": [
|
|
29111
|
+
{
|
|
29112
|
+
"section": "spec/v2/core/errors.md §One code per state",
|
|
29113
|
+
"requirement": null,
|
|
29114
|
+
"interpolated": true
|
|
29115
|
+
}
|
|
29116
|
+
]
|
|
29117
|
+
},
|
|
29118
|
+
{
|
|
29119
|
+
"id": "openwop.it.v2-interrupt-resolve-terminal.a-second-run-scoped-resolve-after-the-run-completed-is-409-interrupt-already-res",
|
|
29120
|
+
"file": "v2-interrupt-resolve-terminal.test.ts",
|
|
29121
|
+
"line": 83,
|
|
29122
|
+
"title": "a second run-scoped resolve after the run completed is 409 interrupt_already_resolved",
|
|
29123
|
+
"explicitId": "openwop.requirement.0213.resolve-after-complete",
|
|
29124
|
+
"citations": [
|
|
29125
|
+
{
|
|
29126
|
+
"section": "spec/v2/core/errors.md §One code per state",
|
|
29127
|
+
"requirement": null,
|
|
29128
|
+
"interpolated": true
|
|
29129
|
+
}
|
|
29130
|
+
]
|
|
29131
|
+
},
|
|
29132
|
+
{
|
|
29133
|
+
"id": "openwop.it.v2-interrupt-resolve-terminal.a-run-scoped-resolve-on-an-unknown-run-is-404-not-found",
|
|
29134
|
+
"file": "v2-interrupt-resolve-terminal.test.ts",
|
|
29135
|
+
"line": 96,
|
|
29136
|
+
"title": "a run-scoped resolve on an unknown run is 404 not_found",
|
|
29137
|
+
"explicitId": "openwop.requirement.0213.resolve-unknown-run",
|
|
29138
|
+
"citations": [
|
|
29139
|
+
{
|
|
29140
|
+
"section": "spec/v2/core/interrupt.md §Resolve",
|
|
29141
|
+
"requirement": null,
|
|
29142
|
+
"interpolated": true
|
|
29143
|
+
}
|
|
29144
|
+
]
|
|
29145
|
+
},
|
|
28947
29146
|
{
|
|
28948
29147
|
"id": "openwop.it.v2-interrupt-token-scheme.a-token-without-the-ow2-prefix-is-refused",
|
|
28949
29148
|
"file": "v2-interrupt-token-scheme.test.ts",
|
|
@@ -29413,7 +29612,7 @@
|
|
|
29413
29612
|
{
|
|
29414
29613
|
"id": "openwop.it.v2-mcp-mount-map.a-host-claiming-mcp-2026-07-28-lists-every-feature-the-map-requires-for-it",
|
|
29415
29614
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29416
|
-
"line":
|
|
29615
|
+
"line": 97,
|
|
29417
29616
|
"title": "a host claiming mcp-2026-07-28 lists every feature the map requires for it",
|
|
29418
29617
|
"explicitId": null,
|
|
29419
29618
|
"citations": [
|
|
@@ -29427,7 +29626,7 @@
|
|
|
29427
29626
|
{
|
|
29428
29627
|
"id": "openwop.it.v2-mcp-mount-map.server-discover-supportedversions-equals-mcp-revisions-with-resulttype-and-cache",
|
|
29429
29628
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29430
|
-
"line":
|
|
29629
|
+
"line": 104,
|
|
29431
29630
|
"title": "server/discover supportedVersions equals mcp.revisions, with resultType and cache hints",
|
|
29432
29631
|
"explicitId": null,
|
|
29433
29632
|
"citations": [
|
|
@@ -29457,7 +29656,7 @@
|
|
|
29457
29656
|
{
|
|
29458
29657
|
"id": "openwop.it.v2-mcp-mount-map.header-body-disagreement-fails-closed-32020-before-version-selection-an-unsuppor",
|
|
29459
29658
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29460
|
-
"line":
|
|
29659
|
+
"line": 116,
|
|
29461
29660
|
"title": "header/body disagreement fails closed -32020 before version selection; an unsupported revision is -32022",
|
|
29462
29661
|
"explicitId": null,
|
|
29463
29662
|
"citations": [
|
|
@@ -29490,7 +29689,7 @@
|
|
|
29490
29689
|
{
|
|
29491
29690
|
"id": "openwop.it.v2-mcp-mount-map.tools-list-needs-no-initialize-and-no-session-results-carry-cache-hints-and-agre",
|
|
29492
29691
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29493
|
-
"line":
|
|
29692
|
+
"line": 131,
|
|
29494
29693
|
"title": "tools/list needs no initialize and no session; results carry cache hints and agree across requests",
|
|
29495
29694
|
"explicitId": null,
|
|
29496
29695
|
"citations": [
|
|
@@ -29528,7 +29727,7 @@
|
|
|
29528
29727
|
{
|
|
29529
29728
|
"id": "openwop.it.v2-mcp-mount-map.tools-call-answers-a-completed-run-iserror-false-and-a-failed-run-iserror-true-n",
|
|
29530
29729
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29531
|
-
"line":
|
|
29730
|
+
"line": 147,
|
|
29532
29731
|
"title": "tools/call answers a completed run isError false and a failed run isError true, never a JSON-RPC error",
|
|
29533
29732
|
"explicitId": null,
|
|
29534
29733
|
"citations": [
|
|
@@ -29560,7 +29759,7 @@
|
|
|
29560
29759
|
{
|
|
29561
29760
|
"id": "openwop.it.v2-mcp-mount-map.a-run-started-by-tools-call-records-run-started-transport-mcp",
|
|
29562
29761
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29563
|
-
"line":
|
|
29762
|
+
"line": 162,
|
|
29564
29763
|
"title": "a run started by tools/call records run.started.transport mcp",
|
|
29565
29764
|
"explicitId": null,
|
|
29566
29765
|
"citations": [
|
|
@@ -29578,7 +29777,7 @@
|
|
|
29578
29777
|
{
|
|
29579
29778
|
"id": "openwop.it.v2-mcp-mount-map.a-suspending-tool-answers-inputrequiredresult-the-retry-resolves-it-requeststate",
|
|
29580
29779
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29581
|
-
"line":
|
|
29780
|
+
"line": 181,
|
|
29582
29781
|
"title": "a suspending tool answers InputRequiredResult; the retry resolves it; requestState is single use and forgery-proof",
|
|
29583
29782
|
"explicitId": null,
|
|
29584
29783
|
"citations": [
|
|
@@ -29617,10 +29816,49 @@
|
|
|
29617
29816
|
}
|
|
29618
29817
|
]
|
|
29619
29818
|
},
|
|
29819
|
+
{
|
|
29820
|
+
"id": "openwop.it.v2-mcp-mount-map.the-mrtr-input-request-key-is-the-open-interrupt-s-interruptid-never-the-node-it",
|
|
29821
|
+
"file": "v2-mcp-mount-map.test.ts",
|
|
29822
|
+
"line": 206,
|
|
29823
|
+
"title": "the MRTR input-request key is the open interrupt’s interruptId, never the node it suspended on",
|
|
29824
|
+
"explicitId": null,
|
|
29825
|
+
"citations": [
|
|
29826
|
+
{
|
|
29827
|
+
"section": "interop-map.json mcp.mrtr InputRequiredResult (host as server)",
|
|
29828
|
+
"requirement": null,
|
|
29829
|
+
"interpolated": true
|
|
29830
|
+
},
|
|
29831
|
+
{
|
|
29832
|
+
"section": "interop-map.json mcp.tasks.status waiting-approval",
|
|
29833
|
+
"requirement": null,
|
|
29834
|
+
"interpolated": true
|
|
29835
|
+
},
|
|
29836
|
+
{
|
|
29837
|
+
"section": "interop-map.json mcp.mrtr InputRequiredResult (host as server); schemas/v2/ids.schema.json interruptId",
|
|
29838
|
+
"requirement": null,
|
|
29839
|
+
"interpolated": true
|
|
29840
|
+
},
|
|
29841
|
+
{
|
|
29842
|
+
"section": "interop-map.json mcp.mrtr InputRequiredResult (host as server)",
|
|
29843
|
+
"requirement": null,
|
|
29844
|
+
"interpolated": true
|
|
29845
|
+
},
|
|
29846
|
+
{
|
|
29847
|
+
"section": "interop-map.json mcp.mrtr InputRequiredResult (host as server); runs.md node.suspended",
|
|
29848
|
+
"requirement": null,
|
|
29849
|
+
"interpolated": true
|
|
29850
|
+
},
|
|
29851
|
+
{
|
|
29852
|
+
"section": "interop-map.json mcp.mrtr inputResponses[key] (host as server)",
|
|
29853
|
+
"requirement": null,
|
|
29854
|
+
"interpolated": true
|
|
29855
|
+
}
|
|
29856
|
+
]
|
|
29857
|
+
},
|
|
29620
29858
|
{
|
|
29621
29859
|
"id": "openwop.it.v2-mcp-mount-map.a-list-that-differs-per-caller-is-cachescope-private",
|
|
29622
29860
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29623
|
-
"line":
|
|
29861
|
+
"line": 244,
|
|
29624
29862
|
"title": "a list that differs per caller is cacheScope private",
|
|
29625
29863
|
"explicitId": null,
|
|
29626
29864
|
"citations": [
|
|
@@ -29638,7 +29876,7 @@
|
|
|
29638
29876
|
{
|
|
29639
29877
|
"id": "openwop.it.v2-mcp-mount-map.unknown-meta-extension-keys-and-capabilities-extensions-are-opaque-processed-nor",
|
|
29640
29878
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29641
|
-
"line":
|
|
29879
|
+
"line": 261,
|
|
29642
29880
|
"title": "unknown _meta extension keys and capabilities.extensions are opaque: processed normally, granting nothing",
|
|
29643
29881
|
"explicitId": null,
|
|
29644
29882
|
"citations": [
|
|
@@ -29656,7 +29894,7 @@
|
|
|
29656
29894
|
{
|
|
29657
29895
|
"id": "openwop.it.v2-mcp-mount-map.an-unauthenticated-request-is-refused-at-the-boundary-unless-anonymousactor-is-a",
|
|
29658
29896
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29659
|
-
"line":
|
|
29897
|
+
"line": 270,
|
|
29660
29898
|
"title": "an unauthenticated request is refused at the boundary unless anonymousActor is advertised",
|
|
29661
29899
|
"explicitId": null,
|
|
29662
29900
|
"citations": [
|
|
@@ -29679,7 +29917,7 @@
|
|
|
29679
29917
|
{
|
|
29680
29918
|
"id": "openwop.it.v2-mcp-mount-map.a-credential-interrupt-is-answered-in-url-mode-url-connecturl-iserror-without-ur",
|
|
29681
29919
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29682
|
-
"line":
|
|
29920
|
+
"line": 287,
|
|
29683
29921
|
"title": "a credential interrupt is answered in URL mode (url = connectUrl), isError without URL support, and input_required again on an accept retry with no credential",
|
|
29684
29922
|
"explicitId": null,
|
|
29685
29923
|
"citations": [
|
|
@@ -29717,7 +29955,7 @@
|
|
|
29717
29955
|
{
|
|
29718
29956
|
"id": "openwop.it.v2-mcp-mount-map.form-mode-is-never-emitted-for-a-nested-schema-or-a-sensitive-format-password-fi",
|
|
29719
29957
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29720
|
-
"line":
|
|
29958
|
+
"line": 328,
|
|
29721
29959
|
"title": "form mode is never emitted for a nested schema or a sensitive (format password) field",
|
|
29722
29960
|
"explicitId": null,
|
|
29723
29961
|
"citations": [
|
|
@@ -30188,7 +30426,7 @@
|
|
|
30188
30426
|
{
|
|
30189
30427
|
"id": "openwop.it.v2-negotiation-authenticated.an-unauthenticated-mcp-exchange-cannot-lower-the-revision-below-preferredversion",
|
|
30190
30428
|
"file": "v2-negotiation-authenticated.test.ts",
|
|
30191
|
-
"line":
|
|
30429
|
+
"line": 117,
|
|
30192
30430
|
"title": "an unauthenticated MCP exchange cannot lower the revision below preferredVersion",
|
|
30193
30431
|
"explicitId": null,
|
|
30194
30432
|
"citations": []
|
|
@@ -31910,6 +32148,77 @@
|
|
|
31910
32148
|
}
|
|
31911
32149
|
]
|
|
31912
32150
|
},
|
|
32151
|
+
{
|
|
32152
|
+
"id": "openwop.it.v2-sse-last-event-id-cursor.a-last-event-id-past-the-log-is-an-exclusive-cursor-a-terminal-run-answers-200-w",
|
|
32153
|
+
"file": "v2-sse-last-event-id-cursor.test.ts",
|
|
32154
|
+
"line": 84,
|
|
32155
|
+
"title": "a Last-Event-ID past the log is an exclusive cursor: a terminal run answers 200 with no frame and closes",
|
|
32156
|
+
"explicitId": "openwop.requirement.0213.last-event-id-exclusive-cursor",
|
|
32157
|
+
"citations": [
|
|
32158
|
+
{
|
|
32159
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32160
|
+
"requirement": null,
|
|
32161
|
+
"interpolated": true
|
|
32162
|
+
},
|
|
32163
|
+
{
|
|
32164
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32165
|
+
"requirement": null,
|
|
32166
|
+
"interpolated": true
|
|
32167
|
+
},
|
|
32168
|
+
{
|
|
32169
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32170
|
+
"requirement": "on a terminal run the host MUST close the empty stream itself"
|
|
32171
|
+
}
|
|
32172
|
+
]
|
|
32173
|
+
},
|
|
32174
|
+
{
|
|
32175
|
+
"id": "openwop.it.v2-sse-last-event-id-cursor.a-last-event-id-that-is-not-a-non-negative-integer-when-refused-is-400-validatio",
|
|
32176
|
+
"file": "v2-sse-last-event-id-cursor.test.ts",
|
|
32177
|
+
"line": 99,
|
|
32178
|
+
"title": "a Last-Event-ID that is not a non-negative integer, when refused, is 400 validation_error",
|
|
32179
|
+
"explicitId": "openwop.requirement.0213.last-event-id-malformed",
|
|
32180
|
+
"citations": [
|
|
32181
|
+
{
|
|
32182
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32183
|
+
"requirement": null,
|
|
32184
|
+
"interpolated": true
|
|
32185
|
+
},
|
|
32186
|
+
{
|
|
32187
|
+
"section": "spec/v2/core/errors.md",
|
|
32188
|
+
"requirement": null,
|
|
32189
|
+
"interpolated": true
|
|
32190
|
+
}
|
|
32191
|
+
]
|
|
32192
|
+
},
|
|
32193
|
+
{
|
|
32194
|
+
"id": "openwop.it.v2-sse-last-event-id-cursor.the-cursor-never-changes-the-answer-for-a-run-the-caller-cannot-read",
|
|
32195
|
+
"file": "v2-sse-last-event-id-cursor.test.ts",
|
|
32196
|
+
"line": 108,
|
|
32197
|
+
"title": "the cursor never changes the answer for a run the caller cannot read",
|
|
32198
|
+
"explicitId": "openwop.requirement.0213.last-event-id-after-authorization",
|
|
32199
|
+
"citations": [
|
|
32200
|
+
{
|
|
32201
|
+
"section": "spec/v2/core/runs.md §Identity",
|
|
32202
|
+
"requirement": null,
|
|
32203
|
+
"interpolated": true
|
|
32204
|
+
},
|
|
32205
|
+
{
|
|
32206
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32207
|
+
"requirement": null,
|
|
32208
|
+
"interpolated": true
|
|
32209
|
+
},
|
|
32210
|
+
{
|
|
32211
|
+
"section": "spec/v2/core/runs.md §Identity",
|
|
32212
|
+
"requirement": null,
|
|
32213
|
+
"interpolated": true
|
|
32214
|
+
},
|
|
32215
|
+
{
|
|
32216
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32217
|
+
"requirement": null,
|
|
32218
|
+
"interpolated": true
|
|
32219
|
+
}
|
|
32220
|
+
]
|
|
32221
|
+
},
|
|
31913
32222
|
{
|
|
31914
32223
|
"id": "openwop.it.v2-sse-last-event-id.last-event-id-resumes-at-the-next-sequence-never-re-emits-the-resumption-point-l",
|
|
31915
32224
|
"file": "v2-sse-last-event-id.test.ts",
|
|
@@ -32152,7 +32461,7 @@
|
|
|
32152
32461
|
{
|
|
32153
32462
|
"id": "openwop.it.v2-terminal-event-once.every-run-observed-to-a-terminal-state-has-exactly-one-terminal-event-and-no-for",
|
|
32154
32463
|
"file": "v2-terminal-event-once.test.ts",
|
|
32155
|
-
"line":
|
|
32464
|
+
"line": 81,
|
|
32156
32465
|
"title": "every run observed to a terminal state has exactly one terminal event and no forward execution after it",
|
|
32157
32466
|
"explicitId": "openwop.requirement.0194.terminal-once",
|
|
32158
32467
|
"citations": [
|
|
@@ -32170,7 +32479,7 @@
|
|
|
32170
32479
|
{
|
|
32171
32480
|
"id": "openwop.it.v2-terminal-event-once.work-delivered-twice-still-leaves-one-terminal-event-and-no-forward-execution-af",
|
|
32172
32481
|
"file": "v2-terminal-event-once.test.ts",
|
|
32173
|
-
"line":
|
|
32482
|
+
"line": 109,
|
|
32174
32483
|
"title": "work delivered twice still leaves one terminal event and no forward execution after it",
|
|
32175
32484
|
"explicitId": "openwop.requirement.0194.terminal-once.duplicate-delivery",
|
|
32176
32485
|
"citations": [
|
|
@@ -37947,7 +38256,7 @@
|
|
|
37947
38256
|
{
|
|
37948
38257
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.spec-v1-operation-path-manifest-json-exists-in-the-corpus-layout-and-re-derives",
|
|
37949
38258
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
37950
|
-
"line":
|
|
38259
|
+
"line": 200,
|
|
37951
38260
|
"title": "spec/v1/operation-path-manifest.json exists in the corpus layout and re-derives byte-for-byte from api/openapi.yaml",
|
|
37952
38261
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.spec-v1-operation-path-manifest-json-exists-in-the-corpus-layout-and-re-derives",
|
|
37953
38262
|
"citations": [
|
|
@@ -37960,7 +38269,7 @@
|
|
|
37960
38269
|
{
|
|
37961
38270
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.every-operation-resolves-to-exactly-one-v1-segment-none-for-well-known-has-an-op",
|
|
37962
38271
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
37963
|
-
"line":
|
|
38272
|
+
"line": 212,
|
|
37964
38273
|
"title": "every operation resolves to exactly one /v1 segment (none for /.well-known/*), has an operationId, and ids are unique",
|
|
37965
38274
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.every-operation-resolves-to-exactly-one-v1-segment-none-for-well-known-has-an-op",
|
|
37966
38275
|
"citations": [
|
|
@@ -37989,7 +38298,7 @@
|
|
|
37989
38298
|
{
|
|
37990
38299
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.the-asyncapi-server-pathname-carries-the-version-segment-exactly-once",
|
|
37991
38300
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
37992
|
-
"line":
|
|
38301
|
+
"line": 231,
|
|
37993
38302
|
"title": "the AsyncAPI server pathname carries the version segment exactly once",
|
|
37994
38303
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.the-asyncapi-server-pathname-carries-the-version-segment-exactly-once",
|
|
37995
38304
|
"citations": [
|
|
@@ -38003,7 +38312,7 @@
|
|
|
38003
38312
|
{
|
|
38004
38313
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.every-addressed-channel-resolves-server-pathname-address-to-an-openapi-path-key",
|
|
38005
38314
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
38006
|
-
"line":
|
|
38315
|
+
"line": 237,
|
|
38007
38316
|
"title": "every addressed channel resolves (server pathname + address) to an OpenAPI path key that has a GET operation, with exactly one /v1",
|
|
38008
38317
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.every-addressed-channel-resolves-server-pathname-address-to-an-openapi-path-key",
|
|
38009
38318
|
"citations": [
|
|
@@ -38026,7 +38335,7 @@
|
|
|
38026
38335
|
{
|
|
38027
38336
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.logical-address-null-channels-are-the-only-ones-without-a-wire-address-and-they",
|
|
38028
38337
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
38029
|
-
"line":
|
|
38338
|
+
"line": 253,
|
|
38030
38339
|
"title": "logical (address: null) channels are the only ones without a wire address, and they are documented as logical",
|
|
38031
38340
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.logical-address-null-channels-are-the-only-ones-without-a-wire-address-and-they",
|
|
38032
38341
|
"citations": [
|
|
@@ -38040,13 +38349,14 @@
|
|
|
38040
38349
|
{
|
|
38041
38350
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.sdk-parity-expectations-json-covers-every-canonical-operation-with-the-same-meth",
|
|
38042
38351
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
38043
|
-
"line":
|
|
38352
|
+
"line": 262,
|
|
38044
38353
|
"title": "sdk/parity-expectations.json covers every canonical operation with the same method + path, declares nothing the contract lacks, and the TypeScript client issues every ts-typed path",
|
|
38045
38354
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.sdk-parity-expectations-json-covers-every-canonical-operation-with-the-same-meth",
|
|
38046
38355
|
"citations": [
|
|
38047
38356
|
{
|
|
38048
38357
|
"section": "RFC 0149 §A",
|
|
38049
|
-
"requirement":
|
|
38358
|
+
"requirement": null,
|
|
38359
|
+
"interpolated": true
|
|
38050
38360
|
},
|
|
38051
38361
|
{
|
|
38052
38362
|
"section": "RFC 0149 §A",
|
|
@@ -40027,6 +40337,81 @@
|
|
|
40027
40337
|
}
|
|
40028
40338
|
]
|
|
40029
40339
|
},
|
|
40340
|
+
{
|
|
40341
|
+
"id": "openwop.it.v1-webhook-rotation-contract.the-v1-rotation-route-the-prose-mandates-is-an-api-openapi-yaml-operation-with-t",
|
|
40342
|
+
"file": "v1-webhook-rotation-contract.test.ts",
|
|
40343
|
+
"line": 63,
|
|
40344
|
+
"title": "the v1 rotation route the prose mandates is an api/openapi.yaml operation with the scopes and refusals the prose names",
|
|
40345
|
+
"explicitId": "openwop.requirement.0201.v1-rotation-route-in-contract",
|
|
40346
|
+
"citations": [
|
|
40347
|
+
{
|
|
40348
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40349
|
+
"requirement": "spec/v1/webhooks.md §Rotation MUST still mandate `POST /v1/webhooks/{webhookId}/rotate-secret` — this leg is only meaningful while it does"
|
|
40350
|
+
},
|
|
40351
|
+
{
|
|
40352
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40353
|
+
"requirement": null,
|
|
40354
|
+
"interpolated": true
|
|
40355
|
+
},
|
|
40356
|
+
{
|
|
40357
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40358
|
+
"requirement": null,
|
|
40359
|
+
"interpolated": true
|
|
40360
|
+
},
|
|
40361
|
+
{
|
|
40362
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40363
|
+
"requirement": "the v1 operation MUST carry the same operationId as its v2 twin, so one SDK surface spans both majors"
|
|
40364
|
+
},
|
|
40365
|
+
{
|
|
40366
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40367
|
+
"requirement": null,
|
|
40368
|
+
"interpolated": true
|
|
40369
|
+
},
|
|
40370
|
+
{
|
|
40371
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40372
|
+
"requirement": null,
|
|
40373
|
+
"interpolated": true
|
|
40374
|
+
}
|
|
40375
|
+
]
|
|
40376
|
+
},
|
|
40377
|
+
{
|
|
40378
|
+
"id": "openwop.it.v1-webhook-rotation-contract.the-v1-rotation-request-takes-the-new-secret-and-the-response-returns-none",
|
|
40379
|
+
"file": "v1-webhook-rotation-contract.test.ts",
|
|
40380
|
+
"line": 105,
|
|
40381
|
+
"title": "the v1 rotation request takes the new secret and the response returns none",
|
|
40382
|
+
"explicitId": "openwop.requirement.0201.v1-rotation-response-carries-no-secret",
|
|
40383
|
+
"citations": [
|
|
40384
|
+
{
|
|
40385
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40386
|
+
"requirement": null,
|
|
40387
|
+
"interpolated": true
|
|
40388
|
+
},
|
|
40389
|
+
{
|
|
40390
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40391
|
+
"requirement": "the rotation request MUST require `secret`"
|
|
40392
|
+
},
|
|
40393
|
+
{
|
|
40394
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40395
|
+
"requirement": "the new secret MUST be constrained to the RFC 0201 §B.6 `whsec_<base64>` form"
|
|
40396
|
+
},
|
|
40397
|
+
{
|
|
40398
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40399
|
+
"requirement": "the 200 MUST return `rotatedAt`"
|
|
40400
|
+
},
|
|
40401
|
+
{
|
|
40402
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40403
|
+
"requirement": "the 200 MUST return `previousSecretExpiresAt` — a rotation whose overlap end the caller cannot read is not zero-downtime"
|
|
40404
|
+
},
|
|
40405
|
+
{
|
|
40406
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40407
|
+
"requirement": "the rotation 200 MUST NOT carry a `secret` property — the caller already holds the new one, and echoing it re-leaks a value the host issues once"
|
|
40408
|
+
},
|
|
40409
|
+
{
|
|
40410
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40411
|
+
"requirement": "the 200 body MUST be closed (`additionalProperties: false`) so a secret cannot be smuggled back in a later edit"
|
|
40412
|
+
}
|
|
40413
|
+
]
|
|
40414
|
+
},
|
|
40030
40415
|
{
|
|
40031
40416
|
"id": "openwop.it.v2-alias-covers-reword.the-corpus-gate-script-exits-0",
|
|
40032
40417
|
"file": "v2-alias-covers-reword.test.ts",
|
|
@@ -40453,7 +40838,7 @@
|
|
|
40453
40838
|
{
|
|
40454
40839
|
"id": "openwop.it.v2-interop-map-coherent.the-map-agrees-with-the-v2-wire-and-the-gate-refuses-each-defect-it-exists-to-ca",
|
|
40455
40840
|
"file": "v2-interop-map-coherent.test.ts",
|
|
40456
|
-
"line":
|
|
40841
|
+
"line": 62,
|
|
40457
40842
|
"title": "the map agrees with the v2 wire, and the gate refuses each defect it exists to catch",
|
|
40458
40843
|
"explicitId": "openwop.requirement.0208.map-coherent",
|
|
40459
40844
|
"citations": [
|