Repository navigation
One paid solve per page, parser failures exit 5, CSV formula guard, canary fails without its secret - #2
Merged
Conversation
…lls escaped - CSV: string cells starting with = + - @ TAB CR LF get a leading apostrophe in the CSV only; csv_cells_escaped recorded in the sidecar. - Captcha: one paid solve per page (page_flow.SolveBudget), checked before purchase and not reset by block retries or exit rotation. - served_but_unparsed with zero rows exits 5 (parser failure), not 4. - Atomic writer keeps an existing output's mode; new files follow the umask. - pyppeteer: page.authenticate falls back to CDP Fetch.authRequired when Network.setRequestInterception is missing. - Canary fails with ::error:: without KOHLS_CDP_ENDPOINT; assertions moved to .github/canary_assert.py and tied to the listing's stated size. - .gitignore: repo-root *.html (bare --dump-html captures). - Comments and docs no longer cite private notes; suite guard added. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jehrr
marked this pull request as ready for review
October 15, 2026 21:16
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes from the 2026-10-14 audit of kohls-scraper (base
61db4e0= audited SHA, no other open PRs).Behaviour changes
served_but_unparsed) now exits 5, not 4. Exit 4 says the catalogue is empty. A genuinely empty listing is classifiedemptybefore parsing and still exits 4. The smoke check that pinned 4 was rewritten, with the reason in a comment.page_flow.SolveBudget,SOLVES_PER_PAGE = 1). The allowance is created once per page and checked before the solver is called. Before this, a probe with a stub solver counted 2 solves with no pool and 6 with--proxy-block-retries 5. Both cases now buy 1.0o666 & ~umask.Other fixes
= + - @ TAB CR LFgets a leading'in the CSV only. The check runs after lists are joined. Numbers and JSON are untouched.csv_cells_escapedgoes into the sidecar, under the run's own keys.page.authenticatefalls back to CDPFetch.authRequired(source == "Proxy"only) whenNetwork.setRequestInterceptionis missing. Ported from a sibling repo where it was measured. Not run through an authenticated proxy here. The README engine table now says so..gitignore: added/*.html, so a bare--dump-html page.htmlis ignored..env.exampleandcanary.yml. It was never measured for this repo.captcha_solver.pydocstring: describes the removed flag without quoting its name.Canary (owner request)
::notice::when the secret was missing, and its floors were a fixed 3 pages and 300 rows.KOHLS_CDP_ENDPOINTis missing, the job fails with::error::Missing secret KOHLS_CDP_ENDPOINT. The assertions moved to.github/canary_assert.py, which the suite tests. Exit 3, 4 or 5, zero rows, or any missing core field (sku,url,title,price,currency) is red. The page and row floors come from the listing's owntotal_results,pages_availableandper_page, at 95%. A smaller brand assortment is therefore not a failure, while a parser that loses rows is.Evidence
smoke_test.pypasses, all 3 engine groups skipped.ci_checks.py --allok.PYTHONDONTWRITEBYTECODE=1and__pycache__removed. I planted each fault, confirmed the suite went red on the named check, restored it, and confirmed green:::notice::/*.htmlremovedAll 10 were red on the named check and green after restore.
Not changed
--concurrency/--proxy/--fingerprintwith--cdp-endpoint. Owner decision.skus_in_stock/skus_total/rating. Owner decision..env.exampleKOHLS_URL: this repo has no builder flags it could hijack, and the audit's loader round-trip passed.🤖 Generated with Claude Code