Repository navigation
Keep good output on a failed write; one paid solve per page; report 404s and parser failures by name - #10
Merged
Conversation
…04s and parser failures by name - Outputs, the sidecar and diff_runs --out are written atomically (temp file in the target's directory, fsync, rename); new files get 0666 & ~umask, existing files keep their mode. - CSV cells starting with = + - @ TAB CR LF are prefixed with ' in the CSV only; csv_cells_escaped goes in the sidecar under the caller's extra keys. - One paid-solve allowance per page in all three browser engines, checked before every purchase and not reset by a retry or an exit rotation. - The site's 404 page, the edge's nginx 404 and an unknown player id redirected to the ranking are not_found (exit 4) in every engine; a served page whose rows the parser lost is parser_found_nothing (exit 5, or 6 after rows). A captcha named only by its header is blocked. - TRANSFERMARKT_URL is commented out in .env.example and no longer overrides --club-id/--player-id/--season or a --mode of another page kind. - Numeric count/delay flags reject values below their floor (exit 2). - The credential scan judges paths inside the repo and fails on 0 files. - --concurrency accounts for a page held by a worker that died. - Capture kinds are gitignored; private-note citations removed, with a suite guard; README exit-5 row and products table corrected. - The canary fails on exit 3 instead of skipping green. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Problem
Measured on
mainatc00411d:write_json,write_csvand the.meta.jsonsidecar usedopen(path, "w"). When the dump failed part-way, a 732-byte goodout.jsonwas left as 10 bytes of invalid JSON..env.examplebroke--club-id/--player-id. It shippedTRANSFERMARKT_URL=<market-values URL>, and the environment fills--urlbefore an engine builds the mode's URL. With a copied example,--mode club-squad --club-id 27scraped the ranking and labelled the result club 27's squad (5 rows from the suite's real fixture).--mode transfersand--mode playerwere affected the same way.--proxy-block-retries 2recorded 3 purchases for one page.--concurrencydropped the page held by a worker that died, and still reported the run complete..../venv/scanned 0 files and reported clean.--delay -1,--pages 0,--proxy-block-retries -1, …).Resulting behaviour
page_flow.SolveBudget). It is created before the block-retry loop and checked beforesolve_recaptchain all three browser engines. The audit's probe now records 1 purchase with a 3-exit pool, and 1 with no pool.path.relative_to(REPO).parts, a scan of 0 files fails, and.json/.sh/.toml/.html/.cfgfiles are scanned too (41 files, was 36)..gitignore: captures are ignored by kind (/*.htmlexceptindex.html,*.page[0-9]*,live/,out/,captures/).tests.ymlrunsci_checks.py --sample-checkinstead of an inline copy of it.price-monitoring→sports-analytics.The 2026-10-04/05 red canaries were the known gallery case. The site's own next-link was the doubled
/galerie/{uuid}/page/5//page/2shape, and the edge answered it with a bare nginx 404. That page, from the run's artifact, is now a fixture. Without a status code it used to read asempty, which a chained Selenium or pyppeteer run would take for the end of the listing.Evidence
Offline suite (
PYTHONDONTWRITEBYTECODE=1,__pycache__cleared):--pages 0and--delay -1give exit 2 naming the flag.pytest -qpasses,ci_checks.py --allis OK, andcompileallis clean.Controls: each fault below was planted and the suite went RED on the named check, then GREEN once restored.
--delay(selenium); a plain-int--retries(api client);typed_urlcaptured afterapply; the env-URL conflict ignored; the URL uncommented in.env.example.parse_failednever set (api client, playwright); a header-only captcha parsed (api client, pyppeteer).Live, free, from this machine on 2026-10-15 (Playwright engine with the system Chromium, no proxy, no key):
--mode club-squad --club-id 99999999not_found--mode player --player-id 999999999not_found--mode player --player-id 418560--mode transfers --pages 2no_new_products(see below)The 404 and redirect shapes in the fixtures were captured the same day.
No paid calls, no proxies, no credentials.
Not changed (and why)
[Unreleased]now holds these changes and the earlier ones. Owner decision.existing_token, and the cookie domain fromawsWafCookieDomainList: needs a live solve control on this site first.cf-turnstile,Access Denied, …): a candidate only. It is mitigated by the content-first ordering.--category,--chromium-path,--no-autosolveacross engines): low, not changed./statistik/neuestetransfersserved 20 rows with no next-link, and?page=2returned the same 20 rows, so--mode transfersendsno_new_productsafter page 1. This is honest about what the site serves, but it is a change from the measured 25-row paginated listing. It was not in the audit and is left for a separate look.🤖 Generated with Claude Code