21 shapes · 5 checks · zero credits
Break it yourself
Pick a way a scraper can fail, and read what each check said.
Synthetic captures. The failure shapes are real; the boards are not.
The capture behind every panel was generated by seeded code. The price shapes stage against whichever committed store has the most history, and move to real captures on the third real night. The expiry shapes stage on the synthetic job board, because no real capture carries a validity date yet.
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 fireprice null on every row (price selector no longer matches)
status-pollingquietmissed it3 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-priceselector-moved-partial
must fireprice null on one retailer only (single-site redesign)
status-pollingquietmissed it3 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-partiallist-price-captured
must fireprice holds the struck-through MRP instead of the live price
status-pollingquietmissed it3 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-capturedcurrency-vanished
must firecurrency null on every row
status-pollingquietmissed it3 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-vanishedrows-collapsed
must firezero rows on a still-ready snapshot
status-pollingquietmissed it3 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-collapsedrows-halved
must fireone retailer's rows disappear entirely
status-pollingquietmissed it3 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-halvedtitle-emptied
must firetitle null on every row
status-pollingquietmissed it3 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-emptiedstale-repeat
must fireneeds last night's capturerows repeat the previous capture verbatim (a cached template served with HTTP 200)
status-pollingquietmissed it3 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-repeatprice-scaled-100x
must fireone retailer's prices are 100x too large (a decimal point was eaten)
status-pollingquietmissed it3 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-100xplaceholder-price-repeated
must fireone retailer returns a single hard-coded price for every SKU
status-pollingquietmissed it3 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-repeatedordinary-price-moves
must stay quietsmall +/-5% price moves on a seeded subset of rows
status-pollingquietcorrect3 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-movesstock-churn
must stay quietinStock flips on a minority of rows
status-pollingquietcorrect3 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-churndiscontinued-sku
must stay quietone or two rows drop out (end-of-life SKUs)
status-pollingquietcorrect3 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-skuno-discount-today
must stay quietlistPrice null on most rows (nothing on sale) while price holds
status-pollingquietcorrect3 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-todayidentity
must stay quietunchanged capture (control)
status-pollingquietcorrect3 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 identityclearance-at-one-retailer
must stay quietone retailer clears stock at 50-65% off (a real sale, not a defect)
status-pollingquietcorrect3 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-retailerjoined-config-mismatch
must stay quietone SKU is joined to a higher-spec variant at one retailer (~2x, both correct)
status-pollingquietcorrect3 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-mismatchStaged 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 fireevery dated posting's validity has already ended (a cached board served with HTTP 200)
status-pollingquietmissed it3 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-servedlive-listings
must stay quietevery dated posting expires weeks ahead (a healthy, current board)
status-pollingquietcorrect3 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-listingssome-listings-lapsed
must stay quieta minority of dated postings expired while still listed (ordinary board lag)
status-pollingquietcorrect3 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-lapsedexpiry-absent
must stay quietno posting carries validThrough (the board does not publish expiries)
status-pollingquietcorrect3 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-absentStaged on the synthetic job board under fixtures/jobs-synthetic