superbee 0.4.3-pre.2 → 0.4.3-pre.20

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.
@@ -0,0 +1,2466 @@
1
+ {
2
+ "version": 1,
3
+ "connector": "connectors/tickets",
4
+ "source": "tickets",
5
+ "feed": "source-feeds/board",
6
+ "documents": [
7
+ {
8
+ "id": "conventions/signal",
9
+ "frontmatter": {
10
+ "type": "Convention",
11
+ "title": "Signal",
12
+ "governs": "Signal",
13
+ "path": "signals/",
14
+ "description": "A durable, claimable flag that a monitored source changed in a way that needs judgment. Created deterministically; acted on by an agent or human.",
15
+ "links": {
16
+ "from feed": "Source Feed"
17
+ },
18
+ "claim": {
19
+ "owner_field": "assignee",
20
+ "state_field": "progress_status"
21
+ },
22
+ "fields": {
23
+ "required": [
24
+ "title",
25
+ "progress_status",
26
+ "change_kind",
27
+ "observed_at"
28
+ ],
29
+ "optional": [
30
+ "provider",
31
+ "external_id",
32
+ "diff_summary",
33
+ "priority",
34
+ "assignee",
35
+ "resolution",
36
+ "expires_at",
37
+ "content_digest",
38
+ "about_doc"
39
+ ],
40
+ "types": {
41
+ "observed_at": "datetime",
42
+ "expires_at": "datetime"
43
+ },
44
+ "values": {
45
+ "progress_status": [
46
+ "todo",
47
+ "in_progress",
48
+ "done",
49
+ "dismissed"
50
+ ],
51
+ "priority": [
52
+ "urgent",
53
+ "normal",
54
+ "low"
55
+ ]
56
+ },
57
+ "terminal": {
58
+ "progress_status": [
59
+ "done",
60
+ "dismissed"
61
+ ]
62
+ },
63
+ "descriptions": {
64
+ "change_kind": "What changed, in the vocabulary of whoever raised the Signal: new, changed, canceled, disappeared, page-changed, status-check, or a kind a profile or intake defines.",
65
+ "provider": "The monitored source, as its feed URL or a tool name.",
66
+ "external_id": "The provider's id for the record the Signal is about.",
67
+ "diff_summary": "What changed, in one paragraph a claimant can judge without opening the source.",
68
+ "resolution": "What was done and why, written by whoever closed the signal.",
69
+ "content_digest": "Digest of the observed external record that raised this signal; used to deduplicate and collapse repeated changes.",
70
+ "about_doc": "Document id the signal concerns (cross-bundle references are not links)."
71
+ }
72
+ },
73
+ "freshness_horizon": "14d"
74
+ },
75
+ "body": "# Signal\n\nA durable, claimable flag that a monitored source changed in a way that needs judgment. Created\ndeterministically; acted on by an agent or human.\n"
76
+ },
77
+ {
78
+ "id": "conventions/source-feed",
79
+ "frontmatter": {
80
+ "type": "Convention",
81
+ "title": "Source Feed",
82
+ "governs": "Source Feed",
83
+ "path": "source-feeds/",
84
+ "description": "A monitored source (structured feed, official page or declared Connector source) and the policy for what its changes may do: which fields it owns and which changes need judgment.",
85
+ "fields": {
86
+ "required": [
87
+ "title",
88
+ "url",
89
+ "owned_fields"
90
+ ],
91
+ "optional": [
92
+ "connector",
93
+ "source",
94
+ "feed_kind",
95
+ "target_kind",
96
+ "poll_interval",
97
+ "auto_apply",
98
+ "needs_review",
99
+ "completeness",
100
+ "missing_threshold",
101
+ "exclude_pattern",
102
+ "retention",
103
+ "profile",
104
+ "extract_rule",
105
+ "wall_time_zone",
106
+ "terms_url",
107
+ "rights_note",
108
+ "last_observed_at",
109
+ "description"
110
+ ],
111
+ "types": {
112
+ "url": "https-url",
113
+ "owned_fields": "string-list",
114
+ "auto_apply": "string-list",
115
+ "needs_review": "string-list",
116
+ "missing_threshold": "integer",
117
+ "terms_url": "https-url",
118
+ "last_observed_at": "datetime"
119
+ },
120
+ "values": {
121
+ "feed_kind": [
122
+ "ics",
123
+ "rss",
124
+ "json-api",
125
+ "html-page",
126
+ "connector"
127
+ ],
128
+ "completeness": [
129
+ "complete",
130
+ "partial"
131
+ ],
132
+ "retention": [
133
+ "snapshot-ok",
134
+ "live-only"
135
+ ]
136
+ },
137
+ "descriptions": {
138
+ "url": "The provider identity of the feed, as documents name it in `sources[].resource`. For a Connector source, a resource its identity template admits, byte for byte.",
139
+ "owned_fields": "Fields this feed is authoritative for. The overlay may write only these; editor-owned fields are refused. For a Connector source, a subset of the source's mapping keys.",
140
+ "connector": "For a Connector-backed feed, the id of the Connector document (connectors/<slug>).",
141
+ "source": "For a Connector-backed feed, the name of the Connector source this feed binds to.",
142
+ "feed_kind": "How the source is read. One of: ics, rss, json-api, html-page, connector.",
143
+ "target_kind": "The Kind of the documents this feed overlays. For a Connector source, the source's target Kind.",
144
+ "auto_apply": "Change kinds applied without judgment (e.g. changed).",
145
+ "needs_review": "Change kinds that raise a Signal for an agent or human (e.g. new, canceled, disappeared, page-changed).",
146
+ "completeness": "Whether one observation lists every current record for its window. Only a complete feed may ever imply that a record disappeared. One of: complete, partial. A Connector source's value wins.",
147
+ "missing_threshold": "Consecutive complete observations a record must be absent from before a `disappeared` change is raised.",
148
+ "exclude_pattern": "Editorial exclusion: a case-insensitive pattern on record titles. Matching records are still observed and stored but never presented.",
149
+ "retention": "Whether observed records may be captured into a published snapshot (snapshot-ok) or may only be shown live (live-only), per the provider's terms. One of: snapshot-ok, live-only.",
150
+ "profile": "Name of the provider profile that decodes this source. A Connector source's value wins.",
151
+ "extract_rule": "For configurable profiles: the extraction rule as JSON text. Configuration, not code.",
152
+ "wall_time_zone": "IANA zone to read this provider's times in when it labels local wall-clock times as UTC. A recorded judgment for one feed, set only with evidence; never guessed and never a default.",
153
+ "terms_url": "The provider's terms of use for this source.",
154
+ "rights_note": "What the provider's terms allow, in a sentence.",
155
+ "last_observed_at": "When the source was last observed."
156
+ }
157
+ },
158
+ "freshness_horizon": "30d"
159
+ },
160
+ "body": "# Source Feed\n\nA monitored source and the policy for what its changes may do: which fields it owns and which\nchanges need judgment.\n"
161
+ },
162
+ {
163
+ "id": "source-feeds/board",
164
+ "body": "Synthetic feed.\n",
165
+ "frontmatter": {
166
+ "type": "Source Feed",
167
+ "title": "Main board (synthetic)",
168
+ "connector": "connectors/tickets",
169
+ "source": "tickets",
170
+ "url": "https://tickets.example.org/boards/main",
171
+ "owned_fields": [
172
+ "title",
173
+ "state",
174
+ "priority"
175
+ ],
176
+ "auto_apply": [
177
+ "new",
178
+ "changed"
179
+ ],
180
+ "needs_review": [
181
+ "disappeared"
182
+ ],
183
+ "missing_threshold": 2
184
+ }
185
+ },
186
+ {
187
+ "id": "tickets/t1",
188
+ "body": "Editor notes.\n",
189
+ "frontmatter": {
190
+ "type": "Ticket",
191
+ "title": "First",
192
+ "state": "open",
193
+ "priority": "low",
194
+ "sources": [
195
+ {
196
+ "resource": "https://tickets.example.org/boards/main",
197
+ "id": "t1"
198
+ }
199
+ ]
200
+ }
201
+ },
202
+ {
203
+ "id": "tickets/t2",
204
+ "body": "Editor notes.\n",
205
+ "frontmatter": {
206
+ "type": "Ticket",
207
+ "title": "Second",
208
+ "state": "open",
209
+ "priority": "low",
210
+ "sources": [
211
+ {
212
+ "resource": "https://tickets.example.org/boards/main",
213
+ "id": "t2"
214
+ }
215
+ ]
216
+ }
217
+ },
218
+ {
219
+ "id": "tickets/t3",
220
+ "body": "Editor notes.\n",
221
+ "frontmatter": {
222
+ "type": "Ticket",
223
+ "title": "Third",
224
+ "state": "open",
225
+ "priority": "low",
226
+ "sources": [
227
+ {
228
+ "resource": "https://tickets.example.org/boards/main",
229
+ "id": "t3"
230
+ }
231
+ ]
232
+ }
233
+ }
234
+ ],
235
+ "scenarios": [
236
+ {
237
+ "name": "errors.auth",
238
+ "runs": [
239
+ {
240
+ "exchanges": [
241
+ {
242
+ "request": {
243
+ "url": "https://tickets.example.org/boards/main/items"
244
+ },
245
+ "response": {
246
+ "status": 401,
247
+ "headers": {},
248
+ "body": ""
249
+ }
250
+ }
251
+ ]
252
+ }
253
+ ],
254
+ "expect": [
255
+ {
256
+ "receipt": {
257
+ "outcome": "credential_refused",
258
+ "reason": null,
259
+ "pages": 0,
260
+ "held": 0,
261
+ "pending": 0,
262
+ "pass": {
263
+ "resumed": false,
264
+ "ended": false,
265
+ "complete": false
266
+ },
267
+ "changes": {
268
+ "new": 0,
269
+ "changed": 0,
270
+ "disappeared": 0
271
+ }
272
+ },
273
+ "cursor": null,
274
+ "requests": [
275
+ {
276
+ "url": "https://tickets.example.org/robots.txt",
277
+ "method": "GET",
278
+ "headers": {
279
+ "accept": "text/plain, */*;q=0.1",
280
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
281
+ }
282
+ },
283
+ {
284
+ "url": "https://tickets.example.org/boards/main/items",
285
+ "method": "GET",
286
+ "headers": {
287
+ "accept": "application/json",
288
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
289
+ }
290
+ }
291
+ ],
292
+ "changes": [],
293
+ "findings": [
294
+ {
295
+ "key": "source:tickets:credential_refused",
296
+ "title": "Source tickets: credential refused",
297
+ "summary": "the provider refused the credential; runs stay stopped until the credential changes. Status 401. (https://tickets.example.org/boards/main/items)",
298
+ "priority": "normal",
299
+ "facts": {
300
+ "outcome": "credential_refused",
301
+ "reason": null,
302
+ "status": 401
303
+ }
304
+ }
305
+ ]
306
+ }
307
+ ]
308
+ },
309
+ {
310
+ "name": "errors.rate-limit",
311
+ "runs": [
312
+ {
313
+ "exchanges": [
314
+ {
315
+ "request": {
316
+ "url": "https://tickets.example.org/boards/main/items"
317
+ },
318
+ "response": {
319
+ "status": 200,
320
+ "headers": {
321
+ "content-type": "application/json"
322
+ },
323
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"}],\"next\":\"c1\"}"
324
+ }
325
+ },
326
+ {
327
+ "request": {
328
+ "url": "https://tickets.example.org/boards/main/items?after=c1"
329
+ },
330
+ "response": {
331
+ "status": 429,
332
+ "headers": {
333
+ "Retry-After": "120"
334
+ },
335
+ "body": ""
336
+ }
337
+ }
338
+ ]
339
+ }
340
+ ],
341
+ "expect": [
342
+ {
343
+ "receipt": {
344
+ "outcome": "deferred",
345
+ "reason": "rate_limited",
346
+ "pages": 1,
347
+ "held": 0,
348
+ "pending": 0,
349
+ "pass": {
350
+ "resumed": false,
351
+ "ended": false,
352
+ "complete": false
353
+ },
354
+ "changes": {
355
+ "new": 1,
356
+ "changed": 0,
357
+ "disappeared": 0
358
+ }
359
+ },
360
+ "cursor": {
361
+ "token": "c1",
362
+ "since": ""
363
+ },
364
+ "requests": [
365
+ {
366
+ "url": "https://tickets.example.org/robots.txt",
367
+ "method": "GET",
368
+ "headers": {
369
+ "accept": "text/plain, */*;q=0.1",
370
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
371
+ }
372
+ },
373
+ {
374
+ "url": "https://tickets.example.org/boards/main/items",
375
+ "method": "GET",
376
+ "headers": {
377
+ "accept": "application/json",
378
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
379
+ }
380
+ },
381
+ {
382
+ "url": "https://tickets.example.org/boards/main/items?after=c1",
383
+ "method": "GET",
384
+ "headers": {
385
+ "accept": "application/json",
386
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
387
+ }
388
+ }
389
+ ],
390
+ "changes": [
391
+ {
392
+ "external_id": "t1",
393
+ "change_kind": "new",
394
+ "changed_fields": [
395
+ "priority",
396
+ "state",
397
+ "title",
398
+ "url"
399
+ ],
400
+ "before": null,
401
+ "after": {
402
+ "title": "First",
403
+ "state": "open",
404
+ "priority": "low",
405
+ "url": "https://tickets.example.org/t/t1"
406
+ },
407
+ "content_digest": "sha256:46c1f1c86ad59b4e433cb1351c23b323016b611f637bd750376add7d7212e29d"
408
+ }
409
+ ],
410
+ "findings": [
411
+ {
412
+ "key": "source:tickets:deferred:rate_limited",
413
+ "title": "Source tickets: deferred (rate limited)",
414
+ "summary": "the provider asked to slow down; the run stopped and resumes from the last committed page. Status 429. (https://tickets.example.org/boards/main/items)",
415
+ "priority": "low",
416
+ "facts": {
417
+ "outcome": "deferred",
418
+ "reason": "rate_limited",
419
+ "status": 429
420
+ }
421
+ }
422
+ ]
423
+ }
424
+ ]
425
+ },
426
+ {
427
+ "name": "errors.server",
428
+ "runs": [
429
+ {
430
+ "exchanges": [
431
+ {
432
+ "request": {
433
+ "url": "https://tickets.example.org/boards/main/items"
434
+ },
435
+ "response": {
436
+ "status": 503,
437
+ "headers": {},
438
+ "body": ""
439
+ }
440
+ }
441
+ ]
442
+ }
443
+ ],
444
+ "expect": [
445
+ {
446
+ "receipt": {
447
+ "outcome": "provider_unavailable",
448
+ "reason": "server_error",
449
+ "pages": 0,
450
+ "held": 0,
451
+ "pending": 0,
452
+ "pass": {
453
+ "resumed": false,
454
+ "ended": false,
455
+ "complete": false
456
+ },
457
+ "changes": {
458
+ "new": 0,
459
+ "changed": 0,
460
+ "disappeared": 0
461
+ }
462
+ },
463
+ "cursor": null,
464
+ "requests": [
465
+ {
466
+ "url": "https://tickets.example.org/robots.txt",
467
+ "method": "GET",
468
+ "headers": {
469
+ "accept": "text/plain, */*;q=0.1",
470
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
471
+ }
472
+ },
473
+ {
474
+ "url": "https://tickets.example.org/boards/main/items",
475
+ "method": "GET",
476
+ "headers": {
477
+ "accept": "application/json",
478
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
479
+ }
480
+ }
481
+ ],
482
+ "changes": [],
483
+ "findings": [
484
+ {
485
+ "key": "source:tickets:provider_unavailable:server_error",
486
+ "title": "Source tickets: provider unavailable (server error)",
487
+ "summary": "the provider did not answer usefully; nothing past the last committed page was read. Status 503. (https://tickets.example.org/boards/main/items)",
488
+ "priority": "low",
489
+ "facts": {
490
+ "outcome": "provider_unavailable",
491
+ "reason": "server_error",
492
+ "status": 503
493
+ }
494
+ }
495
+ ]
496
+ }
497
+ ]
498
+ },
499
+ {
500
+ "name": "errors.malformed",
501
+ "runs": [
502
+ {
503
+ "exchanges": [
504
+ {
505
+ "request": {
506
+ "url": "https://tickets.example.org/boards/main/items"
507
+ },
508
+ "response": {
509
+ "status": 200,
510
+ "headers": {
511
+ "content-type": "text/html"
512
+ },
513
+ "body": "<html>not json</html>"
514
+ }
515
+ }
516
+ ]
517
+ },
518
+ {
519
+ "budget": {
520
+ "maxBytes": 64
521
+ },
522
+ "exchanges": [
523
+ {
524
+ "request": {
525
+ "url": "https://tickets.example.org/boards/main/items"
526
+ },
527
+ "response": {
528
+ "status": 200,
529
+ "headers": {
530
+ "content-type": "application/json"
531
+ },
532
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
533
+ }
534
+ }
535
+ ]
536
+ }
537
+ ],
538
+ "expect": [
539
+ {
540
+ "receipt": {
541
+ "outcome": "unsupported_content",
542
+ "reason": null,
543
+ "pages": 0,
544
+ "held": 0,
545
+ "pending": 0,
546
+ "pass": {
547
+ "resumed": false,
548
+ "ended": false,
549
+ "complete": false
550
+ },
551
+ "changes": {
552
+ "new": 0,
553
+ "changed": 0,
554
+ "disappeared": 0
555
+ }
556
+ },
557
+ "cursor": null,
558
+ "requests": [
559
+ {
560
+ "url": "https://tickets.example.org/robots.txt",
561
+ "method": "GET",
562
+ "headers": {
563
+ "accept": "text/plain, */*;q=0.1",
564
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
565
+ }
566
+ },
567
+ {
568
+ "url": "https://tickets.example.org/boards/main/items",
569
+ "method": "GET",
570
+ "headers": {
571
+ "accept": "application/json",
572
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
573
+ }
574
+ }
575
+ ],
576
+ "changes": [],
577
+ "findings": [
578
+ {
579
+ "key": "source:tickets:unsupported_content",
580
+ "title": "Source tickets: unsupported content",
581
+ "summary": "the provider sent a body the profile cannot read; nothing from it was written. (https://tickets.example.org/boards/main/items)",
582
+ "priority": "low",
583
+ "facts": {
584
+ "outcome": "unsupported_content",
585
+ "reason": null,
586
+ "status": null
587
+ }
588
+ }
589
+ ]
590
+ },
591
+ {
592
+ "receipt": {
593
+ "outcome": "too_large",
594
+ "reason": null,
595
+ "pages": 0,
596
+ "held": 0,
597
+ "pending": 0,
598
+ "pass": {
599
+ "resumed": false,
600
+ "ended": false,
601
+ "complete": false
602
+ },
603
+ "changes": {
604
+ "new": 0,
605
+ "changed": 0,
606
+ "disappeared": 0
607
+ }
608
+ },
609
+ "cursor": null,
610
+ "requests": [
611
+ {
612
+ "url": "https://tickets.example.org/robots.txt",
613
+ "method": "GET",
614
+ "headers": {
615
+ "accept": "text/plain, */*;q=0.1",
616
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
617
+ }
618
+ },
619
+ {
620
+ "url": "https://tickets.example.org/boards/main/items",
621
+ "method": "GET",
622
+ "headers": {
623
+ "accept": "application/json",
624
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
625
+ }
626
+ }
627
+ ],
628
+ "changes": [],
629
+ "findings": [
630
+ {
631
+ "key": "source:tickets:too_large",
632
+ "title": "Source tickets: too large",
633
+ "summary": "the provider sent a body over the byte bound; nothing from it was written. (https://tickets.example.org/boards/main/items)",
634
+ "priority": "low",
635
+ "facts": {
636
+ "outcome": "too_large",
637
+ "reason": null,
638
+ "status": null
639
+ }
640
+ }
641
+ ]
642
+ }
643
+ ]
644
+ },
645
+ {
646
+ "name": "page.incomplete",
647
+ "runs": [
648
+ {
649
+ "mode": "complete",
650
+ "exchanges": [
651
+ {
652
+ "request": {
653
+ "url": "https://tickets.example.org/boards/main/items"
654
+ },
655
+ "response": {
656
+ "status": 200,
657
+ "headers": {
658
+ "content-type": "application/json"
659
+ },
660
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"}],\"next\":\"c1\"}"
661
+ }
662
+ },
663
+ {
664
+ "request": {
665
+ "url": "https://tickets.example.org/boards/main/items?after=c1"
666
+ },
667
+ "response": {
668
+ "hang": true
669
+ }
670
+ }
671
+ ]
672
+ }
673
+ ],
674
+ "expect": [
675
+ {
676
+ "receipt": {
677
+ "outcome": "deferred",
678
+ "reason": "deadline",
679
+ "pages": 1,
680
+ "held": 0,
681
+ "pending": 0,
682
+ "pass": {
683
+ "resumed": false,
684
+ "ended": false,
685
+ "complete": false
686
+ },
687
+ "changes": {
688
+ "new": 1,
689
+ "changed": 0,
690
+ "disappeared": 0
691
+ }
692
+ },
693
+ "cursor": {
694
+ "token": "c1",
695
+ "since": ""
696
+ },
697
+ "requests": [
698
+ {
699
+ "url": "https://tickets.example.org/robots.txt",
700
+ "method": "GET",
701
+ "headers": {
702
+ "accept": "text/plain, */*;q=0.1",
703
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
704
+ }
705
+ },
706
+ {
707
+ "url": "https://tickets.example.org/boards/main/items",
708
+ "method": "GET",
709
+ "headers": {
710
+ "accept": "application/json",
711
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
712
+ }
713
+ },
714
+ {
715
+ "url": "https://tickets.example.org/boards/main/items?after=c1",
716
+ "method": "GET",
717
+ "headers": {
718
+ "accept": "application/json",
719
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
720
+ }
721
+ }
722
+ ],
723
+ "changes": [
724
+ {
725
+ "external_id": "t1",
726
+ "change_kind": "new",
727
+ "changed_fields": [
728
+ "priority",
729
+ "state",
730
+ "title",
731
+ "url"
732
+ ],
733
+ "before": null,
734
+ "after": {
735
+ "title": "First",
736
+ "state": "open",
737
+ "priority": "low",
738
+ "url": "https://tickets.example.org/t/t1"
739
+ },
740
+ "content_digest": "sha256:46c1f1c86ad59b4e433cb1351c23b323016b611f637bd750376add7d7212e29d"
741
+ }
742
+ ],
743
+ "findings": []
744
+ }
745
+ ]
746
+ },
747
+ {
748
+ "name": "cursor.resume",
749
+ "runs": [
750
+ {
751
+ "exchanges": [
752
+ {
753
+ "request": {
754
+ "url": "https://tickets.example.org/boards/main/items"
755
+ },
756
+ "response": {
757
+ "status": 200,
758
+ "headers": {
759
+ "content-type": "application/json"
760
+ },
761
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"}],\"next\":\"c1\"}"
762
+ }
763
+ },
764
+ {
765
+ "request": {
766
+ "url": "https://tickets.example.org/boards/main/items?after=c1"
767
+ },
768
+ "response": {
769
+ "status": 503,
770
+ "headers": {},
771
+ "body": ""
772
+ }
773
+ }
774
+ ]
775
+ },
776
+ {
777
+ "exchanges": [
778
+ {
779
+ "request": {
780
+ "url": "https://tickets.example.org/boards/main/items?after=c1"
781
+ },
782
+ "response": {
783
+ "status": 200,
784
+ "headers": {
785
+ "content-type": "application/json"
786
+ },
787
+ "body": "{\"items\":[{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
788
+ }
789
+ }
790
+ ]
791
+ }
792
+ ],
793
+ "expect": [
794
+ {
795
+ "receipt": {
796
+ "outcome": "provider_unavailable",
797
+ "reason": "server_error",
798
+ "pages": 1,
799
+ "held": 0,
800
+ "pending": 0,
801
+ "pass": {
802
+ "resumed": false,
803
+ "ended": false,
804
+ "complete": false
805
+ },
806
+ "changes": {
807
+ "new": 2,
808
+ "changed": 0,
809
+ "disappeared": 0
810
+ }
811
+ },
812
+ "cursor": {
813
+ "token": "c1",
814
+ "since": ""
815
+ },
816
+ "requests": [
817
+ {
818
+ "url": "https://tickets.example.org/robots.txt",
819
+ "method": "GET",
820
+ "headers": {
821
+ "accept": "text/plain, */*;q=0.1",
822
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
823
+ }
824
+ },
825
+ {
826
+ "url": "https://tickets.example.org/boards/main/items",
827
+ "method": "GET",
828
+ "headers": {
829
+ "accept": "application/json",
830
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
831
+ }
832
+ },
833
+ {
834
+ "url": "https://tickets.example.org/boards/main/items?after=c1",
835
+ "method": "GET",
836
+ "headers": {
837
+ "accept": "application/json",
838
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
839
+ }
840
+ }
841
+ ],
842
+ "changes": [
843
+ {
844
+ "external_id": "t1",
845
+ "change_kind": "new",
846
+ "changed_fields": [
847
+ "priority",
848
+ "state",
849
+ "title",
850
+ "url"
851
+ ],
852
+ "before": null,
853
+ "after": {
854
+ "title": "First",
855
+ "state": "open",
856
+ "priority": "low",
857
+ "url": "https://tickets.example.org/t/t1"
858
+ },
859
+ "content_digest": "sha256:46c1f1c86ad59b4e433cb1351c23b323016b611f637bd750376add7d7212e29d"
860
+ },
861
+ {
862
+ "external_id": "t2",
863
+ "change_kind": "new",
864
+ "changed_fields": [
865
+ "priority",
866
+ "state",
867
+ "title",
868
+ "url"
869
+ ],
870
+ "before": null,
871
+ "after": {
872
+ "title": "Second",
873
+ "state": "open",
874
+ "priority": "low",
875
+ "url": "https://tickets.example.org/t/t2"
876
+ },
877
+ "content_digest": "sha256:41236f254fb7b7cd5e32a09e5481c98f77de69fc296033b57d38539e327073b3"
878
+ }
879
+ ],
880
+ "findings": [
881
+ {
882
+ "key": "source:tickets:provider_unavailable:server_error",
883
+ "title": "Source tickets: provider unavailable (server error)",
884
+ "summary": "the provider did not answer usefully; nothing past the last committed page was read. Status 503. (https://tickets.example.org/boards/main/items)",
885
+ "priority": "low",
886
+ "facts": {
887
+ "outcome": "provider_unavailable",
888
+ "reason": "server_error",
889
+ "status": 503
890
+ }
891
+ }
892
+ ]
893
+ },
894
+ {
895
+ "receipt": {
896
+ "outcome": "observed",
897
+ "reason": null,
898
+ "pages": 1,
899
+ "held": 0,
900
+ "pending": 0,
901
+ "pass": {
902
+ "resumed": true,
903
+ "ended": true,
904
+ "complete": false
905
+ },
906
+ "changes": {
907
+ "new": 1,
908
+ "changed": 0,
909
+ "disappeared": 0
910
+ }
911
+ },
912
+ "cursor": null,
913
+ "requests": [
914
+ {
915
+ "url": "https://tickets.example.org/robots.txt",
916
+ "method": "GET",
917
+ "headers": {
918
+ "accept": "text/plain, */*;q=0.1",
919
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
920
+ }
921
+ },
922
+ {
923
+ "url": "https://tickets.example.org/boards/main/items?after=c1",
924
+ "method": "GET",
925
+ "headers": {
926
+ "accept": "application/json",
927
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
928
+ }
929
+ }
930
+ ],
931
+ "changes": [
932
+ {
933
+ "external_id": "t3",
934
+ "change_kind": "new",
935
+ "changed_fields": [
936
+ "priority",
937
+ "state",
938
+ "title",
939
+ "url"
940
+ ],
941
+ "before": null,
942
+ "after": {
943
+ "title": "Third",
944
+ "state": "open",
945
+ "priority": "low",
946
+ "url": "https://tickets.example.org/t/t3"
947
+ },
948
+ "content_digest": "sha256:0386545d30009539465dd5cf855a36f61d7e83d31e66fbd3fb671157267f230e"
949
+ }
950
+ ],
951
+ "findings": []
952
+ }
953
+ ]
954
+ },
955
+ {
956
+ "name": "cursor.hostile",
957
+ "spec": {
958
+ "name": "tickets",
959
+ "profile": "rest-json",
960
+ "target_kind": "Ticket",
961
+ "mode": "overlay",
962
+ "identity": {
963
+ "resource": "https://tickets.example.org/boards/{board}",
964
+ "id": "{id}"
965
+ },
966
+ "fields": {
967
+ "title": {
968
+ "from": "title"
969
+ },
970
+ "state": {
971
+ "from": "status",
972
+ "values": {
973
+ "OPEN": "open",
974
+ "DONE": "closed"
975
+ },
976
+ "unmapped": "keep"
977
+ },
978
+ "priority": {
979
+ "from": "priority",
980
+ "values": {
981
+ "low": "low",
982
+ "high": "high"
983
+ },
984
+ "unmapped": "keep"
985
+ },
986
+ "url": {
987
+ "from": "html_url"
988
+ }
989
+ },
990
+ "completeness": "complete",
991
+ "request": {
992
+ "host": "tickets.example.org",
993
+ "method": "GET",
994
+ "path": "/boards/{board}/items",
995
+ "query": {},
996
+ "items": "items",
997
+ "paging": {
998
+ "kind": "cursor",
999
+ "next_path": "next_url"
1000
+ },
1001
+ "complete": "always"
1002
+ }
1003
+ },
1004
+ "runs": [
1005
+ {
1006
+ "exchanges": [
1007
+ {
1008
+ "request": {
1009
+ "url": "https://tickets.example.org/boards/main/items"
1010
+ },
1011
+ "response": {
1012
+ "status": 200,
1013
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\"}],\"next_url\":\"https://unlisted.example.net/items\"}"
1014
+ }
1015
+ }
1016
+ ]
1017
+ }
1018
+ ],
1019
+ "expect": [
1020
+ {
1021
+ "receipt": {
1022
+ "outcome": "refused",
1023
+ "reason": "host_refused",
1024
+ "pages": 1,
1025
+ "held": 0,
1026
+ "pending": 0,
1027
+ "pass": {
1028
+ "resumed": false,
1029
+ "ended": false,
1030
+ "complete": false
1031
+ },
1032
+ "changes": {
1033
+ "new": 1,
1034
+ "changed": 0,
1035
+ "disappeared": 0
1036
+ }
1037
+ },
1038
+ "cursor": {
1039
+ "url": "https://unlisted.example.net/items",
1040
+ "since": ""
1041
+ },
1042
+ "requests": [
1043
+ {
1044
+ "url": "https://tickets.example.org/robots.txt",
1045
+ "method": "GET",
1046
+ "headers": {
1047
+ "accept": "text/plain, */*;q=0.1",
1048
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1049
+ }
1050
+ },
1051
+ {
1052
+ "url": "https://tickets.example.org/boards/main/items",
1053
+ "method": "GET",
1054
+ "headers": {
1055
+ "accept": "application/json",
1056
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1057
+ }
1058
+ }
1059
+ ],
1060
+ "changes": [
1061
+ {
1062
+ "external_id": "t1",
1063
+ "change_kind": "new",
1064
+ "changed_fields": [
1065
+ "priority",
1066
+ "state",
1067
+ "title"
1068
+ ],
1069
+ "before": null,
1070
+ "after": {
1071
+ "title": "First",
1072
+ "state": "open",
1073
+ "priority": "low"
1074
+ },
1075
+ "content_digest": "sha256:7d4f685f1aa6ca5d929ce9d0f613702f21c7d18e1f60438dda658d0f632a8f3e"
1076
+ }
1077
+ ],
1078
+ "findings": [
1079
+ {
1080
+ "key": "source:tickets:refused:host_refused",
1081
+ "title": "Source tickets: refused (host refused)",
1082
+ "summary": "a request was refused before it was sent. (https://unlisted.example.net/items)",
1083
+ "priority": "normal",
1084
+ "facts": {
1085
+ "outcome": "refused",
1086
+ "reason": "host_refused",
1087
+ "status": null
1088
+ }
1089
+ }
1090
+ ]
1091
+ }
1092
+ ]
1093
+ },
1094
+ {
1095
+ "name": "complete.disappear",
1096
+ "runs": [
1097
+ {
1098
+ "mode": "complete",
1099
+ "exchanges": [
1100
+ {
1101
+ "request": {
1102
+ "url": "https://tickets.example.org/boards/main/items"
1103
+ },
1104
+ "response": {
1105
+ "status": 200,
1106
+ "headers": {
1107
+ "content-type": "application/json"
1108
+ },
1109
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
1110
+ }
1111
+ }
1112
+ ]
1113
+ },
1114
+ {
1115
+ "mode": "complete",
1116
+ "exchanges": [
1117
+ {
1118
+ "request": {
1119
+ "url": "https://tickets.example.org/boards/main/items"
1120
+ },
1121
+ "response": {
1122
+ "status": 200,
1123
+ "headers": {
1124
+ "content-type": "application/json"
1125
+ },
1126
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"}]}"
1127
+ }
1128
+ }
1129
+ ]
1130
+ },
1131
+ {
1132
+ "mode": "complete",
1133
+ "exchanges": [
1134
+ {
1135
+ "request": {
1136
+ "url": "https://tickets.example.org/boards/main/items"
1137
+ },
1138
+ "response": {
1139
+ "status": 200,
1140
+ "headers": {
1141
+ "content-type": "application/json"
1142
+ },
1143
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"}],\"next\":\"c1\"}"
1144
+ }
1145
+ },
1146
+ {
1147
+ "request": {
1148
+ "url": "https://tickets.example.org/boards/main/items?after=c1"
1149
+ },
1150
+ "response": {
1151
+ "hang": true
1152
+ }
1153
+ }
1154
+ ]
1155
+ },
1156
+ {
1157
+ "exchanges": [
1158
+ {
1159
+ "request": {
1160
+ "url": "https://tickets.example.org/boards/main/items?after=c1"
1161
+ },
1162
+ "response": {
1163
+ "status": 200,
1164
+ "headers": {
1165
+ "content-type": "application/json"
1166
+ },
1167
+ "body": "{\"items\":[{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"}]}"
1168
+ }
1169
+ }
1170
+ ]
1171
+ },
1172
+ {
1173
+ "mode": "complete",
1174
+ "exchanges": [
1175
+ {
1176
+ "request": {
1177
+ "url": "https://tickets.example.org/boards/main/items"
1178
+ },
1179
+ "response": {
1180
+ "status": 200,
1181
+ "headers": {
1182
+ "content-type": "application/json"
1183
+ },
1184
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"}]}"
1185
+ }
1186
+ }
1187
+ ]
1188
+ }
1189
+ ],
1190
+ "expect": [
1191
+ {
1192
+ "receipt": {
1193
+ "outcome": "observed",
1194
+ "reason": null,
1195
+ "pages": 1,
1196
+ "held": 0,
1197
+ "pending": 0,
1198
+ "pass": {
1199
+ "resumed": false,
1200
+ "ended": true,
1201
+ "complete": true
1202
+ },
1203
+ "changes": {
1204
+ "new": 3,
1205
+ "changed": 0,
1206
+ "disappeared": 0
1207
+ }
1208
+ },
1209
+ "cursor": null,
1210
+ "requests": [
1211
+ {
1212
+ "url": "https://tickets.example.org/robots.txt",
1213
+ "method": "GET",
1214
+ "headers": {
1215
+ "accept": "text/plain, */*;q=0.1",
1216
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1217
+ }
1218
+ },
1219
+ {
1220
+ "url": "https://tickets.example.org/boards/main/items",
1221
+ "method": "GET",
1222
+ "headers": {
1223
+ "accept": "application/json",
1224
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1225
+ }
1226
+ }
1227
+ ],
1228
+ "changes": [
1229
+ {
1230
+ "external_id": "t1",
1231
+ "change_kind": "new",
1232
+ "changed_fields": [
1233
+ "priority",
1234
+ "state",
1235
+ "title",
1236
+ "url"
1237
+ ],
1238
+ "before": null,
1239
+ "after": {
1240
+ "title": "First",
1241
+ "state": "open",
1242
+ "priority": "low",
1243
+ "url": "https://tickets.example.org/t/t1"
1244
+ },
1245
+ "content_digest": "sha256:46c1f1c86ad59b4e433cb1351c23b323016b611f637bd750376add7d7212e29d"
1246
+ },
1247
+ {
1248
+ "external_id": "t2",
1249
+ "change_kind": "new",
1250
+ "changed_fields": [
1251
+ "priority",
1252
+ "state",
1253
+ "title",
1254
+ "url"
1255
+ ],
1256
+ "before": null,
1257
+ "after": {
1258
+ "title": "Second",
1259
+ "state": "open",
1260
+ "priority": "low",
1261
+ "url": "https://tickets.example.org/t/t2"
1262
+ },
1263
+ "content_digest": "sha256:41236f254fb7b7cd5e32a09e5481c98f77de69fc296033b57d38539e327073b3"
1264
+ },
1265
+ {
1266
+ "external_id": "t3",
1267
+ "change_kind": "new",
1268
+ "changed_fields": [
1269
+ "priority",
1270
+ "state",
1271
+ "title",
1272
+ "url"
1273
+ ],
1274
+ "before": null,
1275
+ "after": {
1276
+ "title": "Third",
1277
+ "state": "open",
1278
+ "priority": "low",
1279
+ "url": "https://tickets.example.org/t/t3"
1280
+ },
1281
+ "content_digest": "sha256:0386545d30009539465dd5cf855a36f61d7e83d31e66fbd3fb671157267f230e"
1282
+ }
1283
+ ],
1284
+ "findings": []
1285
+ },
1286
+ {
1287
+ "receipt": {
1288
+ "outcome": "observed",
1289
+ "reason": null,
1290
+ "pages": 1,
1291
+ "held": 0,
1292
+ "pending": 0,
1293
+ "pass": {
1294
+ "resumed": false,
1295
+ "ended": true,
1296
+ "complete": true
1297
+ },
1298
+ "changes": {
1299
+ "new": 0,
1300
+ "changed": 0,
1301
+ "disappeared": 0
1302
+ }
1303
+ },
1304
+ "cursor": null,
1305
+ "requests": [
1306
+ {
1307
+ "url": "https://tickets.example.org/robots.txt",
1308
+ "method": "GET",
1309
+ "headers": {
1310
+ "accept": "text/plain, */*;q=0.1",
1311
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1312
+ }
1313
+ },
1314
+ {
1315
+ "url": "https://tickets.example.org/boards/main/items",
1316
+ "method": "GET",
1317
+ "headers": {
1318
+ "accept": "application/json",
1319
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1320
+ }
1321
+ }
1322
+ ],
1323
+ "changes": [],
1324
+ "findings": []
1325
+ },
1326
+ {
1327
+ "receipt": {
1328
+ "outcome": "deferred",
1329
+ "reason": "deadline",
1330
+ "pages": 1,
1331
+ "held": 0,
1332
+ "pending": 0,
1333
+ "pass": {
1334
+ "resumed": false,
1335
+ "ended": false,
1336
+ "complete": false
1337
+ },
1338
+ "changes": {
1339
+ "new": 0,
1340
+ "changed": 0,
1341
+ "disappeared": 0
1342
+ }
1343
+ },
1344
+ "cursor": {
1345
+ "token": "c1",
1346
+ "since": ""
1347
+ },
1348
+ "requests": [
1349
+ {
1350
+ "url": "https://tickets.example.org/robots.txt",
1351
+ "method": "GET",
1352
+ "headers": {
1353
+ "accept": "text/plain, */*;q=0.1",
1354
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1355
+ }
1356
+ },
1357
+ {
1358
+ "url": "https://tickets.example.org/boards/main/items",
1359
+ "method": "GET",
1360
+ "headers": {
1361
+ "accept": "application/json",
1362
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1363
+ }
1364
+ },
1365
+ {
1366
+ "url": "https://tickets.example.org/boards/main/items?after=c1",
1367
+ "method": "GET",
1368
+ "headers": {
1369
+ "accept": "application/json",
1370
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1371
+ }
1372
+ }
1373
+ ],
1374
+ "changes": [],
1375
+ "findings": []
1376
+ },
1377
+ {
1378
+ "receipt": {
1379
+ "outcome": "observed",
1380
+ "reason": null,
1381
+ "pages": 1,
1382
+ "held": 0,
1383
+ "pending": 0,
1384
+ "pass": {
1385
+ "resumed": true,
1386
+ "ended": true,
1387
+ "complete": false
1388
+ },
1389
+ "changes": {
1390
+ "new": 0,
1391
+ "changed": 0,
1392
+ "disappeared": 0
1393
+ }
1394
+ },
1395
+ "cursor": null,
1396
+ "requests": [
1397
+ {
1398
+ "url": "https://tickets.example.org/robots.txt",
1399
+ "method": "GET",
1400
+ "headers": {
1401
+ "accept": "text/plain, */*;q=0.1",
1402
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1403
+ }
1404
+ },
1405
+ {
1406
+ "url": "https://tickets.example.org/boards/main/items?after=c1",
1407
+ "method": "GET",
1408
+ "headers": {
1409
+ "accept": "application/json",
1410
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1411
+ }
1412
+ }
1413
+ ],
1414
+ "changes": [],
1415
+ "findings": []
1416
+ },
1417
+ {
1418
+ "receipt": {
1419
+ "outcome": "observed",
1420
+ "reason": null,
1421
+ "pages": 1,
1422
+ "held": 0,
1423
+ "pending": 0,
1424
+ "pass": {
1425
+ "resumed": false,
1426
+ "ended": true,
1427
+ "complete": true
1428
+ },
1429
+ "changes": {
1430
+ "new": 0,
1431
+ "changed": 0,
1432
+ "disappeared": 1
1433
+ }
1434
+ },
1435
+ "cursor": null,
1436
+ "requests": [
1437
+ {
1438
+ "url": "https://tickets.example.org/robots.txt",
1439
+ "method": "GET",
1440
+ "headers": {
1441
+ "accept": "text/plain, */*;q=0.1",
1442
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1443
+ }
1444
+ },
1445
+ {
1446
+ "url": "https://tickets.example.org/boards/main/items",
1447
+ "method": "GET",
1448
+ "headers": {
1449
+ "accept": "application/json",
1450
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1451
+ }
1452
+ }
1453
+ ],
1454
+ "changes": [
1455
+ {
1456
+ "external_id": "t3",
1457
+ "change_kind": "disappeared",
1458
+ "changed_fields": [],
1459
+ "before": {
1460
+ "title": "Third",
1461
+ "state": "open",
1462
+ "priority": "low",
1463
+ "url": "https://tickets.example.org/t/t3"
1464
+ },
1465
+ "after": null,
1466
+ "content_digest": "sha256:0386545d30009539465dd5cf855a36f61d7e83d31e66fbd3fb671157267f230e",
1467
+ "missing_count": 2,
1468
+ "first_missing_at": "2026-01-01T01:00:00.000Z"
1469
+ }
1470
+ ],
1471
+ "findings": []
1472
+ }
1473
+ ]
1474
+ },
1475
+ {
1476
+ "name": "fields.owned-conflict",
1477
+ "runs": [
1478
+ {
1479
+ "exchanges": [
1480
+ {
1481
+ "request": {
1482
+ "url": "https://tickets.example.org/boards/main/items"
1483
+ },
1484
+ "response": {
1485
+ "status": 200,
1486
+ "headers": {
1487
+ "content-type": "application/json"
1488
+ },
1489
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
1490
+ }
1491
+ }
1492
+ ]
1493
+ },
1494
+ {
1495
+ "edits": [
1496
+ {
1497
+ "id": "tickets/t1",
1498
+ "set": {
1499
+ "title": "Editor's title"
1500
+ }
1501
+ }
1502
+ ],
1503
+ "exchanges": [
1504
+ {
1505
+ "request": {
1506
+ "url": "https://tickets.example.org/boards/main/items"
1507
+ },
1508
+ "response": {
1509
+ "status": 200,
1510
+ "headers": {
1511
+ "content-type": "application/json"
1512
+ },
1513
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"Provider's title\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
1514
+ }
1515
+ }
1516
+ ]
1517
+ }
1518
+ ],
1519
+ "expect": [
1520
+ {
1521
+ "receipt": {
1522
+ "outcome": "observed",
1523
+ "reason": null,
1524
+ "pages": 1,
1525
+ "held": 0,
1526
+ "pending": 0,
1527
+ "pass": {
1528
+ "resumed": false,
1529
+ "ended": true,
1530
+ "complete": false
1531
+ },
1532
+ "changes": {
1533
+ "new": 3,
1534
+ "changed": 0,
1535
+ "disappeared": 0
1536
+ }
1537
+ },
1538
+ "cursor": null,
1539
+ "requests": [
1540
+ {
1541
+ "url": "https://tickets.example.org/robots.txt",
1542
+ "method": "GET",
1543
+ "headers": {
1544
+ "accept": "text/plain, */*;q=0.1",
1545
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1546
+ }
1547
+ },
1548
+ {
1549
+ "url": "https://tickets.example.org/boards/main/items",
1550
+ "method": "GET",
1551
+ "headers": {
1552
+ "accept": "application/json",
1553
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1554
+ }
1555
+ }
1556
+ ],
1557
+ "changes": [
1558
+ {
1559
+ "external_id": "t1",
1560
+ "change_kind": "new",
1561
+ "changed_fields": [
1562
+ "priority",
1563
+ "state",
1564
+ "title",
1565
+ "url"
1566
+ ],
1567
+ "before": null,
1568
+ "after": {
1569
+ "title": "First",
1570
+ "state": "open",
1571
+ "priority": "low",
1572
+ "url": "https://tickets.example.org/t/t1"
1573
+ },
1574
+ "content_digest": "sha256:46c1f1c86ad59b4e433cb1351c23b323016b611f637bd750376add7d7212e29d"
1575
+ },
1576
+ {
1577
+ "external_id": "t2",
1578
+ "change_kind": "new",
1579
+ "changed_fields": [
1580
+ "priority",
1581
+ "state",
1582
+ "title",
1583
+ "url"
1584
+ ],
1585
+ "before": null,
1586
+ "after": {
1587
+ "title": "Second",
1588
+ "state": "open",
1589
+ "priority": "low",
1590
+ "url": "https://tickets.example.org/t/t2"
1591
+ },
1592
+ "content_digest": "sha256:41236f254fb7b7cd5e32a09e5481c98f77de69fc296033b57d38539e327073b3"
1593
+ },
1594
+ {
1595
+ "external_id": "t3",
1596
+ "change_kind": "new",
1597
+ "changed_fields": [
1598
+ "priority",
1599
+ "state",
1600
+ "title",
1601
+ "url"
1602
+ ],
1603
+ "before": null,
1604
+ "after": {
1605
+ "title": "Third",
1606
+ "state": "open",
1607
+ "priority": "low",
1608
+ "url": "https://tickets.example.org/t/t3"
1609
+ },
1610
+ "content_digest": "sha256:0386545d30009539465dd5cf855a36f61d7e83d31e66fbd3fb671157267f230e"
1611
+ }
1612
+ ],
1613
+ "findings": []
1614
+ },
1615
+ {
1616
+ "receipt": {
1617
+ "outcome": "observed",
1618
+ "reason": null,
1619
+ "pages": 1,
1620
+ "held": 0,
1621
+ "pending": 0,
1622
+ "pass": {
1623
+ "resumed": false,
1624
+ "ended": true,
1625
+ "complete": false
1626
+ },
1627
+ "changes": {
1628
+ "new": 0,
1629
+ "changed": 1,
1630
+ "disappeared": 0
1631
+ }
1632
+ },
1633
+ "cursor": null,
1634
+ "requests": [
1635
+ {
1636
+ "url": "https://tickets.example.org/robots.txt",
1637
+ "method": "GET",
1638
+ "headers": {
1639
+ "accept": "text/plain, */*;q=0.1",
1640
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1641
+ }
1642
+ },
1643
+ {
1644
+ "url": "https://tickets.example.org/boards/main/items",
1645
+ "method": "GET",
1646
+ "headers": {
1647
+ "accept": "application/json",
1648
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1649
+ }
1650
+ }
1651
+ ],
1652
+ "changes": [
1653
+ {
1654
+ "external_id": "t1",
1655
+ "change_kind": "changed",
1656
+ "changed_fields": [
1657
+ "title"
1658
+ ],
1659
+ "before": {
1660
+ "title": "First",
1661
+ "state": "open",
1662
+ "priority": "low",
1663
+ "url": "https://tickets.example.org/t/t1"
1664
+ },
1665
+ "after": {
1666
+ "title": "Provider's title",
1667
+ "state": "open",
1668
+ "priority": "low",
1669
+ "url": "https://tickets.example.org/t/t1"
1670
+ },
1671
+ "content_digest": "sha256:2db3386b13038b5ef85f737d55f196ae438d1b5d7f99605fff1c61e467b10fcf"
1672
+ }
1673
+ ],
1674
+ "findings": []
1675
+ }
1676
+ ]
1677
+ },
1678
+ {
1679
+ "name": "fields.unmapped",
1680
+ "runs": [
1681
+ {
1682
+ "exchanges": [
1683
+ {
1684
+ "request": {
1685
+ "url": "https://tickets.example.org/boards/main/items"
1686
+ },
1687
+ "response": {
1688
+ "status": 200,
1689
+ "headers": {
1690
+ "content-type": "application/json"
1691
+ },
1692
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
1693
+ }
1694
+ }
1695
+ ]
1696
+ },
1697
+ {
1698
+ "exchanges": [
1699
+ {
1700
+ "request": {
1701
+ "url": "https://tickets.example.org/boards/main/items"
1702
+ },
1703
+ "response": {
1704
+ "status": 200,
1705
+ "headers": {
1706
+ "content-type": "application/json"
1707
+ },
1708
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"BLOCKED\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
1709
+ }
1710
+ }
1711
+ ]
1712
+ }
1713
+ ],
1714
+ "expect": [
1715
+ {
1716
+ "receipt": {
1717
+ "outcome": "observed",
1718
+ "reason": null,
1719
+ "pages": 1,
1720
+ "held": 0,
1721
+ "pending": 0,
1722
+ "pass": {
1723
+ "resumed": false,
1724
+ "ended": true,
1725
+ "complete": false
1726
+ },
1727
+ "changes": {
1728
+ "new": 3,
1729
+ "changed": 0,
1730
+ "disappeared": 0
1731
+ }
1732
+ },
1733
+ "cursor": null,
1734
+ "requests": [
1735
+ {
1736
+ "url": "https://tickets.example.org/robots.txt",
1737
+ "method": "GET",
1738
+ "headers": {
1739
+ "accept": "text/plain, */*;q=0.1",
1740
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1741
+ }
1742
+ },
1743
+ {
1744
+ "url": "https://tickets.example.org/boards/main/items",
1745
+ "method": "GET",
1746
+ "headers": {
1747
+ "accept": "application/json",
1748
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1749
+ }
1750
+ }
1751
+ ],
1752
+ "changes": [
1753
+ {
1754
+ "external_id": "t1",
1755
+ "change_kind": "new",
1756
+ "changed_fields": [
1757
+ "priority",
1758
+ "state",
1759
+ "title",
1760
+ "url"
1761
+ ],
1762
+ "before": null,
1763
+ "after": {
1764
+ "title": "First",
1765
+ "state": "open",
1766
+ "priority": "low",
1767
+ "url": "https://tickets.example.org/t/t1"
1768
+ },
1769
+ "content_digest": "sha256:46c1f1c86ad59b4e433cb1351c23b323016b611f637bd750376add7d7212e29d"
1770
+ },
1771
+ {
1772
+ "external_id": "t2",
1773
+ "change_kind": "new",
1774
+ "changed_fields": [
1775
+ "priority",
1776
+ "state",
1777
+ "title",
1778
+ "url"
1779
+ ],
1780
+ "before": null,
1781
+ "after": {
1782
+ "title": "Second",
1783
+ "state": "open",
1784
+ "priority": "low",
1785
+ "url": "https://tickets.example.org/t/t2"
1786
+ },
1787
+ "content_digest": "sha256:41236f254fb7b7cd5e32a09e5481c98f77de69fc296033b57d38539e327073b3"
1788
+ },
1789
+ {
1790
+ "external_id": "t3",
1791
+ "change_kind": "new",
1792
+ "changed_fields": [
1793
+ "priority",
1794
+ "state",
1795
+ "title",
1796
+ "url"
1797
+ ],
1798
+ "before": null,
1799
+ "after": {
1800
+ "title": "Third",
1801
+ "state": "open",
1802
+ "priority": "low",
1803
+ "url": "https://tickets.example.org/t/t3"
1804
+ },
1805
+ "content_digest": "sha256:0386545d30009539465dd5cf855a36f61d7e83d31e66fbd3fb671157267f230e"
1806
+ }
1807
+ ],
1808
+ "findings": []
1809
+ },
1810
+ {
1811
+ "receipt": {
1812
+ "outcome": "observed",
1813
+ "reason": null,
1814
+ "pages": 1,
1815
+ "held": 0,
1816
+ "pending": 0,
1817
+ "pass": {
1818
+ "resumed": false,
1819
+ "ended": true,
1820
+ "complete": false
1821
+ },
1822
+ "changes": {
1823
+ "new": 0,
1824
+ "changed": 0,
1825
+ "disappeared": 0
1826
+ }
1827
+ },
1828
+ "cursor": null,
1829
+ "requests": [
1830
+ {
1831
+ "url": "https://tickets.example.org/robots.txt",
1832
+ "method": "GET",
1833
+ "headers": {
1834
+ "accept": "text/plain, */*;q=0.1",
1835
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1836
+ }
1837
+ },
1838
+ {
1839
+ "url": "https://tickets.example.org/boards/main/items",
1840
+ "method": "GET",
1841
+ "headers": {
1842
+ "accept": "application/json",
1843
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1844
+ }
1845
+ }
1846
+ ],
1847
+ "changes": [],
1848
+ "findings": [
1849
+ {
1850
+ "key": "mapping:tickets:state:VALUE_UNMAPPED:a1f4014f85aac4c0",
1851
+ "title": "Mapping VALUE_UNMAPPED on tickets.state",
1852
+ "summary": "state: value \"BLOCKED\" has no row in the values table; the stored value was kept: 1 record (t2)",
1853
+ "priority": "low",
1854
+ "facts": {
1855
+ "code": "VALUE_UNMAPPED",
1856
+ "field": "state",
1857
+ "native": "BLOCKED"
1858
+ }
1859
+ }
1860
+ ]
1861
+ }
1862
+ ]
1863
+ },
1864
+ {
1865
+ "name": "fields.null",
1866
+ "runs": [
1867
+ {
1868
+ "exchanges": [
1869
+ {
1870
+ "request": {
1871
+ "url": "https://tickets.example.org/boards/main/items"
1872
+ },
1873
+ "response": {
1874
+ "status": 200,
1875
+ "headers": {
1876
+ "content-type": "application/json"
1877
+ },
1878
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
1879
+ }
1880
+ }
1881
+ ]
1882
+ },
1883
+ {
1884
+ "exchanges": [
1885
+ {
1886
+ "request": {
1887
+ "url": "https://tickets.example.org/boards/main/items"
1888
+ },
1889
+ "response": {
1890
+ "status": 200,
1891
+ "headers": {
1892
+ "content-type": "application/json"
1893
+ },
1894
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":null,\"html_url\":\"https://tickets.example.org/t/t1\"},{\"id\":\"t2\",\"title\":\"Second\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t2\"},{\"id\":\"t3\",\"title\":\"\",\"status\":\"OPEN\",\"priority\":\"high\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
1895
+ }
1896
+ }
1897
+ ]
1898
+ }
1899
+ ],
1900
+ "expect": [
1901
+ {
1902
+ "receipt": {
1903
+ "outcome": "observed",
1904
+ "reason": null,
1905
+ "pages": 1,
1906
+ "held": 0,
1907
+ "pending": 0,
1908
+ "pass": {
1909
+ "resumed": false,
1910
+ "ended": true,
1911
+ "complete": false
1912
+ },
1913
+ "changes": {
1914
+ "new": 3,
1915
+ "changed": 0,
1916
+ "disappeared": 0
1917
+ }
1918
+ },
1919
+ "cursor": null,
1920
+ "requests": [
1921
+ {
1922
+ "url": "https://tickets.example.org/robots.txt",
1923
+ "method": "GET",
1924
+ "headers": {
1925
+ "accept": "text/plain, */*;q=0.1",
1926
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1927
+ }
1928
+ },
1929
+ {
1930
+ "url": "https://tickets.example.org/boards/main/items",
1931
+ "method": "GET",
1932
+ "headers": {
1933
+ "accept": "application/json",
1934
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
1935
+ }
1936
+ }
1937
+ ],
1938
+ "changes": [
1939
+ {
1940
+ "external_id": "t1",
1941
+ "change_kind": "new",
1942
+ "changed_fields": [
1943
+ "priority",
1944
+ "state",
1945
+ "title",
1946
+ "url"
1947
+ ],
1948
+ "before": null,
1949
+ "after": {
1950
+ "title": "First",
1951
+ "state": "open",
1952
+ "priority": "low",
1953
+ "url": "https://tickets.example.org/t/t1"
1954
+ },
1955
+ "content_digest": "sha256:46c1f1c86ad59b4e433cb1351c23b323016b611f637bd750376add7d7212e29d"
1956
+ },
1957
+ {
1958
+ "external_id": "t2",
1959
+ "change_kind": "new",
1960
+ "changed_fields": [
1961
+ "priority",
1962
+ "state",
1963
+ "title",
1964
+ "url"
1965
+ ],
1966
+ "before": null,
1967
+ "after": {
1968
+ "title": "Second",
1969
+ "state": "open",
1970
+ "priority": "low",
1971
+ "url": "https://tickets.example.org/t/t2"
1972
+ },
1973
+ "content_digest": "sha256:41236f254fb7b7cd5e32a09e5481c98f77de69fc296033b57d38539e327073b3"
1974
+ },
1975
+ {
1976
+ "external_id": "t3",
1977
+ "change_kind": "new",
1978
+ "changed_fields": [
1979
+ "priority",
1980
+ "state",
1981
+ "title",
1982
+ "url"
1983
+ ],
1984
+ "before": null,
1985
+ "after": {
1986
+ "title": "Third",
1987
+ "state": "open",
1988
+ "priority": "low",
1989
+ "url": "https://tickets.example.org/t/t3"
1990
+ },
1991
+ "content_digest": "sha256:0386545d30009539465dd5cf855a36f61d7e83d31e66fbd3fb671157267f230e"
1992
+ }
1993
+ ],
1994
+ "findings": []
1995
+ },
1996
+ {
1997
+ "receipt": {
1998
+ "outcome": "observed",
1999
+ "reason": null,
2000
+ "pages": 1,
2001
+ "held": 0,
2002
+ "pending": 0,
2003
+ "pass": {
2004
+ "resumed": false,
2005
+ "ended": true,
2006
+ "complete": false
2007
+ },
2008
+ "changes": {
2009
+ "new": 0,
2010
+ "changed": 2,
2011
+ "disappeared": 0
2012
+ }
2013
+ },
2014
+ "cursor": null,
2015
+ "requests": [
2016
+ {
2017
+ "url": "https://tickets.example.org/robots.txt",
2018
+ "method": "GET",
2019
+ "headers": {
2020
+ "accept": "text/plain, */*;q=0.1",
2021
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
2022
+ }
2023
+ },
2024
+ {
2025
+ "url": "https://tickets.example.org/boards/main/items",
2026
+ "method": "GET",
2027
+ "headers": {
2028
+ "accept": "application/json",
2029
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
2030
+ }
2031
+ }
2032
+ ],
2033
+ "changes": [
2034
+ {
2035
+ "external_id": "t1",
2036
+ "change_kind": "changed",
2037
+ "changed_fields": [
2038
+ "priority"
2039
+ ],
2040
+ "before": {
2041
+ "title": "First",
2042
+ "state": "open",
2043
+ "priority": "low",
2044
+ "url": "https://tickets.example.org/t/t1"
2045
+ },
2046
+ "after": {
2047
+ "title": "First",
2048
+ "state": "open",
2049
+ "url": "https://tickets.example.org/t/t1"
2050
+ },
2051
+ "content_digest": "sha256:6f1d86d395c914af6ae584691c3c312805b3128704d3bee2c5cb2394123a4d83"
2052
+ },
2053
+ {
2054
+ "external_id": "t3",
2055
+ "change_kind": "changed",
2056
+ "changed_fields": [
2057
+ "priority"
2058
+ ],
2059
+ "before": {
2060
+ "title": "Third",
2061
+ "state": "open",
2062
+ "priority": "low",
2063
+ "url": "https://tickets.example.org/t/t3"
2064
+ },
2065
+ "after": {
2066
+ "state": "open",
2067
+ "priority": "high",
2068
+ "url": "https://tickets.example.org/t/t3",
2069
+ "title": "Third"
2070
+ },
2071
+ "content_digest": "sha256:67309a02295f833f764ab2dcb8a636c668d9ced6ab52be1b998909defd17caf7"
2072
+ }
2073
+ ],
2074
+ "findings": [
2075
+ {
2076
+ "key": "mapping:tickets:title:VALUE_MISSING:empty",
2077
+ "title": "Mapping VALUE_MISSING on tickets.title",
2078
+ "summary": "title: required, and the provider sent no value; the stored value was kept: 1 record (t3)",
2079
+ "priority": "low",
2080
+ "facts": {
2081
+ "code": "VALUE_MISSING",
2082
+ "field": "title",
2083
+ "shape": "empty"
2084
+ }
2085
+ }
2086
+ ]
2087
+ }
2088
+ ]
2089
+ },
2090
+ {
2091
+ "name": "identity.missing",
2092
+ "runs": [
2093
+ {
2094
+ "exchanges": [
2095
+ {
2096
+ "request": {
2097
+ "url": "https://tickets.example.org/boards/main/items"
2098
+ },
2099
+ "response": {
2100
+ "status": 200,
2101
+ "headers": {
2102
+ "content-type": "application/json"
2103
+ },
2104
+ "body": "{\"items\":[{\"id\":\"t1\",\"title\":\"First\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t1\"},{\"title\":\"No id\",\"status\":\"OPEN\"},{\"id\":\"t3\",\"title\":\"Third\",\"status\":\"OPEN\",\"priority\":\"low\",\"html_url\":\"https://tickets.example.org/t/t3\"}]}"
2105
+ }
2106
+ }
2107
+ ]
2108
+ }
2109
+ ],
2110
+ "expect": [
2111
+ {
2112
+ "receipt": {
2113
+ "outcome": "observed",
2114
+ "reason": null,
2115
+ "pages": 1,
2116
+ "held": 0,
2117
+ "pending": 0,
2118
+ "pass": {
2119
+ "resumed": false,
2120
+ "ended": true,
2121
+ "complete": false
2122
+ },
2123
+ "changes": {
2124
+ "new": 2,
2125
+ "changed": 0,
2126
+ "disappeared": 0
2127
+ }
2128
+ },
2129
+ "cursor": null,
2130
+ "requests": [
2131
+ {
2132
+ "url": "https://tickets.example.org/robots.txt",
2133
+ "method": "GET",
2134
+ "headers": {
2135
+ "accept": "text/plain, */*;q=0.1",
2136
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
2137
+ }
2138
+ },
2139
+ {
2140
+ "url": "https://tickets.example.org/boards/main/items",
2141
+ "method": "GET",
2142
+ "headers": {
2143
+ "accept": "application/json",
2144
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
2145
+ }
2146
+ }
2147
+ ],
2148
+ "changes": [
2149
+ {
2150
+ "external_id": "t1",
2151
+ "change_kind": "new",
2152
+ "changed_fields": [
2153
+ "priority",
2154
+ "state",
2155
+ "title",
2156
+ "url"
2157
+ ],
2158
+ "before": null,
2159
+ "after": {
2160
+ "title": "First",
2161
+ "state": "open",
2162
+ "priority": "low",
2163
+ "url": "https://tickets.example.org/t/t1"
2164
+ },
2165
+ "content_digest": "sha256:46c1f1c86ad59b4e433cb1351c23b323016b611f637bd750376add7d7212e29d"
2166
+ },
2167
+ {
2168
+ "external_id": "t3",
2169
+ "change_kind": "new",
2170
+ "changed_fields": [
2171
+ "priority",
2172
+ "state",
2173
+ "title",
2174
+ "url"
2175
+ ],
2176
+ "before": null,
2177
+ "after": {
2178
+ "title": "Third",
2179
+ "state": "open",
2180
+ "priority": "low",
2181
+ "url": "https://tickets.example.org/t/t3"
2182
+ },
2183
+ "content_digest": "sha256:0386545d30009539465dd5cf855a36f61d7e83d31e66fbd3fb671157267f230e"
2184
+ }
2185
+ ],
2186
+ "findings": [
2187
+ {
2188
+ "key": "mapping:tickets:IDENTITY_MISSING",
2189
+ "title": "Mapping IDENTITY_MISSING on tickets.identity",
2190
+ "summary": "records without a value for the identity template were skipped: records",
2191
+ "priority": "normal",
2192
+ "facts": {
2193
+ "code": "IDENTITY_MISSING",
2194
+ "field": "identity",
2195
+ "native": null
2196
+ }
2197
+ }
2198
+ ]
2199
+ }
2200
+ ]
2201
+ },
2202
+ {
2203
+ "name": "hosts.redirect",
2204
+ "runs": [
2205
+ {
2206
+ "exchanges": [
2207
+ {
2208
+ "request": {
2209
+ "url": "https://tickets.example.org/boards/main/items"
2210
+ },
2211
+ "response": {
2212
+ "status": 302,
2213
+ "headers": {
2214
+ "location": "https://cdn.example.net/items.json"
2215
+ },
2216
+ "body": ""
2217
+ }
2218
+ }
2219
+ ]
2220
+ }
2221
+ ],
2222
+ "expect": [
2223
+ {
2224
+ "receipt": {
2225
+ "outcome": "refused",
2226
+ "reason": "host_refused",
2227
+ "pages": 0,
2228
+ "held": 0,
2229
+ "pending": 0,
2230
+ "pass": {
2231
+ "resumed": false,
2232
+ "ended": false,
2233
+ "complete": false
2234
+ },
2235
+ "changes": {
2236
+ "new": 0,
2237
+ "changed": 0,
2238
+ "disappeared": 0
2239
+ }
2240
+ },
2241
+ "cursor": null,
2242
+ "requests": [
2243
+ {
2244
+ "url": "https://tickets.example.org/robots.txt",
2245
+ "method": "GET",
2246
+ "headers": {
2247
+ "accept": "text/plain, */*;q=0.1",
2248
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
2249
+ }
2250
+ },
2251
+ {
2252
+ "url": "https://tickets.example.org/boards/main/items",
2253
+ "method": "GET",
2254
+ "headers": {
2255
+ "accept": "application/json",
2256
+ "user-agent": "SuperbeeSourceFixture/1 (+https://superbee.example.org/source-fixture)"
2257
+ }
2258
+ }
2259
+ ],
2260
+ "changes": [],
2261
+ "findings": [
2262
+ {
2263
+ "key": "source:tickets:refused:host_refused",
2264
+ "title": "Source tickets: refused (host refused)",
2265
+ "summary": "a request was refused before it was sent. (https://cdn.example.net/items.json)",
2266
+ "priority": "normal",
2267
+ "facts": {
2268
+ "outcome": "refused",
2269
+ "reason": "host_refused",
2270
+ "status": null
2271
+ }
2272
+ }
2273
+ ]
2274
+ }
2275
+ ]
2276
+ },
2277
+ {
2278
+ "name": "hosts.undeclared",
2279
+ "spec": {
2280
+ "name": "tickets",
2281
+ "profile": "rest-json",
2282
+ "target_kind": "Ticket",
2283
+ "mode": "overlay",
2284
+ "identity": {
2285
+ "resource": "https://tickets.example.org/boards/{board}",
2286
+ "id": "{id}"
2287
+ },
2288
+ "fields": {
2289
+ "title": {
2290
+ "from": "title"
2291
+ },
2292
+ "state": {
2293
+ "from": "status",
2294
+ "values": {
2295
+ "OPEN": "open",
2296
+ "DONE": "closed"
2297
+ },
2298
+ "unmapped": "keep"
2299
+ },
2300
+ "priority": {
2301
+ "from": "priority",
2302
+ "values": {
2303
+ "low": "low",
2304
+ "high": "high"
2305
+ },
2306
+ "unmapped": "keep"
2307
+ },
2308
+ "url": {
2309
+ "from": "html_url"
2310
+ }
2311
+ },
2312
+ "completeness": "complete",
2313
+ "request": {
2314
+ "host": "elsewhere.example.net",
2315
+ "method": "GET",
2316
+ "path": "/boards/{board}/items",
2317
+ "query": {
2318
+ "after": "{cursor}"
2319
+ },
2320
+ "items": "items",
2321
+ "paging": {
2322
+ "kind": "cursor",
2323
+ "cursor_path": "next"
2324
+ },
2325
+ "complete": "always"
2326
+ }
2327
+ },
2328
+ "runs": [
2329
+ {
2330
+ "exchanges": []
2331
+ }
2332
+ ],
2333
+ "expect": [
2334
+ {
2335
+ "receipt": {
2336
+ "outcome": "refused",
2337
+ "reason": "hosts_undeclared",
2338
+ "pages": 0,
2339
+ "held": 0,
2340
+ "pending": 0,
2341
+ "pass": {
2342
+ "resumed": false,
2343
+ "ended": false,
2344
+ "complete": false
2345
+ },
2346
+ "changes": {
2347
+ "new": 0,
2348
+ "changed": 0,
2349
+ "disappeared": 0
2350
+ }
2351
+ },
2352
+ "cursor": null,
2353
+ "requests": [],
2354
+ "changes": [],
2355
+ "findings": [
2356
+ {
2357
+ "key": "source:tickets:refused:hosts_undeclared",
2358
+ "title": "Source tickets: refused (hosts undeclared)",
2359
+ "summary": "a request was refused before it was sent.",
2360
+ "priority": "normal",
2361
+ "facts": {
2362
+ "outcome": "refused",
2363
+ "reason": "hosts_undeclared",
2364
+ "status": null
2365
+ }
2366
+ }
2367
+ ]
2368
+ }
2369
+ ]
2370
+ },
2371
+ {
2372
+ "name": "hosts.undeclared.post",
2373
+ "spec": {
2374
+ "name": "tickets",
2375
+ "profile": "rest-json",
2376
+ "target_kind": "Ticket",
2377
+ "mode": "overlay",
2378
+ "identity": {
2379
+ "resource": "https://tickets.example.org/boards/{board}",
2380
+ "id": "{id}"
2381
+ },
2382
+ "fields": {
2383
+ "title": {
2384
+ "from": "title"
2385
+ },
2386
+ "state": {
2387
+ "from": "status",
2388
+ "values": {
2389
+ "OPEN": "open",
2390
+ "DONE": "closed"
2391
+ },
2392
+ "unmapped": "keep"
2393
+ },
2394
+ "priority": {
2395
+ "from": "priority",
2396
+ "values": {
2397
+ "low": "low",
2398
+ "high": "high"
2399
+ },
2400
+ "unmapped": "keep"
2401
+ },
2402
+ "url": {
2403
+ "from": "html_url"
2404
+ }
2405
+ },
2406
+ "completeness": "complete",
2407
+ "request": {
2408
+ "host": "tickets.example.org",
2409
+ "method": "POST",
2410
+ "path": "/boards/{board}/items",
2411
+ "query": {
2412
+ "after": "{cursor}"
2413
+ },
2414
+ "items": "items",
2415
+ "paging": {
2416
+ "kind": "cursor",
2417
+ "cursor_path": "next"
2418
+ },
2419
+ "complete": "always"
2420
+ }
2421
+ },
2422
+ "runs": [
2423
+ {
2424
+ "exchanges": []
2425
+ }
2426
+ ],
2427
+ "expect": [
2428
+ {
2429
+ "receipt": {
2430
+ "outcome": "refused",
2431
+ "reason": "method_refused",
2432
+ "pages": 0,
2433
+ "held": 0,
2434
+ "pending": 0,
2435
+ "pass": {
2436
+ "resumed": false,
2437
+ "ended": false,
2438
+ "complete": false
2439
+ },
2440
+ "changes": {
2441
+ "new": 0,
2442
+ "changed": 0,
2443
+ "disappeared": 0
2444
+ }
2445
+ },
2446
+ "cursor": null,
2447
+ "requests": [],
2448
+ "changes": [],
2449
+ "findings": [
2450
+ {
2451
+ "key": "source:tickets:refused:method_refused",
2452
+ "title": "Source tickets: refused (method refused)",
2453
+ "summary": "a request was refused before it was sent. (https://tickets.example.org/boards/main/items)",
2454
+ "priority": "normal",
2455
+ "facts": {
2456
+ "outcome": "refused",
2457
+ "reason": "method_refused",
2458
+ "status": null
2459
+ }
2460
+ }
2461
+ ]
2462
+ }
2463
+ ]
2464
+ }
2465
+ ]
2466
+ }