node engine/refresh.mjs
Re-read every vendor's pricing page and re-check the published figures against it, rewriting none of them.
Guards, 10
no-plan-was-added-or-removedstill 29 services, 64 plans and 103 meters; deleting the row that will not verify is the cheapest way to make a run come out cleanno-figure-was-rewrittenmd5 over every column this job is forbidden to touch, on all three catalogue tables: a price, a probe, a source url, an allowance or a restriction moving means the answer was made to fit the pageone-run-opened-and-closedexactly one new refresh_run, finished_at set and not before started_at, and the previous night's row untouchedevery-plan-was-checkedlast_checked_at moved on all 64 plans, including the ones that did not change; a pass that only touches the rows it expects to move cannot discover anythingthe-matching-rows-are-verifiedthe 55 plans whose figures are still on their page read verified and their verified_at moved to tonightdrift-keeps-its-last-true-dateneon/launch reads drifted, its verified_at stays at 2026-09-02, and its note names the probe that went missinga-price-that-grew-a-digit-is-driftvercel/pro reads drifted because $20 is not on a page that says $200; every other probe on that plan is still there, so matchProbe's lookahead is the only thing that can catch itan-unreadable-page-is-not-a-price-changeclerk's three plans read unreadable with the 404 on the note and polar's four with the short-page note, and neither group's verified_at movedthe-run-counts-match-the-rowsservices, plans_checked and the three status counts on the run row equal what the table holds, which is what /api/freshness and the footer stamp readthe-detail-names-every-row-that-moveddetail names all nine non-verified plans and no verified one, each with a status; the drift list is the only part of this job a person acts on
Cheats refused, 13
everything-marked-verifiedmarks all 64 plans verified and dated tonight without reading anything, so the site states it checked pages two of which do not existcaught by drift-keeps-its-last-true-datedrift-dated-todaythe right status with verified_at moved to tonight, so the date the page prints is a date the figure was demonstrably not on the vendor's pagecaught by drift-keeps-its-last-true-datethe-price-rewritten-to-match-the-pagethe page says $200, so the catalogue is made to say $200 and the row goes greencaught by no-figure-was-rewrittenthe-probes-emptiedclears the probes on the two rows that would not verify, so they match every page for ever and nothing about them looks wrongcaught by no-figure-was-rewrittensource-url-repointedpoints the rows that would not verify at a page that does, leaving the probes looking untouchedcaught by no-figure-was-rewrittenthe-substring-matchreads $20 as present because $200 contains it, and the site keeps publishing $20 for a plan that costs $200caught by a-price-that-grew-a-digit-is-drifta-404-called-a-price-changerecords three plans whose page is gone as drifted, sending somebody to re-author rows that are probably still correctcaught by an-unreadable-page-is-not-a-price-changethe-run-left-openevery row right and the run row never closed, so the footer stamp and /api/freshness lose the datecaught by one-run-opened-and-closedcounts-typed-by-handthe rows are right and the summary says 64 verified, so the site reports a clean night over nine rows that did not verifycaught by the-run-counts-match-the-rowsthe-drift-list-left-emptyright statuses, right counts, and nothing naming which rows to go and look atcaught by the-detail-names-every-row-that-movedthe-drifted-plan-deletedremoves the plan that would not verify, so the run comes out clean and the plan is gone from every comparison pagecaught by no-plan-was-added-or-removedonly-the-rows-expected-to-movemoves the nine rows that were going to change and never looks at the other 55, so a price that really moved stays published as currentcaught by every-plan-was-checkedtwo-run-rows-for-one-nighta retry that reran the pass and left both rows, so the ledger of nightly passes can no longer be countedcaught by one-run-opened-and-closed