TAP version 13
# Subtest: normalizes whitespace before hashing
ok 1 - normalizes whitespace before hashing
  ---
  duration_ms: 1.848601
  type: 'test'
  ...
# Subtest: nullish and blank body text normalize to the empty string
ok 2 - nullish and blank body text normalize to the empty string
  ---
  duration_ms: 0.278913
  type: 'test'
  ...
# Subtest: body text prefix is normalized and capped
ok 3 - body text prefix is normalized and capped
  ---
  duration_ms: 0.129837
  type: 'test'
  ...
# Subtest: identical runs do not diverge
ok 4 - identical runs do not diverge
  ---
  duration_ms: 0.851877
  type: 'test'
  ...
# Subtest: status change diverges
ok 5 - status change diverges
  ---
  duration_ms: 0.339117
  type: 'test'
  ...
# Subtest: title change diverges
ok 6 - title change diverges
  ---
  duration_ms: 0.167908
  type: 'test'
  ...
# Subtest: title comparison is skipped when either side lacks one
ok 7 - title comparison is skipped when either side lacks one
  ---
  duration_ms: 0.196529
  type: 'test'
  ...
# Subtest: canvas disappearing diverges; canvas appearing does not
ok 8 - canvas disappearing diverges; canvas appearing does not
  ---
  duration_ms: 0.143144
  type: 'test'
  ...
# Subtest: horizontal overflow appearing diverges; clearing does not
ok 9 - horizontal overflow appearing diverges; clearing does not
  ---
  duration_ms: 0.30795
  type: 'test'
  ...
# Subtest: new console errors diverge
ok 10 - new console errors diverge
  ---
  duration_ms: 0.352305
  type: 'test'
  ...
# Subtest: errors already present in the baseline do not re-diverge
ok 11 - errors already present in the baseline do not re-diverge
  ---
  duration_ms: 0.15351
  type: 'test'
  ...
# Subtest: body text collapse diverges
ok 12 - body text collapse diverges
  ---
  duration_ms: 0.105343
  type: 'test'
  ...
# Subtest: body text dropping to zero reports collapse
ok 13 - body text dropping to zero reports collapse
  ---
  duration_ms: 0.094498
  type: 'test'
  ...
# Subtest: zero-length baseline reports growth via the hash branch, not collapse
ok 14 - zero-length baseline reports growth via the hash branch, not collapse
  ---
  duration_ms: 0.135739
  type: 'test'
  ...
# Subtest: hash mismatch with a trivial length delta and same page start is tolerated
ok 15 - hash mismatch with a trivial length delta and same page start is tolerated
  ---
  duration_ms: 0.081101
  type: 'test'
  ...
# Subtest: hash mismatch with a trivial length delta but changed page start diverges
ok 16 - hash mismatch with a trivial length delta but changed page start diverges
  ---
  duration_ms: 0.07949
  type: 'test'
  ...
# Subtest: prefix check is skipped when either side lacks a prefix
ok 17 - prefix check is skipped when either side lacks a prefix
  ---
  duration_ms: 0.119725
  type: 'test'
  ...
# Subtest: length-delta tolerance boundary: 50 tolerated, 51 diverges (500-char baseline)
ok 18 - length-delta tolerance boundary: 50 tolerated, 51 diverges (500-char baseline)
  ---
  duration_ms: 0.105378
  type: 'test'
  ...
# Subtest: length-delta floor dominates small baselines: 20 tolerated, 21 diverges (100-char baseline)
ok 19 - length-delta floor dominates small baselines: 20 tolerated, 21 diverges (100-char baseline)
  ---
  duration_ms: 0.077066
  type: 'test'
  ...
# Subtest: collapse boundary: exactly half is 'changed', one below is 'collapsed'
ok 20 - collapse boundary: exactly half is 'changed', one below is 'collapsed'
  ---
  duration_ms: 0.081763
  type: 'test'
  ...
# Subtest: missing baseline viewport diverges
ok 21 - missing baseline viewport diverges
  ---
  duration_ms: 0.087889
  type: 'test'
  ...
# Subtest: empty or null baseline diverges for every viewport
ok 22 - empty or null baseline diverges for every viewport
  ---
  duration_ms: 0.090636
  type: 'test'
  ...
# Subtest: degenerate current verdict fails closed
ok 23 - degenerate current verdict fails closed
  ---
  duration_ms: 0.230434
  type: 'test'
  ...
# Subtest: multiple signals across viewports all accumulate
ok 24 - multiple signals across viewports all accumulate
  ---
  duration_ms: 0.160505
  type: 'test'
  ...
# Subtest: baselineComparison round-trips a valid baseline
ok 25 - baselineComparison round-trips a valid baseline
  ---
  duration_ms: 0.158113
  type: 'test'
  ...
# Subtest: baselineComparison fails closed on malformed or wrong-shape baselines
ok 26 - baselineComparison fails closed on malformed or wrong-shape baselines
  ---
  duration_ms: 0.291661
  type: 'test'
  ...
# Subtest: parseSmokeArgs defaults
ok 27 - parseSmokeArgs defaults
  ---
  duration_ms: 0.191159
  type: 'test'
  ...
# Subtest: parseSmokeArgs consumes --baseline without shifting positionals
ok 28 - parseSmokeArgs consumes --baseline without shifting positionals
  ---
  duration_ms: 0.080158
  type: 'test'
  ...
# Subtest: parseSmokeArgs rejects a trailing --baseline flag
ok 29 - parseSmokeArgs rejects a trailing --baseline flag
  ---
  duration_ms: 0.06395
  type: 'test'
  ...
# Subtest: parseSmokeArgs supports the --baseline= form
ok 30 - parseSmokeArgs supports the --baseline= form
  ---
  duration_ms: 0.068281
  type: 'test'
  ...
# Subtest: parseSmokeArgs rejects unknown flags instead of treating them as positionals
ok 31 - parseSmokeArgs rejects unknown flags instead of treating them as positionals
  ---
  duration_ms: 0.076252
  type: 'test'
  ...
# Subtest: parseSmokeArgs env fallback and flag precedence
ok 32 - parseSmokeArgs env fallback and flag precedence
  ---
  duration_ms: 0.083895
  type: 'test'
  ...
# Subtest: derivedPaths handles .png, .PNG, and extensionless inputs
ok 33 - derivedPaths handles .png, .PNG, and extensionless inputs
  ---
  duration_ms: 0.174418
  type: 'test'
  ...
# Subtest: exitCodeFor: clean run exits 0
ok 34 - exitCodeFor: clean run exits 0
  ---
  duration_ms: 0.990953
  type: 'test'
  ...
# Subtest: exitCodeFor: errors in any single viewport exit 2
ok 35 - exitCodeFor: errors in any single viewport exit 2
  ---
  duration_ms: 0.16837
  type: 'test'
  ...
# Subtest: exitCodeFor: navigation failure in any viewport exits 1, beating errors
ok 36 - exitCodeFor: navigation failure in any viewport exits 1, beating errors
  ---
  duration_ms: 0.136656
  type: 'test'
  ...
# Subtest: exitCodeFor: 4xx boundary and missing status
ok 37 - exitCodeFor: 4xx boundary and missing status
  ---
  duration_ms: 0.081805
  type: 'test'
  ...
# Subtest: exitCodeFor: no viewport data is a failure
ok 38 - exitCodeFor: no viewport data is a failure
  ---
  duration_ms: 0.060489
  type: 'test'
  ...
# Subtest: browser-smoke wires the guard and verdict helpers
ok 39 - browser-smoke wires the guard and verdict helpers
  ---
  duration_ms: 0.315405
  type: 'test'
  ...
# Subtest: browser-smoke file I/O only touches guarded paths
ok 40 - browser-smoke file I/O only touches guarded paths
  ---
  duration_ms: 0.56425
  type: 'test'
  ...
1..40
# tests 40
# suites 0
# pass 40
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 117.545019
