@whooshbang/contracts 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/contract-manifest.json +32 -32
  3. package/dist/generated/artifact-index.d.ts +33 -33
  4. package/dist/generated/artifact-index.js +32 -32
  5. package/dist/generated/interaction-v1.d.ts +72 -4
  6. package/dist/generated/validators-standalone.d.ts +492 -480
  7. package/dist/generated/validators-standalone.js +4191 -2276
  8. package/dist/generated/validators-standalone.js.map +1 -1
  9. package/dist/generated/validators.d.ts +2 -1
  10. package/dist/generated/validators.js +2 -1
  11. package/dist/generated/validators.js.map +1 -1
  12. package/dist/generated/whooshbang-v1.d.ts +94 -17
  13. package/dist/index.d.ts +3 -2
  14. package/dist/index.js +2 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/interaction-expiry.d.ts +17 -0
  17. package/dist/interaction-expiry.js +67 -0
  18. package/dist/interaction-expiry.js.map +1 -0
  19. package/fixtures/core-v1/fixture-index.json +1 -1
  20. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
  21. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
  22. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
  23. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
  24. package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
  25. package/fixtures/core-v1/scenarios/cross-organization-project.json +1 -1
  26. package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
  27. package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
  28. package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
  29. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
  30. package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
  31. package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
  32. package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
  33. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +1 -1
  34. package/fixtures/core-v1/scenarios/project-slug-conflict.json +1 -1
  35. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
  36. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
  37. package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +1 -1
  38. package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +1 -1
  39. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
  40. package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +1 -1
  41. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
  42. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
  43. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
  44. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
  45. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
  46. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
  47. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
  48. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
  49. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
  50. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
  51. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
  52. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
  53. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
  54. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
  55. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
  56. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
  57. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
  58. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
  59. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
  60. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
  61. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
  62. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
  63. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
  64. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
  65. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
  66. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
  67. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
  68. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
  69. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
  70. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
  71. package/fixtures/recipient-experience-v1/scenarios/membership-broadcast-snapshot.json +1 -1
  72. package/fixtures/recipient-experience-v1/scenarios/preferred-binding-resolution.json +1 -1
  73. package/fixtures/recipient-experience-v1/scenarios/recipient-session-security.json +1 -1
  74. package/fixtures/recipient-experience-v1/scenarios/subscriber-initial-groups-transaction.json +1 -1
  75. package/openapi/generated/whooshbang-v1.bundle.json +165 -28
  76. package/openapi/whooshbang-v1.yaml +33 -2
  77. package/package.json +1 -1
  78. package/schemas/core-scenario.schema.json +1 -1
  79. package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
  80. package/schemas/events/interaction-expired-v1.schema.json +1 -1
  81. package/schemas/events/interaction-received-v1.schema.json +1 -1
  82. package/schemas/events/message-delivered-v1.schema.json +1 -1
  83. package/schemas/events/message-expired-v1.schema.json +1 -1
  84. package/schemas/events/message-failed-v1.schema.json +1 -1
  85. package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
  86. package/schemas/events/subscription-activated-v1.schema.json +1 -1
  87. package/schemas/events/subscription-revoked-v1.schema.json +1 -1
  88. package/schemas/events/whooshbang-event-v1.schema.json +1 -1
  89. package/schemas/fixture-index.schema.json +1 -1
  90. package/schemas/interaction-machine-scenario.schema.json +1 -1
  91. package/schemas/interaction-v1.schema.json +151 -19
  92. package/schemas/machine-v1.schema.json +1 -1
  93. package/schemas/provider-capabilities-v1.schema.json +1 -1
  94. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
  95. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
  96. package/schemas/whooshbang-v1.schema.json +56 -50
@@ -0,0 +1,17 @@
1
+ import type { InteractionRequest } from "./generated/interaction-v1.js";
2
+ import type { CreateMessageRequest } from "./generated/whooshbang-v1.js";
3
+ /** Compatibility default, never a ceiling on a sender-selected answer window. */
4
+ export declare const DEFAULT_INTERACTION_EXPIRY_SECONDS = 86400;
5
+ /** The public RFC3339 timestamp vocabulary has four-digit years. */
6
+ export declare const MAX_INTERACTION_TIMESTAMP_MILLISECONDS = 253402300799999;
7
+ export declare class InteractionExpiryError extends RangeError {
8
+ readonly field: "expires_at" | "expires_in_seconds";
9
+ constructor(field: "expires_at" | "expires_in_seconds", message: string);
10
+ }
11
+ /** Resolve once at acceptance, after idempotency lookup, never at dispatch/replay. */
12
+ export declare function resolveInteractionExpiry(acceptedAt: Date, input: {
13
+ readonly expires_at?: string;
14
+ readonly expires_in_seconds?: number;
15
+ }): string;
16
+ /** Canonical retained/provider request: relative input never escapes acceptance. */
17
+ export declare function resolveInteractionRequest(acceptedAt: Date, input: NonNullable<CreateMessageRequest["interaction"]>): InteractionRequest;
@@ -0,0 +1,67 @@
1
+ /** Compatibility default, never a ceiling on a sender-selected answer window. */
2
+ export const DEFAULT_INTERACTION_EXPIRY_SECONDS = 86_400;
3
+ /** The public RFC3339 timestamp vocabulary has four-digit years. */
4
+ export const MAX_INTERACTION_TIMESTAMP_MILLISECONDS = 253_402_300_799_999;
5
+ const timestampPattern = /^(\d{4})-(\d{2})-(\d{2})T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,3})?(?:Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$/u;
6
+ export class InteractionExpiryError extends RangeError {
7
+ field;
8
+ constructor(field, message) {
9
+ super(message);
10
+ this.field = field;
11
+ this.name = "InteractionExpiryError";
12
+ }
13
+ }
14
+ /** Resolve once at acceptance, after idempotency lookup, never at dispatch/replay. */
15
+ export function resolveInteractionExpiry(acceptedAt, input) {
16
+ const absolute = input.expires_at;
17
+ const relative = input.expires_in_seconds;
18
+ const field = absolute === undefined ? "expires_in_seconds" : "expires_at";
19
+ const fail = (message) => {
20
+ throw new InteractionExpiryError(field, message);
21
+ };
22
+ if (absolute !== undefined && relative !== undefined)
23
+ fail("Supply expires_at or expires_in_seconds, not both.");
24
+ const base = acceptedAt.getTime();
25
+ if (!Number.isFinite(base))
26
+ fail("The acceptance clock is invalid.");
27
+ let deadline;
28
+ if (absolute !== undefined) {
29
+ const match = timestampPattern.exec(absolute);
30
+ if (!match)
31
+ return fail("Use an RFC3339 timestamp with an explicit timezone and at most three fractional digits.");
32
+ // Date.parse normalizes impossible dates such as February 30; refuse them.
33
+ const year = Number(match[1]);
34
+ const month = Number(match[2]);
35
+ const day = Number(match[3]);
36
+ const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
37
+ const days = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
38
+ if (year < 1 ||
39
+ month < 1 ||
40
+ month > 12 ||
41
+ day < 1 ||
42
+ day > (days[month - 1] ?? 0))
43
+ fail("Use a real calendar date in years 0001 through 9999.");
44
+ deadline = Date.parse(absolute);
45
+ }
46
+ else {
47
+ const seconds = relative ?? DEFAULT_INTERACTION_EXPIRY_SECONDS;
48
+ if (!Number.isSafeInteger(seconds) || seconds < 30)
49
+ fail("Use a whole number of seconds, at least 30.");
50
+ deadline = base + seconds * 1000;
51
+ }
52
+ if (!Number.isSafeInteger(deadline) ||
53
+ deadline > MAX_INTERACTION_TIMESTAMP_MILLISECONDS ||
54
+ deadline < -62_135_596_800_000)
55
+ fail("The resolved expiry must be representable in years 0001 through 9999.");
56
+ if (deadline - base < 30_000)
57
+ fail("Interaction expiry must be at least 30 seconds after server acceptance.");
58
+ return new Date(deadline).toISOString();
59
+ }
60
+ /** Canonical retained/provider request: relative input never escapes acceptance. */
61
+ export function resolveInteractionRequest(acceptedAt, input) {
62
+ const expires_at = resolveInteractionExpiry(acceptedAt, input);
63
+ const request = { ...input };
64
+ delete request.expires_in_seconds;
65
+ return { ...request, expires_at };
66
+ }
67
+ //# sourceMappingURL=interaction-expiry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-expiry.js","sourceRoot":"","sources":["../src/interaction-expiry.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "fixtures": [
4
4
  {
5
5
  "id": "create-project.request",
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "api-credential-invalid-indistinguishable",
4
4
  "category": "credential_lifecycle",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "api-credential-one-time-reveal",
4
4
  "category": "credential_lifecycle",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "api-credential-revocation-replay",
4
4
  "category": "credential_lifecycle",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "api-credential-rotation-overlap",
4
4
  "category": "credential_lifecycle",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "cancellation-too-late",
4
4
  "category": "cancellation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "cross-organization-project",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "cross-project-resource",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "environment-mismatch",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "idempotency-conflict",
4
4
  "category": "idempotency",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "idempotency-equivalent-replay",
4
4
  "category": "idempotency",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "malformed-bearer",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "metadata-overrun",
4
4
  "category": "message_outcome",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "missing-scope",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "project-create-equivalent-replay",
4
4
  "category": "idempotency",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "project-slug-conflict",
4
4
  "category": "idempotency",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "provider-outcome-unknown",
4
4
  "category": "message_outcome",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "subscription-activation-replay",
4
4
  "category": "subscription_replay",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "subscription-authorization-capability-opacity",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "subscription-cross-connection-callback-rejected",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "subscription-expired-replay",
4
4
  "category": "subscription_replay",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "subscription-selected-connection-replay",
4
4
  "category": "subscription_replay",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "ack-conflict",
4
4
  "category": "machine_ack",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "ack-cross-machine",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "ack-out-of-order",
4
4
  "category": "machine_ack",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "ack-replay",
4
4
  "category": "machine_ack",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "ambiguous-free-text",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "callback-token-opacity",
4
4
  "category": "callback_token",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "credential-registration-conflict",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "credential-registration-replay",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "credential-revocation-replay",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "credential-rotation",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "first-credential-activates",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "interaction-duplicate",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "interaction-expired",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "interaction-mismatch",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "interaction-retired",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "interaction-stale",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "machine-admin-denied",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "machine-bound-message-create",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "machine-cancel-denied",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "machine-crash-before-ack",
4
4
  "category": "machine_poll",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "machine-notifier-mismatch",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "machine-other-message-read",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "machine-owned-message-read",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "machine-subscriber-mismatch",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "poll-uncommitted-cursor-rejected",
4
4
  "category": "machine_poll",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "project-credential-machine-endpoint-denied",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "quarantine-integrity-rejected",
4
4
  "category": "quarantine",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "quarantine-signature-rejected",
4
4
  "category": "quarantine",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "quarantine-valid",
4
4
  "category": "quarantine",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "revoked-machine-credential",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "membership-broadcast-snapshot",
4
4
  "category": "membership_broadcast",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "preferred-binding-resolution",
4
4
  "category": "preference_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "recipient-session-security",
4
4
  "category": "recipient_security",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.2.0",
2
+ "contract_version": "2.4.0",
3
3
  "id": "subscriber-initial-groups-transaction",
4
4
  "category": "subscriber_groups",
5
5
  "given": {