Skip to content
PriceGuard

21 shapes · 5 checks · zero credits

Break it yourself

Pick a way a scraper can fail, and read what each check said.

What a correct detector has to do

10 of these shapes must fire and 7 must not.

9 of 10

breaks some watcher caught

1 of 10

caught by nothing: list-price-captured

0 of 7

ordinary days wrongly fired on

Pick a shape

Every panel is a real evaluation, run during the build.

Select any shape to see its 4 verdicts below.

selector-moved-price

must fire

price null on every row (price selector no longer matches)

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftFIREDcorrect
  • price null on 49/49 rows (baseline 0.9%)
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
7 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
nullRate.price
1
baselineNullRate.price
0.009
nullRows.price
49
value-plausibilityquietmissed it
rowCount
49
pricedRows
0
comparableRows
0
uncomparableRows
0
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietmissed it
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
b0ea8a44148b
priorValueSignature
9d2a1877611f
npm run watch:once -- --break selector-moved-price

selector-moved-partial

must fire

price null on one retailer only (single-site redesign)

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftFIREDcorrect
  • price null on 17/49 rows (baseline 0.9%)
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
7 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
nullRate.price
0.347
baselineNullRate.price
0.009
nullRows.price
17
value-plausibilityquietmissed it
rowCount
49
pricedRows
32
comparableRows
0
uncomparableRows
32
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietmissed it
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9896
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
5c65987d3f4a
priorValueSignature
9d2a1877611f
npm run watch:once -- --break selector-moved-partial

list-price-captured

must fire

price holds the struck-through MRP instead of the live price

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietmissed it
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietmissed it
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietmissed it
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
e986177cbd61
priorValueSignature
9d2a1877611f
npm run watch:once -- --break list-price-captured

currency-vanished

must fire

currency null on every row

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftFIREDcorrect
  • currency null on 49/49 rows (baseline 0.3%)
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
7 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
nullRate.currency
1
baselineNullRate.currency
0.003
nullRows.currency
49
value-plausibilityquietmissed it
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietmissed it
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
f823530c6461
priorValueSignature
9d2a1877611f
npm run watch:once -- --break currency-vanished

rows-collapsed

must fire

zero rows on a still-ready snapshot

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftFIREDcorrect
  • zero rows on a ready snapshot. The run reported success and returned nothing
rowCount
0
baselineMeanRows
48.71
baselineStdDevRows
1.16
nullRatesMeasured
no, 0 rows < 8
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietmissed it
rowCount
0
pricedRows
0
comparableRows
0
uncomparableRows
0
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietmissed it
rowCount
0
priorCapture
synthetic_night_09
rowsCompared
no, 0 rows < 8
3 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
npm run watch:once -- --break rows-collapsed

rows-halved

must fire

one retailer's rows disappear entirely

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftFIREDcorrect
  • vijay_sales returned 0 rows, baseline mean 15.3 (floor 1.5), its column on the board is blank
rowCount
34
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
7 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
retailerRowCount.vijay_sales
0
baselineRetailerMeanRows.vijay_sales
15.29
retailerRowCountFloor.vijay_sales
1.53
value-plausibilityquietmissed it
rowCount
34
pricedRows
34
comparableRows
0
uncomparableRows
34
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietmissed it
rowCount
34
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9877
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
fdb46fb254a0
priorValueSignature
9d2a1877611f
npm run watch:once -- --break rows-halved

title-emptied

must fire

title null on every row

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftFIREDcorrect
  • title null on 49/49 rows (baseline 3.5%)
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
7 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
nullRate.title
1
baselineNullRate.title
0.035
nullRows.title
49
value-plausibilityquietmissed it
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietmissed it
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
7aeba39f44df
priorValueSignature
9d2a1877611f
npm run watch:once -- --break title-emptied

stale-repeat

must fireneeds last night's capture

rows repeat the previous capture verbatim (a cached template served with HTTP 200)

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietmissed it
rowCount
48
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietmissed it
rowCount
48
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessFIREDcorrect
  • every one of 48 rows is value-identical to the previous capture synthetic_night_09 (2026-08-16T02:14:00.000Z). The run reported success and returned last night's numbers
rowCount
48
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0
unchangedRows
48
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
9d2a1877611f
priorValueSignature
9d2a1877611f
npm run watch:once -- --break stale-repeat

price-scaled-100x

must fire

one retailer's prices are 100x too large (a decimal point was eaten)

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietmissed it
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityFIREDcorrect
  • croma: 9 prices are 5x or more from the same SKU at other retailers, of 27 comparable rows in this capture (worst LAP-006: 10129000 against a 3-retailer median of 100490, 100.8x)
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
8 more evidence keys
status
ready
valuesMeasured
yes
implausibleRows
9
implausibleRows.croma
9
worstMultiple.croma
100.8
worstSku.croma
LAP-006
worstPrice.croma
10129000
peerMedian.croma
100490
row-freshnessquietmissed it
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
be4d32775037
priorValueSignature
9d2a1877611f
npm run watch:once -- --break price-scaled-100x

placeholder-price-repeated

must fire

one retailer returns a single hard-coded price for every SKU

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietmissed it
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityFIREDcorrect
  • reliance_digital: the same price 71890 on 16 of 16 distinct SKUs (100%, ceiling 50%), a placeholder, not a catalogue
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
5 more evidence keys
status
ready
valuesMeasured
yes
repeatedPrice.reliance_digital
71890
repeatedPriceSkus.reliance_digital
16
repeatedPriceShare.reliance_digital
1
row-freshnessquietmissed it
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9896
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
7af66c6b4ec4
priorValueSignature
9d2a1877611f
npm run watch:once -- --break placeholder-price-repeated

ordinary-price-moves

must stay quiet

small +/-5% price moves on a seeded subset of rows

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9896
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
344377baec02
priorValueSignature
9d2a1877611f
npm run watch:once -- --break ordinary-price-moves

stock-churn

must stay quiet

inStock flips on a minority of rows

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9896
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
9a7b6b4ff8db
priorValueSignature
9d2a1877611f
npm run watch:once -- --break stock-churn

discontinued-sku

must stay quiet

one or two rows drop out (end-of-life SKUs)

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
48
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
48
pricedRows
47
comparableRows
24
uncomparableRows
23
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
48
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9895
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
39e2f5976fa4
priorValueSignature
9d2a1877611f
npm run watch:once -- --break discontinued-sku

no-discount-today

must stay quiet

listPrice null on most rows (nothing on sale) while price holds

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9896
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
367809d242de
priorValueSignature
9d2a1877611f
npm run watch:once -- --break no-discount-today

identity

must stay quiet

unchanged capture (control)

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9896
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
c33d7ee4622c
priorValueSignature
9d2a1877611f
npm run watch:once -- --break identity

clearance-at-one-retailer

must stay quiet

one retailer clears stock at 50-65% off (a real sale, not a defect)

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
af1c8b1a2250
priorValueSignature
9d2a1877611f
npm run watch:once -- --break clearance-at-one-retailer

joined-config-mismatch

must stay quiet

one SKU is joined to a higher-spec variant at one retailer (~2x, both correct)

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
49
baselineMeanRows
48.71
baselineStdDevRows
1.16
rowCountFloor
29.23
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
49
pricedRows
48
comparableRows
27
uncomparableRows
21
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
49
priorCapture
synthetic_night_09
rowsCompared
yes
valueDistance
0.9896
unchangedRows
1
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
abf993a716ae
priorValueSignature
9d2a1877611f
npm run watch:once -- --break joined-config-mismatch

Staged on fixtures/snapshots

The check that needs no history

A schema that declares a validity date makes one more failure readable from a single capture. 1 of these 4 shapes must fire; all five checks read every one.

expired-listing-served

must fire

every dated posting's validity has already ended (a cached board served with HTTP 200)

status-pollingquietmissed it
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietmissed it
rowCount
18
baselineMeanRows
18
baselineStdDevRows
0
rowCountFloor
10.8
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietmissed it
rowCount
18
pricedRows
0
comparableRows
0
uncomparableRows
0
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietmissed it
rowCount
18
priorCapture
synthetic_jobs_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
33bae15b0d47
priorValueSignature
ded62a6e522d
row-expiryFIREDcorrect
  • every one of 12 rows carrying an expiry (job-board.validThrough) expires before this capture's timestamp (2026-08-17T02:14:00.000Z): all 12 advertised windows have already closed while the page still serves them. A live board would still be listing rows whose window is open, so these bytes predate their own expiry stamps
datedRows
12
expiredRows
12
unpublishedRows
6
expiredShare
1
judged
yes
5 more evidence keys
status
ready
rowCount
18
applicable
yes, via job-board.validThrough
capturedAt
2026-08-17T02:14:00.000Z
threshold
1
npm run watch:once -- --schema schemas/job-board.json --store fixtures/jobs-synthetic --break expired-listing-served

live-listings

must stay quiet

every dated posting expires weeks ahead (a healthy, current board)

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
18
baselineMeanRows
18
baselineStdDevRows
0
rowCountFloor
10.8
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
18
pricedRows
0
comparableRows
0
uncomparableRows
0
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
18
priorCapture
synthetic_jobs_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
33bae15b0d47
priorValueSignature
ded62a6e522d
row-expiryquietcorrect
datedRows
12
expiredRows
0
unpublishedRows
6
expiredShare
0
judged
no, 12 of 12 windows are still open
5 more evidence keys
status
ready
rowCount
18
applicable
yes, via job-board.validThrough
capturedAt
2026-08-17T02:14:00.000Z
threshold
1
npm run watch:once -- --schema schemas/job-board.json --store fixtures/jobs-synthetic --break live-listings

some-listings-lapsed

must stay quiet

a minority of dated postings expired while still listed (ordinary board lag)

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
18
baselineMeanRows
18
baselineStdDevRows
0
rowCountFloor
10.8
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
18
pricedRows
0
comparableRows
0
uncomparableRows
0
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
18
priorCapture
synthetic_jobs_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
33bae15b0d47
priorValueSignature
ded62a6e522d
row-expiryquietcorrect
datedRows
12
expiredRows
5
unpublishedRows
6
expiredShare
0.4167
judged
no, 7 of 12 windows are still open
5 more evidence keys
status
ready
rowCount
18
applicable
yes, via job-board.validThrough
capturedAt
2026-08-17T02:14:00.000Z
threshold
1
npm run watch:once -- --schema schemas/job-board.json --store fixtures/jobs-synthetic --break some-listings-lapsed

expiry-absent

must stay quiet

no posting carries validThrough (the board does not publish expiries)

status-pollingquietcorrect
3 more evidence keys
status
ready
errorCode
none
errorMessage
none
row-driftquietcorrect
rowCount
18
baselineMeanRows
18
baselineStdDevRows
0
rowCountFloor
10.8
nullRatesMeasured
yes
4 more evidence keys
status
ready
errorCode
none
baselineSamples
7
rowsMeasured
yes
value-plausibilityquietcorrect
rowCount
18
pricedRows
0
comparableRows
0
uncomparableRows
0
2 more evidence keys
status
ready
valuesMeasured
yes
row-freshnessquietcorrect
rowCount
18
priorCapture
synthetic_jobs_night_09
rowsCompared
yes
valueDistance
1
unchangedRows
0
5 more evidence keys
status
ready
priorCapturedAt
2026-08-16T02:14:00.000Z
hoursSincePrior
24
valueSignature
33bae15b0d47
priorValueSignature
ded62a6e522d
row-expiryquietcorrect
datedRows
0
expiredRows
0
unpublishedRows
18
expiredShare
none
judged
no, 0 dated rows < 8
5 more evidence keys
status
ready
rowCount
18
applicable
yes, via job-board.validThrough
capturedAt
2026-08-17T02:14:00.000Z
threshold
1
npm run watch:once -- --schema schemas/job-board.json --store fixtures/jobs-synthetic --break expiry-absent

Staged on the synthetic job board under fixtures/jobs-synthetic