doc-detective 4.33.0 → 4.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -34565,6 +34565,56 @@ var init_schemas = __esm({
34565
34565
  }
34566
34566
  ]
34567
34567
  },
34568
+ verify: {
34569
+ title: "Recording verify guards",
34570
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
34571
+ type: "object",
34572
+ additionalProperties: false,
34573
+ properties: {
34574
+ minDuration: {
34575
+ type: "number",
34576
+ description: "Fail if the video is shorter than this many seconds.",
34577
+ minimum: 0
34578
+ },
34579
+ maxDuration: {
34580
+ type: "number",
34581
+ description: "Fail if the video is longer than this many seconds.",
34582
+ minimum: 0
34583
+ },
34584
+ resolution: {
34585
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
34586
+ anyOf: [
34587
+ {
34588
+ type: "boolean",
34589
+ title: "Verify resolution (boolean)"
34590
+ },
34591
+ {
34592
+ type: "object",
34593
+ title: "Verify resolution (detailed)",
34594
+ additionalProperties: false,
34595
+ required: [
34596
+ "width",
34597
+ "height"
34598
+ ],
34599
+ properties: {
34600
+ width: {
34601
+ type: "integer",
34602
+ minimum: 1
34603
+ },
34604
+ height: {
34605
+ type: "integer",
34606
+ minimum: 1
34607
+ }
34608
+ }
34609
+ }
34610
+ ]
34611
+ },
34612
+ notBlack: {
34613
+ type: "boolean",
34614
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
34615
+ }
34616
+ }
34617
+ },
34568
34618
  checkpoints: {
34569
34619
  title: "Recording checkpoints",
34570
34620
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -34920,6 +34970,56 @@ var init_schemas = __esm({
34920
34970
  }
34921
34971
  ]
34922
34972
  },
34973
+ verify: {
34974
+ title: "Recording verify guards",
34975
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
34976
+ type: "object",
34977
+ additionalProperties: false,
34978
+ properties: {
34979
+ minDuration: {
34980
+ type: "number",
34981
+ description: "Fail if the video is shorter than this many seconds.",
34982
+ minimum: 0
34983
+ },
34984
+ maxDuration: {
34985
+ type: "number",
34986
+ description: "Fail if the video is longer than this many seconds.",
34987
+ minimum: 0
34988
+ },
34989
+ resolution: {
34990
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
34991
+ anyOf: [
34992
+ {
34993
+ type: "boolean",
34994
+ title: "Verify resolution (boolean)"
34995
+ },
34996
+ {
34997
+ type: "object",
34998
+ title: "Verify resolution (detailed)",
34999
+ additionalProperties: false,
35000
+ required: [
35001
+ "width",
35002
+ "height"
35003
+ ],
35004
+ properties: {
35005
+ width: {
35006
+ type: "integer",
35007
+ minimum: 1
35008
+ },
35009
+ height: {
35010
+ type: "integer",
35011
+ minimum: 1
35012
+ }
35013
+ }
35014
+ }
35015
+ ]
35016
+ },
35017
+ notBlack: {
35018
+ type: "boolean",
35019
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
35020
+ }
35021
+ }
35022
+ },
34923
35023
  checkpoints: {
34924
35024
  title: "Recording checkpoints",
34925
35025
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -80287,6 +80387,56 @@ var init_schemas = __esm({
80287
80387
  }
80288
80388
  ]
80289
80389
  },
80390
+ verify: {
80391
+ title: "Recording verify guards",
80392
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
80393
+ type: "object",
80394
+ additionalProperties: false,
80395
+ properties: {
80396
+ minDuration: {
80397
+ type: "number",
80398
+ description: "Fail if the video is shorter than this many seconds.",
80399
+ minimum: 0
80400
+ },
80401
+ maxDuration: {
80402
+ type: "number",
80403
+ description: "Fail if the video is longer than this many seconds.",
80404
+ minimum: 0
80405
+ },
80406
+ resolution: {
80407
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
80408
+ anyOf: [
80409
+ {
80410
+ type: "boolean",
80411
+ title: "Verify resolution (boolean)"
80412
+ },
80413
+ {
80414
+ type: "object",
80415
+ title: "Verify resolution (detailed)",
80416
+ additionalProperties: false,
80417
+ required: [
80418
+ "width",
80419
+ "height"
80420
+ ],
80421
+ properties: {
80422
+ width: {
80423
+ type: "integer",
80424
+ minimum: 1
80425
+ },
80426
+ height: {
80427
+ type: "integer",
80428
+ minimum: 1
80429
+ }
80430
+ }
80431
+ }
80432
+ ]
80433
+ },
80434
+ notBlack: {
80435
+ type: "boolean",
80436
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
80437
+ }
80438
+ }
80439
+ },
80290
80440
  checkpoints: {
80291
80441
  title: "Recording checkpoints",
80292
80442
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -80642,6 +80792,56 @@ var init_schemas = __esm({
80642
80792
  }
80643
80793
  ]
80644
80794
  },
80795
+ verify: {
80796
+ title: "Recording verify guards",
80797
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
80798
+ type: "object",
80799
+ additionalProperties: false,
80800
+ properties: {
80801
+ minDuration: {
80802
+ type: "number",
80803
+ description: "Fail if the video is shorter than this many seconds.",
80804
+ minimum: 0
80805
+ },
80806
+ maxDuration: {
80807
+ type: "number",
80808
+ description: "Fail if the video is longer than this many seconds.",
80809
+ minimum: 0
80810
+ },
80811
+ resolution: {
80812
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
80813
+ anyOf: [
80814
+ {
80815
+ type: "boolean",
80816
+ title: "Verify resolution (boolean)"
80817
+ },
80818
+ {
80819
+ type: "object",
80820
+ title: "Verify resolution (detailed)",
80821
+ additionalProperties: false,
80822
+ required: [
80823
+ "width",
80824
+ "height"
80825
+ ],
80826
+ properties: {
80827
+ width: {
80828
+ type: "integer",
80829
+ minimum: 1
80830
+ },
80831
+ height: {
80832
+ type: "integer",
80833
+ minimum: 1
80834
+ }
80835
+ }
80836
+ }
80837
+ ]
80838
+ },
80839
+ notBlack: {
80840
+ type: "boolean",
80841
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
80842
+ }
80843
+ }
80844
+ },
80645
80845
  checkpoints: {
80646
80846
  title: "Recording checkpoints",
80647
80847
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -106649,6 +106849,56 @@ var init_schemas = __esm({
106649
106849
  }
106650
106850
  ]
106651
106851
  },
106852
+ verify: {
106853
+ title: "Recording verify guards",
106854
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
106855
+ type: "object",
106856
+ additionalProperties: false,
106857
+ properties: {
106858
+ minDuration: {
106859
+ type: "number",
106860
+ description: "Fail if the video is shorter than this many seconds.",
106861
+ minimum: 0
106862
+ },
106863
+ maxDuration: {
106864
+ type: "number",
106865
+ description: "Fail if the video is longer than this many seconds.",
106866
+ minimum: 0
106867
+ },
106868
+ resolution: {
106869
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
106870
+ anyOf: [
106871
+ {
106872
+ type: "boolean",
106873
+ title: "Verify resolution (boolean)"
106874
+ },
106875
+ {
106876
+ type: "object",
106877
+ title: "Verify resolution (detailed)",
106878
+ additionalProperties: false,
106879
+ required: [
106880
+ "width",
106881
+ "height"
106882
+ ],
106883
+ properties: {
106884
+ width: {
106885
+ type: "integer",
106886
+ minimum: 1
106887
+ },
106888
+ height: {
106889
+ type: "integer",
106890
+ minimum: 1
106891
+ }
106892
+ }
106893
+ }
106894
+ ]
106895
+ },
106896
+ notBlack: {
106897
+ type: "boolean",
106898
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
106899
+ }
106900
+ }
106901
+ },
106652
106902
  checkpoints: {
106653
106903
  title: "Recording checkpoints",
106654
106904
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -107004,6 +107254,56 @@ var init_schemas = __esm({
107004
107254
  }
107005
107255
  ]
107006
107256
  },
107257
+ verify: {
107258
+ title: "Recording verify guards",
107259
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
107260
+ type: "object",
107261
+ additionalProperties: false,
107262
+ properties: {
107263
+ minDuration: {
107264
+ type: "number",
107265
+ description: "Fail if the video is shorter than this many seconds.",
107266
+ minimum: 0
107267
+ },
107268
+ maxDuration: {
107269
+ type: "number",
107270
+ description: "Fail if the video is longer than this many seconds.",
107271
+ minimum: 0
107272
+ },
107273
+ resolution: {
107274
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
107275
+ anyOf: [
107276
+ {
107277
+ type: "boolean",
107278
+ title: "Verify resolution (boolean)"
107279
+ },
107280
+ {
107281
+ type: "object",
107282
+ title: "Verify resolution (detailed)",
107283
+ additionalProperties: false,
107284
+ required: [
107285
+ "width",
107286
+ "height"
107287
+ ],
107288
+ properties: {
107289
+ width: {
107290
+ type: "integer",
107291
+ minimum: 1
107292
+ },
107293
+ height: {
107294
+ type: "integer",
107295
+ minimum: 1
107296
+ }
107297
+ }
107298
+ }
107299
+ ]
107300
+ },
107301
+ notBlack: {
107302
+ type: "boolean",
107303
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
107304
+ }
107305
+ }
107306
+ },
107007
107307
  checkpoints: {
107008
107308
  title: "Recording checkpoints",
107009
107309
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -139373,6 +139673,56 @@ var init_schemas = __esm({
139373
139673
  }
139374
139674
  ]
139375
139675
  },
139676
+ verify: {
139677
+ title: "Recording verify guards",
139678
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
139679
+ type: "object",
139680
+ additionalProperties: false,
139681
+ properties: {
139682
+ minDuration: {
139683
+ type: "number",
139684
+ description: "Fail if the video is shorter than this many seconds.",
139685
+ minimum: 0
139686
+ },
139687
+ maxDuration: {
139688
+ type: "number",
139689
+ description: "Fail if the video is longer than this many seconds.",
139690
+ minimum: 0
139691
+ },
139692
+ resolution: {
139693
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
139694
+ anyOf: [
139695
+ {
139696
+ type: "boolean",
139697
+ title: "Verify resolution (boolean)"
139698
+ },
139699
+ {
139700
+ type: "object",
139701
+ title: "Verify resolution (detailed)",
139702
+ additionalProperties: false,
139703
+ required: [
139704
+ "width",
139705
+ "height"
139706
+ ],
139707
+ properties: {
139708
+ width: {
139709
+ type: "integer",
139710
+ minimum: 1
139711
+ },
139712
+ height: {
139713
+ type: "integer",
139714
+ minimum: 1
139715
+ }
139716
+ }
139717
+ }
139718
+ ]
139719
+ },
139720
+ notBlack: {
139721
+ type: "boolean",
139722
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
139723
+ }
139724
+ }
139725
+ },
139376
139726
  checkpoints: {
139377
139727
  title: "Recording checkpoints",
139378
139728
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -139728,6 +140078,56 @@ var init_schemas = __esm({
139728
140078
  }
139729
140079
  ]
139730
140080
  },
140081
+ verify: {
140082
+ title: "Recording verify guards",
140083
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
140084
+ type: "object",
140085
+ additionalProperties: false,
140086
+ properties: {
140087
+ minDuration: {
140088
+ type: "number",
140089
+ description: "Fail if the video is shorter than this many seconds.",
140090
+ minimum: 0
140091
+ },
140092
+ maxDuration: {
140093
+ type: "number",
140094
+ description: "Fail if the video is longer than this many seconds.",
140095
+ minimum: 0
140096
+ },
140097
+ resolution: {
140098
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
140099
+ anyOf: [
140100
+ {
140101
+ type: "boolean",
140102
+ title: "Verify resolution (boolean)"
140103
+ },
140104
+ {
140105
+ type: "object",
140106
+ title: "Verify resolution (detailed)",
140107
+ additionalProperties: false,
140108
+ required: [
140109
+ "width",
140110
+ "height"
140111
+ ],
140112
+ properties: {
140113
+ width: {
140114
+ type: "integer",
140115
+ minimum: 1
140116
+ },
140117
+ height: {
140118
+ type: "integer",
140119
+ minimum: 1
140120
+ }
140121
+ }
140122
+ }
140123
+ ]
140124
+ },
140125
+ notBlack: {
140126
+ type: "boolean",
140127
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
140128
+ }
140129
+ }
140130
+ },
139731
140131
  checkpoints: {
139732
140132
  title: "Recording checkpoints",
139733
140133
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -185095,6 +185495,56 @@ var init_schemas = __esm({
185095
185495
  }
185096
185496
  ]
185097
185497
  },
185498
+ verify: {
185499
+ title: "Recording verify guards",
185500
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
185501
+ type: "object",
185502
+ additionalProperties: false,
185503
+ properties: {
185504
+ minDuration: {
185505
+ type: "number",
185506
+ description: "Fail if the video is shorter than this many seconds.",
185507
+ minimum: 0
185508
+ },
185509
+ maxDuration: {
185510
+ type: "number",
185511
+ description: "Fail if the video is longer than this many seconds.",
185512
+ minimum: 0
185513
+ },
185514
+ resolution: {
185515
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
185516
+ anyOf: [
185517
+ {
185518
+ type: "boolean",
185519
+ title: "Verify resolution (boolean)"
185520
+ },
185521
+ {
185522
+ type: "object",
185523
+ title: "Verify resolution (detailed)",
185524
+ additionalProperties: false,
185525
+ required: [
185526
+ "width",
185527
+ "height"
185528
+ ],
185529
+ properties: {
185530
+ width: {
185531
+ type: "integer",
185532
+ minimum: 1
185533
+ },
185534
+ height: {
185535
+ type: "integer",
185536
+ minimum: 1
185537
+ }
185538
+ }
185539
+ }
185540
+ ]
185541
+ },
185542
+ notBlack: {
185543
+ type: "boolean",
185544
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
185545
+ }
185546
+ }
185547
+ },
185098
185548
  checkpoints: {
185099
185549
  title: "Recording checkpoints",
185100
185550
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -185450,6 +185900,56 @@ var init_schemas = __esm({
185450
185900
  }
185451
185901
  ]
185452
185902
  },
185903
+ verify: {
185904
+ title: "Recording verify guards",
185905
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
185906
+ type: "object",
185907
+ additionalProperties: false,
185908
+ properties: {
185909
+ minDuration: {
185910
+ type: "number",
185911
+ description: "Fail if the video is shorter than this many seconds.",
185912
+ minimum: 0
185913
+ },
185914
+ maxDuration: {
185915
+ type: "number",
185916
+ description: "Fail if the video is longer than this many seconds.",
185917
+ minimum: 0
185918
+ },
185919
+ resolution: {
185920
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
185921
+ anyOf: [
185922
+ {
185923
+ type: "boolean",
185924
+ title: "Verify resolution (boolean)"
185925
+ },
185926
+ {
185927
+ type: "object",
185928
+ title: "Verify resolution (detailed)",
185929
+ additionalProperties: false,
185930
+ required: [
185931
+ "width",
185932
+ "height"
185933
+ ],
185934
+ properties: {
185935
+ width: {
185936
+ type: "integer",
185937
+ minimum: 1
185938
+ },
185939
+ height: {
185940
+ type: "integer",
185941
+ minimum: 1
185942
+ }
185943
+ }
185944
+ }
185945
+ ]
185946
+ },
185947
+ notBlack: {
185948
+ type: "boolean",
185949
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
185950
+ }
185951
+ }
185952
+ },
185453
185953
  checkpoints: {
185454
185954
  title: "Recording checkpoints",
185455
185955
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -232556,6 +233056,56 @@ var init_schemas = __esm({
232556
233056
  }
232557
233057
  ]
232558
233058
  },
233059
+ verify: {
233060
+ title: "Recording verify guards",
233061
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
233062
+ type: "object",
233063
+ additionalProperties: false,
233064
+ properties: {
233065
+ minDuration: {
233066
+ type: "number",
233067
+ description: "Fail if the video is shorter than this many seconds.",
233068
+ minimum: 0
233069
+ },
233070
+ maxDuration: {
233071
+ type: "number",
233072
+ description: "Fail if the video is longer than this many seconds.",
233073
+ minimum: 0
233074
+ },
233075
+ resolution: {
233076
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
233077
+ anyOf: [
233078
+ {
233079
+ type: "boolean",
233080
+ title: "Verify resolution (boolean)"
233081
+ },
233082
+ {
233083
+ type: "object",
233084
+ title: "Verify resolution (detailed)",
233085
+ additionalProperties: false,
233086
+ required: [
233087
+ "width",
233088
+ "height"
233089
+ ],
233090
+ properties: {
233091
+ width: {
233092
+ type: "integer",
233093
+ minimum: 1
233094
+ },
233095
+ height: {
233096
+ type: "integer",
233097
+ minimum: 1
233098
+ }
233099
+ }
233100
+ }
233101
+ ]
233102
+ },
233103
+ notBlack: {
233104
+ type: "boolean",
233105
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
233106
+ }
233107
+ }
233108
+ },
232559
233109
  checkpoints: {
232560
233110
  title: "Recording checkpoints",
232561
233111
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -232911,6 +233461,56 @@ var init_schemas = __esm({
232911
233461
  }
232912
233462
  ]
232913
233463
  },
233464
+ verify: {
233465
+ title: "Recording verify guards",
233466
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
233467
+ type: "object",
233468
+ additionalProperties: false,
233469
+ properties: {
233470
+ minDuration: {
233471
+ type: "number",
233472
+ description: "Fail if the video is shorter than this many seconds.",
233473
+ minimum: 0
233474
+ },
233475
+ maxDuration: {
233476
+ type: "number",
233477
+ description: "Fail if the video is longer than this many seconds.",
233478
+ minimum: 0
233479
+ },
233480
+ resolution: {
233481
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
233482
+ anyOf: [
233483
+ {
233484
+ type: "boolean",
233485
+ title: "Verify resolution (boolean)"
233486
+ },
233487
+ {
233488
+ type: "object",
233489
+ title: "Verify resolution (detailed)",
233490
+ additionalProperties: false,
233491
+ required: [
233492
+ "width",
233493
+ "height"
233494
+ ],
233495
+ properties: {
233496
+ width: {
233497
+ type: "integer",
233498
+ minimum: 1
233499
+ },
233500
+ height: {
233501
+ type: "integer",
233502
+ minimum: 1
233503
+ }
233504
+ }
233505
+ }
233506
+ ]
233507
+ },
233508
+ notBlack: {
233509
+ type: "boolean",
233510
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
233511
+ }
233512
+ }
233513
+ },
232914
233514
  checkpoints: {
232915
233515
  title: "Recording checkpoints",
232916
233516
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -277540,6 +278140,56 @@ var init_schemas = __esm({
277540
278140
  }
277541
278141
  ]
277542
278142
  },
278143
+ verify: {
278144
+ title: "Recording verify guards",
278145
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
278146
+ type: "object",
278147
+ additionalProperties: false,
278148
+ properties: {
278149
+ minDuration: {
278150
+ type: "number",
278151
+ description: "Fail if the video is shorter than this many seconds.",
278152
+ minimum: 0
278153
+ },
278154
+ maxDuration: {
278155
+ type: "number",
278156
+ description: "Fail if the video is longer than this many seconds.",
278157
+ minimum: 0
278158
+ },
278159
+ resolution: {
278160
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
278161
+ anyOf: [
278162
+ {
278163
+ type: "boolean",
278164
+ title: "Verify resolution (boolean)"
278165
+ },
278166
+ {
278167
+ type: "object",
278168
+ title: "Verify resolution (detailed)",
278169
+ additionalProperties: false,
278170
+ required: [
278171
+ "width",
278172
+ "height"
278173
+ ],
278174
+ properties: {
278175
+ width: {
278176
+ type: "integer",
278177
+ minimum: 1
278178
+ },
278179
+ height: {
278180
+ type: "integer",
278181
+ minimum: 1
278182
+ }
278183
+ }
278184
+ }
278185
+ ]
278186
+ },
278187
+ notBlack: {
278188
+ type: "boolean",
278189
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
278190
+ }
278191
+ }
278192
+ },
277543
278193
  checkpoints: {
277544
278194
  title: "Recording checkpoints",
277545
278195
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -277895,6 +278545,56 @@ var init_schemas = __esm({
277895
278545
  }
277896
278546
  ]
277897
278547
  },
278548
+ verify: {
278549
+ title: "Recording verify guards",
278550
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
278551
+ type: "object",
278552
+ additionalProperties: false,
278553
+ properties: {
278554
+ minDuration: {
278555
+ type: "number",
278556
+ description: "Fail if the video is shorter than this many seconds.",
278557
+ minimum: 0
278558
+ },
278559
+ maxDuration: {
278560
+ type: "number",
278561
+ description: "Fail if the video is longer than this many seconds.",
278562
+ minimum: 0
278563
+ },
278564
+ resolution: {
278565
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
278566
+ anyOf: [
278567
+ {
278568
+ type: "boolean",
278569
+ title: "Verify resolution (boolean)"
278570
+ },
278571
+ {
278572
+ type: "object",
278573
+ title: "Verify resolution (detailed)",
278574
+ additionalProperties: false,
278575
+ required: [
278576
+ "width",
278577
+ "height"
278578
+ ],
278579
+ properties: {
278580
+ width: {
278581
+ type: "integer",
278582
+ minimum: 1
278583
+ },
278584
+ height: {
278585
+ type: "integer",
278586
+ minimum: 1
278587
+ }
278588
+ }
278589
+ }
278590
+ ]
278591
+ },
278592
+ notBlack: {
278593
+ type: "boolean",
278594
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
278595
+ }
278596
+ }
278597
+ },
277898
278598
  checkpoints: {
277899
278599
  title: "Recording checkpoints",
277900
278600
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -325485,6 +326185,56 @@ var init_schemas = __esm({
325485
326185
  }
325486
326186
  ]
325487
326187
  },
326188
+ verify: {
326189
+ title: "Recording verify guards",
326190
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
326191
+ type: "object",
326192
+ additionalProperties: false,
326193
+ properties: {
326194
+ minDuration: {
326195
+ type: "number",
326196
+ description: "Fail if the video is shorter than this many seconds.",
326197
+ minimum: 0
326198
+ },
326199
+ maxDuration: {
326200
+ type: "number",
326201
+ description: "Fail if the video is longer than this many seconds.",
326202
+ minimum: 0
326203
+ },
326204
+ resolution: {
326205
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
326206
+ anyOf: [
326207
+ {
326208
+ type: "boolean",
326209
+ title: "Verify resolution (boolean)"
326210
+ },
326211
+ {
326212
+ type: "object",
326213
+ title: "Verify resolution (detailed)",
326214
+ additionalProperties: false,
326215
+ required: [
326216
+ "width",
326217
+ "height"
326218
+ ],
326219
+ properties: {
326220
+ width: {
326221
+ type: "integer",
326222
+ minimum: 1
326223
+ },
326224
+ height: {
326225
+ type: "integer",
326226
+ minimum: 1
326227
+ }
326228
+ }
326229
+ }
326230
+ ]
326231
+ },
326232
+ notBlack: {
326233
+ type: "boolean",
326234
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
326235
+ }
326236
+ }
326237
+ },
325488
326238
  checkpoints: {
325489
326239
  title: "Recording checkpoints",
325490
326240
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -325840,6 +326590,56 @@ var init_schemas = __esm({
325840
326590
  }
325841
326591
  ]
325842
326592
  },
326593
+ verify: {
326594
+ title: "Recording verify guards",
326595
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
326596
+ type: "object",
326597
+ additionalProperties: false,
326598
+ properties: {
326599
+ minDuration: {
326600
+ type: "number",
326601
+ description: "Fail if the video is shorter than this many seconds.",
326602
+ minimum: 0
326603
+ },
326604
+ maxDuration: {
326605
+ type: "number",
326606
+ description: "Fail if the video is longer than this many seconds.",
326607
+ minimum: 0
326608
+ },
326609
+ resolution: {
326610
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
326611
+ anyOf: [
326612
+ {
326613
+ type: "boolean",
326614
+ title: "Verify resolution (boolean)"
326615
+ },
326616
+ {
326617
+ type: "object",
326618
+ title: "Verify resolution (detailed)",
326619
+ additionalProperties: false,
326620
+ required: [
326621
+ "width",
326622
+ "height"
326623
+ ],
326624
+ properties: {
326625
+ width: {
326626
+ type: "integer",
326627
+ minimum: 1
326628
+ },
326629
+ height: {
326630
+ type: "integer",
326631
+ minimum: 1
326632
+ }
326633
+ }
326634
+ }
326635
+ ]
326636
+ },
326637
+ notBlack: {
326638
+ type: "boolean",
326639
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
326640
+ }
326641
+ }
326642
+ },
325843
326643
  checkpoints: {
325844
326644
  title: "Recording checkpoints",
325845
326645
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -370469,6 +371269,56 @@ var init_schemas = __esm({
370469
371269
  }
370470
371270
  ]
370471
371271
  },
371272
+ verify: {
371273
+ title: "Recording verify guards",
371274
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
371275
+ type: "object",
371276
+ additionalProperties: false,
371277
+ properties: {
371278
+ minDuration: {
371279
+ type: "number",
371280
+ description: "Fail if the video is shorter than this many seconds.",
371281
+ minimum: 0
371282
+ },
371283
+ maxDuration: {
371284
+ type: "number",
371285
+ description: "Fail if the video is longer than this many seconds.",
371286
+ minimum: 0
371287
+ },
371288
+ resolution: {
371289
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
371290
+ anyOf: [
371291
+ {
371292
+ type: "boolean",
371293
+ title: "Verify resolution (boolean)"
371294
+ },
371295
+ {
371296
+ type: "object",
371297
+ title: "Verify resolution (detailed)",
371298
+ additionalProperties: false,
371299
+ required: [
371300
+ "width",
371301
+ "height"
371302
+ ],
371303
+ properties: {
371304
+ width: {
371305
+ type: "integer",
371306
+ minimum: 1
371307
+ },
371308
+ height: {
371309
+ type: "integer",
371310
+ minimum: 1
371311
+ }
371312
+ }
371313
+ }
371314
+ ]
371315
+ },
371316
+ notBlack: {
371317
+ type: "boolean",
371318
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
371319
+ }
371320
+ }
371321
+ },
370472
371322
  checkpoints: {
370473
371323
  title: "Recording checkpoints",
370474
371324
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -370824,6 +371674,56 @@ var init_schemas = __esm({
370824
371674
  }
370825
371675
  ]
370826
371676
  },
371677
+ verify: {
371678
+ title: "Recording verify guards",
371679
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
371680
+ type: "object",
371681
+ additionalProperties: false,
371682
+ properties: {
371683
+ minDuration: {
371684
+ type: "number",
371685
+ description: "Fail if the video is shorter than this many seconds.",
371686
+ minimum: 0
371687
+ },
371688
+ maxDuration: {
371689
+ type: "number",
371690
+ description: "Fail if the video is longer than this many seconds.",
371691
+ minimum: 0
371692
+ },
371693
+ resolution: {
371694
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
371695
+ anyOf: [
371696
+ {
371697
+ type: "boolean",
371698
+ title: "Verify resolution (boolean)"
371699
+ },
371700
+ {
371701
+ type: "object",
371702
+ title: "Verify resolution (detailed)",
371703
+ additionalProperties: false,
371704
+ required: [
371705
+ "width",
371706
+ "height"
371707
+ ],
371708
+ properties: {
371709
+ width: {
371710
+ type: "integer",
371711
+ minimum: 1
371712
+ },
371713
+ height: {
371714
+ type: "integer",
371715
+ minimum: 1
371716
+ }
371717
+ }
371718
+ }
371719
+ ]
371720
+ },
371721
+ notBlack: {
371722
+ type: "boolean",
371723
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
371724
+ }
371725
+ }
371726
+ },
370827
371727
  checkpoints: {
370828
371728
  title: "Recording checkpoints",
370829
371729
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -421744,6 +422644,56 @@ var init_schemas = __esm({
421744
422644
  }
421745
422645
  ]
421746
422646
  },
422647
+ verify: {
422648
+ title: "Recording verify guards",
422649
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
422650
+ type: "object",
422651
+ additionalProperties: false,
422652
+ properties: {
422653
+ minDuration: {
422654
+ type: "number",
422655
+ description: "Fail if the video is shorter than this many seconds.",
422656
+ minimum: 0
422657
+ },
422658
+ maxDuration: {
422659
+ type: "number",
422660
+ description: "Fail if the video is longer than this many seconds.",
422661
+ minimum: 0
422662
+ },
422663
+ resolution: {
422664
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
422665
+ anyOf: [
422666
+ {
422667
+ type: "boolean",
422668
+ title: "Verify resolution (boolean)"
422669
+ },
422670
+ {
422671
+ type: "object",
422672
+ title: "Verify resolution (detailed)",
422673
+ additionalProperties: false,
422674
+ required: [
422675
+ "width",
422676
+ "height"
422677
+ ],
422678
+ properties: {
422679
+ width: {
422680
+ type: "integer",
422681
+ minimum: 1
422682
+ },
422683
+ height: {
422684
+ type: "integer",
422685
+ minimum: 1
422686
+ }
422687
+ }
422688
+ }
422689
+ ]
422690
+ },
422691
+ notBlack: {
422692
+ type: "boolean",
422693
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
422694
+ }
422695
+ }
422696
+ },
421747
422697
  checkpoints: {
421748
422698
  title: "Recording checkpoints",
421749
422699
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -422099,6 +423049,56 @@ var init_schemas = __esm({
422099
423049
  }
422100
423050
  ]
422101
423051
  },
423052
+ verify: {
423053
+ title: "Recording verify guards",
423054
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
423055
+ type: "object",
423056
+ additionalProperties: false,
423057
+ properties: {
423058
+ minDuration: {
423059
+ type: "number",
423060
+ description: "Fail if the video is shorter than this many seconds.",
423061
+ minimum: 0
423062
+ },
423063
+ maxDuration: {
423064
+ type: "number",
423065
+ description: "Fail if the video is longer than this many seconds.",
423066
+ minimum: 0
423067
+ },
423068
+ resolution: {
423069
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
423070
+ anyOf: [
423071
+ {
423072
+ type: "boolean",
423073
+ title: "Verify resolution (boolean)"
423074
+ },
423075
+ {
423076
+ type: "object",
423077
+ title: "Verify resolution (detailed)",
423078
+ additionalProperties: false,
423079
+ required: [
423080
+ "width",
423081
+ "height"
423082
+ ],
423083
+ properties: {
423084
+ width: {
423085
+ type: "integer",
423086
+ minimum: 1
423087
+ },
423088
+ height: {
423089
+ type: "integer",
423090
+ minimum: 1
423091
+ }
423092
+ }
423093
+ }
423094
+ ]
423095
+ },
423096
+ notBlack: {
423097
+ type: "boolean",
423098
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
423099
+ }
423100
+ }
423101
+ },
422102
423102
  checkpoints: {
422103
423103
  title: "Recording checkpoints",
422104
423104
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -466728,6 +467728,56 @@ var init_schemas = __esm({
466728
467728
  }
466729
467729
  ]
466730
467730
  },
467731
+ verify: {
467732
+ title: "Recording verify guards",
467733
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
467734
+ type: "object",
467735
+ additionalProperties: false,
467736
+ properties: {
467737
+ minDuration: {
467738
+ type: "number",
467739
+ description: "Fail if the video is shorter than this many seconds.",
467740
+ minimum: 0
467741
+ },
467742
+ maxDuration: {
467743
+ type: "number",
467744
+ description: "Fail if the video is longer than this many seconds.",
467745
+ minimum: 0
467746
+ },
467747
+ resolution: {
467748
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
467749
+ anyOf: [
467750
+ {
467751
+ type: "boolean",
467752
+ title: "Verify resolution (boolean)"
467753
+ },
467754
+ {
467755
+ type: "object",
467756
+ title: "Verify resolution (detailed)",
467757
+ additionalProperties: false,
467758
+ required: [
467759
+ "width",
467760
+ "height"
467761
+ ],
467762
+ properties: {
467763
+ width: {
467764
+ type: "integer",
467765
+ minimum: 1
467766
+ },
467767
+ height: {
467768
+ type: "integer",
467769
+ minimum: 1
467770
+ }
467771
+ }
467772
+ }
467773
+ ]
467774
+ },
467775
+ notBlack: {
467776
+ type: "boolean",
467777
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
467778
+ }
467779
+ }
467780
+ },
466731
467781
  checkpoints: {
466732
467782
  title: "Recording checkpoints",
466733
467783
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -467083,6 +468133,56 @@ var init_schemas = __esm({
467083
468133
  }
467084
468134
  ]
467085
468135
  },
468136
+ verify: {
468137
+ title: "Recording verify guards",
468138
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
468139
+ type: "object",
468140
+ additionalProperties: false,
468141
+ properties: {
468142
+ minDuration: {
468143
+ type: "number",
468144
+ description: "Fail if the video is shorter than this many seconds.",
468145
+ minimum: 0
468146
+ },
468147
+ maxDuration: {
468148
+ type: "number",
468149
+ description: "Fail if the video is longer than this many seconds.",
468150
+ minimum: 0
468151
+ },
468152
+ resolution: {
468153
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
468154
+ anyOf: [
468155
+ {
468156
+ type: "boolean",
468157
+ title: "Verify resolution (boolean)"
468158
+ },
468159
+ {
468160
+ type: "object",
468161
+ title: "Verify resolution (detailed)",
468162
+ additionalProperties: false,
468163
+ required: [
468164
+ "width",
468165
+ "height"
468166
+ ],
468167
+ properties: {
468168
+ width: {
468169
+ type: "integer",
468170
+ minimum: 1
468171
+ },
468172
+ height: {
468173
+ type: "integer",
468174
+ minimum: 1
468175
+ }
468176
+ }
468177
+ }
468178
+ ]
468179
+ },
468180
+ notBlack: {
468181
+ type: "boolean",
468182
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
468183
+ }
468184
+ }
468185
+ },
467086
468186
  checkpoints: {
467087
468187
  title: "Recording checkpoints",
467088
468188
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -513404,6 +514504,56 @@ var init_schemas = __esm({
513404
514504
  }
513405
514505
  ]
513406
514506
  },
514507
+ verify: {
514508
+ title: "Recording verify guards",
514509
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
514510
+ type: "object",
514511
+ additionalProperties: false,
514512
+ properties: {
514513
+ minDuration: {
514514
+ type: "number",
514515
+ description: "Fail if the video is shorter than this many seconds.",
514516
+ minimum: 0
514517
+ },
514518
+ maxDuration: {
514519
+ type: "number",
514520
+ description: "Fail if the video is longer than this many seconds.",
514521
+ minimum: 0
514522
+ },
514523
+ resolution: {
514524
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
514525
+ anyOf: [
514526
+ {
514527
+ type: "boolean",
514528
+ title: "Verify resolution (boolean)"
514529
+ },
514530
+ {
514531
+ type: "object",
514532
+ title: "Verify resolution (detailed)",
514533
+ additionalProperties: false,
514534
+ required: [
514535
+ "width",
514536
+ "height"
514537
+ ],
514538
+ properties: {
514539
+ width: {
514540
+ type: "integer",
514541
+ minimum: 1
514542
+ },
514543
+ height: {
514544
+ type: "integer",
514545
+ minimum: 1
514546
+ }
514547
+ }
514548
+ }
514549
+ ]
514550
+ },
514551
+ notBlack: {
514552
+ type: "boolean",
514553
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
514554
+ }
514555
+ }
514556
+ },
513407
514557
  checkpoints: {
513408
514558
  title: "Recording checkpoints",
513409
514559
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -513759,6 +514909,56 @@ var init_schemas = __esm({
513759
514909
  }
513760
514910
  ]
513761
514911
  },
514912
+ verify: {
514913
+ title: "Recording verify guards",
514914
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
514915
+ type: "object",
514916
+ additionalProperties: false,
514917
+ properties: {
514918
+ minDuration: {
514919
+ type: "number",
514920
+ description: "Fail if the video is shorter than this many seconds.",
514921
+ minimum: 0
514922
+ },
514923
+ maxDuration: {
514924
+ type: "number",
514925
+ description: "Fail if the video is longer than this many seconds.",
514926
+ minimum: 0
514927
+ },
514928
+ resolution: {
514929
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
514930
+ anyOf: [
514931
+ {
514932
+ type: "boolean",
514933
+ title: "Verify resolution (boolean)"
514934
+ },
514935
+ {
514936
+ type: "object",
514937
+ title: "Verify resolution (detailed)",
514938
+ additionalProperties: false,
514939
+ required: [
514940
+ "width",
514941
+ "height"
514942
+ ],
514943
+ properties: {
514944
+ width: {
514945
+ type: "integer",
514946
+ minimum: 1
514947
+ },
514948
+ height: {
514949
+ type: "integer",
514950
+ minimum: 1
514951
+ }
514952
+ }
514953
+ }
514954
+ ]
514955
+ },
514956
+ notBlack: {
514957
+ type: "boolean",
514958
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
514959
+ }
514960
+ }
514961
+ },
513762
514962
  checkpoints: {
513763
514963
  title: "Recording checkpoints",
513764
514964
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -561733,6 +562933,56 @@ var init_schemas = __esm({
561733
562933
  }
561734
562934
  ]
561735
562935
  },
562936
+ verify: {
562937
+ title: "Recording verify guards",
562938
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
562939
+ type: "object",
562940
+ additionalProperties: false,
562941
+ properties: {
562942
+ minDuration: {
562943
+ type: "number",
562944
+ description: "Fail if the video is shorter than this many seconds.",
562945
+ minimum: 0
562946
+ },
562947
+ maxDuration: {
562948
+ type: "number",
562949
+ description: "Fail if the video is longer than this many seconds.",
562950
+ minimum: 0
562951
+ },
562952
+ resolution: {
562953
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
562954
+ anyOf: [
562955
+ {
562956
+ type: "boolean",
562957
+ title: "Verify resolution (boolean)"
562958
+ },
562959
+ {
562960
+ type: "object",
562961
+ title: "Verify resolution (detailed)",
562962
+ additionalProperties: false,
562963
+ required: [
562964
+ "width",
562965
+ "height"
562966
+ ],
562967
+ properties: {
562968
+ width: {
562969
+ type: "integer",
562970
+ minimum: 1
562971
+ },
562972
+ height: {
562973
+ type: "integer",
562974
+ minimum: 1
562975
+ }
562976
+ }
562977
+ }
562978
+ ]
562979
+ },
562980
+ notBlack: {
562981
+ type: "boolean",
562982
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
562983
+ }
562984
+ }
562985
+ },
561736
562986
  checkpoints: {
561737
562987
  title: "Recording checkpoints",
561738
562988
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -562088,6 +563338,56 @@ var init_schemas = __esm({
562088
563338
  }
562089
563339
  ]
562090
563340
  },
563341
+ verify: {
563342
+ title: "Recording verify guards",
563343
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
563344
+ type: "object",
563345
+ additionalProperties: false,
563346
+ properties: {
563347
+ minDuration: {
563348
+ type: "number",
563349
+ description: "Fail if the video is shorter than this many seconds.",
563350
+ minimum: 0
563351
+ },
563352
+ maxDuration: {
563353
+ type: "number",
563354
+ description: "Fail if the video is longer than this many seconds.",
563355
+ minimum: 0
563356
+ },
563357
+ resolution: {
563358
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
563359
+ anyOf: [
563360
+ {
563361
+ type: "boolean",
563362
+ title: "Verify resolution (boolean)"
563363
+ },
563364
+ {
563365
+ type: "object",
563366
+ title: "Verify resolution (detailed)",
563367
+ additionalProperties: false,
563368
+ required: [
563369
+ "width",
563370
+ "height"
563371
+ ],
563372
+ properties: {
563373
+ width: {
563374
+ type: "integer",
563375
+ minimum: 1
563376
+ },
563377
+ height: {
563378
+ type: "integer",
563379
+ minimum: 1
563380
+ }
563381
+ }
563382
+ }
563383
+ ]
563384
+ },
563385
+ notBlack: {
563386
+ type: "boolean",
563387
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
563388
+ }
563389
+ }
563390
+ },
562091
563391
  checkpoints: {
562092
563392
  title: "Recording checkpoints",
562093
563393
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -606717,6 +608017,56 @@ var init_schemas = __esm({
606717
608017
  }
606718
608018
  ]
606719
608019
  },
608020
+ verify: {
608021
+ title: "Recording verify guards",
608022
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
608023
+ type: "object",
608024
+ additionalProperties: false,
608025
+ properties: {
608026
+ minDuration: {
608027
+ type: "number",
608028
+ description: "Fail if the video is shorter than this many seconds.",
608029
+ minimum: 0
608030
+ },
608031
+ maxDuration: {
608032
+ type: "number",
608033
+ description: "Fail if the video is longer than this many seconds.",
608034
+ minimum: 0
608035
+ },
608036
+ resolution: {
608037
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
608038
+ anyOf: [
608039
+ {
608040
+ type: "boolean",
608041
+ title: "Verify resolution (boolean)"
608042
+ },
608043
+ {
608044
+ type: "object",
608045
+ title: "Verify resolution (detailed)",
608046
+ additionalProperties: false,
608047
+ required: [
608048
+ "width",
608049
+ "height"
608050
+ ],
608051
+ properties: {
608052
+ width: {
608053
+ type: "integer",
608054
+ minimum: 1
608055
+ },
608056
+ height: {
608057
+ type: "integer",
608058
+ minimum: 1
608059
+ }
608060
+ }
608061
+ }
608062
+ ]
608063
+ },
608064
+ notBlack: {
608065
+ type: "boolean",
608066
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
608067
+ }
608068
+ }
608069
+ },
606720
608070
  checkpoints: {
606721
608071
  title: "Recording checkpoints",
606722
608072
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -607072,6 +608422,56 @@ var init_schemas = __esm({
607072
608422
  }
607073
608423
  ]
607074
608424
  },
608425
+ verify: {
608426
+ title: "Recording verify guards",
608427
+ description: "Structural assertions on the produced video file, evaluated when the recording stops. Unlike checkpoint drift (a WARNING), a violated guard FAILs the stopRecord step \u2014 these are properties you explicitly demand of the artifact.",
608428
+ type: "object",
608429
+ additionalProperties: false,
608430
+ properties: {
608431
+ minDuration: {
608432
+ type: "number",
608433
+ description: "Fail if the video is shorter than this many seconds.",
608434
+ minimum: 0
608435
+ },
608436
+ maxDuration: {
608437
+ type: "number",
608438
+ description: "Fail if the video is longer than this many seconds.",
608439
+ minimum: 0
608440
+ },
608441
+ resolution: {
608442
+ description: "Verify the video's dimensions (\xB12 pixels \u2014 encoders round to even dimensions). `true` compares against the capture plan's resolved expectation (the crop rectangle when a window/viewport crop applied, else the capture frame size; skipped when no expectation exists for the engine). An object compares literal dimensions.",
608443
+ anyOf: [
608444
+ {
608445
+ type: "boolean",
608446
+ title: "Verify resolution (boolean)"
608447
+ },
608448
+ {
608449
+ type: "object",
608450
+ title: "Verify resolution (detailed)",
608451
+ additionalProperties: false,
608452
+ required: [
608453
+ "width",
608454
+ "height"
608455
+ ],
608456
+ properties: {
608457
+ width: {
608458
+ type: "integer",
608459
+ minimum: 1
608460
+ },
608461
+ height: {
608462
+ type: "integer",
608463
+ minimum: 1
608464
+ }
608465
+ }
608466
+ }
608467
+ ]
608468
+ },
608469
+ notBlack: {
608470
+ type: "boolean",
608471
+ description: "Fail if the video is essentially all black (black frames cover 95% or more of its duration) \u2014 the classic symptom of a broken screen capture."
608472
+ }
608473
+ }
608474
+ },
607075
608475
  checkpoints: {
607076
608476
  title: "Recording checkpoints",
607077
608477
  description: "Capture a checkpoint screenshot after every step while this recording is active and compare each against a persistent baseline stored beside the recording (`<path>.checkpoints/` by default). Baselines seed on the first run; on later runs, per-checkpoint variation is reported in the `stopRecord` step's outputs, and variation beyond `maxVariation` surfaces as a WARNING. If `false` or unset, no checkpoints are captured.",
@@ -644688,6 +646088,93 @@ async function probeVideoMetadata({ cacheDir, filePath }) {
644688
646088
  return null;
644689
646089
  }
644690
646090
  }
646091
+ function createMatchingLineCollector(needle, limit = 65536) {
646092
+ let partial = "";
646093
+ let collected = "";
646094
+ const keep = (lines) => {
646095
+ for (const line of lines) {
646096
+ if (line.includes(needle) && collected.length < limit) {
646097
+ collected = (collected + line + "\n").slice(0, limit);
646098
+ }
646099
+ }
646100
+ };
646101
+ return {
646102
+ push(text) {
646103
+ partial += text;
646104
+ const lines = partial.split(/\r?\n/);
646105
+ partial = lines.pop() ?? "";
646106
+ keep(lines);
646107
+ },
646108
+ flush() {
646109
+ if (partial) {
646110
+ keep([partial]);
646111
+ partial = "";
646112
+ }
646113
+ return collected;
646114
+ }
646115
+ };
646116
+ }
646117
+ function parseBlackdetect(stderr, duration, fps) {
646118
+ if (typeof duration !== "number" || !(duration > 0))
646119
+ return false;
646120
+ let covered = 0;
646121
+ const re = /black_duration:([\d.]+)/g;
646122
+ let m;
646123
+ while ((m = re.exec(stderr ?? "")) !== null) {
646124
+ const d = Number(m[1]);
646125
+ if (Number.isFinite(d))
646126
+ covered += d;
646127
+ }
646128
+ const frameInterval = typeof fps === "number" && fps > 0 ? 1 / fps : 0;
646129
+ return covered >= (duration - frameInterval) * 0.95;
646130
+ }
646131
+ async function detectAllBlack({ cacheDir, filePath, duration, fps }) {
646132
+ try {
646133
+ const ffmpegPath = await getFfmpegPath({ cacheDir, autoInstall: false });
646134
+ const stderr = await new Promise((resolve) => {
646135
+ let settled = false;
646136
+ let proc = null;
646137
+ let timer;
646138
+ const done = (v) => {
646139
+ if (settled)
646140
+ return;
646141
+ settled = true;
646142
+ if (timer)
646143
+ clearTimeout(timer);
646144
+ try {
646145
+ proc?.kill();
646146
+ } catch {
646147
+ }
646148
+ resolve(v);
646149
+ };
646150
+ try {
646151
+ proc = (0, import_node_child_process11.spawn)(ffmpegPath, [
646152
+ "-hide_banner",
646153
+ "-i",
646154
+ filePath,
646155
+ "-vf",
646156
+ "blackdetect=d=0.1:pix_th=0.10",
646157
+ "-an",
646158
+ "-f",
646159
+ "null",
646160
+ "-"
646161
+ ], { stdio: ["ignore", "ignore", "pipe"] });
646162
+ const lines = createMatchingLineCollector("black_");
646163
+ proc.stderr?.on("data", (chunk) => lines.push(chunk.toString()));
646164
+ proc.on("error", () => done(null));
646165
+ proc.on("close", (code) => done(code === 0 ? lines.flush() : null));
646166
+ timer = setTimeout(() => done(null), 3e4);
646167
+ } catch {
646168
+ done(null);
646169
+ }
646170
+ });
646171
+ if (stderr === null)
646172
+ return null;
646173
+ return parseBlackdetect(stderr, duration, fps);
646174
+ } catch {
646175
+ return null;
646176
+ }
646177
+ }
644691
646178
  function deriveCropScale({ platform, frameSize, displayPointSize }) {
644692
646179
  if (platform !== "darwin")
644693
646180
  return 1;
@@ -648716,6 +650203,7 @@ async function stopRecording({ config, step, driver, deps = {} }) {
648716
650203
  result.description = "The device recording never started (no app surface opened a device session), so there is nothing to save.";
648717
650204
  return result;
648718
650205
  }
650206
+ let appliedCrop = null;
648719
650207
  const isAboveVariation = recording.overwrite === "aboveVariation";
648720
650208
  const finalTargetPath = recording.targetPath;
648721
650209
  const writeTargetPath = isAboveVariation ? import_node_path20.default.join(import_node_path20.default.dirname(finalTargetPath), `.${import_node_path20.default.basename(finalTargetPath, import_node_path20.default.extname(finalTargetPath))}.staging${import_node_path20.default.extname(finalTargetPath)}`) : finalTargetPath;
@@ -648826,6 +650314,7 @@ async function stopRecording({ config, step, driver, deps = {} }) {
648826
650314
  deleteSource: true,
648827
650315
  crop
648828
650316
  });
650317
+ appliedCrop = crop;
648829
650318
  dropHandle();
648830
650319
  } else if (recording.type === "appium") {
648831
650320
  const b64 = await recording.driver.stopRecordingScreen();
@@ -648980,28 +650469,92 @@ async function stopRecording({ config, step, driver, deps = {} }) {
648980
650469
  if (!meta || Object.keys(meta).length === 0) {
648981
650470
  log(config, "debug", `Couldn't probe recording metadata for ${finalTargetPath}.`);
648982
650471
  }
650472
+ const specs = [];
650473
+ const verify = recording.verify;
650474
+ if (verify && typeof verify === "object") {
650475
+ if (typeof verify.minDuration === "number") {
650476
+ specs.push({
650477
+ statement: `$$outputs.duration >= ${verify.minDuration}`,
650478
+ severity: "fail"
650479
+ });
650480
+ }
650481
+ if (typeof verify.maxDuration === "number") {
650482
+ specs.push({
650483
+ statement: `$$outputs.duration <= ${verify.maxDuration}`,
650484
+ severity: "fail"
650485
+ });
650486
+ }
650487
+ if (verify.resolution !== void 0 && verify.resolution !== false) {
650488
+ let expected = null;
650489
+ if (verify.resolution === true) {
650490
+ if (appliedCrop) {
650491
+ expected = { width: appliedCrop.w, height: appliedCrop.h };
650492
+ } else if (recording.captureInfo?.frameSize) {
650493
+ expected = {
650494
+ width: recording.captureInfo.frameSize.w,
650495
+ height: recording.captureInfo.frameSize.h
650496
+ };
650497
+ }
650498
+ } else {
650499
+ expected = {
650500
+ width: verify.resolution.width,
650501
+ height: verify.resolution.height
650502
+ };
650503
+ }
650504
+ if (!expected) {
650505
+ log(config, "debug", `verify.resolution: true has no capture expectation for this engine; skipping the check.`);
650506
+ } else {
650507
+ result.outputs.resolutionMatch = typeof result.outputs.width === "number" && typeof result.outputs.height === "number" && Math.abs(result.outputs.width - expected.width) <= 2 && Math.abs(result.outputs.height - expected.height) <= 2;
650508
+ specs.push({
650509
+ statement: `$$outputs.resolutionMatch == true`,
650510
+ severity: "fail"
650511
+ });
650512
+ }
650513
+ }
650514
+ if (verify.notBlack) {
650515
+ const allBlack = typeof result.outputs.duration === "number" ? await detectAllBlack({
650516
+ cacheDir: config?.cacheDir,
650517
+ filePath: finalTargetPath,
650518
+ duration: result.outputs.duration,
650519
+ fps: result.outputs.fps
650520
+ }) : null;
650521
+ if (allBlack === null) {
650522
+ log(config, "debug", `verify.notBlack: couldn't analyze ${finalTargetPath} (unreadable or unknown duration); skipping the check.`);
650523
+ } else {
650524
+ result.outputs.allBlack = allBlack;
650525
+ specs.push({
650526
+ statement: `$$outputs.allBlack == false`,
650527
+ severity: "fail"
650528
+ });
650529
+ }
650530
+ }
650531
+ }
648983
650532
  if (checkpoints?.entries?.length) {
648984
650533
  Object.assign(result.outputs, buildCheckpointOutputs(checkpoints.entries));
648985
650534
  result.outputs.seededBaselines = seededBaselines;
650535
+ specs.push({
650536
+ statement: `$$outputs.maxCheckpointVariation <= ${checkpoints.maxVariation}`,
650537
+ severity: "warning"
650538
+ }, {
650539
+ statement: `$$outputs.checkpointErrors == 0`,
650540
+ severity: "warning"
650541
+ });
650542
+ }
650543
+ if (specs.length > 0) {
648986
650544
  const ctx = buildConditionContext({ outputs: result.outputs });
648987
- const { assertions, status } = await evaluateImplicitAssertions([
648988
- {
648989
- statement: `$$outputs.maxCheckpointVariation <= ${checkpoints.maxVariation}`,
648990
- severity: "warning"
648991
- },
648992
- {
648993
- statement: `$$outputs.checkpointErrors == 0`,
648994
- severity: "warning"
648995
- }
648996
- ], ctx);
650545
+ const { assertions, status } = await evaluateImplicitAssertions(specs, ctx);
648997
650546
  result.assertions = assertions;
648998
650547
  result.status = status;
648999
- if (status === "WARNING") {
650548
+ if (status === "FAIL") {
650549
+ result.description += ` One or more structural verify guards failed.`;
650550
+ } else if (status === "WARNING" && checkpoints?.entries?.length) {
649000
650551
  result.description += !isAboveVariation ? ` One or more checkpoints drifted beyond maxVariation (${checkpoints.maxVariation}) or couldn't be compared \u2014 the recorded flow's content may have changed since its baselines were captured.` : result.outputs.changed ? ` One or more checkpoints drifted beyond maxVariation (${checkpoints.maxVariation}) or couldn't be compared \u2014 the recording was refreshed to match the current content.` : ` One or more checkpoints drifted beyond maxVariation (${checkpoints.maxVariation}) or couldn't be compared \u2014 the existing recording was kept.`;
649001
650552
  }
649002
650553
  if (baselineFailures > 0) {
649003
650554
  result.outputs.baselineFailures = baselineFailures;
649004
650555
  }
650556
+ }
650557
+ if (checkpoints) {
649005
650558
  try {
649006
650559
  import_node_fs23.default.rmSync(checkpoints.stagingDir, { recursive: true, force: true });
649007
650560
  } catch {
@@ -649014,7 +650567,8 @@ async function stopRecording({ config, step, driver, deps = {} }) {
649014
650567
  delete result.outputs.recordingPath;
649015
650568
  delete result.outputs.format;
649016
650569
  } else {
649017
- result.status = "WARNING";
650570
+ if (result.status !== "FAIL")
650571
+ result.status = "WARNING";
649018
650572
  result.description += ` The captured video couldn't replace ${finalTargetPath}, so the existing (now stale) recording was kept.`;
649019
650573
  }
649020
650574
  }
@@ -654332,6 +655886,7 @@ async function runStep({ config = {}, context = {}, step, driver, metaValues = {
654332
655886
  handle.id = handle.id ?? (0, import_node_crypto10.randomUUID)();
654333
655887
  handle.name = handle.name ?? recordStepName(step.record);
654334
655888
  handle.overwrite = step.record?.overwrite;
655889
+ handle.verify = step.record?.verify;
654335
655890
  if (handle.targetPath) {
654336
655891
  handle.checkpoints = resolveCheckpointsConfig({
654337
655892
  record: step.record,