Repository navigation
A moved payload shape is not an empty listing; CI tests 3.14 - #3
Merged
Merged
Conversation
The three endpoints are the front end's, not a published API, so a field will be renamed one day. Both ways that can happen were silent: - a renamed row container parsed to zero rows and ended the run as exit 4, "the listing has nothing in it", on a response still counting 187 adverts. A page whose OWN total puts rows on it and from which none were read is now `unread`: exit 5 on page 1, exit 6 later, stop_reason parser_found_nothing. Measured 2026-09-30 that every page up to the one the total implies carries rows on all three endpoints, and the next carries none, so the end of a listing is still end_of_listing. - a renamed column wrote a complete file with the column null on every row and one warning. The sidecar now carries core_field_shortfall per page, and the canary fails on it. One test simulated "the listing shrank" with a past-the-end capture whose total still covered the page, which the live endpoints never answer; it now states the shrunk total. CI's newest Python is 3.14 (was 3.12); 3.9 stays as the floor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merged
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.
Follows up the 2026-09-30 audit: its point 1 (the endpoints are undocumented BAPI) and the CI half of point 3. What the audit described as a risk turned out to be a live gap. I renamed fields in a real capture, and both ways a shape can move went through silently:
data→items, page 1completepartial,stop_reason: parser_found_nothing,pages_failed: [2]adv.price→unitPricecore_field_shortfall: {"1": {"price": 0.0}}; the canary fails on itHow the rule was set
A page counts as unread when its own
totalputs rows on it and no row was parsed. That relies on the endpoints serving every page their total implies. I measured this live on 2026-09-30 with plainrequests:So the real end of a listing is still
end_of_listing. The total is read from the page being judged, so a listing that shrank during the run carries its new total.One case it cannot catch: if the total is renamed too, the page looks like an empty listing. The canary's daily row floor is what catches that.
A test whose premise could not happen
check_a_multi_page_run_merges_in_page_order_and_ends_on_datamodelled "the listing shrank" as the page-999 capture served as page 3, with its total of 8,921 unchanged. That means page 3 claims rows and has none, which the live endpoints never answer. It now states a shrunk total. The dedupe check next to it had the same premise. It passed before for the right reason and would have kept passing afterwards for the wrong one (partial rather than complete), so it now also asserts the run is complete.CI
The matrix is now 3.9 + 3.14 (was 3.9 + 3.12). I did not act on the audit's suggestion to drop 3.9: it is the Python macOS still ships, and it is the one the audit itself ran on. The reason is written next to the matrix.
Evidence
unreadnever set: red 4 times, and the page-2 case readcomplete/ exit 0, which is the old behaviour;complete/ exit 0 withcore_field_shortfall: {}:Not changed
🤖 Generated with Claude Code