one thing i'd poke at in build_snapshot, the country check only fires when the payload sends a wrong value. so if the key's just missing it falls back to expected_country, so maybe label that field asserted not observed instead
also missing price raises invalidoperation every time which kind of contradicts the bit about a title without a price still working for catalog matching. and decimal NaN sneaks past that same check unhandled, might be worth guarding with is_finite first
contract could use a few more fields too, extraction_layer, seller, provenance, and fetched_at as an actual datetime instead of a plain string would go a long way
one thing i'd poke at in build_snapshot, the country check only fires when the payload sends a wrong value. so if the key's just missing it falls back to expected_country, so maybe label that field asserted not observed instead
also missing price raises invalidoperation every time which kind of contradicts the bit about a title without a price still working for catalog matching. and decimal NaN sneaks past that same check unhandled, might be worth guarding with is_finite first
contract could use a few more fields too, extraction_layer, seller, provenance, and fetched_at as an actual datetime instead of a plain string would go a long way