@openwop/openwop-conformance 2.36.1 → 2.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/README.md +4 -3
- package/coverage.md +1 -0
- package/dist/lib/requirement-ledger.js +44 -3
- package/dist/lib/scenario-disposition.js +37 -8
- package/dist/spec-artifacts.lock.json +2 -2
- package/package.json +2 -2
- package/requirements.json +510 -73
- 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 +102 -0
- package/src/lib/mcp-fake-server.ts +15 -4
- package/src/lib/oidc-issuer.ts +15 -5
- package/src/lib/requirement-ledger.ts +82 -4
- package/src/lib/scenario-disposition.ts +41 -3
- package/src/lib/scoped-receiver.ts +223 -0
- package/src/lib/triggerBridge.ts +49 -0
- package/src/scenarios/a2a-1-0-agent-card.test.ts +19 -7
- package/src/scenarios/auth-subject-link.test.ts +18 -1
- package/src/scenarios/trigger-bridge-delivery.test.ts +17 -2
- package/src/scenarios/trigger-stream-cdc-sources.test.ts +17 -2
- 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-bound-id-kinds.test.ts +35 -22
- package/src/scenarios/v2-durability-recovery.test.ts +83 -35
- package/src/scenarios/v2-idempotency-in-flight.test.ts +132 -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/src/scenarios/v2-webhook-delivery-shape.test.ts +31 -34
- package/src/scenarios/v2-webhook-durable-delivery.test.ts +63 -47
- package/src/scenarios/webhook-signed-delivery.test.ts +55 -42
- package/src/setup.ts +24 -4
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": 629,
|
|
6
|
+
"tests": 2404,
|
|
7
|
+
"withStableId": 2404,
|
|
8
8
|
"interpolatedTitles": 0,
|
|
9
|
-
"explicitIds":
|
|
9
|
+
"explicitIds": 2294
|
|
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": [
|
|
@@ -5952,7 +5956,7 @@
|
|
|
5952
5956
|
{
|
|
5953
5957
|
"id": "openwop.it.auth-subject-link.subjectlinking-true-is-only-claimed-alongside-both-saml-and-scim-profiles",
|
|
5954
5958
|
"file": "auth-subject-link.test.ts",
|
|
5955
|
-
"line":
|
|
5959
|
+
"line": 62,
|
|
5956
5960
|
"title": "subjectLinking:true is only claimed alongside both SAML and SCIM profiles",
|
|
5957
5961
|
"explicitId": "openwop.it.auth-subject-link.subjectlinking-true-is-only-claimed-alongside-both-saml-and-scim-profiles",
|
|
5958
5962
|
"citations": [
|
|
@@ -5965,7 +5969,7 @@
|
|
|
5965
5969
|
{
|
|
5966
5970
|
"id": "openwop.it.auth-subject-link.advertising-both-profiles-requires-subjectlinking-true-a-subjectlinkkey-rfc-0164",
|
|
5967
5971
|
"file": "auth-subject-link.test.ts",
|
|
5968
|
-
"line":
|
|
5972
|
+
"line": 77,
|
|
5969
5973
|
"title": "advertising BOTH profiles REQUIRES subjectLinking:true + a subjectLinkKey (RFC 0164 — the vulnerable shape fails, never inapplicable)",
|
|
5970
5974
|
"explicitId": "openwop.it.auth-subject-link.advertising-both-profiles-requires-subjectlinking-true-a-subjectlinkkey-rfc-0164",
|
|
5971
5975
|
"citations": [
|
|
@@ -5983,7 +5987,7 @@
|
|
|
5983
5987
|
{
|
|
5984
5988
|
"id": "openwop.it.auth-subject-link.a-scim-deactivation-fail-closes-the-linked-saml-identity",
|
|
5985
5989
|
"file": "auth-subject-link.test.ts",
|
|
5986
|
-
"line":
|
|
5990
|
+
"line": 107,
|
|
5987
5991
|
"title": "a SCIM deactivation fail-closes the linked SAML identity",
|
|
5988
5992
|
"explicitId": "openwop.it.auth-subject-link.a-scim-deactivation-fail-closes-the-linked-saml-identity",
|
|
5989
5993
|
"citations": [
|
|
@@ -6008,7 +6012,7 @@
|
|
|
6008
6012
|
{
|
|
6009
6013
|
"id": "openwop.it.auth-subject-link.a-mutable-pii-link-key-email-never-produces-a-cross-lane-pass",
|
|
6010
6014
|
"file": "auth-subject-link.test.ts",
|
|
6011
|
-
"line":
|
|
6015
|
+
"line": 169,
|
|
6012
6016
|
"title": "a mutable/PII link key (email) never produces a cross-lane pass",
|
|
6013
6017
|
"explicitId": "openwop.it.auth-subject-link.a-mutable-pii-link-key-email-never-produces-a-cross-lane-pass",
|
|
6014
6018
|
"citations": [
|
|
@@ -6025,7 +6029,7 @@
|
|
|
6025
6029
|
{
|
|
6026
6030
|
"id": "openwop.it.auth-subject-link.a-scim-deactivation-does-not-deny-a-saml-login-whose-run-subject-is-legacy-issue",
|
|
6027
6031
|
"file": "auth-subject-link.test.ts",
|
|
6028
|
-
"line":
|
|
6032
|
+
"line": 219,
|
|
6029
6033
|
"title": "a SCIM deactivation does not deny a SAML login whose run subject is legacy-issued",
|
|
6030
6034
|
"explicitId": null,
|
|
6031
6035
|
"citations": []
|
|
@@ -25729,7 +25733,7 @@
|
|
|
25729
25733
|
{
|
|
25730
25734
|
"id": "openwop.it.trigger-bridge-delivery.de-dups-by-dedupkey-retries-to-dead-letter-and-links-delivery-run-causation",
|
|
25731
25735
|
"file": "trigger-bridge-delivery.test.ts",
|
|
25732
|
-
"line":
|
|
25736
|
+
"line": 55,
|
|
25733
25737
|
"title": "de-dups by dedupKey, retries to dead-letter, and links delivery→run causation",
|
|
25734
25738
|
"explicitId": "openwop.it.trigger-bridge-delivery.de-dups-by-dedupkey-retries-to-dead-letter-and-links-delivery-run-causation",
|
|
25735
25739
|
"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": [
|
|
@@ -27147,7 +27265,7 @@
|
|
|
27147
27265
|
{
|
|
27148
27266
|
"id": "openwop.it.v2-bound-id-kinds.subscriptionid-the-webhookid-a-host-emits-on-a-delivery-is-the-one-it-minted",
|
|
27149
27267
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27150
|
-
"line":
|
|
27268
|
+
"line": 140,
|
|
27151
27269
|
"title": "subscriptionId: the webhookId a host EMITS on a delivery is the one it minted",
|
|
27152
27270
|
"explicitId": "openwop.requirement.0187.bound-id-kinds.webhook-emitted",
|
|
27153
27271
|
"citations": [
|
|
@@ -27166,7 +27284,7 @@
|
|
|
27166
27284
|
{
|
|
27167
27285
|
"id": "openwop.it.v2-bound-id-kinds.interruptid-the-id-a-suspension-puts-on-the-wire-is-bound",
|
|
27168
27286
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27169
|
-
"line":
|
|
27287
|
+
"line": 192,
|
|
27170
27288
|
"title": "interruptId: the id a suspension puts on the wire is bound",
|
|
27171
27289
|
"explicitId": null,
|
|
27172
27290
|
"citations": []
|
|
@@ -27174,7 +27292,7 @@
|
|
|
27174
27292
|
{
|
|
27175
27293
|
"id": "openwop.it.v2-bound-id-kinds.effectid-every-row-get-runs-runid-effects-serves-is-bound",
|
|
27176
27294
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27177
|
-
"line":
|
|
27295
|
+
"line": 213,
|
|
27178
27296
|
"title": "effectId: every row GET /runs/{runId}/effects serves is bound",
|
|
27179
27297
|
"explicitId": "openwop.requirement.0187.bound-id-kinds.per-kind",
|
|
27180
27298
|
"citations": [
|
|
@@ -27187,7 +27305,7 @@
|
|
|
27187
27305
|
{
|
|
27188
27306
|
"id": "openwop.it.v2-bound-id-kinds.deliveryid-every-record-in-the-dead-letter-read-carries-a-bound-id-in-the-caller",
|
|
27189
27307
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27190
|
-
"line":
|
|
27308
|
+
"line": 228,
|
|
27191
27309
|
"title": "deliveryId: every record in the dead-letter read carries a bound id in the caller's tenant",
|
|
27192
27310
|
"explicitId": "openwop.requirement.0187.bound-id-kinds.per-kind",
|
|
27193
27311
|
"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,54 @@
|
|
|
28764
28882
|
}
|
|
28765
28883
|
]
|
|
28766
28884
|
},
|
|
28885
|
+
{
|
|
28886
|
+
"id": "openwop.it.v2-idempotency-in-flight.concurrent-same-key-creates-yield-exactly-one-run",
|
|
28887
|
+
"file": "v2-idempotency-in-flight.test.ts",
|
|
28888
|
+
"line": 101,
|
|
28889
|
+
"title": "concurrent same-key creates yield exactly one run",
|
|
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
|
+
},
|
|
28904
|
+
{
|
|
28905
|
+
"id": "openwop.it.v2-idempotency-in-flight.each-loser-is-a-marked-replay-of-a-final-outcome-or-409-idempotency-in-flight-wi",
|
|
28906
|
+
"file": "v2-idempotency-in-flight.test.ts",
|
|
28907
|
+
"line": 109,
|
|
28908
|
+
"title": "each loser is a marked replay of a final outcome, or 409 idempotency_in_flight with no retry timing in details",
|
|
28909
|
+
"explicitId": "openwop.requirement.0213.in-flight-loser-outcome",
|
|
28910
|
+
"citations": [
|
|
28911
|
+
{
|
|
28912
|
+
"section": "spec/v2/core/idempotency.md Concurrency",
|
|
28913
|
+
"requirement": null,
|
|
28914
|
+
"interpolated": true
|
|
28915
|
+
},
|
|
28916
|
+
{
|
|
28917
|
+
"section": "spec/v2/core/idempotency.md Concurrency",
|
|
28918
|
+
"requirement": null,
|
|
28919
|
+
"interpolated": true
|
|
28920
|
+
},
|
|
28921
|
+
{
|
|
28922
|
+
"section": "spec/v2/core/errors.md §Retry timing",
|
|
28923
|
+
"requirement": null,
|
|
28924
|
+
"interpolated": true
|
|
28925
|
+
},
|
|
28926
|
+
{
|
|
28927
|
+
"section": "spec/v2/core/idempotency.md Concurrency",
|
|
28928
|
+
"requirement": null,
|
|
28929
|
+
"interpolated": true
|
|
28930
|
+
}
|
|
28931
|
+
]
|
|
28932
|
+
},
|
|
28767
28933
|
{
|
|
28768
28934
|
"id": "openwop.it.v2-idempotency-key-grammar.a-22-character-key-inside-the-grammar-is-accepted",
|
|
28769
28935
|
"file": "v2-idempotency-key-grammar.test.ts",
|
|
@@ -28944,6 +29110,48 @@
|
|
|
28944
29110
|
}
|
|
28945
29111
|
]
|
|
28946
29112
|
},
|
|
29113
|
+
{
|
|
29114
|
+
"id": "openwop.it.v2-interrupt-resolve-terminal.a-run-scoped-resolve-after-the-run-was-cancelled-is-409-interrupt-already-resolv",
|
|
29115
|
+
"file": "v2-interrupt-resolve-terminal.test.ts",
|
|
29116
|
+
"line": 70,
|
|
29117
|
+
"title": "a run-scoped resolve after the run was cancelled is 409 interrupt_already_resolved",
|
|
29118
|
+
"explicitId": "openwop.requirement.0213.resolve-after-cancel",
|
|
29119
|
+
"citations": [
|
|
29120
|
+
{
|
|
29121
|
+
"section": "spec/v2/core/errors.md §One code per state",
|
|
29122
|
+
"requirement": null,
|
|
29123
|
+
"interpolated": true
|
|
29124
|
+
}
|
|
29125
|
+
]
|
|
29126
|
+
},
|
|
29127
|
+
{
|
|
29128
|
+
"id": "openwop.it.v2-interrupt-resolve-terminal.a-second-run-scoped-resolve-after-the-run-completed-is-409-interrupt-already-res",
|
|
29129
|
+
"file": "v2-interrupt-resolve-terminal.test.ts",
|
|
29130
|
+
"line": 83,
|
|
29131
|
+
"title": "a second run-scoped resolve after the run completed is 409 interrupt_already_resolved",
|
|
29132
|
+
"explicitId": "openwop.requirement.0213.resolve-after-complete",
|
|
29133
|
+
"citations": [
|
|
29134
|
+
{
|
|
29135
|
+
"section": "spec/v2/core/errors.md §One code per state",
|
|
29136
|
+
"requirement": null,
|
|
29137
|
+
"interpolated": true
|
|
29138
|
+
}
|
|
29139
|
+
]
|
|
29140
|
+
},
|
|
29141
|
+
{
|
|
29142
|
+
"id": "openwop.it.v2-interrupt-resolve-terminal.a-run-scoped-resolve-on-an-unknown-run-is-404-not-found",
|
|
29143
|
+
"file": "v2-interrupt-resolve-terminal.test.ts",
|
|
29144
|
+
"line": 96,
|
|
29145
|
+
"title": "a run-scoped resolve on an unknown run is 404 not_found",
|
|
29146
|
+
"explicitId": "openwop.requirement.0213.resolve-unknown-run",
|
|
29147
|
+
"citations": [
|
|
29148
|
+
{
|
|
29149
|
+
"section": "spec/v2/core/interrupt.md §Resolve",
|
|
29150
|
+
"requirement": null,
|
|
29151
|
+
"interpolated": true
|
|
29152
|
+
}
|
|
29153
|
+
]
|
|
29154
|
+
},
|
|
28947
29155
|
{
|
|
28948
29156
|
"id": "openwop.it.v2-interrupt-token-scheme.a-token-without-the-ow2-prefix-is-refused",
|
|
28949
29157
|
"file": "v2-interrupt-token-scheme.test.ts",
|
|
@@ -29413,7 +29621,7 @@
|
|
|
29413
29621
|
{
|
|
29414
29622
|
"id": "openwop.it.v2-mcp-mount-map.a-host-claiming-mcp-2026-07-28-lists-every-feature-the-map-requires-for-it",
|
|
29415
29623
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29416
|
-
"line":
|
|
29624
|
+
"line": 97,
|
|
29417
29625
|
"title": "a host claiming mcp-2026-07-28 lists every feature the map requires for it",
|
|
29418
29626
|
"explicitId": null,
|
|
29419
29627
|
"citations": [
|
|
@@ -29427,7 +29635,7 @@
|
|
|
29427
29635
|
{
|
|
29428
29636
|
"id": "openwop.it.v2-mcp-mount-map.server-discover-supportedversions-equals-mcp-revisions-with-resulttype-and-cache",
|
|
29429
29637
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29430
|
-
"line":
|
|
29638
|
+
"line": 104,
|
|
29431
29639
|
"title": "server/discover supportedVersions equals mcp.revisions, with resultType and cache hints",
|
|
29432
29640
|
"explicitId": null,
|
|
29433
29641
|
"citations": [
|
|
@@ -29457,7 +29665,7 @@
|
|
|
29457
29665
|
{
|
|
29458
29666
|
"id": "openwop.it.v2-mcp-mount-map.header-body-disagreement-fails-closed-32020-before-version-selection-an-unsuppor",
|
|
29459
29667
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29460
|
-
"line":
|
|
29668
|
+
"line": 116,
|
|
29461
29669
|
"title": "header/body disagreement fails closed -32020 before version selection; an unsupported revision is -32022",
|
|
29462
29670
|
"explicitId": null,
|
|
29463
29671
|
"citations": [
|
|
@@ -29490,7 +29698,7 @@
|
|
|
29490
29698
|
{
|
|
29491
29699
|
"id": "openwop.it.v2-mcp-mount-map.tools-list-needs-no-initialize-and-no-session-results-carry-cache-hints-and-agre",
|
|
29492
29700
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29493
|
-
"line":
|
|
29701
|
+
"line": 131,
|
|
29494
29702
|
"title": "tools/list needs no initialize and no session; results carry cache hints and agree across requests",
|
|
29495
29703
|
"explicitId": null,
|
|
29496
29704
|
"citations": [
|
|
@@ -29528,7 +29736,7 @@
|
|
|
29528
29736
|
{
|
|
29529
29737
|
"id": "openwop.it.v2-mcp-mount-map.tools-call-answers-a-completed-run-iserror-false-and-a-failed-run-iserror-true-n",
|
|
29530
29738
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29531
|
-
"line":
|
|
29739
|
+
"line": 147,
|
|
29532
29740
|
"title": "tools/call answers a completed run isError false and a failed run isError true, never a JSON-RPC error",
|
|
29533
29741
|
"explicitId": null,
|
|
29534
29742
|
"citations": [
|
|
@@ -29560,7 +29768,7 @@
|
|
|
29560
29768
|
{
|
|
29561
29769
|
"id": "openwop.it.v2-mcp-mount-map.a-run-started-by-tools-call-records-run-started-transport-mcp",
|
|
29562
29770
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29563
|
-
"line":
|
|
29771
|
+
"line": 162,
|
|
29564
29772
|
"title": "a run started by tools/call records run.started.transport mcp",
|
|
29565
29773
|
"explicitId": null,
|
|
29566
29774
|
"citations": [
|
|
@@ -29578,7 +29786,7 @@
|
|
|
29578
29786
|
{
|
|
29579
29787
|
"id": "openwop.it.v2-mcp-mount-map.a-suspending-tool-answers-inputrequiredresult-the-retry-resolves-it-requeststate",
|
|
29580
29788
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29581
|
-
"line":
|
|
29789
|
+
"line": 181,
|
|
29582
29790
|
"title": "a suspending tool answers InputRequiredResult; the retry resolves it; requestState is single use and forgery-proof",
|
|
29583
29791
|
"explicitId": null,
|
|
29584
29792
|
"citations": [
|
|
@@ -29617,10 +29825,49 @@
|
|
|
29617
29825
|
}
|
|
29618
29826
|
]
|
|
29619
29827
|
},
|
|
29828
|
+
{
|
|
29829
|
+
"id": "openwop.it.v2-mcp-mount-map.the-mrtr-input-request-key-is-the-open-interrupt-s-interruptid-never-the-node-it",
|
|
29830
|
+
"file": "v2-mcp-mount-map.test.ts",
|
|
29831
|
+
"line": 206,
|
|
29832
|
+
"title": "the MRTR input-request key is the open interrupt’s interruptId, never the node it suspended on",
|
|
29833
|
+
"explicitId": null,
|
|
29834
|
+
"citations": [
|
|
29835
|
+
{
|
|
29836
|
+
"section": "interop-map.json mcp.mrtr InputRequiredResult (host as server)",
|
|
29837
|
+
"requirement": null,
|
|
29838
|
+
"interpolated": true
|
|
29839
|
+
},
|
|
29840
|
+
{
|
|
29841
|
+
"section": "interop-map.json mcp.tasks.status waiting-approval",
|
|
29842
|
+
"requirement": null,
|
|
29843
|
+
"interpolated": true
|
|
29844
|
+
},
|
|
29845
|
+
{
|
|
29846
|
+
"section": "interop-map.json mcp.mrtr InputRequiredResult (host as server); schemas/v2/ids.schema.json interruptId",
|
|
29847
|
+
"requirement": null,
|
|
29848
|
+
"interpolated": true
|
|
29849
|
+
},
|
|
29850
|
+
{
|
|
29851
|
+
"section": "interop-map.json mcp.mrtr InputRequiredResult (host as server)",
|
|
29852
|
+
"requirement": null,
|
|
29853
|
+
"interpolated": true
|
|
29854
|
+
},
|
|
29855
|
+
{
|
|
29856
|
+
"section": "interop-map.json mcp.mrtr InputRequiredResult (host as server); runs.md node.suspended",
|
|
29857
|
+
"requirement": null,
|
|
29858
|
+
"interpolated": true
|
|
29859
|
+
},
|
|
29860
|
+
{
|
|
29861
|
+
"section": "interop-map.json mcp.mrtr inputResponses[key] (host as server)",
|
|
29862
|
+
"requirement": null,
|
|
29863
|
+
"interpolated": true
|
|
29864
|
+
}
|
|
29865
|
+
]
|
|
29866
|
+
},
|
|
29620
29867
|
{
|
|
29621
29868
|
"id": "openwop.it.v2-mcp-mount-map.a-list-that-differs-per-caller-is-cachescope-private",
|
|
29622
29869
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29623
|
-
"line":
|
|
29870
|
+
"line": 244,
|
|
29624
29871
|
"title": "a list that differs per caller is cacheScope private",
|
|
29625
29872
|
"explicitId": null,
|
|
29626
29873
|
"citations": [
|
|
@@ -29638,7 +29885,7 @@
|
|
|
29638
29885
|
{
|
|
29639
29886
|
"id": "openwop.it.v2-mcp-mount-map.unknown-meta-extension-keys-and-capabilities-extensions-are-opaque-processed-nor",
|
|
29640
29887
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29641
|
-
"line":
|
|
29888
|
+
"line": 261,
|
|
29642
29889
|
"title": "unknown _meta extension keys and capabilities.extensions are opaque: processed normally, granting nothing",
|
|
29643
29890
|
"explicitId": null,
|
|
29644
29891
|
"citations": [
|
|
@@ -29656,7 +29903,7 @@
|
|
|
29656
29903
|
{
|
|
29657
29904
|
"id": "openwop.it.v2-mcp-mount-map.an-unauthenticated-request-is-refused-at-the-boundary-unless-anonymousactor-is-a",
|
|
29658
29905
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29659
|
-
"line":
|
|
29906
|
+
"line": 270,
|
|
29660
29907
|
"title": "an unauthenticated request is refused at the boundary unless anonymousActor is advertised",
|
|
29661
29908
|
"explicitId": null,
|
|
29662
29909
|
"citations": [
|
|
@@ -29679,7 +29926,7 @@
|
|
|
29679
29926
|
{
|
|
29680
29927
|
"id": "openwop.it.v2-mcp-mount-map.a-credential-interrupt-is-answered-in-url-mode-url-connecturl-iserror-without-ur",
|
|
29681
29928
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29682
|
-
"line":
|
|
29929
|
+
"line": 287,
|
|
29683
29930
|
"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
29931
|
"explicitId": null,
|
|
29685
29932
|
"citations": [
|
|
@@ -29717,7 +29964,7 @@
|
|
|
29717
29964
|
{
|
|
29718
29965
|
"id": "openwop.it.v2-mcp-mount-map.form-mode-is-never-emitted-for-a-nested-schema-or-a-sensitive-format-password-fi",
|
|
29719
29966
|
"file": "v2-mcp-mount-map.test.ts",
|
|
29720
|
-
"line":
|
|
29967
|
+
"line": 328,
|
|
29721
29968
|
"title": "form mode is never emitted for a nested schema or a sensitive (format password) field",
|
|
29722
29969
|
"explicitId": null,
|
|
29723
29970
|
"citations": [
|
|
@@ -30188,7 +30435,7 @@
|
|
|
30188
30435
|
{
|
|
30189
30436
|
"id": "openwop.it.v2-negotiation-authenticated.an-unauthenticated-mcp-exchange-cannot-lower-the-revision-below-preferredversion",
|
|
30190
30437
|
"file": "v2-negotiation-authenticated.test.ts",
|
|
30191
|
-
"line":
|
|
30438
|
+
"line": 117,
|
|
30192
30439
|
"title": "an unauthenticated MCP exchange cannot lower the revision below preferredVersion",
|
|
30193
30440
|
"explicitId": null,
|
|
30194
30441
|
"citations": []
|
|
@@ -31910,6 +32157,77 @@
|
|
|
31910
32157
|
}
|
|
31911
32158
|
]
|
|
31912
32159
|
},
|
|
32160
|
+
{
|
|
32161
|
+
"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",
|
|
32162
|
+
"file": "v2-sse-last-event-id-cursor.test.ts",
|
|
32163
|
+
"line": 84,
|
|
32164
|
+
"title": "a Last-Event-ID past the log is an exclusive cursor: a terminal run answers 200 with no frame and closes",
|
|
32165
|
+
"explicitId": "openwop.requirement.0213.last-event-id-exclusive-cursor",
|
|
32166
|
+
"citations": [
|
|
32167
|
+
{
|
|
32168
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32169
|
+
"requirement": null,
|
|
32170
|
+
"interpolated": true
|
|
32171
|
+
},
|
|
32172
|
+
{
|
|
32173
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32174
|
+
"requirement": null,
|
|
32175
|
+
"interpolated": true
|
|
32176
|
+
},
|
|
32177
|
+
{
|
|
32178
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32179
|
+
"requirement": "on a terminal run the host MUST close the empty stream itself"
|
|
32180
|
+
}
|
|
32181
|
+
]
|
|
32182
|
+
},
|
|
32183
|
+
{
|
|
32184
|
+
"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",
|
|
32185
|
+
"file": "v2-sse-last-event-id-cursor.test.ts",
|
|
32186
|
+
"line": 99,
|
|
32187
|
+
"title": "a Last-Event-ID that is not a non-negative integer, when refused, is 400 validation_error",
|
|
32188
|
+
"explicitId": "openwop.requirement.0213.last-event-id-malformed",
|
|
32189
|
+
"citations": [
|
|
32190
|
+
{
|
|
32191
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32192
|
+
"requirement": null,
|
|
32193
|
+
"interpolated": true
|
|
32194
|
+
},
|
|
32195
|
+
{
|
|
32196
|
+
"section": "spec/v2/core/errors.md",
|
|
32197
|
+
"requirement": null,
|
|
32198
|
+
"interpolated": true
|
|
32199
|
+
}
|
|
32200
|
+
]
|
|
32201
|
+
},
|
|
32202
|
+
{
|
|
32203
|
+
"id": "openwop.it.v2-sse-last-event-id-cursor.the-cursor-never-changes-the-answer-for-a-run-the-caller-cannot-read",
|
|
32204
|
+
"file": "v2-sse-last-event-id-cursor.test.ts",
|
|
32205
|
+
"line": 108,
|
|
32206
|
+
"title": "the cursor never changes the answer for a run the caller cannot read",
|
|
32207
|
+
"explicitId": "openwop.requirement.0213.last-event-id-after-authorization",
|
|
32208
|
+
"citations": [
|
|
32209
|
+
{
|
|
32210
|
+
"section": "spec/v2/core/runs.md §Identity",
|
|
32211
|
+
"requirement": null,
|
|
32212
|
+
"interpolated": true
|
|
32213
|
+
},
|
|
32214
|
+
{
|
|
32215
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32216
|
+
"requirement": null,
|
|
32217
|
+
"interpolated": true
|
|
32218
|
+
},
|
|
32219
|
+
{
|
|
32220
|
+
"section": "spec/v2/core/runs.md §Identity",
|
|
32221
|
+
"requirement": null,
|
|
32222
|
+
"interpolated": true
|
|
32223
|
+
},
|
|
32224
|
+
{
|
|
32225
|
+
"section": "spec/v2/core/events.md §SSE frames",
|
|
32226
|
+
"requirement": null,
|
|
32227
|
+
"interpolated": true
|
|
32228
|
+
}
|
|
32229
|
+
]
|
|
32230
|
+
},
|
|
31913
32231
|
{
|
|
31914
32232
|
"id": "openwop.it.v2-sse-last-event-id.last-event-id-resumes-at-the-next-sequence-never-re-emits-the-resumption-point-l",
|
|
31915
32233
|
"file": "v2-sse-last-event-id.test.ts",
|
|
@@ -32152,7 +32470,7 @@
|
|
|
32152
32470
|
{
|
|
32153
32471
|
"id": "openwop.it.v2-terminal-event-once.every-run-observed-to-a-terminal-state-has-exactly-one-terminal-event-and-no-for",
|
|
32154
32472
|
"file": "v2-terminal-event-once.test.ts",
|
|
32155
|
-
"line":
|
|
32473
|
+
"line": 81,
|
|
32156
32474
|
"title": "every run observed to a terminal state has exactly one terminal event and no forward execution after it",
|
|
32157
32475
|
"explicitId": "openwop.requirement.0194.terminal-once",
|
|
32158
32476
|
"citations": [
|
|
@@ -32170,7 +32488,7 @@
|
|
|
32170
32488
|
{
|
|
32171
32489
|
"id": "openwop.it.v2-terminal-event-once.work-delivered-twice-still-leaves-one-terminal-event-and-no-forward-execution-af",
|
|
32172
32490
|
"file": "v2-terminal-event-once.test.ts",
|
|
32173
|
-
"line":
|
|
32491
|
+
"line": 109,
|
|
32174
32492
|
"title": "work delivered twice still leaves one terminal event and no forward execution after it",
|
|
32175
32493
|
"explicitId": "openwop.requirement.0194.terminal-once.duplicate-delivery",
|
|
32176
32494
|
"citations": [
|
|
@@ -32409,7 +32727,7 @@
|
|
|
32409
32727
|
{
|
|
32410
32728
|
"id": "openwop.it.v2-webhook-delivery-shape.a-major-2-subscriber-receives-the-v2-rendering-the-delivery-validates-and-run-st",
|
|
32411
32729
|
"file": "v2-webhook-delivery-shape.test.ts",
|
|
32412
|
-
"line":
|
|
32730
|
+
"line": 217,
|
|
32413
32731
|
"title": "a major-2 subscriber receives the v2 rendering: the delivery validates, and run.started.owner carries subject, never principal",
|
|
32414
32732
|
"explicitId": "openwop.requirement.0171.webhook-delivery-shape",
|
|
32415
32733
|
"citations": [
|
|
@@ -32440,7 +32758,7 @@
|
|
|
32440
32758
|
{
|
|
32441
32759
|
"id": "openwop.it.v2-webhook-delivery-shape.a-major-1-subscriber-still-receives-the-v1-rendering-the-v1-wire-does-not-move-m",
|
|
32442
32760
|
"file": "v2-webhook-delivery-shape.test.ts",
|
|
32443
|
-
"line":
|
|
32761
|
+
"line": 237,
|
|
32444
32762
|
"title": "a major-1 subscriber still receives the v1 rendering — the v1 wire does not move mid-overlap",
|
|
32445
32763
|
"explicitId": "openwop.requirement.0171.webhook-delivery-shape",
|
|
32446
32764
|
"citations": [
|
|
@@ -32458,7 +32776,7 @@
|
|
|
32458
32776
|
{
|
|
32459
32777
|
"id": "openwop.it.v2-webhook-delivery-shape.a-seeded-era-2-run-is-delivered-projected-too-the-fan-out-branch-a-fresh-run-can",
|
|
32460
32778
|
"file": "v2-webhook-delivery-shape.test.ts",
|
|
32461
|
-
"line":
|
|
32779
|
+
"line": 261,
|
|
32462
32780
|
"title": "a seeded era-2 run is delivered projected too — the fan-out branch a fresh run cannot reach (seam-gated)",
|
|
32463
32781
|
"explicitId": "openwop.requirement.0171.webhook-delivery-shape",
|
|
32464
32782
|
"citations": [
|
|
@@ -32476,7 +32794,7 @@
|
|
|
32476
32794
|
{
|
|
32477
32795
|
"id": "openwop.it.v2-webhook-durable-delivery.a-failed-attempt-is-retried-and-the-event-is-delivered-at-least-once",
|
|
32478
32796
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
32479
|
-
"line":
|
|
32797
|
+
"line": 238,
|
|
32480
32798
|
"title": "a failed attempt is retried and the event is delivered at least once",
|
|
32481
32799
|
"explicitId": "openwop.requirement.0173.webhook-durable-delivery",
|
|
32482
32800
|
"citations": [
|
|
@@ -32486,7 +32804,8 @@
|
|
|
32486
32804
|
},
|
|
32487
32805
|
{
|
|
32488
32806
|
"section": "webhooks.md §Durability",
|
|
32489
|
-
"requirement":
|
|
32807
|
+
"requirement": null,
|
|
32808
|
+
"interpolated": true
|
|
32490
32809
|
},
|
|
32491
32810
|
{
|
|
32492
32811
|
"section": "webhooks.md §Durability",
|
|
@@ -32507,7 +32826,7 @@
|
|
|
32507
32826
|
{
|
|
32508
32827
|
"id": "openwop.it.v2-webhook-durable-delivery.an-exhausted-delivery-is-dead-lettered-never-dropped",
|
|
32509
32828
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
32510
|
-
"line":
|
|
32829
|
+
"line": 339,
|
|
32511
32830
|
"title": "an exhausted delivery is dead-lettered, never dropped",
|
|
32512
32831
|
"explicitId": "openwop.requirement.0173.webhook-durable-delivery.dead-letter",
|
|
32513
32832
|
"citations": [
|
|
@@ -32541,7 +32860,7 @@
|
|
|
32541
32860
|
{
|
|
32542
32861
|
"id": "openwop.it.v2-webhook-durable-delivery.the-dead-letter-read-is-served-and-its-records-carry-no-payload",
|
|
32543
32862
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
32544
|
-
"line":
|
|
32863
|
+
"line": 433,
|
|
32545
32864
|
"title": "the dead-letter read is served and its records carry no payload",
|
|
32546
32865
|
"explicitId": "openwop.requirement.0188.dead-letter-read",
|
|
32547
32866
|
"citations": [
|
|
@@ -32554,7 +32873,7 @@
|
|
|
32554
32873
|
{
|
|
32555
32874
|
"id": "openwop.it.v2-webhook-durable-delivery.a-dead-letter-record-carries-no-delivered-payload",
|
|
32556
32875
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
32557
|
-
"line":
|
|
32876
|
+
"line": 454,
|
|
32558
32877
|
"title": "a dead-letter record carries no delivered payload",
|
|
32559
32878
|
"explicitId": "openwop.requirement.0188.dead-letter-content-free",
|
|
32560
32879
|
"citations": [
|
|
@@ -33681,7 +34000,7 @@
|
|
|
33681
34000
|
{
|
|
33682
34001
|
"id": "openwop.it.webhook-signed-delivery.host-posts-run-events-to-subscriber-with-valid-x-openwop-signature",
|
|
33683
34002
|
"file": "webhook-signed-delivery.test.ts",
|
|
33684
|
-
"line":
|
|
34003
|
+
"line": 168,
|
|
33685
34004
|
"title": "host POSTs run events to subscriber with valid X-openwop-Signature",
|
|
33686
34005
|
"explicitId": "openwop.it.webhook-signed-delivery.host-posts-run-events-to-subscriber-with-valid-x-openwop-signature",
|
|
33687
34006
|
"citations": [
|
|
@@ -33732,7 +34051,7 @@
|
|
|
33732
34051
|
{
|
|
33733
34052
|
"id": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
|
|
33734
34053
|
"file": "webhook-signed-delivery.test.ts",
|
|
33735
|
-
"line":
|
|
34054
|
+
"line": 423,
|
|
33736
34055
|
"title": "control: with a tunnel wired, the host still refuses the loopback receiver",
|
|
33737
34056
|
"explicitId": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
|
|
33738
34057
|
"citations": [
|
|
@@ -37947,7 +38266,7 @@
|
|
|
37947
38266
|
{
|
|
37948
38267
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.spec-v1-operation-path-manifest-json-exists-in-the-corpus-layout-and-re-derives",
|
|
37949
38268
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
37950
|
-
"line":
|
|
38269
|
+
"line": 200,
|
|
37951
38270
|
"title": "spec/v1/operation-path-manifest.json exists in the corpus layout and re-derives byte-for-byte from api/openapi.yaml",
|
|
37952
38271
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.spec-v1-operation-path-manifest-json-exists-in-the-corpus-layout-and-re-derives",
|
|
37953
38272
|
"citations": [
|
|
@@ -37960,7 +38279,7 @@
|
|
|
37960
38279
|
{
|
|
37961
38280
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.every-operation-resolves-to-exactly-one-v1-segment-none-for-well-known-has-an-op",
|
|
37962
38281
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
37963
|
-
"line":
|
|
38282
|
+
"line": 212,
|
|
37964
38283
|
"title": "every operation resolves to exactly one /v1 segment (none for /.well-known/*), has an operationId, and ids are unique",
|
|
37965
38284
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.every-operation-resolves-to-exactly-one-v1-segment-none-for-well-known-has-an-op",
|
|
37966
38285
|
"citations": [
|
|
@@ -37989,7 +38308,7 @@
|
|
|
37989
38308
|
{
|
|
37990
38309
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.the-asyncapi-server-pathname-carries-the-version-segment-exactly-once",
|
|
37991
38310
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
37992
|
-
"line":
|
|
38311
|
+
"line": 231,
|
|
37993
38312
|
"title": "the AsyncAPI server pathname carries the version segment exactly once",
|
|
37994
38313
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.the-asyncapi-server-pathname-carries-the-version-segment-exactly-once",
|
|
37995
38314
|
"citations": [
|
|
@@ -38003,7 +38322,7 @@
|
|
|
38003
38322
|
{
|
|
38004
38323
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.every-addressed-channel-resolves-server-pathname-address-to-an-openapi-path-key",
|
|
38005
38324
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
38006
|
-
"line":
|
|
38325
|
+
"line": 237,
|
|
38007
38326
|
"title": "every addressed channel resolves (server pathname + address) to an OpenAPI path key that has a GET operation, with exactly one /v1",
|
|
38008
38327
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.every-addressed-channel-resolves-server-pathname-address-to-an-openapi-path-key",
|
|
38009
38328
|
"citations": [
|
|
@@ -38026,7 +38345,7 @@
|
|
|
38026
38345
|
{
|
|
38027
38346
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.logical-address-null-channels-are-the-only-ones-without-a-wire-address-and-they",
|
|
38028
38347
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
38029
|
-
"line":
|
|
38348
|
+
"line": 253,
|
|
38030
38349
|
"title": "logical (address: null) channels are the only ones without a wire address, and they are documented as logical",
|
|
38031
38350
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.logical-address-null-channels-are-the-only-ones-without-a-wire-address-and-they",
|
|
38032
38351
|
"citations": [
|
|
@@ -38040,13 +38359,14 @@
|
|
|
38040
38359
|
{
|
|
38041
38360
|
"id": "openwop.it.openapi-asyncapi-sdk-parity.sdk-parity-expectations-json-covers-every-canonical-operation-with-the-same-meth",
|
|
38042
38361
|
"file": "openapi-asyncapi-sdk-parity.test.ts",
|
|
38043
|
-
"line":
|
|
38362
|
+
"line": 262,
|
|
38044
38363
|
"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
38364
|
"explicitId": "openwop.it.openapi-asyncapi-sdk-parity.sdk-parity-expectations-json-covers-every-canonical-operation-with-the-same-meth",
|
|
38046
38365
|
"citations": [
|
|
38047
38366
|
{
|
|
38048
38367
|
"section": "RFC 0149 §A",
|
|
38049
|
-
"requirement":
|
|
38368
|
+
"requirement": null,
|
|
38369
|
+
"interpolated": true
|
|
38050
38370
|
},
|
|
38051
38371
|
{
|
|
38052
38372
|
"section": "RFC 0149 §A",
|
|
@@ -40027,6 +40347,123 @@
|
|
|
40027
40347
|
}
|
|
40028
40348
|
]
|
|
40029
40349
|
},
|
|
40350
|
+
{
|
|
40351
|
+
"id": "openwop.it.v1-webhook-rotation-contract.the-v1-rotation-route-the-prose-mandates-is-an-api-openapi-yaml-operation-with-t",
|
|
40352
|
+
"file": "v1-webhook-rotation-contract.test.ts",
|
|
40353
|
+
"line": 63,
|
|
40354
|
+
"title": "the v1 rotation route the prose mandates is an api/openapi.yaml operation with the scopes and refusals the prose names",
|
|
40355
|
+
"explicitId": "openwop.requirement.0201.v1-rotation-route-in-contract",
|
|
40356
|
+
"citations": [
|
|
40357
|
+
{
|
|
40358
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40359
|
+
"requirement": "spec/v1/webhooks.md §Rotation MUST still mandate `POST /v1/webhooks/{webhookId}/rotate-secret` — this leg is only meaningful while it does"
|
|
40360
|
+
},
|
|
40361
|
+
{
|
|
40362
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40363
|
+
"requirement": null,
|
|
40364
|
+
"interpolated": true
|
|
40365
|
+
},
|
|
40366
|
+
{
|
|
40367
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40368
|
+
"requirement": null,
|
|
40369
|
+
"interpolated": true
|
|
40370
|
+
},
|
|
40371
|
+
{
|
|
40372
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40373
|
+
"requirement": "the v1 operation MUST carry the same operationId as its v2 twin, so one SDK surface spans both majors"
|
|
40374
|
+
},
|
|
40375
|
+
{
|
|
40376
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40377
|
+
"requirement": null,
|
|
40378
|
+
"interpolated": true
|
|
40379
|
+
},
|
|
40380
|
+
{
|
|
40381
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40382
|
+
"requirement": null,
|
|
40383
|
+
"interpolated": true
|
|
40384
|
+
}
|
|
40385
|
+
]
|
|
40386
|
+
},
|
|
40387
|
+
{
|
|
40388
|
+
"id": "openwop.it.v1-webhook-rotation-contract.the-v1-rotation-request-takes-the-new-secret-and-the-response-returns-none",
|
|
40389
|
+
"file": "v1-webhook-rotation-contract.test.ts",
|
|
40390
|
+
"line": 105,
|
|
40391
|
+
"title": "the v1 rotation request takes the new secret and the response returns none",
|
|
40392
|
+
"explicitId": "openwop.requirement.0201.v1-rotation-response-carries-no-secret",
|
|
40393
|
+
"citations": [
|
|
40394
|
+
{
|
|
40395
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40396
|
+
"requirement": null,
|
|
40397
|
+
"interpolated": true
|
|
40398
|
+
},
|
|
40399
|
+
{
|
|
40400
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40401
|
+
"requirement": "the rotation request MUST require `secret`"
|
|
40402
|
+
},
|
|
40403
|
+
{
|
|
40404
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40405
|
+
"requirement": "the new secret MUST be constrained to the RFC 0201 §B.6 `whsec_<base64>` form"
|
|
40406
|
+
},
|
|
40407
|
+
{
|
|
40408
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40409
|
+
"requirement": "the 200 MUST return `rotatedAt`"
|
|
40410
|
+
},
|
|
40411
|
+
{
|
|
40412
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40413
|
+
"requirement": "the 200 MUST return `previousSecretExpiresAt` — a rotation whose overlap end the caller cannot read is not zero-downtime"
|
|
40414
|
+
},
|
|
40415
|
+
{
|
|
40416
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40417
|
+
"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"
|
|
40418
|
+
},
|
|
40419
|
+
{
|
|
40420
|
+
"section": "RFC 0201 §E.18 / spec/v1/webhooks.md §\"Standard Webhooks companion scheme\"",
|
|
40421
|
+
"requirement": "the 200 body MUST be closed (`additionalProperties: false`) so a secret cannot be smuggled back in a later edit"
|
|
40422
|
+
}
|
|
40423
|
+
]
|
|
40424
|
+
},
|
|
40425
|
+
{
|
|
40426
|
+
"id": "openwop.it.v1-webhook-unregister-contract.the-tenantid-the-v1-prose-requires-on-unregister-is-a-required-query-parameter-o",
|
|
40427
|
+
"file": "v1-webhook-unregister-contract.test.ts",
|
|
40428
|
+
"line": 68,
|
|
40429
|
+
"title": "the tenantId the v1 prose requires on unregister is a required query parameter of api/openapi.yaml unregisterWebhook",
|
|
40430
|
+
"explicitId": "openwop.requirement.webhooks.v1-unregister-tenantid-in-contract",
|
|
40431
|
+
"citations": [
|
|
40432
|
+
{
|
|
40433
|
+
"section": "spec/v1/webhooks.md §Unregister",
|
|
40434
|
+
"requirement": "spec/v1/webhooks.md §Unregister MUST still require the tenantId query parameter — this leg is only meaningful while it does"
|
|
40435
|
+
},
|
|
40436
|
+
{
|
|
40437
|
+
"section": "spec/v1/webhooks.md §Unregister",
|
|
40438
|
+
"requirement": "api/openapi.yaml MUST define DELETE /v1/webhooks/{webhookId}"
|
|
40439
|
+
},
|
|
40440
|
+
{
|
|
40441
|
+
"section": "spec/v1/webhooks.md §Unregister",
|
|
40442
|
+
"requirement": "the v1 operation is unregisterWebhook"
|
|
40443
|
+
},
|
|
40444
|
+
{
|
|
40445
|
+
"section": "spec/v1/webhooks.md §Unregister",
|
|
40446
|
+
"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"
|
|
40447
|
+
}
|
|
40448
|
+
]
|
|
40449
|
+
},
|
|
40450
|
+
{
|
|
40451
|
+
"id": "openwop.it.v1-webhook-unregister-contract.the-v2-twin-carries-the-tenant-in-its-id-and-does-not-grow-the-v1-query-paramete",
|
|
40452
|
+
"file": "v1-webhook-unregister-contract.test.ts",
|
|
40453
|
+
"line": 87,
|
|
40454
|
+
"title": "the v2 twin carries the tenant in its id and does not grow the v1 query parameter",
|
|
40455
|
+
"explicitId": "openwop.requirement.webhooks.v2-unregister-no-tenantid-query",
|
|
40456
|
+
"citations": [
|
|
40457
|
+
{
|
|
40458
|
+
"section": "api/v2/openapi.yaml unregisterWebhook",
|
|
40459
|
+
"requirement": "api/v2/openapi.yaml MUST define DELETE /webhooks/{webhookId}"
|
|
40460
|
+
},
|
|
40461
|
+
{
|
|
40462
|
+
"section": "identity.md §5 (RFC 0187 §A.1)",
|
|
40463
|
+
"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"
|
|
40464
|
+
}
|
|
40465
|
+
]
|
|
40466
|
+
},
|
|
40030
40467
|
{
|
|
40031
40468
|
"id": "openwop.it.v2-alias-covers-reword.the-corpus-gate-script-exits-0",
|
|
40032
40469
|
"file": "v2-alias-covers-reword.test.ts",
|
|
@@ -40453,7 +40890,7 @@
|
|
|
40453
40890
|
{
|
|
40454
40891
|
"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
40892
|
"file": "v2-interop-map-coherent.test.ts",
|
|
40456
|
-
"line":
|
|
40893
|
+
"line": 62,
|
|
40457
40894
|
"title": "the map agrees with the v2 wire, and the gate refuses each defect it exists to catch",
|
|
40458
40895
|
"explicitId": "openwop.requirement.0208.map-coherent",
|
|
40459
40896
|
"citations": [
|