@openwop/openwop-conformance 2.36.0 → 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/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": 623,
6
- "tests": 2386,
7
- "withStableId": 2386,
5
+ "files": 628,
6
+ "tests": 2401,
7
+ "withStableId": 2401,
8
8
  "interpolatedTitles": 0,
9
- "explicitIds": 2281
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": 56,
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": 75,
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": 94,
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": 107,
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": 114,
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": 122,
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": 134,
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": 152,
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": 170,
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": 176,
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": [
@@ -15860,13 +15864,21 @@
15860
15864
  {
15861
15865
  "section": "RFC 0153 §B",
15862
15866
  "requirement": "tools/list @2026-07-28 carries resultType + CacheableResult hints and lists the MRTR tool"
15867
+ },
15868
+ {
15869
+ "section": "mcp-integration.md §D",
15870
+ "requirement": "a truncated tools/list MUST carry a pagination cursor"
15871
+ },
15872
+ {
15873
+ "section": "mcp-integration.md §D",
15874
+ "requirement": "the last page of tools/list MUST NOT advertise a further cursor"
15863
15875
  }
15864
15876
  ]
15865
15877
  },
15866
15878
  {
15867
15879
  "id": "openwop.it.mcp-2026-07-28-discover.mrtr-needs-input-answers-input-required-elicitation-opaque-requeststate-and-comp",
15868
15880
  "file": "mcp-2026-07-28-discover.test.ts",
15869
- "line": 130,
15881
+ "line": 145,
15870
15882
  "title": "MRTR: needs_input answers input_required (elicitation + opaque requestState) and completes on the retry; missing capability ⇒ -32021",
15871
15883
  "explicitId": "openwop.it.mcp-2026-07-28-discover.mrtr-needs-input-answers-input-required-elicitation-opaque-requeststate-and-comp",
15872
15884
  "citations": [
@@ -15879,7 +15891,7 @@
15879
15891
  {
15880
15892
  "id": "openwop.it.mcp-2026-07-28-discover.server-discover-reports-supportedversions-equal-to-capabilities-mcp-protocolvers",
15881
15893
  "file": "mcp-2026-07-28-discover.test.ts",
15882
- "line": 186,
15894
+ "line": 201,
15883
15895
  "title": "server/discover reports supportedVersions equal to capabilities.mcp.protocolVersions, with resultType + cache hints",
15884
15896
  "explicitId": "openwop.it.mcp-2026-07-28-discover.server-discover-reports-supportedversions-equal-to-capabilities-mcp-protocolvers",
15885
15897
  "citations": [
@@ -15900,7 +15912,7 @@
15900
15912
  {
15901
15913
  "id": "openwop.it.mcp-2026-07-28-discover.a-header-body-revision-mismatch-is-refused-400-32020-an-unsupported-revision-400",
15902
15914
  "file": "mcp-2026-07-28-discover.test.ts",
15903
- "line": 198,
15915
+ "line": 213,
15904
15916
  "title": "a header/body revision mismatch is refused 400 + -32020; an unsupported revision 400 + -32022",
15905
15917
  "explicitId": "openwop.it.mcp-2026-07-28-discover.a-header-body-revision-mismatch-is-refused-400-32020-an-unsupported-revision-400",
15906
15918
  "citations": [
@@ -26465,10 +26477,24 @@
26465
26477
  }
26466
26478
  ]
26467
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
+ },
26468
26494
  {
26469
26495
  "id": "openwop.it.v2-a2a-operation-map.a-message-carrying-taskid-without-contextid-is-answered-with-the-task-s-contexti",
26470
26496
  "file": "v2-a2a-operation-map.test.ts",
26471
- "line": 130,
26497
+ "line": 134,
26472
26498
  "title": "a message carrying taskId without contextId is answered with the task's contextId",
26473
26499
  "explicitId": null,
26474
26500
  "citations": [
@@ -26499,7 +26525,7 @@
26499
26525
  {
26500
26526
  "id": "openwop.it.v2-a2a-operation-map.a-message-whose-contextid-is-not-its-task-s-is-refused-invalid-parameters-and-ch",
26501
26527
  "file": "v2-a2a-operation-map.test.ts",
26502
- "line": 144,
26528
+ "line": 148,
26503
26529
  "title": "a message whose contextId is not its task's is refused invalid-parameters and changes nothing",
26504
26530
  "explicitId": null,
26505
26531
  "citations": [
@@ -26526,7 +26552,7 @@
26526
26552
  {
26527
26553
  "id": "openwop.it.v2-a2a-operation-map.a-message-to-a-retained-terminal-task-is-refused-unsupportedoperationerror-and-a",
26528
26554
  "file": "v2-a2a-operation-map.test.ts",
26529
- "line": 159,
26555
+ "line": 163,
26530
26556
  "title": "a message to a retained terminal task is refused UnsupportedOperationError, and appends no event",
26531
26557
  "explicitId": null,
26532
26558
  "citations": [
@@ -26553,7 +26579,7 @@
26553
26579
  {
26554
26580
  "id": "openwop.it.v2-a2a-operation-map.an-unknown-task-and-another-tenant-s-task-are-answered-by-the-same-tasknotfounde",
26555
26581
  "file": "v2-a2a-operation-map.test.ts",
26556
- "line": 174,
26582
+ "line": 178,
26557
26583
  "title": "an unknown task and another tenant's task are answered by the same TaskNotFoundError",
26558
26584
  "explicitId": null,
26559
26585
  "citations": [
@@ -26573,15 +26599,20 @@
26573
26599
  "interpolated": true
26574
26600
  },
26575
26601
  {
26576
- "section": "interop.md §\"The operation mappings\" Isolation (A2A 1.0.1 §3.3.2)",
26577
- "requirement": "the foreign-tenant answer MUST be indistinguishable from the unknown-id answer: same HTTP status and the same error.data shape"
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)"
26578
26609
  }
26579
26610
  ]
26580
26611
  },
26581
26612
  {
26582
26613
  "id": "openwop.it.v2-a2a-operation-map.task-status-state-is-the-map-s-projection-of-the-run-status-at-every-observed-st",
26583
26614
  "file": "v2-a2a-operation-map.test.ts",
26584
- "line": 192,
26615
+ "line": 200,
26585
26616
  "title": "Task.status.state is the map's projection of the run status at every observed state",
26586
26617
  "explicitId": null,
26587
26618
  "citations": [
@@ -26604,7 +26635,7 @@
26604
26635
  {
26605
26636
  "id": "openwop.it.v2-a2a-operation-map.the-json-rpc-error-codes-the-suite-can-cause-are-the-a2a-1-0-1-codes",
26606
26637
  "file": "v2-a2a-operation-map.test.ts",
26607
- "line": 217,
26638
+ "line": 225,
26608
26639
  "title": "the JSON-RPC error codes the suite can cause are the A2A 1.0.1 codes",
26609
26640
  "explicitId": null,
26610
26641
  "citations": [
@@ -26627,7 +26658,7 @@
26627
26658
  {
26628
26659
  "id": "openwop.it.v2-a2a-operation-map.a-row-whose-requires-facet-is-not-advertised-is-refused-with-the-row-s-error",
26629
26660
  "file": "v2-a2a-operation-map.test.ts",
26630
- "line": 231,
26661
+ "line": 239,
26631
26662
  "title": "a row whose requires facet is not advertised is refused with the row's error",
26632
26663
  "explicitId": null,
26633
26664
  "citations": [
@@ -26645,7 +26676,7 @@
26645
26676
  {
26646
26677
  "id": "openwop.it.v2-a2a-operation-map.listtasks-returns-only-what-listruns-returns-to-the-same-subject-tenant-and-cont",
26647
26678
  "file": "v2-a2a-operation-map.test.ts",
26648
- "line": 244,
26679
+ "line": 252,
26649
26680
  "title": "ListTasks returns only what listRuns returns to the same Subject; tenant and contextId never select",
26650
26681
  "explicitId": null,
26651
26682
  "citations": [
@@ -26679,10 +26710,105 @@
26679
26710
  }
26680
26711
  ]
26681
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
+ },
26682
26808
  {
26683
26809
  "id": "openwop.it.v2-a2a-operation-map.a-run-suspended-on-a-credential-interrupt-projects-to-task-state-auth-required-n",
26684
26810
  "file": "v2-a2a-operation-map.test.ts",
26685
- "line": 277,
26811
+ "line": 359,
26686
26812
  "title": "a run suspended on a credential interrupt projects to TASK_STATE_AUTH_REQUIRED, naming the provider and carrying connectUrl",
26687
26813
  "explicitId": null,
26688
26814
  "citations": [
@@ -28088,7 +28214,7 @@
28088
28214
  {
28089
28215
  "id": "openwop.it.v2-durability-recovery.accepted-work-survives-a-kill-before-dispatch-and-dispatches-on-resume",
28090
28216
  "file": "v2-durability-recovery.test.ts",
28091
- "line": 292,
28217
+ "line": 280,
28092
28218
  "title": "accepted work survives a kill before dispatch and dispatches on resume",
28093
28219
  "explicitId": "openwop.requirement.0158.kill-after-accept",
28094
28220
  "citations": [
@@ -28102,7 +28228,7 @@
28102
28228
  {
28103
28229
  "id": "openwop.it.v2-durability-recovery.work-executing-at-a-real-process-death-is-never-reported-complete-and-resumes",
28104
28230
  "file": "v2-durability-recovery.test.ts",
28105
- "line": 346,
28231
+ "line": 334,
28106
28232
  "title": "work executing at a real process death is never reported complete, and resumes",
28107
28233
  "explicitId": "openwop.requirement.0158.kill-during-execution",
28108
28234
  "citations": [
@@ -28121,7 +28247,7 @@
28121
28247
  {
28122
28248
  "id": "openwop.it.v2-durability-recovery.the-same-accepted-work-delivered-twice-fires-each-effect-exactly-once",
28123
28249
  "file": "v2-durability-recovery.test.ts",
28124
- "line": 402,
28250
+ "line": 390,
28125
28251
  "title": "the same accepted work delivered twice fires each effect exactly once",
28126
28252
  "explicitId": "openwop.requirement.0158.duplicate-delivery",
28127
28253
  "citations": [
@@ -28140,7 +28266,7 @@
28140
28266
  {
28141
28267
  "id": "openwop.it.v2-durability-recovery.the-declared-recovery-bound-is-derived-from-the-mechanism-that-enforces-it",
28142
28268
  "file": "v2-durability-recovery.test.ts",
28143
- "line": 476,
28269
+ "line": 524,
28144
28270
  "title": "the declared recovery bound is derived from the mechanism that enforces it",
28145
28271
  "explicitId": "openwop.requirement.0158.bound-is-derived",
28146
28272
  "citations": [
@@ -28154,7 +28280,7 @@
28154
28280
  {
28155
28281
  "id": "openwop.it.v2-durability-recovery.deterministically-failing-work-reaches-a-terminal-state-and-stops-being-retried",
28156
28282
  "file": "v2-durability-recovery.test.ts",
28157
- "line": 507,
28283
+ "line": 555,
28158
28284
  "title": "deterministically failing work reaches a terminal state and stops being retried",
28159
28285
  "explicitId": "openwop.requirement.0158.poison-exhaustion",
28160
28286
  "citations": [
@@ -28756,6 +28882,45 @@
28756
28882
  }
28757
28883
  ]
28758
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
+ },
28759
28924
  {
28760
28925
  "id": "openwop.it.v2-idempotency-key-grammar.a-22-character-key-inside-the-grammar-is-accepted",
28761
28926
  "file": "v2-idempotency-key-grammar.test.ts",
@@ -28936,6 +29101,48 @@
28936
29101
  }
28937
29102
  ]
28938
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
+ },
28939
29146
  {
28940
29147
  "id": "openwop.it.v2-interrupt-token-scheme.a-token-without-the-ow2-prefix-is-refused",
28941
29148
  "file": "v2-interrupt-token-scheme.test.ts",
@@ -29405,7 +29612,7 @@
29405
29612
  {
29406
29613
  "id": "openwop.it.v2-mcp-mount-map.a-host-claiming-mcp-2026-07-28-lists-every-feature-the-map-requires-for-it",
29407
29614
  "file": "v2-mcp-mount-map.test.ts",
29408
- "line": 94,
29615
+ "line": 97,
29409
29616
  "title": "a host claiming mcp-2026-07-28 lists every feature the map requires for it",
29410
29617
  "explicitId": null,
29411
29618
  "citations": [
@@ -29419,7 +29626,7 @@
29419
29626
  {
29420
29627
  "id": "openwop.it.v2-mcp-mount-map.server-discover-supportedversions-equals-mcp-revisions-with-resulttype-and-cache",
29421
29628
  "file": "v2-mcp-mount-map.test.ts",
29422
- "line": 101,
29629
+ "line": 104,
29423
29630
  "title": "server/discover supportedVersions equals mcp.revisions, with resultType and cache hints",
29424
29631
  "explicitId": null,
29425
29632
  "citations": [
@@ -29449,7 +29656,7 @@
29449
29656
  {
29450
29657
  "id": "openwop.it.v2-mcp-mount-map.header-body-disagreement-fails-closed-32020-before-version-selection-an-unsuppor",
29451
29658
  "file": "v2-mcp-mount-map.test.ts",
29452
- "line": 113,
29659
+ "line": 116,
29453
29660
  "title": "header/body disagreement fails closed -32020 before version selection; an unsupported revision is -32022",
29454
29661
  "explicitId": null,
29455
29662
  "citations": [
@@ -29482,7 +29689,7 @@
29482
29689
  {
29483
29690
  "id": "openwop.it.v2-mcp-mount-map.tools-list-needs-no-initialize-and-no-session-results-carry-cache-hints-and-agre",
29484
29691
  "file": "v2-mcp-mount-map.test.ts",
29485
- "line": 128,
29692
+ "line": 131,
29486
29693
  "title": "tools/list needs no initialize and no session; results carry cache hints and agree across requests",
29487
29694
  "explicitId": null,
29488
29695
  "citations": [
@@ -29520,7 +29727,7 @@
29520
29727
  {
29521
29728
  "id": "openwop.it.v2-mcp-mount-map.tools-call-answers-a-completed-run-iserror-false-and-a-failed-run-iserror-true-n",
29522
29729
  "file": "v2-mcp-mount-map.test.ts",
29523
- "line": 144,
29730
+ "line": 147,
29524
29731
  "title": "tools/call answers a completed run isError false and a failed run isError true, never a JSON-RPC error",
29525
29732
  "explicitId": null,
29526
29733
  "citations": [
@@ -29552,7 +29759,7 @@
29552
29759
  {
29553
29760
  "id": "openwop.it.v2-mcp-mount-map.a-run-started-by-tools-call-records-run-started-transport-mcp",
29554
29761
  "file": "v2-mcp-mount-map.test.ts",
29555
- "line": 159,
29762
+ "line": 162,
29556
29763
  "title": "a run started by tools/call records run.started.transport mcp",
29557
29764
  "explicitId": null,
29558
29765
  "citations": [
@@ -29570,7 +29777,7 @@
29570
29777
  {
29571
29778
  "id": "openwop.it.v2-mcp-mount-map.a-suspending-tool-answers-inputrequiredresult-the-retry-resolves-it-requeststate",
29572
29779
  "file": "v2-mcp-mount-map.test.ts",
29573
- "line": 178,
29780
+ "line": 181,
29574
29781
  "title": "a suspending tool answers InputRequiredResult; the retry resolves it; requestState is single use and forgery-proof",
29575
29782
  "explicitId": null,
29576
29783
  "citations": [
@@ -29609,10 +29816,49 @@
29609
29816
  }
29610
29817
  ]
29611
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
+ },
29612
29858
  {
29613
29859
  "id": "openwop.it.v2-mcp-mount-map.a-list-that-differs-per-caller-is-cachescope-private",
29614
29860
  "file": "v2-mcp-mount-map.test.ts",
29615
- "line": 203,
29861
+ "line": 244,
29616
29862
  "title": "a list that differs per caller is cacheScope private",
29617
29863
  "explicitId": null,
29618
29864
  "citations": [
@@ -29630,7 +29876,7 @@
29630
29876
  {
29631
29877
  "id": "openwop.it.v2-mcp-mount-map.unknown-meta-extension-keys-and-capabilities-extensions-are-opaque-processed-nor",
29632
29878
  "file": "v2-mcp-mount-map.test.ts",
29633
- "line": 220,
29879
+ "line": 261,
29634
29880
  "title": "unknown _meta extension keys and capabilities.extensions are opaque: processed normally, granting nothing",
29635
29881
  "explicitId": null,
29636
29882
  "citations": [
@@ -29648,7 +29894,7 @@
29648
29894
  {
29649
29895
  "id": "openwop.it.v2-mcp-mount-map.an-unauthenticated-request-is-refused-at-the-boundary-unless-anonymousactor-is-a",
29650
29896
  "file": "v2-mcp-mount-map.test.ts",
29651
- "line": 229,
29897
+ "line": 270,
29652
29898
  "title": "an unauthenticated request is refused at the boundary unless anonymousActor is advertised",
29653
29899
  "explicitId": null,
29654
29900
  "citations": [
@@ -29671,7 +29917,7 @@
29671
29917
  {
29672
29918
  "id": "openwop.it.v2-mcp-mount-map.a-credential-interrupt-is-answered-in-url-mode-url-connecturl-iserror-without-ur",
29673
29919
  "file": "v2-mcp-mount-map.test.ts",
29674
- "line": 246,
29920
+ "line": 287,
29675
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",
29676
29922
  "explicitId": null,
29677
29923
  "citations": [
@@ -29709,7 +29955,7 @@
29709
29955
  {
29710
29956
  "id": "openwop.it.v2-mcp-mount-map.form-mode-is-never-emitted-for-a-nested-schema-or-a-sensitive-format-password-fi",
29711
29957
  "file": "v2-mcp-mount-map.test.ts",
29712
- "line": 287,
29958
+ "line": 328,
29713
29959
  "title": "form mode is never emitted for a nested schema or a sensitive (format password) field",
29714
29960
  "explicitId": null,
29715
29961
  "citations": [
@@ -30180,7 +30426,7 @@
30180
30426
  {
30181
30427
  "id": "openwop.it.v2-negotiation-authenticated.an-unauthenticated-mcp-exchange-cannot-lower-the-revision-below-preferredversion",
30182
30428
  "file": "v2-negotiation-authenticated.test.ts",
30183
- "line": 111,
30429
+ "line": 117,
30184
30430
  "title": "an unauthenticated MCP exchange cannot lower the revision below preferredVersion",
30185
30431
  "explicitId": null,
30186
30432
  "citations": []
@@ -31902,6 +32148,77 @@
31902
32148
  }
31903
32149
  ]
31904
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
+ },
31905
32222
  {
31906
32223
  "id": "openwop.it.v2-sse-last-event-id.last-event-id-resumes-at-the-next-sequence-never-re-emits-the-resumption-point-l",
31907
32224
  "file": "v2-sse-last-event-id.test.ts",
@@ -32144,7 +32461,7 @@
32144
32461
  {
32145
32462
  "id": "openwop.it.v2-terminal-event-once.every-run-observed-to-a-terminal-state-has-exactly-one-terminal-event-and-no-for",
32146
32463
  "file": "v2-terminal-event-once.test.ts",
32147
- "line": 71,
32464
+ "line": 81,
32148
32465
  "title": "every run observed to a terminal state has exactly one terminal event and no forward execution after it",
32149
32466
  "explicitId": "openwop.requirement.0194.terminal-once",
32150
32467
  "citations": [
@@ -32162,7 +32479,7 @@
32162
32479
  {
32163
32480
  "id": "openwop.it.v2-terminal-event-once.work-delivered-twice-still-leaves-one-terminal-event-and-no-forward-execution-af",
32164
32481
  "file": "v2-terminal-event-once.test.ts",
32165
- "line": 99,
32482
+ "line": 109,
32166
32483
  "title": "work delivered twice still leaves one terminal event and no forward execution after it",
32167
32484
  "explicitId": "openwop.requirement.0194.terminal-once.duplicate-delivery",
32168
32485
  "citations": [
@@ -37939,7 +38256,7 @@
37939
38256
  {
37940
38257
  "id": "openwop.it.openapi-asyncapi-sdk-parity.spec-v1-operation-path-manifest-json-exists-in-the-corpus-layout-and-re-derives",
37941
38258
  "file": "openapi-asyncapi-sdk-parity.test.ts",
37942
- "line": 189,
38259
+ "line": 200,
37943
38260
  "title": "spec/v1/operation-path-manifest.json exists in the corpus layout and re-derives byte-for-byte from api/openapi.yaml",
37944
38261
  "explicitId": "openwop.it.openapi-asyncapi-sdk-parity.spec-v1-operation-path-manifest-json-exists-in-the-corpus-layout-and-re-derives",
37945
38262
  "citations": [
@@ -37952,7 +38269,7 @@
37952
38269
  {
37953
38270
  "id": "openwop.it.openapi-asyncapi-sdk-parity.every-operation-resolves-to-exactly-one-v1-segment-none-for-well-known-has-an-op",
37954
38271
  "file": "openapi-asyncapi-sdk-parity.test.ts",
37955
- "line": 201,
38272
+ "line": 212,
37956
38273
  "title": "every operation resolves to exactly one /v1 segment (none for /.well-known/*), has an operationId, and ids are unique",
37957
38274
  "explicitId": "openwop.it.openapi-asyncapi-sdk-parity.every-operation-resolves-to-exactly-one-v1-segment-none-for-well-known-has-an-op",
37958
38275
  "citations": [
@@ -37981,7 +38298,7 @@
37981
38298
  {
37982
38299
  "id": "openwop.it.openapi-asyncapi-sdk-parity.the-asyncapi-server-pathname-carries-the-version-segment-exactly-once",
37983
38300
  "file": "openapi-asyncapi-sdk-parity.test.ts",
37984
- "line": 220,
38301
+ "line": 231,
37985
38302
  "title": "the AsyncAPI server pathname carries the version segment exactly once",
37986
38303
  "explicitId": "openwop.it.openapi-asyncapi-sdk-parity.the-asyncapi-server-pathname-carries-the-version-segment-exactly-once",
37987
38304
  "citations": [
@@ -37995,7 +38312,7 @@
37995
38312
  {
37996
38313
  "id": "openwop.it.openapi-asyncapi-sdk-parity.every-addressed-channel-resolves-server-pathname-address-to-an-openapi-path-key",
37997
38314
  "file": "openapi-asyncapi-sdk-parity.test.ts",
37998
- "line": 226,
38315
+ "line": 237,
37999
38316
  "title": "every addressed channel resolves (server pathname + address) to an OpenAPI path key that has a GET operation, with exactly one /v1",
38000
38317
  "explicitId": "openwop.it.openapi-asyncapi-sdk-parity.every-addressed-channel-resolves-server-pathname-address-to-an-openapi-path-key",
38001
38318
  "citations": [
@@ -38018,7 +38335,7 @@
38018
38335
  {
38019
38336
  "id": "openwop.it.openapi-asyncapi-sdk-parity.logical-address-null-channels-are-the-only-ones-without-a-wire-address-and-they",
38020
38337
  "file": "openapi-asyncapi-sdk-parity.test.ts",
38021
- "line": 242,
38338
+ "line": 253,
38022
38339
  "title": "logical (address: null) channels are the only ones without a wire address, and they are documented as logical",
38023
38340
  "explicitId": "openwop.it.openapi-asyncapi-sdk-parity.logical-address-null-channels-are-the-only-ones-without-a-wire-address-and-they",
38024
38341
  "citations": [
@@ -38032,13 +38349,14 @@
38032
38349
  {
38033
38350
  "id": "openwop.it.openapi-asyncapi-sdk-parity.sdk-parity-expectations-json-covers-every-canonical-operation-with-the-same-meth",
38034
38351
  "file": "openapi-asyncapi-sdk-parity.test.ts",
38035
- "line": 251,
38352
+ "line": 262,
38036
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",
38037
38354
  "explicitId": "openwop.it.openapi-asyncapi-sdk-parity.sdk-parity-expectations-json-covers-every-canonical-operation-with-the-same-meth",
38038
38355
  "citations": [
38039
38356
  {
38040
38357
  "section": "RFC 0149 §A",
38041
- "requirement": "canonical operations with no SDK parity declaration"
38358
+ "requirement": null,
38359
+ "interpolated": true
38042
38360
  },
38043
38361
  {
38044
38362
  "section": "RFC 0149 §A",
@@ -40019,6 +40337,81 @@
40019
40337
  }
40020
40338
  ]
40021
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
+ },
40022
40415
  {
40023
40416
  "id": "openwop.it.v2-alias-covers-reword.the-corpus-gate-script-exits-0",
40024
40417
  "file": "v2-alias-covers-reword.test.ts",
@@ -40445,7 +40838,7 @@
40445
40838
  {
40446
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",
40447
40840
  "file": "v2-interop-map-coherent.test.ts",
40448
- "line": 54,
40841
+ "line": 62,
40449
40842
  "title": "the map agrees with the v2 wire, and the gate refuses each defect it exists to catch",
40450
40843
  "explicitId": "openwop.requirement.0208.map-coherent",
40451
40844
  "citations": [