@whooshbang/contracts 1.0.0-rc.13

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 (229) hide show
  1. package/CHANGELOG.md +198 -0
  2. package/LICENSE +21 -0
  3. package/README.md +120 -0
  4. package/contract-manifest.json +390 -0
  5. package/dist/base64url.d.ts +2 -0
  6. package/dist/base64url.js +51 -0
  7. package/dist/base64url.js.map +1 -0
  8. package/dist/generated/artifact-index.d.ts +205 -0
  9. package/dist/generated/artifact-index.js +396 -0
  10. package/dist/generated/artifact-index.js.map +1 -0
  11. package/dist/generated/contract-manifest.d.ts +66 -0
  12. package/dist/generated/contract-manifest.js +6 -0
  13. package/dist/generated/contract-manifest.js.map +1 -0
  14. package/dist/generated/core-scenario.d.ts +18 -0
  15. package/dist/generated/core-scenario.js +6 -0
  16. package/dist/generated/core-scenario.js.map +1 -0
  17. package/dist/generated/fixture-index.d.ts +33 -0
  18. package/dist/generated/fixture-index.js +6 -0
  19. package/dist/generated/fixture-index.js.map +1 -0
  20. package/dist/generated/interaction-machine-scenario.d.ts +263 -0
  21. package/dist/generated/interaction-machine-scenario.js +6 -0
  22. package/dist/generated/interaction-machine-scenario.js.map +1 -0
  23. package/dist/generated/interaction-v1.d.ts +152 -0
  24. package/dist/generated/interaction-v1.js +6 -0
  25. package/dist/generated/interaction-v1.js.map +1 -0
  26. package/dist/generated/machine-v1.d.ts +169 -0
  27. package/dist/generated/machine-v1.js +6 -0
  28. package/dist/generated/machine-v1.js.map +1 -0
  29. package/dist/generated/provider-capabilities-v1.d.ts +78 -0
  30. package/dist/generated/provider-capabilities-v1.js +6 -0
  31. package/dist/generated/provider-capabilities-v1.js.map +1 -0
  32. package/dist/generated/validators-standalone.d.ts +659 -0
  33. package/dist/generated/validators-standalone.js +47800 -0
  34. package/dist/generated/validators-standalone.js.map +1 -0
  35. package/dist/generated/validators.d.ts +74 -0
  36. package/dist/generated/validators.js +493 -0
  37. package/dist/generated/validators.js.map +1 -0
  38. package/dist/generated/webhook-delivery-case-v1.d.ts +91 -0
  39. package/dist/generated/webhook-delivery-case-v1.js +6 -0
  40. package/dist/generated/webhook-delivery-case-v1.js.map +1 -0
  41. package/dist/generated/webhook-signing-vector-v1.d.ts +88 -0
  42. package/dist/generated/webhook-signing-vector-v1.js +6 -0
  43. package/dist/generated/webhook-signing-vector-v1.js.map +1 -0
  44. package/dist/generated/whooshbang-event-v1.d.ts +191 -0
  45. package/dist/generated/whooshbang-event-v1.js +6 -0
  46. package/dist/generated/whooshbang-event-v1.js.map +1 -0
  47. package/dist/generated/whooshbang-v1.d.ts +1162 -0
  48. package/dist/generated/whooshbang-v1.js +6 -0
  49. package/dist/generated/whooshbang-v1.js.map +1 -0
  50. package/dist/index.d.ts +20 -0
  51. package/dist/index.js +7 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/machine-credential.d.ts +31 -0
  54. package/dist/machine-credential.js +78 -0
  55. package/dist/machine-credential.js.map +1 -0
  56. package/dist/webhook-consumer.d.ts +50 -0
  57. package/dist/webhook-consumer.js +71 -0
  58. package/dist/webhook-consumer.js.map +1 -0
  59. package/dist/webhook-delivery.d.ts +46 -0
  60. package/dist/webhook-delivery.js +126 -0
  61. package/dist/webhook-delivery.js.map +1 -0
  62. package/dist/webhook-signature.d.ts +36 -0
  63. package/dist/webhook-signature.js +255 -0
  64. package/dist/webhook-signature.js.map +1 -0
  65. package/examples/python/verify_webhook.py +283 -0
  66. package/fixtures/.gitkeep +1 -0
  67. package/fixtures/core-v1/fixture-index.json +963 -0
  68. package/fixtures/core-v1/problems/auth-invalid.json +9 -0
  69. package/fixtures/core-v1/problems/authentication-required.json +9 -0
  70. package/fixtures/core-v1/problems/cancellation-too-late.json +9 -0
  71. package/fixtures/core-v1/problems/endpoint-rotation-conflict.json +10 -0
  72. package/fixtures/core-v1/problems/environment-mismatch.json +9 -0
  73. package/fixtures/core-v1/problems/idempotency-conflict.json +9 -0
  74. package/fixtures/core-v1/problems/idempotency-key-required.json +9 -0
  75. package/fixtures/core-v1/problems/project-slug-conflict.json +16 -0
  76. package/fixtures/core-v1/problems/provider-outcome-unknown.json +9 -0
  77. package/fixtures/core-v1/problems/provider-retryable.json +10 -0
  78. package/fixtures/core-v1/problems/provider-terminal.json +9 -0
  79. package/fixtures/core-v1/problems/rate-limited.json +10 -0
  80. package/fixtures/core-v1/problems/replay-unavailable-not-terminal.json +16 -0
  81. package/fixtures/core-v1/problems/replay-unavailable-payload.json +16 -0
  82. package/fixtures/core-v1/problems/replay-unavailable-rollout.json +16 -0
  83. package/fixtures/core-v1/problems/request-invalid.json +16 -0
  84. package/fixtures/core-v1/problems/resource-expired.json +9 -0
  85. package/fixtures/core-v1/problems/resource-not-found.json +9 -0
  86. package/fixtures/core-v1/problems/scope-forbidden.json +9 -0
  87. package/fixtures/core-v1/problems/subscriber-unbound.json +9 -0
  88. package/fixtures/core-v1/requests/create-api-credential.json +9 -0
  89. package/fixtures/core-v1/requests/create-customer-endpoint.json +5 -0
  90. package/fixtures/core-v1/requests/create-message.json +15 -0
  91. package/fixtures/core-v1/requests/create-project.json +4 -0
  92. package/fixtures/core-v1/requests/create-subscription-link.json +5 -0
  93. package/fixtures/core-v1/requests/rotate-api-credential.json +3 -0
  94. package/fixtures/core-v1/requests/rotate-customer-endpoint.json +3 -0
  95. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +14 -0
  96. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +21 -0
  97. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +17 -0
  98. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +18 -0
  99. package/fixtures/core-v1/scenarios/cancellation-too-late.json +15 -0
  100. package/fixtures/core-v1/scenarios/cross-account-project.json +14 -0
  101. package/fixtures/core-v1/scenarios/cross-project-resource.json +17 -0
  102. package/fixtures/core-v1/scenarios/environment-mismatch.json +17 -0
  103. package/fixtures/core-v1/scenarios/idempotency-conflict.json +35 -0
  104. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +27 -0
  105. package/fixtures/core-v1/scenarios/malformed-bearer.json +14 -0
  106. package/fixtures/core-v1/scenarios/metadata-overrun.json +14 -0
  107. package/fixtures/core-v1/scenarios/missing-scope.json +15 -0
  108. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +26 -0
  109. package/fixtures/core-v1/scenarios/project-slug-conflict.json +21 -0
  110. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +15 -0
  111. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +18 -0
  112. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +16 -0
  113. package/fixtures/core-v1/success/account-projection.json +11 -0
  114. package/fixtures/core-v1/success/api-credential-collection.json +22 -0
  115. package/fixtures/core-v1/success/api-credential-created.json +20 -0
  116. package/fixtures/core-v1/success/api-credential-revoked.json +19 -0
  117. package/fixtures/core-v1/success/api-credential-rotated.json +41 -0
  118. package/fixtures/core-v1/success/customer-endpoint-attempts.json +15 -0
  119. package/fixtures/core-v1/success/customer-endpoint-collection.json +26 -0
  120. package/fixtures/core-v1/success/customer-endpoint-create-replayed.json +16 -0
  121. package/fixtures/core-v1/success/customer-endpoint-created.json +17 -0
  122. package/fixtures/core-v1/success/customer-endpoint-rotated.json +21 -0
  123. package/fixtures/core-v1/success/message-accepted.json +30 -0
  124. package/fixtures/core-v1/success/message-cancellation-too-late.json +27 -0
  125. package/fixtures/core-v1/success/message-cancelled.json +27 -0
  126. package/fixtures/core-v1/success/message-outcome-unknown.json +33 -0
  127. package/fixtures/core-v1/success/message-provider-accepted.json +30 -0
  128. package/fixtures/core-v1/success/project-collection.json +42 -0
  129. package/fixtures/core-v1/success/project-created.json +38 -0
  130. package/fixtures/core-v1/success/subscription-link-activated.json +22 -0
  131. package/fixtures/core-v1/success/subscription-link-cancelled.json +14 -0
  132. package/fixtures/core-v1/success/subscription-link-paused.json +22 -0
  133. package/fixtures/core-v1/success/subscription-link-pending.json +14 -0
  134. package/fixtures/core-v1/success/subscription-link-revoked.json +22 -0
  135. package/fixtures/interaction-machine-v1/capabilities/providers.json +57 -0
  136. package/fixtures/interaction-machine-v1/capabilities/telegram.json +52 -0
  137. package/fixtures/interaction-machine-v1/events/confirm-answered.json +22 -0
  138. package/fixtures/interaction-machine-v1/events/input-answered.json +22 -0
  139. package/fixtures/interaction-machine-v1/events/input-redacted.json +18 -0
  140. package/fixtures/interaction-machine-v1/events/select-answered.json +22 -0
  141. package/fixtures/interaction-machine-v1/requests/ack-processed.json +5 -0
  142. package/fixtures/interaction-machine-v1/requests/ack-quarantined.json +5 -0
  143. package/fixtures/interaction-machine-v1/requests/create-machine-client.json +6 -0
  144. package/fixtures/interaction-machine-v1/requests/create-message-confirm.json +18 -0
  145. package/fixtures/interaction-machine-v1/requests/create-message-input.json +16 -0
  146. package/fixtures/interaction-machine-v1/requests/create-message-select.json +26 -0
  147. package/fixtures/interaction-machine-v1/requests/register-machine-credential.json +4 -0
  148. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +14 -0
  149. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +15 -0
  150. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +15 -0
  151. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +17 -0
  152. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +15 -0
  153. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +16 -0
  154. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +16 -0
  155. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +15 -0
  156. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +14 -0
  157. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +16 -0
  158. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +15 -0
  159. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +16 -0
  160. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +17 -0
  161. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +16 -0
  162. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +16 -0
  163. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +16 -0
  164. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +14 -0
  165. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +22 -0
  166. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +14 -0
  167. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +16 -0
  168. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +14 -0
  169. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +14 -0
  170. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +22 -0
  171. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +14 -0
  172. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +17 -0
  173. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +14 -0
  174. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +15 -0
  175. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +16 -0
  176. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +15 -0
  177. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +15 -0
  178. package/fixtures/interaction-machine-v1/success/ack-out-of-order.json +8 -0
  179. package/fixtures/interaction-machine-v1/success/ack-processed.json +8 -0
  180. package/fixtures/interaction-machine-v1/success/ack-quarantined.json +9 -0
  181. package/fixtures/interaction-machine-v1/success/interaction-answered-confirm.json +10 -0
  182. package/fixtures/interaction-machine-v1/success/interaction-answered-input.json +10 -0
  183. package/fixtures/interaction-machine-v1/success/interaction-answered-redacted.json +8 -0
  184. package/fixtures/interaction-machine-v1/success/interaction-answered-select.json +10 -0
  185. package/fixtures/interaction-machine-v1/success/interaction-open.json +7 -0
  186. package/fixtures/interaction-machine-v1/success/machine-client-active.json +20 -0
  187. package/fixtures/interaction-machine-v1/success/machine-client-provisioning.json +19 -0
  188. package/fixtures/interaction-machine-v1/success/machine-client-revoked.json +21 -0
  189. package/fixtures/interaction-machine-v1/success/machine-credential-active.json +13 -0
  190. package/fixtures/interaction-machine-v1/success/machine-credential-revoked.json +14 -0
  191. package/fixtures/interaction-machine-v1/success/message-interaction-open.json +33 -0
  192. package/fixtures/interaction-machine-v1/success/poll-empty.json +6 -0
  193. package/fixtures/interaction-machine-v1/success/poll-events.json +51 -0
  194. package/fixtures/interaction-machine-v1/tokens/callback-token.json +1 -0
  195. package/fixtures/whooshbang-events-v1/delivery/cases.json +418 -0
  196. package/fixtures/whooshbang-events-v1/events/agent-binding-degraded.json +17 -0
  197. package/fixtures/whooshbang-events-v1/events/interaction-expired.json +16 -0
  198. package/fixtures/whooshbang-events-v1/events/interaction-received.json +23 -0
  199. package/fixtures/whooshbang-events-v1/events/message-delivered.json +16 -0
  200. package/fixtures/whooshbang-events-v1/events/message-expired.json +15 -0
  201. package/fixtures/whooshbang-events-v1/events/message-failed.json +17 -0
  202. package/fixtures/whooshbang-events-v1/events/message-provider-accepted.json +15 -0
  203. package/fixtures/whooshbang-events-v1/events/subscription-activated.json +18 -0
  204. package/fixtures/whooshbang-events-v1/events/subscription-revoked.json +18 -0
  205. package/fixtures/whooshbang-events-v1/signing/vectors.json +852 -0
  206. package/openapi/.gitkeep +1 -0
  207. package/openapi/generated/whooshbang-v1.bundle.json +5913 -0
  208. package/openapi/whooshbang-v1.yaml +2334 -0
  209. package/package.json +63 -0
  210. package/schemas/contract-manifest.schema.json +140 -0
  211. package/schemas/core-scenario.schema.json +38 -0
  212. package/schemas/events/agent-binding-degraded-v1.schema.json +8 -0
  213. package/schemas/events/interaction-expired-v1.schema.json +8 -0
  214. package/schemas/events/interaction-received-v1.schema.json +8 -0
  215. package/schemas/events/message-delivered-v1.schema.json +8 -0
  216. package/schemas/events/message-expired-v1.schema.json +8 -0
  217. package/schemas/events/message-failed-v1.schema.json +8 -0
  218. package/schemas/events/message-provider-accepted-v1.schema.json +8 -0
  219. package/schemas/events/subscription-activated-v1.schema.json +8 -0
  220. package/schemas/events/subscription-revoked-v1.schema.json +8 -0
  221. package/schemas/events/whooshbang-event-v1.schema.json +689 -0
  222. package/schemas/fixture-index.schema.json +67 -0
  223. package/schemas/interaction-machine-scenario.schema.json +700 -0
  224. package/schemas/interaction-v1.schema.json +483 -0
  225. package/schemas/machine-v1.schema.json +430 -0
  226. package/schemas/provider-capabilities-v1.schema.json +263 -0
  227. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +167 -0
  228. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +197 -0
  229. package/schemas/whooshbang-v1.schema.json +2173 -0
@@ -0,0 +1,418 @@
1
+ {
2
+ "schema": "whooshbang.webhook-delivery-cases.v1",
3
+ "cases": [
4
+ {
5
+ "id": "network-failure",
6
+ "attempt": 1,
7
+ "first_attempt_at_epoch_seconds": 1785000000,
8
+ "now_epoch_seconds": 1785000060,
9
+ "outcome": {
10
+ "kind": "network_failure"
11
+ },
12
+ "expected": {
13
+ "action": "retry",
14
+ "reason": "network_failure",
15
+ "latest_retry_at_epoch_seconds": 1785086400
16
+ }
17
+ },
18
+ {
19
+ "id": "http-200",
20
+ "attempt": 1,
21
+ "first_attempt_at_epoch_seconds": 1785000000,
22
+ "now_epoch_seconds": 1785000060,
23
+ "outcome": {
24
+ "kind": "http",
25
+ "status": 200
26
+ },
27
+ "expected": {
28
+ "action": "accepted",
29
+ "reason": "http_2xx"
30
+ }
31
+ },
32
+ {
33
+ "id": "http-204",
34
+ "attempt": 1,
35
+ "first_attempt_at_epoch_seconds": 1785000000,
36
+ "now_epoch_seconds": 1785000060,
37
+ "outcome": {
38
+ "kind": "http",
39
+ "status": 204
40
+ },
41
+ "expected": {
42
+ "action": "accepted",
43
+ "reason": "http_2xx"
44
+ }
45
+ },
46
+ {
47
+ "id": "http-299",
48
+ "attempt": 1,
49
+ "first_attempt_at_epoch_seconds": 1785000000,
50
+ "now_epoch_seconds": 1785000060,
51
+ "outcome": {
52
+ "kind": "http",
53
+ "status": 299
54
+ },
55
+ "expected": {
56
+ "action": "accepted",
57
+ "reason": "http_2xx"
58
+ }
59
+ },
60
+ {
61
+ "id": "redirect-300",
62
+ "attempt": 1,
63
+ "first_attempt_at_epoch_seconds": 1785000000,
64
+ "now_epoch_seconds": 1785000060,
65
+ "outcome": {
66
+ "kind": "http",
67
+ "status": 300
68
+ },
69
+ "expected": {
70
+ "action": "terminal",
71
+ "reason": "redirect_not_followed"
72
+ }
73
+ },
74
+ {
75
+ "id": "redirect-399",
76
+ "attempt": 1,
77
+ "first_attempt_at_epoch_seconds": 1785000000,
78
+ "now_epoch_seconds": 1785000060,
79
+ "outcome": {
80
+ "kind": "http",
81
+ "status": 399
82
+ },
83
+ "expected": {
84
+ "action": "terminal",
85
+ "reason": "redirect_not_followed"
86
+ }
87
+ },
88
+ {
89
+ "id": "http-400-terminal",
90
+ "attempt": 1,
91
+ "first_attempt_at_epoch_seconds": 1785000000,
92
+ "now_epoch_seconds": 1785000060,
93
+ "outcome": {
94
+ "kind": "http",
95
+ "status": 400
96
+ },
97
+ "expected": {
98
+ "action": "terminal",
99
+ "reason": "http_terminal"
100
+ }
101
+ },
102
+ {
103
+ "id": "http-401-terminal",
104
+ "attempt": 1,
105
+ "first_attempt_at_epoch_seconds": 1785000000,
106
+ "now_epoch_seconds": 1785000060,
107
+ "outcome": {
108
+ "kind": "http",
109
+ "status": 401
110
+ },
111
+ "expected": {
112
+ "action": "terminal",
113
+ "reason": "http_terminal"
114
+ }
115
+ },
116
+ {
117
+ "id": "http-422-terminal",
118
+ "attempt": 1,
119
+ "first_attempt_at_epoch_seconds": 1785000000,
120
+ "now_epoch_seconds": 1785000060,
121
+ "outcome": {
122
+ "kind": "http",
123
+ "status": 422
124
+ },
125
+ "expected": {
126
+ "action": "terminal",
127
+ "reason": "http_terminal"
128
+ }
129
+ },
130
+ {
131
+ "id": "http-408-retry",
132
+ "attempt": 1,
133
+ "first_attempt_at_epoch_seconds": 1785000000,
134
+ "now_epoch_seconds": 1785000060,
135
+ "outcome": {
136
+ "kind": "http",
137
+ "status": 408
138
+ },
139
+ "expected": {
140
+ "action": "retry",
141
+ "reason": "retryable_http_status",
142
+ "latest_retry_at_epoch_seconds": 1785086400
143
+ }
144
+ },
145
+ {
146
+ "id": "http-425-retry",
147
+ "attempt": 1,
148
+ "first_attempt_at_epoch_seconds": 1785000000,
149
+ "now_epoch_seconds": 1785000060,
150
+ "outcome": {
151
+ "kind": "http",
152
+ "status": 425
153
+ },
154
+ "expected": {
155
+ "action": "retry",
156
+ "reason": "retryable_http_status",
157
+ "latest_retry_at_epoch_seconds": 1785086400
158
+ }
159
+ },
160
+ {
161
+ "id": "http-429-retry",
162
+ "attempt": 1,
163
+ "first_attempt_at_epoch_seconds": 1785000000,
164
+ "now_epoch_seconds": 1785000060,
165
+ "outcome": {
166
+ "kind": "http",
167
+ "status": 429
168
+ },
169
+ "expected": {
170
+ "action": "retry",
171
+ "reason": "retryable_http_status",
172
+ "latest_retry_at_epoch_seconds": 1785086400
173
+ }
174
+ },
175
+ {
176
+ "id": "http-429-safe-retry-after",
177
+ "attempt": 1,
178
+ "first_attempt_at_epoch_seconds": 1785000000,
179
+ "now_epoch_seconds": 1785000060,
180
+ "outcome": {
181
+ "kind": "http",
182
+ "status": 429,
183
+ "retry_after": "120"
184
+ },
185
+ "expected": {
186
+ "action": "retry",
187
+ "reason": "retryable_http_status",
188
+ "latest_retry_at_epoch_seconds": 1785086400,
189
+ "retry_after_seconds": 120
190
+ }
191
+ },
192
+ {
193
+ "id": "http-429-http-date-ignored",
194
+ "attempt": 1,
195
+ "first_attempt_at_epoch_seconds": 1785000000,
196
+ "now_epoch_seconds": 1785000060,
197
+ "outcome": {
198
+ "kind": "http",
199
+ "status": 429,
200
+ "retry_after": "Sat, 25 Jul 2026 18:30:00 GMT"
201
+ },
202
+ "expected": {
203
+ "action": "retry",
204
+ "reason": "retryable_http_status",
205
+ "latest_retry_at_epoch_seconds": 1785086400
206
+ }
207
+ },
208
+ {
209
+ "id": "http-429-unsafe-delay-ignored",
210
+ "attempt": 1,
211
+ "first_attempt_at_epoch_seconds": 1785000000,
212
+ "now_epoch_seconds": 1785000060,
213
+ "outcome": {
214
+ "kind": "http",
215
+ "status": 429,
216
+ "retry_after": "86401"
217
+ },
218
+ "expected": {
219
+ "action": "retry",
220
+ "reason": "retryable_http_status",
221
+ "latest_retry_at_epoch_seconds": 1785086400
222
+ }
223
+ },
224
+ {
225
+ "id": "http-429-delay-past-window-ignored",
226
+ "attempt": 7,
227
+ "first_attempt_at_epoch_seconds": 1785000000,
228
+ "now_epoch_seconds": 1785086390,
229
+ "outcome": {
230
+ "kind": "http",
231
+ "status": 429,
232
+ "retry_after": "20"
233
+ },
234
+ "expected": {
235
+ "action": "retry",
236
+ "reason": "retryable_http_status",
237
+ "latest_retry_at_epoch_seconds": 1785086400
238
+ }
239
+ },
240
+ {
241
+ "id": "http-500-retry",
242
+ "attempt": 1,
243
+ "first_attempt_at_epoch_seconds": 1785000000,
244
+ "now_epoch_seconds": 1785000060,
245
+ "outcome": {
246
+ "kind": "http",
247
+ "status": 500
248
+ },
249
+ "expected": {
250
+ "action": "retry",
251
+ "reason": "retryable_http_status",
252
+ "latest_retry_at_epoch_seconds": 1785086400
253
+ }
254
+ },
255
+ {
256
+ "id": "http-503-safe-retry-after",
257
+ "attempt": 1,
258
+ "first_attempt_at_epoch_seconds": 1785000000,
259
+ "now_epoch_seconds": 1785000060,
260
+ "outcome": {
261
+ "kind": "http",
262
+ "status": 503,
263
+ "retry_after": "300"
264
+ },
265
+ "expected": {
266
+ "action": "retry",
267
+ "reason": "retryable_http_status",
268
+ "latest_retry_at_epoch_seconds": 1785086400,
269
+ "retry_after_seconds": 300
270
+ }
271
+ },
272
+ {
273
+ "id": "http-503-delay-at-window",
274
+ "attempt": 7,
275
+ "first_attempt_at_epoch_seconds": 1785000000,
276
+ "now_epoch_seconds": 1785086300,
277
+ "outcome": {
278
+ "kind": "http",
279
+ "status": 503,
280
+ "retry_after": "100"
281
+ },
282
+ "expected": {
283
+ "action": "retry",
284
+ "reason": "retryable_http_status",
285
+ "latest_retry_at_epoch_seconds": 1785086400,
286
+ "retry_after_seconds": 100
287
+ }
288
+ },
289
+ {
290
+ "id": "http-504-retry-after-ignored",
291
+ "attempt": 1,
292
+ "first_attempt_at_epoch_seconds": 1785000000,
293
+ "now_epoch_seconds": 1785000060,
294
+ "outcome": {
295
+ "kind": "http",
296
+ "status": 504,
297
+ "retry_after": "120"
298
+ },
299
+ "expected": {
300
+ "action": "retry",
301
+ "reason": "retryable_http_status",
302
+ "latest_retry_at_epoch_seconds": 1785086400
303
+ }
304
+ },
305
+ {
306
+ "id": "http-599-retry",
307
+ "attempt": 1,
308
+ "first_attempt_at_epoch_seconds": 1785000000,
309
+ "now_epoch_seconds": 1785000060,
310
+ "outcome": {
311
+ "kind": "http",
312
+ "status": 599
313
+ },
314
+ "expected": {
315
+ "action": "retry",
316
+ "reason": "retryable_http_status",
317
+ "latest_retry_at_epoch_seconds": 1785086400
318
+ }
319
+ },
320
+ {
321
+ "id": "attempt-eight-network-terminal",
322
+ "attempt": 8,
323
+ "first_attempt_at_epoch_seconds": 1785000000,
324
+ "now_epoch_seconds": 1785000060,
325
+ "outcome": {
326
+ "kind": "network_failure"
327
+ },
328
+ "expected": {
329
+ "action": "terminal",
330
+ "reason": "attempt_limit_exhausted"
331
+ }
332
+ },
333
+ {
334
+ "id": "attempt-eight-503-terminal",
335
+ "attempt": 8,
336
+ "first_attempt_at_epoch_seconds": 1785000000,
337
+ "now_epoch_seconds": 1785000060,
338
+ "outcome": {
339
+ "kind": "http",
340
+ "status": 503,
341
+ "retry_after": "30"
342
+ },
343
+ "expected": {
344
+ "action": "terminal",
345
+ "reason": "attempt_limit_exhausted"
346
+ }
347
+ },
348
+ {
349
+ "id": "network-at-window-terminal",
350
+ "attempt": 7,
351
+ "first_attempt_at_epoch_seconds": 1785000000,
352
+ "now_epoch_seconds": 1785086400,
353
+ "outcome": {
354
+ "kind": "network_failure"
355
+ },
356
+ "expected": {
357
+ "action": "terminal",
358
+ "reason": "delivery_window_exhausted"
359
+ }
360
+ },
361
+ {
362
+ "id": "http-429-at-window-terminal",
363
+ "attempt": 7,
364
+ "first_attempt_at_epoch_seconds": 1785000000,
365
+ "now_epoch_seconds": 1785086400,
366
+ "outcome": {
367
+ "kind": "http",
368
+ "status": 429
369
+ },
370
+ "expected": {
371
+ "action": "terminal",
372
+ "reason": "delivery_window_exhausted"
373
+ }
374
+ },
375
+ {
376
+ "id": "network-just-inside-window",
377
+ "attempt": 7,
378
+ "first_attempt_at_epoch_seconds": 1785000000,
379
+ "now_epoch_seconds": 1785086399,
380
+ "outcome": {
381
+ "kind": "network_failure"
382
+ },
383
+ "expected": {
384
+ "action": "retry",
385
+ "reason": "network_failure",
386
+ "latest_retry_at_epoch_seconds": 1785086400
387
+ }
388
+ },
389
+ {
390
+ "id": "http-100-unexpected",
391
+ "attempt": 1,
392
+ "first_attempt_at_epoch_seconds": 1785000000,
393
+ "now_epoch_seconds": 1785000060,
394
+ "outcome": {
395
+ "kind": "http",
396
+ "status": 100
397
+ },
398
+ "expected": {
399
+ "action": "terminal",
400
+ "reason": "unexpected_http_status"
401
+ }
402
+ },
403
+ {
404
+ "id": "http-199-unexpected",
405
+ "attempt": 1,
406
+ "first_attempt_at_epoch_seconds": 1785000000,
407
+ "now_epoch_seconds": 1785000060,
408
+ "outcome": {
409
+ "kind": "http",
410
+ "status": 199
411
+ },
412
+ "expected": {
413
+ "action": "terminal",
414
+ "reason": "unexpected_http_status"
415
+ }
416
+ }
417
+ ]
418
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_agent_binding_degraded_synthetic",
4
+ "type": "agent_binding.degraded",
5
+ "created_at": "2026-07-25T18:12:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "agent_binding_id": "agent_binding_synthetic_relay",
11
+ "binding_id": "binding_synthetic_telegram",
12
+ "notifier_id": "notifier_synthetic_telegram",
13
+ "state": "degraded",
14
+ "degradation_code": "interaction_fallback_active",
15
+ "degraded_at": "2026-07-25T18:12:00Z"
16
+ }
17
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_interaction_expired_synthetic",
4
+ "type": "interaction.expired",
5
+ "created_at": "2026-07-25T18:30:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "interaction_id": "interaction_synthetic_expired",
11
+ "message_id": "message_synthetic_interaction",
12
+ "correlation_id": "correlation_synthetic_interaction",
13
+ "interaction_type": "confirm",
14
+ "expired_at": "2026-07-25T18:30:00Z"
15
+ }
16
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_interaction_received_synthetic",
4
+ "type": "interaction.received",
5
+ "created_at": "2026-07-25T18:11:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "interaction_id": "interaction_synthetic_confirm",
11
+ "message_id": "message_synthetic_interaction",
12
+ "binding_id": "binding_synthetic_telegram",
13
+ "channel": "telegram",
14
+ "correlation_id": "correlation_synthetic_interaction",
15
+ "interaction_type": "confirm",
16
+ "response": {
17
+ "type": "confirm",
18
+ "value": true
19
+ },
20
+ "occurred_at": "2026-07-25T18:10:30Z",
21
+ "expires_at": "2026-07-25T18:30:00Z"
22
+ }
23
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_message_delivered_synthetic",
4
+ "type": "message.delivered",
5
+ "created_at": "2026-07-25T18:08:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "message_id": "message_synthetic_customer_event",
11
+ "correlation_id": "correlation_synthetic_customer_event",
12
+ "state": "delivered",
13
+ "evidence": "provider_delivery_receipt",
14
+ "delivered_at": "2026-07-25T18:08:00Z"
15
+ }
16
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_message_expired_synthetic",
4
+ "type": "message.expired",
5
+ "created_at": "2026-07-25T18:10:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "message_id": "message_synthetic_expired",
11
+ "correlation_id": "correlation_synthetic_customer_event",
12
+ "state": "expired",
13
+ "expired_at": "2026-07-25T18:10:00Z"
14
+ }
15
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_message_failed_synthetic",
4
+ "type": "message.failed",
5
+ "created_at": "2026-07-25T18:09:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "message_id": "message_synthetic_customer_event",
11
+ "correlation_id": "correlation_synthetic_customer_event",
12
+ "state": "terminal_failed",
13
+ "failure_code": "provider_terminal",
14
+ "retryable": false,
15
+ "failed_at": "2026-07-25T18:09:00Z"
16
+ }
17
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_message_provider_accepted_synthetic",
4
+ "type": "message.provider_accepted",
5
+ "created_at": "2026-07-25T18:07:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "message_id": "message_synthetic_customer_event",
11
+ "correlation_id": "correlation_synthetic_customer_event",
12
+ "state": "provider_accepted",
13
+ "accepted_at": "2026-07-25T18:07:00Z"
14
+ }
15
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_subscription_activated_synthetic",
4
+ "type": "subscription.activated",
5
+ "created_at": "2026-07-25T18:05:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "subscription_link_id": "slink_synthetic_001",
11
+ "binding_id": "binding_synthetic_telegram",
12
+ "subscriber_id": "subscriber_synthetic_customer",
13
+ "notifier_id": "notifier_synthetic_telegram",
14
+ "channel": "telegram",
15
+ "state": "activated",
16
+ "activated_at": "2026-07-25T18:05:00Z"
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "schema": "whooshbang.event.v1",
3
+ "id": "evt_subscription_revoked_synthetic",
4
+ "type": "subscription.revoked",
5
+ "created_at": "2026-07-25T18:06:00Z",
6
+ "account_id": "acct_synthetic_customer_events",
7
+ "project_id": "proj_synthetic_customer_events",
8
+ "environment": "test",
9
+ "data": {
10
+ "subscription_link_id": "slink_synthetic_001",
11
+ "binding_id": "binding_synthetic_telegram",
12
+ "subscriber_id": "subscriber_synthetic_customer",
13
+ "notifier_id": "notifier_synthetic_telegram",
14
+ "channel": "telegram",
15
+ "state": "revoked",
16
+ "revoked_at": "2026-07-25T18:06:00Z"
17
+ }
18
+ }