Repository navigation
Review: audit response — the --retries 0 artefact, and the regression it hid - #6
Merged
Merged
Conversation
A third-party audit (2026-10-13) reported this site as refusing us — exit 3, 39 bytes, availability unproven. Its command carried `--retries 0`. The load loop is `range(1, retries + 1)`, so zero runs NO navigation and the engine then judges `about:blank`, which is 39 bytes. §28's rule — change ONE variable from the audit's own command — settles it: --retries 0 exit 3, 39 bytes, four attempts, 37 s --retries 1 exit 0, 1,395,922 bytes, 50 rows, 100% coverage, 11 s defaults, 3 pages exit 0, 250 rows, complete, 14 s So the audit was right about the symptom and wrong about the cause, and the symptom was ours. `--retries 0` is now a usage error. THE PART THE AUDIT DID NOT FIND, because it ran one mode. Between 2026-09-17 and today OpenSea stopped inlining its state on the ranking and the activity feed; only a collection page still ships rows. Both modes fell through to the DOM fallback — an address and a name, every price null — and reported `complete`, exit 0, with 23 and 24 rows against the 160 and 200 the endpoint served the same minute. `data_source` said `dom` on every row, which is that column working; nothing read it. page 1's rows are used only when the page actually inlined some, so a mode that stops inlining is handled by the path that already existed for a request the page does not answer: the feed starts from the endpoint; an all-fallback run says so and is no longer `complete`; all three canary jobs assert the route mix — the items job already did and would have gone red, the other two did not, which is how this shipped. Re-measured after the fix: items 250, collections 161, activity 300. A CLAIM OF MINE THAT ROTTED, corrected rather than dropped. The price boundary stopped a walk because passing a null-sort-key cursor back answered `Something went wrong` (2026-09-17). Today that cursor pages normally — 1,000 rows deep, pages 4 to 10 carrying zero priced items. OpenSea fixed their end. The stop survives because a floor scrape should still stop where prices stop, but it is now keyed on a page with no priced row (§7: the catalogue, not the transport). Every copy of the old sentence in code and docs is corrected and dated. ALSO, from the audit's list: a throttle is no longer a block. 429/503 get their own budget, honour Retry-After (the in-page fetch had to start returning that header, or honouring it was dead code) and wait at the SAME exit. No throttle has ever been seen here — `x-ratelimit-remaining` reads 399 and did not move across a burst of 60 — so it is implemented, unexercised, and driven offline against a fake driver for exactly that reason; a browser that will not start is exit 2 with one line, `--verbose` to re-raise, instead of a traceback that says "there is a bug here"; four captured endpoint responses as fixtures — invalid cursor, the null-key cursor, an unknown collection, a validation error. All four are HTTP 200, so a caller branching on the status reads every one as success; `last_cursor` in the sidecar, so the one fact a resume would need is not discarded. Not a resume feature; that is a product decision. And a message fix §28 would call for: Selenium with an authenticated proxy strips the credentials it cannot send, gets an empty document, and used to advise raising --delay. It now names what it did, because it knows. Controls: six planted faults, each asserted to have changed the file, each run checked for the EXPECTED message. One stayed green and was a hole in the suite rather than a pass — a text check matched an assignment the fault left alone — and was tightened until it caught it. Not done, with reasons in the reply: the competitor table, shrinking the engine matrix, the shared-loop refactor and full checkpoint/resume. Co-Authored-By: Claude Opus 5 (1M context) <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.
Response to the third-party audit of
0d4831b(2026-10-13).The audit's headline finding was real, and its cause was not
It reported exit 3 on a 39-byte response and concluded availability was
unproven. Its command carried
--retries 0. The load loop isrange(1, retries + 1), so zero runs no navigation at all and the enginethen judges
about:blank— which is 39 bytes.One variable changed, which is the rule for this:
--retries 0(the audit's)--retries 1complete, 14 sTwo general tells, both cheap: a "refusal" returning in tens of milliseconds
is not a round trip, and 39 bytes is an empty DOM rather than anything a
server sent.
So the bug is ours and is fixed —
--retries 0is now a usage error (exit 2)— and the site was serving throughout. A corollary the audit could not have
known: this flag is affected in 26 of 45 repos in this family.
Related: its "four requests may have increased load" is not what happened.
Four outer attempts × zero navigations each = zero requests.
What the audit did not find, because it ran one mode
Between 2026-09-17 and 2026-10-13 OpenSea stopped inlining its state on the
ranking and on the activity feed; only a collection page still ships rows.
Both modes fell through to the DOM fallback — an address and a name, every
price null — and reported
complete, exit 0:collectionsdomgraphqlactivitydomgraphqlitemsdata_sourcereaddomon every row — the column working exactly asdesigned — and nothing acted on it.
Three changes come out of that, and the third is how it reached a release:
mode that stops inlining is handled by the path that already existed for a
request the page does not answer: the feed starts from the endpoint;
complete;and would have gone red the next morning; the other two did not.
A claim of mine that rotted, corrected rather than dropped
The price-boundary stop rested on passing a null-sort-key cursor back
answering
Something went wrong(measured 2026-09-17). Today that cursorpages normally — a walk went 1,000 rows deep, pages 4 to 10 carrying zero
priced items. OpenSea fixed their end.
The behaviour is unchanged, because a floor scrape should still stop where
the prices stop, but it is now keyed on a page with no priced row — a
property of the catalogue rather than of the transport. Every copy of the old
sentence in the code and the docs is corrected and dated; a captured response
for both behaviours is pinned in the fixtures.
The rest of the audit's list
429/503 get their own budget (separate from
--retries), honourRetry-After— the in-pagefetchhad to start returning that header, orhonouring it was dead code — and wait at the same exit. No throttle
has ever been seen here:
x-ratelimit-remainingreads 399 and did notmove across a burst of 60 requests, so this is implemented, unexercised,
and driven offline against a fake driver for exactly that reason.
the null-key cursor, an unknown collection, a schema validation error. All
four come back HTTP 200, so a caller branching on the status alone
reads every one as success. Captured, not assembled.
actionable line;
--verbosere-raises the driver's own stack.last_cursorin the sidecar, so the one fact a resumewould need is not discarded. Not the feature itself.
credentials it cannot send, gets an empty document, and used to advise
raising
--delay. It now names what it did, because it knows.What was NOT changed, and why
a README carrying Bright Data's pricing is their advertising at our
expense. The audit's own comparison is explicitly not a benchmark — it ran
neither service. The honest half (what this repo does not do
operationally) is a paragraph I will add on request.
keep each other honest, and they did today — Selenium and pyppeteer
independently reproduced Playwright's numbers. CI already builds a venv per
engine, requirements are already split, and pyppeteer's unmaintained state
is already in the README.
a live run of three engines, and it does not belong in the same change as
edits verified by planted faults.
Both are product decisions pending family-wide, not defects here.
(system Python 3.9 on macOS), not a repo defect; CI tests 3.9 and passes.
The audit says as much itself.
Verification
run checked for the expected message. One control stayed green — that is
a hole in the suite rather than a pass, and the check was tightened until
it caught the fault.
Playwright's rows.
9dbf278(waited on the run whoseheadShamatched).items350 /collections161 /activity300 — a second networkindependently contradicting the audit's availability conclusion.
🤖 Generated with Claude Code