@openwop/openwop-conformance 2.41.1 → 2.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# `@openwop/openwop-conformance` Changelog
|
|
2
2
|
|
|
3
|
+
## [2.42.0] — 2026-09-26 — `replay_context_summary_unavailable` is a registered code, and an unregistered subscription has no sink
|
|
4
|
+
|
|
5
|
+
- **RFC 0217: after unregister, the dead-letter read answers `404 not_found`, as for a subscription that never existed.** `v2-webhook-durable-delivery` gains `openwop.requirement.0217.dead-letter-read-after-unregister`, gated on `webhooks.deadLetter`: read the sink (`200`, the control), unregister (`204`), read again, and read a never-minted same-tenant id; both later reads must be `404 not_found`. Closes RFC 0215's gap G5. Sabotage: a v2 reference host whose read answers `200 { deliveries: [] }` for an unknown id fails the row.
|
|
6
|
+
- **Version moved ahead of publication.** `@openwop/openwop-conformance` and its exact-pinned peer `@openwop/spec-artifacts` move to `2.42.0` because `2.41.1` is published and this cycle changes shipped spec files (`spec/v2/errors.json`, the generated `schemas/v2/error-envelope.schema.json`). A minor: a new registered error code is an additive wire member. No scenario changes — no conformance leg asserts the code (a black-box suite cannot make a host's summary artifact unavailable at `fromSeq`; RFC 0111 amendment).
|
|
7
|
+
|
|
3
8
|
## [2.41.1] — 2026-09-26 — an SSE projection row no longer depends on a host's front forwarding headers early
|
|
4
9
|
|
|
5
10
|
- **`v2-stream-sse-projection` reads a terminal run's stream.** It streamed the noop run the moment it was created, so on a loaded certification cut the run was still queued and the stream stayed open. A public front that buffers SSE (openwop-app's Firebase Hosting) withholds the headers of an open stream, `streamEvents`' 8 s budget ran out before any header arrived, and `0171.stream-sse-projection` recorded `blocked` ("answered 0") on both of openwop-app's 2.40.3 production cuts. Quiet-machine time to first byte for the same request was 0.19 s. No rule bounds time to headers. The row tests how every frame names its run, and a terminal run's backlog carries every frame, so the leg now waits up to 30 s for the run to finish before it reads the stream (the host closes a terminal run's stream, events.md §SSE), and a missing response now says which of the two it was.
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# --legacy-peer-deps is REQUIRED, not optional: the exact peer pin is what npm's
|
|
12
12
|
# default resolver refuses. npm 10.9 fails outright with
|
|
13
13
|
# "Cannot read properties of null (reading 'edgesOut')" — use npm >= 11.
|
|
14
|
-
npm install --legacy-peer-deps @openwop/openwop-conformance@2.
|
|
14
|
+
npm install --legacy-peer-deps @openwop/openwop-conformance@2.42.0 @openwop/spec-artifacts@2.42.0
|
|
15
15
|
# or run without install:
|
|
16
16
|
npx @openwop/openwop-conformance --base-url https://api.example.com --api-key hk_test_...
|
|
17
17
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/openwop-conformance",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.42.0",
|
|
4
4
|
"description": "Production-ready black-box conformance suite for OpenWOP v1.0 compliant servers.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -56,6 +56,6 @@
|
|
|
56
56
|
"@openwop/spec-artifacts": "file:../spec-artifacts"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@openwop/spec-artifacts": "2.
|
|
59
|
+
"@openwop/spec-artifacts": "2.42.0"
|
|
60
60
|
}
|
|
61
61
|
}
|
package/requirements.json
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"generatedFrom": "src/scenarios/*.test.ts",
|
|
4
4
|
"counts": {
|
|
5
5
|
"files": 636,
|
|
6
|
-
"tests":
|
|
7
|
-
"withStableId":
|
|
6
|
+
"tests": 2439,
|
|
7
|
+
"withStableId": 2439,
|
|
8
8
|
"interpolatedTitles": 0,
|
|
9
|
-
"explicitIds":
|
|
9
|
+
"explicitIds": 2333
|
|
10
10
|
},
|
|
11
11
|
"records": [
|
|
12
12
|
{
|
|
@@ -33406,9 +33406,36 @@
|
|
|
33406
33406
|
]
|
|
33407
33407
|
},
|
|
33408
33408
|
{
|
|
33409
|
-
"id": "openwop.it.v2-webhook-durable-delivery.
|
|
33409
|
+
"id": "openwop.it.v2-webhook-durable-delivery.after-unregister-the-dead-letter-read-answers-404-not-found-as-for-a-subscriptio",
|
|
33410
33410
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
33411
33411
|
"line": 475,
|
|
33412
|
+
"title": "after unregister, the dead-letter read answers 404 not_found, as for a subscription that never existed",
|
|
33413
|
+
"explicitId": "openwop.requirement.0217.dead-letter-read-after-unregister",
|
|
33414
|
+
"citations": [
|
|
33415
|
+
{
|
|
33416
|
+
"section": "RFC 0188 §A.1",
|
|
33417
|
+
"requirement": "while the subscription exists, its dead-letter read MUST answer 200 (the control for the comparison below)"
|
|
33418
|
+
},
|
|
33419
|
+
{
|
|
33420
|
+
"section": "webhooks.md §Surfaces",
|
|
33421
|
+
"requirement": "unregisterWebhook MUST answer 204 for the caller's own subscription"
|
|
33422
|
+
},
|
|
33423
|
+
{
|
|
33424
|
+
"section": "webhooks.md §Durability (RFC 0217 §A)",
|
|
33425
|
+
"requirement": null,
|
|
33426
|
+
"interpolated": true
|
|
33427
|
+
},
|
|
33428
|
+
{
|
|
33429
|
+
"section": "webhooks.md §Durability (RFC 0217 §A)",
|
|
33430
|
+
"requirement": null,
|
|
33431
|
+
"interpolated": true
|
|
33432
|
+
}
|
|
33433
|
+
]
|
|
33434
|
+
},
|
|
33435
|
+
{
|
|
33436
|
+
"id": "openwop.it.v2-webhook-durable-delivery.a-dead-letter-record-carries-no-delivered-payload",
|
|
33437
|
+
"file": "v2-webhook-durable-delivery.test.ts",
|
|
33438
|
+
"line": 508,
|
|
33412
33439
|
"title": "a dead-letter record carries no delivered payload",
|
|
33413
33440
|
"explicitId": "openwop.requirement.0188.dead-letter-content-free",
|
|
33414
33441
|
"citations": [
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_comment": "Provenance of @openwop/spec-artifacts (RFC 0168 §D.2). files: SHA-256 per file; the conformance suite compares the installed peer against dist/spec-artifacts.lock.json at start.",
|
|
3
3
|
"package": "@openwop/spec-artifacts",
|
|
4
|
-
"version": "2.
|
|
5
|
-
"corpusTag": "v2.
|
|
4
|
+
"version": "2.42.0",
|
|
5
|
+
"corpusTag": "v2.42.0",
|
|
6
6
|
"files": {
|
|
7
7
|
"api/.redocly.lint-ignore.yaml": "bf5a8350b88a72fa43f59605ed8d903ed24b6cfccda5e45509c9f6ed9ee4e712",
|
|
8
8
|
"api/asyncapi.yaml": "d5ecb9ee6114582be3b1f662c84bfac9ae96dae7bacb853e461168f70a8e1c7d",
|
|
9
9
|
"api/grpc/openwop.proto": "c3e72bb17cba514ee98feb6434e6c9b6ea6795bfd086489ec69fd882dd1ad977",
|
|
10
10
|
"api/openapi.yaml": "6366b5514be71098e9ea41fc81ff52bc39db1a547b353c0b344cc2a2bf5370aa",
|
|
11
11
|
"api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
|
|
12
|
-
"api/seams-v2.yaml": "
|
|
13
|
-
"api/v2/asyncapi.yaml": "
|
|
14
|
-
"api/v2/openapi.yaml": "
|
|
12
|
+
"api/seams-v2.yaml": "78bc7bc551f7c91c5b8074dbb6050ab74ec39e032833c51a065c2f834f20826c",
|
|
13
|
+
"api/v2/asyncapi.yaml": "677ca1a062a22dfec6efbc5e109a2b0b356e9ee9508b638a85033361dae7a927",
|
|
14
|
+
"api/v2/openapi.yaml": "bd025e0d7ac058148e17925bb824f00dda4084063b612d6be546c221c393af95",
|
|
15
15
|
"api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
|
|
16
16
|
"schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
|
|
17
17
|
"schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
"schemas/v2/envelopes/schema.request.schema.json": "be2c5f7aa881cdd252ccff47ac02193659e1393633a1541f4297383205d384a2",
|
|
143
143
|
"schemas/v2/envelopes/schema.response.schema.json": "d049a081267c06c28879c331b147f3ed821b14ccfd93005c67aff64db0a8c68e",
|
|
144
144
|
"schemas/v2/envelopes/ui.a2ui-surface.schema.json": "e92a2548ba65454c9e0a34f72ea6768d18f59e61fa5da7668d0b2d5baddaddc8",
|
|
145
|
-
"schemas/v2/error-envelope.schema.json": "
|
|
145
|
+
"schemas/v2/error-envelope.schema.json": "b812a33626efd68d492269ff4a713e5a91a59d7071eb2470db99757f260e5d47",
|
|
146
146
|
"schemas/v2/eval-summary.schema.json": "2f384daf05b8f3b4f604688cae504d6d9971ba41b8c771e55fe9a17e09e86b7a",
|
|
147
147
|
"schemas/v2/export-bundle.schema.json": "bd28905a7729437ab7f2ad8bb33e13a371b2bf5605a7eb2962a0d246de312d69",
|
|
148
148
|
"schemas/v2/form-content-pack-manifest.schema.json": "a1942a124e250a6e9fbdb6b811c5a125e78fbcbcaa46dfc71d0636f24710a339",
|
|
@@ -204,13 +204,13 @@
|
|
|
204
204
|
"schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
|
|
205
205
|
"spec/v1/alias-detectors.json": "2401fcb1c18cdd688c018b3d716ae6bca85c5e356220ee2b793bd9d81872412d",
|
|
206
206
|
"spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
|
|
207
|
-
"spec/v1/core-standard-manifest.json": "
|
|
207
|
+
"spec/v1/core-standard-manifest.json": "da8798e334fbbdc2078e4f83cab486c9f6c5c3cc32c2297d9e5a85eda15a04ad",
|
|
208
208
|
"spec/v1/deprecations.json": "2d03f4729810280147ea08c630ea65434f2dc5370567d0aac41c3595f8337d40",
|
|
209
209
|
"spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
|
|
210
210
|
"spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
|
|
211
211
|
"spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
|
|
212
212
|
"spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
|
|
213
|
-
"spec/v1/gaps.json": "
|
|
213
|
+
"spec/v1/gaps.json": "d91c400b704b83e65dd40dbed1c0331a6d005fdb77d3facce0eacea89c4c7f14",
|
|
214
214
|
"spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
|
|
215
215
|
"spec/v1/migrations.json": "8839497d6a4830b53fa7867014a8336f0d725ef2346352e54fb580b7947897af",
|
|
216
216
|
"spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
|
|
@@ -221,7 +221,7 @@
|
|
|
221
221
|
"spec/v2/core/conformance.md": "e4d3b34ef5b7c6a34675ed59a086143e8bfd0e00d0d04ce0f2a2ec6245275084",
|
|
222
222
|
"spec/v2/core/connection-packs.md": "7257339a4fc125011bf89961588c949cb058a0c0f7d9808ad08a5288deb3f8fc",
|
|
223
223
|
"spec/v2/core/conversation.md": "c9a937e410fdb4e092cec2f05a7cab8b5232745090cfb20041c03c70ccbb5cdc",
|
|
224
|
-
"spec/v2/core/errors.md": "
|
|
224
|
+
"spec/v2/core/errors.md": "870f1a9c9481fb49c8bd39170f0656c2ae46124afd4472fb7a3c18c67be0e561",
|
|
225
225
|
"spec/v2/core/events.md": "3df1866a89fb765c78adf79b8d51f96c59584dee9aa88d59179b88a681d827da",
|
|
226
226
|
"spec/v2/core/form-content-packs.md": "55ea021b5f676f5851f420b3597262fbf6642108bddeb726922f8c5dd96c968b",
|
|
227
227
|
"spec/v2/core/headers.md": "38c03524e3aeea30862432d203faffb8b0b05ec65136d223e96ab06941c3717b",
|
|
@@ -230,23 +230,23 @@
|
|
|
230
230
|
"spec/v2/core/identity.md": "d15667552019f64316be9b65c6e5696c10766581405f05da3907fb47f36e6459",
|
|
231
231
|
"spec/v2/core/interop.md": "9a6b37e07c0235856199ace6b3a84f592fa5903fcf6c442f8a18f4d6b6aa5525",
|
|
232
232
|
"spec/v2/core/interrupt.md": "1dc94f7c791dd5a547b1abafde6a8a76acd3d2993d288057f302f57911dc83bf",
|
|
233
|
-
"spec/v2/core/node-pack-runtimes.md": "
|
|
233
|
+
"spec/v2/core/node-pack-runtimes.md": "b6de99daf90a72f08ce0e311e63988198964f99346591e466529d9e95dc4b6d9",
|
|
234
234
|
"spec/v2/core/oauth.md": "38ec0e70d46f328430138559095f261ae4fcd3d32c2d994a2d3e630a062c0e6c",
|
|
235
235
|
"spec/v2/core/overview.md": "8f9d4a68b6185664e40d226cb82d9a9270a6c6630e3db59bddff300be781947d",
|
|
236
236
|
"spec/v2/core/packs.md": "91cd577b4a636c1587ef78742e583a203244b8508b289b01a18a8ef2ef0a9b3e",
|
|
237
237
|
"spec/v2/core/persistence.md": "d32736bd74e51df7c552565b4105a8ec801ece6d2292c8676421368ee9bffec1",
|
|
238
|
-
"spec/v2/core/replay.md": "
|
|
238
|
+
"spec/v2/core/replay.md": "7c11e0dad22d367b94630e00b435ed8f33d0ab76d36adc65e150212d770ad685",
|
|
239
239
|
"spec/v2/core/runs.md": "c7dcc5116648f42cadecdcd4c949b194272908cbc4b1fbc7321956d5b3a713af",
|
|
240
240
|
"spec/v2/core/security-defaults.md": "500471a8db7af9b776ac40b4a9a278c9f3d45e1c1dead880114e7fadc7bee37d",
|
|
241
241
|
"spec/v2/core/tool-catalog.md": "35f1a3fd509db0fc0490ddf400686fe94dc4b20c98064d5ebe776da516153e60",
|
|
242
242
|
"spec/v2/core/versioning.md": "0aded71d090c8358c3ce17763c120cfc1cc42531a5eaa1b8a2a7016ed9594069",
|
|
243
|
-
"spec/v2/core/webhooks.md": "
|
|
243
|
+
"spec/v2/core/webhooks.md": "221fc8f3222c34ee094723602f286f1b2acad7931188cad6c3611189c9c6acbb",
|
|
244
244
|
"spec/v2/core/workflow-chain-packs.md": "ee45d3fede3bb6f0cc6abcf0d6c929c7cd213a0fbe862b738a998f929c4d1102",
|
|
245
245
|
"spec/v2/corrections.json": "cc74ffde74384b0f261a4f625871d922e8661d654d647a8534e21036595cb280",
|
|
246
246
|
"spec/v2/corrections.schema.json": "4ac595b9a6d7f66d53de03fe0edbe0dc58de46426932387bfdc0ceb3cf949a3e",
|
|
247
247
|
"spec/v2/declaration.json": "84bd247804e625b0a5d66f2011726626e8a9b21e55c479cc9ba239e6b5c358a6",
|
|
248
248
|
"spec/v2/declaration.schema.json": "881c08b455aa12c41a0a0ec43a960ab78b75ff1302188f7eaaa43074ed4cff7a",
|
|
249
|
-
"spec/v2/errors.json": "
|
|
249
|
+
"spec/v2/errors.json": "1064999c8a00f44ab99ce24995fe9a93e6d2d5778e5eacb6621de0d0af1eb37f",
|
|
250
250
|
"spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
|
|
251
251
|
"spec/v2/event-codemap.schema.json": "b173f2a9bcc0bf9b62a474ce3b91e1431d597e64fd1560fc58662cd8606eaf9c",
|
|
252
252
|
"spec/v2/ext/README.md": "ff91a503e0795e1b898e37d9e445add2d5975529723f7b32b2599b60a24c1ae3",
|
|
@@ -294,9 +294,9 @@
|
|
|
294
294
|
"spec/v2/path-manifest.json": "ae9b56d03a701061fd48ad0b73cb0373493f6a4547da92763b422295b5e19535",
|
|
295
295
|
"spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
|
|
296
296
|
"spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
|
|
297
|
-
"spec/v2/release.json": "
|
|
297
|
+
"spec/v2/release.json": "b2fb154e00b0aeb9a64c29d56d99fbd21b9de1872e9a047c81f6c1ee7c50a74c",
|
|
298
298
|
"spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
|
|
299
|
-
"spec/v2/surface-baseline.json": "
|
|
299
|
+
"spec/v2/surface-baseline.json": "fbf584bd7cb6905f0f8280d7d7ae6746fd30f948dc08b4f80aac0afc760f22ce"
|
|
300
300
|
},
|
|
301
|
-
"corpusCommit": "
|
|
301
|
+
"corpusCommit": "bb35ff0f896edfbc7300c5c71e4e33a678e7f815"
|
|
302
302
|
}
|
|
@@ -472,6 +472,39 @@ describe('RFC 0173 §B — webhook-durable-delivery (gated on webhooks)', () =>
|
|
|
472
472
|
).toBe(200);
|
|
473
473
|
}, DEAD_LETTER_TEST_TIMEOUT_MS);
|
|
474
474
|
|
|
475
|
+
it('after unregister, the dead-letter read answers 404 not_found, as for a subscription that never existed', async () => {
|
|
476
|
+
// RFC 0217 (amends RFC 0188 §A; suite 2.42.0; RFC 0215 gap G5). The read
|
|
477
|
+
// is path-scoped to a subscription, and identity.md §5 already says an
|
|
478
|
+
// unknown id is 404. What was unstated is the id that WAS known: after
|
|
479
|
+
// unregisterWebhook's 204 a host MUST answer exactly as for a same-tenant id
|
|
480
|
+
// it never minted, so the subscription's existence is not recoverable
|
|
481
|
+
// through the sink, and a host MAY discard the records at the unregister.
|
|
482
|
+
const ID = 'openwop.requirement.0217.dead-letter-read-after-unregister';
|
|
483
|
+
if (!(await v2Discovery())) return softSkip('blocked', 'v2 discovery unreachable');
|
|
484
|
+
const fam = await gateFamily('webhooks');
|
|
485
|
+
if (!fam) return softSkip('inapplicable', 'webhooks family not advertised');
|
|
486
|
+
if (!fam['deadLetter']) return softSkip('inapplicable', 'host does not advertise the webhooks.deadLetter facet — RFC 0188 §A.5 makes the read a 404 for every subscription, so there is no before/after to compare');
|
|
487
|
+
const reg = await driver.post('/webhooks', { url: 'https://subscriber.invalid/hook', events: ['run.completed'] });
|
|
488
|
+
if (reg.status !== 201) return softSkip('blocked', `POST /webhooks answered ${reg.status} — no subscription to unregister`);
|
|
489
|
+
const webhookId = (reg.json as { webhookId?: unknown } | null)?.webhookId;
|
|
490
|
+
if (typeof webhookId !== 'string' || !webhookId.includes('/')) return softSkip('blocked', `the mint returned ${JSON.stringify(webhookId)}, not a tenant-bound id`);
|
|
491
|
+
const live = await driver.get(`/webhooks/${projectBoundId(webhookId)}/dead-letters`);
|
|
492
|
+
const del = await driver.delete(`/webhooks/${encodeURIComponent(webhookId)}`);
|
|
493
|
+
expect(live.status, req(ID, 'RFC 0188 §A.1', 'while the subscription exists, its dead-letter read MUST answer 200 (the control for the comparison below)')).toBe(200);
|
|
494
|
+
expect(del.status, req(ID, 'webhooks.md §Surfaces', 'unregisterWebhook MUST answer 204 for the caller\'s own subscription')).toBe(204);
|
|
495
|
+
const after = await driver.get(`/webhooks/${projectBoundId(webhookId)}/dead-letters`);
|
|
496
|
+
const tenant = webhookId.slice(0, webhookId.indexOf('/'));
|
|
497
|
+
const never = await driver.get(`/webhooks/${projectBoundId(`${tenant}/never-${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`)}/dead-letters`);
|
|
498
|
+
expect(
|
|
499
|
+
[after.status, readErrorCode(after.json)],
|
|
500
|
+
req(ID, 'webhooks.md §Durability (RFC 0217 §A)', `after unregisterWebhook answers 204, GET /webhooks/{webhookId}/dead-letters MUST answer 404 not_found — the subscription no longer exists to own a sink (got ${after.status} ${readErrorCode(after.json) ?? ''})`),
|
|
501
|
+
).toEqual([404, 'not_found']);
|
|
502
|
+
expect(
|
|
503
|
+
[after.status, readErrorCode(after.json)],
|
|
504
|
+
req(ID, 'webhooks.md §Durability (RFC 0217 §A)', `the answer for an unregistered subscription MUST be indistinguishable from a same-tenant id the host never minted (that one answered ${never.status} ${readErrorCode(never.json) ?? ''})`),
|
|
505
|
+
).toEqual([never.status, readErrorCode(never.json)]);
|
|
506
|
+
}, DEAD_LETTER_TEST_TIMEOUT_MS);
|
|
507
|
+
|
|
475
508
|
it('a dead-letter record carries no delivered payload', async () => {
|
|
476
509
|
// Its own `it`: RFC 0168 §A.1 allows one explicit requirement id per it(),
|
|
477
510
|
// and `check-req-only` enforces it.
|