@crvouga/atlas 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/dist/reports/src/explorer-types.d.ts +19 -0
  3. package/dist/reports/src/latency.d.ts +204 -0
  4. package/dist/reports/src/latency.js +219 -0
  5. package/dist/reports/src/reports-explorer-route.d.ts +19 -6
  6. package/dist/reports/src/reports-route.d.ts +19 -6
  7. package/dist/reports/src/test-catalog.d.ts +3 -1
  8. package/dist/reports/src/test-catalog.js +4 -2
  9. package/dist/schema/src/api.d.ts +151 -0
  10. package/dist/schema/src/api.js +4 -3
  11. package/dist/schema/src/layer.d.ts +90 -0
  12. package/dist/schema/src/layer.js +20 -1
  13. package/docs/extending.md +1 -1
  14. package/docs/reference/reports.md +347 -0
  15. package/docs/reference/schema.md +28 -0
  16. package/docs/rich-evidence.md +43 -0
  17. package/docs/ui.md +10 -1
  18. package/llms-full.txt +54 -2
  19. package/package.json +1 -1
  20. package/packages/schema/schemas/check-detail.schema.json +56 -1
  21. package/packages/schema/schemas/effective-delta.schema.json +60 -2
  22. package/packages/schema/schemas/effective-evidence.schema.json +60 -2
  23. package/packages/schema/schemas/layer-rows.schema.json +60 -2
  24. package/packages/schema/schemas/layer.schema.json +112 -2
  25. package/packages/schema/schemas/publish-checks.schema.json +56 -1
  26. package/packages/schema/schemas/test-catalog.schema.json +85 -0
  27. package/packages/schema/schemas/test-history.schema.json +170 -0
  28. package/packages/server/openapi.json +547 -8
  29. package/packages/visualizer/src/evidence/check-detail.tsx +9 -0
  30. package/packages/visualizer/src/explorer/ProductLatency.tsx +214 -0
  31. package/packages/visualizer/src/explorer/TestDetail.tsx +9 -2
@@ -8824,16 +8824,74 @@
8824
8824
  "type": "object",
8825
8825
  "properties": {
8826
8826
  "name": {
8827
- "type": "string"
8827
+ "type": "string",
8828
+ "minLength": 1
8828
8829
  },
8829
8830
  "value": {
8830
- "type": "number"
8831
+ "type": "number",
8832
+ "description": "A finite number"
8831
8833
  },
8832
8834
  "unit": {
8833
8835
  "type": "string"
8834
8836
  },
8835
8837
  "limit": {
8838
+ "description": "The allowance, or budget. A measurement over it is reported, and never fails the check by itself",
8836
8839
  "type": "number"
8840
+ },
8841
+ "kind": {
8842
+ "description": "What the number is, in an open vocabulary. `product-latency`: a user-visible response time between `from` and `to`. Absent: just a number, never read as product latency",
8843
+ "type": "string",
8844
+ "minLength": 1
8845
+ },
8846
+ "from": {
8847
+ "description": "The event the interval starts at. Without both `from` and `to` a latency is shown but no product claim is made from it",
8848
+ "type": "string",
8849
+ "minLength": 1
8850
+ },
8851
+ "to": {
8852
+ "description": "The event the interval ends at",
8853
+ "type": "string",
8854
+ "minLength": 1
8855
+ },
8856
+ "intended": {
8857
+ "description": "The interval the name of the measurement claims, when what was measured is only part of it. If `intended.to` differs from `to` (or `intended.from` from `from`) the measurement is shown as partial, never as the complete interval",
8858
+ "type": "object",
8859
+ "properties": {
8860
+ "from": {
8861
+ "description": "The event the interval starts at: `end of speech`, `submit pressed`",
8862
+ "type": "string",
8863
+ "minLength": 1
8864
+ },
8865
+ "to": {
8866
+ "description": "The event the interval ends at: `audible response`, `confirmation visible`",
8867
+ "type": "string",
8868
+ "minLength": 1
8869
+ }
8870
+ },
8871
+ "additionalProperties": {}
8872
+ },
8873
+ "source": {
8874
+ "description": "How it was measured: `app-instrumentation`, `trace`, `recording-analysis`",
8875
+ "type": "string"
8876
+ },
8877
+ "outcome": {
8878
+ "description": "`observed` (the default), `timeout` or `failed`. For anything but `observed` the value is how long the observation waited: at least that much, so it counts against a budget and is never dropped",
8879
+ "type": "string",
8880
+ "minLength": 1
8881
+ },
8882
+ "instrumentation": {
8883
+ "description": "The version or method of the measurement. A change of it between two sets of observations is disclosed when they are compared",
8884
+ "type": "string"
8885
+ },
8886
+ "labels": {
8887
+ "description": "What the observation is comparable with: `device`, `build`, `network`. `device` and `build` group the observations and, when two groups differ in the others, the comparison says so",
8888
+ "type": "object",
8889
+ "propertyNames": {
8890
+ "type": "string"
8891
+ },
8892
+ "additionalProperties": {
8893
+ "type": "string"
8894
+ }
8837
8895
  }
8838
8896
  },
8839
8897
  "required": [
@@ -9660,16 +9718,74 @@
9660
9718
  "type": "object",
9661
9719
  "properties": {
9662
9720
  "name": {
9663
- "type": "string"
9721
+ "type": "string",
9722
+ "minLength": 1
9664
9723
  },
9665
9724
  "value": {
9666
- "type": "number"
9725
+ "type": "number",
9726
+ "description": "A finite number"
9667
9727
  },
9668
9728
  "unit": {
9669
9729
  "type": "string"
9670
9730
  },
9671
9731
  "limit": {
9732
+ "description": "The allowance, or budget. A measurement over it is reported, and never fails the check by itself",
9672
9733
  "type": "number"
9734
+ },
9735
+ "kind": {
9736
+ "description": "What the number is, in an open vocabulary. `product-latency`: a user-visible response time between `from` and `to`. Absent: just a number, never read as product latency",
9737
+ "type": "string",
9738
+ "minLength": 1
9739
+ },
9740
+ "from": {
9741
+ "description": "The event the interval starts at. Without both `from` and `to` a latency is shown but no product claim is made from it",
9742
+ "type": "string",
9743
+ "minLength": 1
9744
+ },
9745
+ "to": {
9746
+ "description": "The event the interval ends at",
9747
+ "type": "string",
9748
+ "minLength": 1
9749
+ },
9750
+ "intended": {
9751
+ "description": "The interval the name of the measurement claims, when what was measured is only part of it. If `intended.to` differs from `to` (or `intended.from` from `from`) the measurement is shown as partial, never as the complete interval",
9752
+ "type": "object",
9753
+ "properties": {
9754
+ "from": {
9755
+ "description": "The event the interval starts at: `end of speech`, `submit pressed`",
9756
+ "type": "string",
9757
+ "minLength": 1
9758
+ },
9759
+ "to": {
9760
+ "description": "The event the interval ends at: `audible response`, `confirmation visible`",
9761
+ "type": "string",
9762
+ "minLength": 1
9763
+ }
9764
+ },
9765
+ "additionalProperties": {}
9766
+ },
9767
+ "source": {
9768
+ "description": "How it was measured: `app-instrumentation`, `trace`, `recording-analysis`",
9769
+ "type": "string"
9770
+ },
9771
+ "outcome": {
9772
+ "description": "`observed` (the default), `timeout` or `failed`. For anything but `observed` the value is how long the observation waited: at least that much, so it counts against a budget and is never dropped",
9773
+ "type": "string",
9774
+ "minLength": 1
9775
+ },
9776
+ "instrumentation": {
9777
+ "description": "The version or method of the measurement. A change of it between two sets of observations is disclosed when they are compared",
9778
+ "type": "string"
9779
+ },
9780
+ "labels": {
9781
+ "description": "What the observation is comparable with: `device`, `build`, `network`. `device` and `build` group the observations and, when two groups differ in the others, the comparison says so",
9782
+ "type": "object",
9783
+ "propertyNames": {
9784
+ "type": "string"
9785
+ },
9786
+ "additionalProperties": {
9787
+ "type": "string"
9788
+ }
9673
9789
  }
9674
9790
  },
9675
9791
  "required": [
@@ -10967,8 +11083,63 @@
10967
11083
  "type": "string"
10968
11084
  },
10969
11085
  "limit": {
10970
- "description": "The allowance. A measurement over it is reported, and never fails the check by itself",
11086
+ "description": "The allowance, or budget. A measurement over it is reported, and never fails the check by itself",
10971
11087
  "type": "number"
11088
+ },
11089
+ "kind": {
11090
+ "description": "What the number is, in an open vocabulary. `product-latency`: a user-visible response time between `from` and `to`. Absent: just a number, never read as product latency",
11091
+ "type": "string",
11092
+ "minLength": 1
11093
+ },
11094
+ "from": {
11095
+ "description": "The event the interval starts at. Without both `from` and `to` a latency is shown but no product claim is made from it",
11096
+ "type": "string",
11097
+ "minLength": 1
11098
+ },
11099
+ "to": {
11100
+ "description": "The event the interval ends at",
11101
+ "type": "string",
11102
+ "minLength": 1
11103
+ },
11104
+ "intended": {
11105
+ "description": "The interval the name of the measurement claims, when what was measured is only part of it. If `intended.to` differs from `to` (or `intended.from` from `from`) the measurement is shown as partial, never as the complete interval",
11106
+ "type": "object",
11107
+ "properties": {
11108
+ "from": {
11109
+ "description": "The event the interval starts at: `end of speech`, `submit pressed`",
11110
+ "type": "string",
11111
+ "minLength": 1
11112
+ },
11113
+ "to": {
11114
+ "description": "The event the interval ends at: `audible response`, `confirmation visible`",
11115
+ "type": "string",
11116
+ "minLength": 1
11117
+ }
11118
+ },
11119
+ "additionalProperties": {}
11120
+ },
11121
+ "source": {
11122
+ "description": "How it was measured: `app-instrumentation`, `trace`, `recording-analysis`",
11123
+ "type": "string"
11124
+ },
11125
+ "outcome": {
11126
+ "description": "`observed` (the default), `timeout` or `failed`. For anything but `observed` the value is how long the observation waited: at least that much, so it counts against a budget and is never dropped",
11127
+ "type": "string",
11128
+ "minLength": 1
11129
+ },
11130
+ "instrumentation": {
11131
+ "description": "The version or method of the measurement. A change of it between two sets of observations is disclosed when they are compared",
11132
+ "type": "string"
11133
+ },
11134
+ "labels": {
11135
+ "description": "What the observation is comparable with: `device`, `build`, `network`. `device` and `build` group the observations and, when two groups differ in the others, the comparison says so",
11136
+ "type": "object",
11137
+ "propertyNames": {
11138
+ "type": "string"
11139
+ },
11140
+ "additionalProperties": {
11141
+ "type": "string"
11142
+ }
10972
11143
  }
10973
11144
  },
10974
11145
  "required": [
@@ -13816,16 +13987,74 @@
13816
13987
  "type": "object",
13817
13988
  "properties": {
13818
13989
  "name": {
13819
- "type": "string"
13990
+ "type": "string",
13991
+ "minLength": 1
13820
13992
  },
13821
13993
  "value": {
13822
- "type": "number"
13994
+ "type": "number",
13995
+ "description": "A finite number"
13823
13996
  },
13824
13997
  "unit": {
13825
13998
  "type": "string"
13826
13999
  },
13827
14000
  "limit": {
14001
+ "description": "The allowance, or budget. A measurement over it is reported, and never fails the check by itself",
13828
14002
  "type": "number"
14003
+ },
14004
+ "kind": {
14005
+ "description": "What the number is, in an open vocabulary. `product-latency`: a user-visible response time between `from` and `to`. Absent: just a number, never read as product latency",
14006
+ "type": "string",
14007
+ "minLength": 1
14008
+ },
14009
+ "from": {
14010
+ "description": "The event the interval starts at. Without both `from` and `to` a latency is shown but no product claim is made from it",
14011
+ "type": "string",
14012
+ "minLength": 1
14013
+ },
14014
+ "to": {
14015
+ "description": "The event the interval ends at",
14016
+ "type": "string",
14017
+ "minLength": 1
14018
+ },
14019
+ "intended": {
14020
+ "description": "The interval the name of the measurement claims, when what was measured is only part of it. If `intended.to` differs from `to` (or `intended.from` from `from`) the measurement is shown as partial, never as the complete interval",
14021
+ "type": "object",
14022
+ "properties": {
14023
+ "from": {
14024
+ "description": "The event the interval starts at: `end of speech`, `submit pressed`",
14025
+ "type": "string",
14026
+ "minLength": 1
14027
+ },
14028
+ "to": {
14029
+ "description": "The event the interval ends at: `audible response`, `confirmation visible`",
14030
+ "type": "string",
14031
+ "minLength": 1
14032
+ }
14033
+ },
14034
+ "additionalProperties": {}
14035
+ },
14036
+ "source": {
14037
+ "description": "How it was measured: `app-instrumentation`, `trace`, `recording-analysis`",
14038
+ "type": "string"
14039
+ },
14040
+ "outcome": {
14041
+ "description": "`observed` (the default), `timeout` or `failed`. For anything but `observed` the value is how long the observation waited: at least that much, so it counts against a budget and is never dropped",
14042
+ "type": "string",
14043
+ "minLength": 1
14044
+ },
14045
+ "instrumentation": {
14046
+ "description": "The version or method of the measurement. A change of it between two sets of observations is disclosed when they are compared",
14047
+ "type": "string"
14048
+ },
14049
+ "labels": {
14050
+ "description": "What the observation is comparable with: `device`, `build`, `network`. `device` and `build` group the observations and, when two groups differ in the others, the comparison says so",
14051
+ "type": "object",
14052
+ "propertyNames": {
14053
+ "type": "string"
14054
+ },
14055
+ "additionalProperties": {
14056
+ "type": "string"
14057
+ }
13829
14058
  }
13830
14059
  },
13831
14060
  "required": [
@@ -14176,8 +14405,63 @@
14176
14405
  "type": "string"
14177
14406
  },
14178
14407
  "limit": {
14179
- "description": "The allowance. A measurement over it is reported, and never fails the check by itself",
14408
+ "description": "The allowance, or budget. A measurement over it is reported, and never fails the check by itself",
14180
14409
  "type": "number"
14410
+ },
14411
+ "kind": {
14412
+ "description": "What the number is, in an open vocabulary. `product-latency`: a user-visible response time between `from` and `to`. Absent: just a number, never read as product latency",
14413
+ "type": "string",
14414
+ "minLength": 1
14415
+ },
14416
+ "from": {
14417
+ "description": "The event the interval starts at. Without both `from` and `to` a latency is shown but no product claim is made from it",
14418
+ "type": "string",
14419
+ "minLength": 1
14420
+ },
14421
+ "to": {
14422
+ "description": "The event the interval ends at",
14423
+ "type": "string",
14424
+ "minLength": 1
14425
+ },
14426
+ "intended": {
14427
+ "description": "The interval the name of the measurement claims, when what was measured is only part of it. If `intended.to` differs from `to` (or `intended.from` from `from`) the measurement is shown as partial, never as the complete interval",
14428
+ "type": "object",
14429
+ "properties": {
14430
+ "from": {
14431
+ "description": "The event the interval starts at: `end of speech`, `submit pressed`",
14432
+ "type": "string",
14433
+ "minLength": 1
14434
+ },
14435
+ "to": {
14436
+ "description": "The event the interval ends at: `audible response`, `confirmation visible`",
14437
+ "type": "string",
14438
+ "minLength": 1
14439
+ }
14440
+ },
14441
+ "additionalProperties": {}
14442
+ },
14443
+ "source": {
14444
+ "description": "How it was measured: `app-instrumentation`, `trace`, `recording-analysis`",
14445
+ "type": "string"
14446
+ },
14447
+ "outcome": {
14448
+ "description": "`observed` (the default), `timeout` or `failed`. For anything but `observed` the value is how long the observation waited: at least that much, so it counts against a budget and is never dropped",
14449
+ "type": "string",
14450
+ "minLength": 1
14451
+ },
14452
+ "instrumentation": {
14453
+ "description": "The version or method of the measurement. A change of it between two sets of observations is disclosed when they are compared",
14454
+ "type": "string"
14455
+ },
14456
+ "labels": {
14457
+ "description": "What the observation is comparable with: `device`, `build`, `network`. `device` and `build` group the observations and, when two groups differ in the others, the comparison says so",
14458
+ "type": "object",
14459
+ "propertyNames": {
14460
+ "type": "string"
14461
+ },
14462
+ "additionalProperties": {
14463
+ "type": "string"
14464
+ }
14181
14465
  }
14182
14466
  },
14183
14467
  "required": [
@@ -17191,6 +17475,91 @@
17191
17475
  "roles"
17192
17476
  ],
17193
17477
  "additionalProperties": {}
17478
+ },
17479
+ "latency": {
17480
+ "description": "Its product-latency measurements (`kind: product-latency`), when it recorded any. Separate from `durationMs`, which is how long the test took",
17481
+ "type": "array",
17482
+ "items": {
17483
+ "type": "object",
17484
+ "properties": {
17485
+ "name": {
17486
+ "type": "string",
17487
+ "minLength": 1
17488
+ },
17489
+ "value": {
17490
+ "type": "number",
17491
+ "description": "A finite number"
17492
+ },
17493
+ "unit": {
17494
+ "type": "string"
17495
+ },
17496
+ "limit": {
17497
+ "description": "The allowance, or budget. A measurement over it is reported, and never fails the check by itself",
17498
+ "type": "number"
17499
+ },
17500
+ "kind": {
17501
+ "description": "What the number is, in an open vocabulary. `product-latency`: a user-visible response time between `from` and `to`. Absent: just a number, never read as product latency",
17502
+ "type": "string",
17503
+ "minLength": 1
17504
+ },
17505
+ "from": {
17506
+ "description": "The event the interval starts at. Without both `from` and `to` a latency is shown but no product claim is made from it",
17507
+ "type": "string",
17508
+ "minLength": 1
17509
+ },
17510
+ "to": {
17511
+ "description": "The event the interval ends at",
17512
+ "type": "string",
17513
+ "minLength": 1
17514
+ },
17515
+ "intended": {
17516
+ "description": "The interval the name of the measurement claims, when what was measured is only part of it. If `intended.to` differs from `to` (or `intended.from` from `from`) the measurement is shown as partial, never as the complete interval",
17517
+ "type": "object",
17518
+ "properties": {
17519
+ "from": {
17520
+ "description": "The event the interval starts at: `end of speech`, `submit pressed`",
17521
+ "type": "string",
17522
+ "minLength": 1
17523
+ },
17524
+ "to": {
17525
+ "description": "The event the interval ends at: `audible response`, `confirmation visible`",
17526
+ "type": "string",
17527
+ "minLength": 1
17528
+ }
17529
+ },
17530
+ "additionalProperties": {}
17531
+ },
17532
+ "source": {
17533
+ "description": "How it was measured: `app-instrumentation`, `trace`, `recording-analysis`",
17534
+ "type": "string"
17535
+ },
17536
+ "outcome": {
17537
+ "description": "`observed` (the default), `timeout` or `failed`. For anything but `observed` the value is how long the observation waited: at least that much, so it counts against a budget and is never dropped",
17538
+ "type": "string",
17539
+ "minLength": 1
17540
+ },
17541
+ "instrumentation": {
17542
+ "description": "The version or method of the measurement. A change of it between two sets of observations is disclosed when they are compared",
17543
+ "type": "string"
17544
+ },
17545
+ "labels": {
17546
+ "description": "What the observation is comparable with: `device`, `build`, `network`. `device` and `build` group the observations and, when two groups differ in the others, the comparison says so",
17547
+ "type": "object",
17548
+ "propertyNames": {
17549
+ "type": "string"
17550
+ },
17551
+ "additionalProperties": {
17552
+ "type": "string"
17553
+ }
17554
+ }
17555
+ },
17556
+ "required": [
17557
+ "name",
17558
+ "value",
17559
+ "unit"
17560
+ ],
17561
+ "additionalProperties": {}
17562
+ }
17194
17563
  }
17195
17564
  },
17196
17565
  "required": [
@@ -18238,6 +18607,91 @@
18238
18607
  "roles"
18239
18608
  ],
18240
18609
  "additionalProperties": {}
18610
+ },
18611
+ "latency": {
18612
+ "description": "Its product-latency measurements (`kind: product-latency`), when it recorded any. Separate from `durationMs`, which is how long the test took",
18613
+ "type": "array",
18614
+ "items": {
18615
+ "type": "object",
18616
+ "properties": {
18617
+ "name": {
18618
+ "type": "string",
18619
+ "minLength": 1
18620
+ },
18621
+ "value": {
18622
+ "type": "number",
18623
+ "description": "A finite number"
18624
+ },
18625
+ "unit": {
18626
+ "type": "string"
18627
+ },
18628
+ "limit": {
18629
+ "description": "The allowance, or budget. A measurement over it is reported, and never fails the check by itself",
18630
+ "type": "number"
18631
+ },
18632
+ "kind": {
18633
+ "description": "What the number is, in an open vocabulary. `product-latency`: a user-visible response time between `from` and `to`. Absent: just a number, never read as product latency",
18634
+ "type": "string",
18635
+ "minLength": 1
18636
+ },
18637
+ "from": {
18638
+ "description": "The event the interval starts at. Without both `from` and `to` a latency is shown but no product claim is made from it",
18639
+ "type": "string",
18640
+ "minLength": 1
18641
+ },
18642
+ "to": {
18643
+ "description": "The event the interval ends at",
18644
+ "type": "string",
18645
+ "minLength": 1
18646
+ },
18647
+ "intended": {
18648
+ "description": "The interval the name of the measurement claims, when what was measured is only part of it. If `intended.to` differs from `to` (or `intended.from` from `from`) the measurement is shown as partial, never as the complete interval",
18649
+ "type": "object",
18650
+ "properties": {
18651
+ "from": {
18652
+ "description": "The event the interval starts at: `end of speech`, `submit pressed`",
18653
+ "type": "string",
18654
+ "minLength": 1
18655
+ },
18656
+ "to": {
18657
+ "description": "The event the interval ends at: `audible response`, `confirmation visible`",
18658
+ "type": "string",
18659
+ "minLength": 1
18660
+ }
18661
+ },
18662
+ "additionalProperties": {}
18663
+ },
18664
+ "source": {
18665
+ "description": "How it was measured: `app-instrumentation`, `trace`, `recording-analysis`",
18666
+ "type": "string"
18667
+ },
18668
+ "outcome": {
18669
+ "description": "`observed` (the default), `timeout` or `failed`. For anything but `observed` the value is how long the observation waited: at least that much, so it counts against a budget and is never dropped",
18670
+ "type": "string",
18671
+ "minLength": 1
18672
+ },
18673
+ "instrumentation": {
18674
+ "description": "The version or method of the measurement. A change of it between two sets of observations is disclosed when they are compared",
18675
+ "type": "string"
18676
+ },
18677
+ "labels": {
18678
+ "description": "What the observation is comparable with: `device`, `build`, `network`. `device` and `build` group the observations and, when two groups differ in the others, the comparison says so",
18679
+ "type": "object",
18680
+ "propertyNames": {
18681
+ "type": "string"
18682
+ },
18683
+ "additionalProperties": {
18684
+ "type": "string"
18685
+ }
18686
+ }
18687
+ },
18688
+ "required": [
18689
+ "name",
18690
+ "value",
18691
+ "unit"
18692
+ ],
18693
+ "additionalProperties": {}
18694
+ }
18241
18695
  }
18242
18696
  },
18243
18697
  "required": [
@@ -18789,6 +19243,91 @@
18789
19243
  "roles"
18790
19244
  ],
18791
19245
  "additionalProperties": {}
19246
+ },
19247
+ "latency": {
19248
+ "description": "Its product-latency measurements (`kind: product-latency`), when it recorded any. Separate from `durationMs`, which is how long the test took",
19249
+ "type": "array",
19250
+ "items": {
19251
+ "type": "object",
19252
+ "properties": {
19253
+ "name": {
19254
+ "type": "string",
19255
+ "minLength": 1
19256
+ },
19257
+ "value": {
19258
+ "type": "number",
19259
+ "description": "A finite number"
19260
+ },
19261
+ "unit": {
19262
+ "type": "string"
19263
+ },
19264
+ "limit": {
19265
+ "description": "The allowance, or budget. A measurement over it is reported, and never fails the check by itself",
19266
+ "type": "number"
19267
+ },
19268
+ "kind": {
19269
+ "description": "What the number is, in an open vocabulary. `product-latency`: a user-visible response time between `from` and `to`. Absent: just a number, never read as product latency",
19270
+ "type": "string",
19271
+ "minLength": 1
19272
+ },
19273
+ "from": {
19274
+ "description": "The event the interval starts at. Without both `from` and `to` a latency is shown but no product claim is made from it",
19275
+ "type": "string",
19276
+ "minLength": 1
19277
+ },
19278
+ "to": {
19279
+ "description": "The event the interval ends at",
19280
+ "type": "string",
19281
+ "minLength": 1
19282
+ },
19283
+ "intended": {
19284
+ "description": "The interval the name of the measurement claims, when what was measured is only part of it. If `intended.to` differs from `to` (or `intended.from` from `from`) the measurement is shown as partial, never as the complete interval",
19285
+ "type": "object",
19286
+ "properties": {
19287
+ "from": {
19288
+ "description": "The event the interval starts at: `end of speech`, `submit pressed`",
19289
+ "type": "string",
19290
+ "minLength": 1
19291
+ },
19292
+ "to": {
19293
+ "description": "The event the interval ends at: `audible response`, `confirmation visible`",
19294
+ "type": "string",
19295
+ "minLength": 1
19296
+ }
19297
+ },
19298
+ "additionalProperties": {}
19299
+ },
19300
+ "source": {
19301
+ "description": "How it was measured: `app-instrumentation`, `trace`, `recording-analysis`",
19302
+ "type": "string"
19303
+ },
19304
+ "outcome": {
19305
+ "description": "`observed` (the default), `timeout` or `failed`. For anything but `observed` the value is how long the observation waited: at least that much, so it counts against a budget and is never dropped",
19306
+ "type": "string",
19307
+ "minLength": 1
19308
+ },
19309
+ "instrumentation": {
19310
+ "description": "The version or method of the measurement. A change of it between two sets of observations is disclosed when they are compared",
19311
+ "type": "string"
19312
+ },
19313
+ "labels": {
19314
+ "description": "What the observation is comparable with: `device`, `build`, `network`. `device` and `build` group the observations and, when two groups differ in the others, the comparison says so",
19315
+ "type": "object",
19316
+ "propertyNames": {
19317
+ "type": "string"
19318
+ },
19319
+ "additionalProperties": {
19320
+ "type": "string"
19321
+ }
19322
+ }
19323
+ },
19324
+ "required": [
19325
+ "name",
19326
+ "value",
19327
+ "unit"
19328
+ ],
19329
+ "additionalProperties": {}
19330
+ }
18792
19331
  }
18793
19332
  },
18794
19333
  "required": [