{"startedAt":"2026-10-19","updatedAt":"2026-10-27","checkRuns":21,"runDates":["2026-10-19","2026-10-20","2026-10-21","2026-10-22","2026-10-23","2026-10-24","2026-10-27"],"lastRunId":"2026-10-27.9","runs":[{"runId":"2026-10-19.1","date":"2026-10-19","observedAt":"2026-10-19T16:08:03-04:00","kind":"source_check"},{"runId":"2026-10-20.1","date":"2026-10-20","observedAt":"2026-10-20T08:53:42-04:00","kind":"source_check"},{"runId":"2026-10-20.2","date":"2026-10-20","observedAt":"2026-10-20T15:09:29-04:00","kind":"source_check"},{"runId":"2026-10-20.3","date":"2026-10-20","observedAt":"2026-10-20T15:31:34-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-20.4","date":"2026-10-20","observedAt":"2026-10-20T15:31:41-04:00","kind":"source_check"},{"runId":"2026-10-21.1","date":"2026-10-21","observedAt":"2026-10-21T08:55:38-04:00","kind":"source_check"},{"runId":"2026-10-21.2","date":"2026-10-21","observedAt":"2026-10-21T17:07:13-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-21.3","date":"2026-10-21","observedAt":"2026-10-21T19:46:59-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-22.1","date":"2026-10-22","observedAt":"2026-10-22T08:56:43-04:00","kind":"source_check"},{"runId":"2026-10-23.1","date":"2026-10-23","observedAt":"2026-10-23T03:07:39-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-23.2","date":"2026-10-23","observedAt":"2026-10-23T08:52:07-04:00","kind":"source_check"},{"runId":"2026-10-24.1","date":"2026-10-24","observedAt":"2026-10-24T04:05:07-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-27.1","date":"2026-10-27","observedAt":"2026-10-27T03:13:10-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-27.2","date":"2026-10-27","observedAt":"2026-10-27T04:12:10-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-27.3","date":"2026-10-27","observedAt":"2026-10-27T05:13:15-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-27.4","date":"2026-10-27","observedAt":"2026-10-27T06:09:41-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-27.5","date":"2026-10-27","observedAt":"2026-10-27T07:09:49-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-27.6","date":"2026-10-27","observedAt":"2026-10-27T08:14:07-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-27.7","date":"2026-10-27","observedAt":"2026-10-27T08:49:43-04:00","kind":"source_check"},{"runId":"2026-10-27.8","date":"2026-10-27","observedAt":"2026-10-27T09:08:55-04:00","kind":"catalog_snapshot"},{"runId":"2026-10-27.9","date":"2026-10-27","observedAt":"2026-10-27T11:10:05-04:00","kind":"catalog_snapshot"}],"rowsTracked":943,"pagesTracked":346,"observationDays":7,"events":168,"changes":129,"sourcePriceChanges":28,"catalogAmountChanges":35,"pendingReprice":0,"method":"Append-only, run by run (format v2). Every run (source check or catalog snapshot) is kept as its own entry in check-runs.json with a runId (YYYY-MM-DD.N) and observedAt (ISO time, America/New_York offset); a same-day re-run is a second run, never a replacement. Segments are run-length encoded over consecutive runs with an identical answer (fromRun..toRun). Past segments, events and runs are never edited (scripts/check-history-append-only.mjs enforces it against git HEAD, including same-day replacement). catalog segments = the amount stored in data/pricing-rows.json on each run. source_recheck segments = what scripts/check-sources.mjs found on the official page: status says whether the catalog amount + SKU were on the page; observed = the amount the page itself stated for that SKU in that unit (null when not readable unambiguously; before 0.10.5 implied = amountUsd when status is reconfirmed). Units are never converted. source_price_changed = the observed official amount moved; amount_changed = a human re-priced the catalog. firstSeen = the row's stored asOf when history started (2026-10-19) or the first run containing the row. Run 2026-10-19.1 is the last of several development re-runs that day; earlier same-day runs were replaced before v0.10.6 and are only in git (5f48352..2d9d3ff).","methodology":{"appendOnly":"Append-only, run by run. Every run of the daily source re-check (and every catalog snapshot) is kept as its own entry with a runId (YYYY-MM-DD.N) and observedAt (ISO time, America/New_York offset). A second run on the same day is a second observation, never a replacement. Past segments, events and runs are never edited or deleted; scripts/check-history-append-only.mjs checks this against git HEAD in validate-data and fails on any same-day replacement.","runsAndDays":"Segments are run-length encoded over consecutive runs with an identical answer (fromRun..toRun; from/to are their dates). A day is a summary of its runs (/api/history?runs=1 → days).","observedVsCatalog":"Two series per pricing row. catalog = the amount Depot stores in data/pricing-rows.json on each run (what Depot quotes). observed = the amount the official source page itself stated for that SKU in that unit on that run. They can differ: Depot records the source's move the run it sees it, and re-prices the catalog later in a separate reviewed step (amount_changed event).","observedRules":"observed is read only when unambiguous: an exact raw API field, a schema.org Offer named for the SKU in the row's own unit and corroborated by the visible page text, or (0.10.6+) the exact catalog amount right after the SKU name. Otherwise observed is null. Units are never converted or blended. Segments before 0.10.5 carry no observed field (implied = the catalog amount only when status is reconfirmed); 0.10.5 records with basis catalog_amount_and_sku_on_page used a looser rule and stay as written.","events":"source_price_changed = the observed official amount moved (vs the previous observation, or vs the catalog on a row's first observation), with the evidence snippet, runId and previousObservedBasis (implied_by_reconfirmed_status or catalog_amount_and_sku_on_page mean the 'from' came from the older, looser amount-anywhere-on-page rule and may have been a false match). amount_changed = Depot re-priced its catalog. pendingReprice = rows whose latest observation differs from the catalog (derived, rewritten each run).","neverRetroactive":"Nothing is backfilled before the run it was observed in; history starts at startedAt. Known gap: on 2026-10-19 several development re-runs replaced each other before 0.10.6; only the last (run 2026-10-19.1) is in the record, the earlier ones exist only in git (5f48352..2d9d3ff). The 2026-10-20 morning run, overwritten in 0.10.5, was restored from git 7ee94d2 as run 2026-10-20.1."},"usage":{"rowTimeline":"/api/history/{pricingRowId}","row":"/api/history?sku={pricingRowId}","sourceChanges":"/api/price-changes?kind=source_price_changed","pendingReprice":"/api/price-changes?pending=1","provider":"/api/history?provider={providerId}","page":"/api/history?url={officialSourceUrl}","runs":"/api/history?runs=1","changes":"/api/price-changes?since=YYYY-MM-DD"},"reason":null,"honesty":["History is append-only and kept per run (runId + observedAt); a same-day re-run is a second observation, never a replacement. It started on startedAt; Depot has no observations before that date.","firstSeen for rows that existed when history started is the row's stored asOf (firstSeenBasis says so), not a date Depot watched the page.","lastChanged is null until a stored amount or unit changes. A catalog change is only ever a human edit; re-checks never edit amounts.","source_recheck segments say whether the stored $amount and SKU name were on the official page that run (status), and what amount the page itself stated for that SKU and unit (observed, null when not readable unambiguously).","An observed amount that differs from the catalog is a source_price_changed event and a pendingReprice row, not a catalog edit. Re-pricing the catalog is a separate reviewed step (amount_changed)."]}