[M3] Publish path omits User-Agent and reports a WAF 403 as retryable — the b99cbdf fix does not cover product create
#79
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
b99cbdffixed a 403 from the store's WAF by sending a descriptiveUser-Agentfrom the Woo client. That fix landed inwoo.pyonly. The publish path builds its own requests and omits the header, so create is still exposed to the same 403 — and the 403 is then classified as a retryable failure, telling the owner to retry something retrying cannot fix.Found in a read-only review of
main@b99cbdf(2026-09-20). 63 backend tests pass and both docs gates pass at that commit; these are gaps the green suite does not cover.Observed evidence
backend/publish.py:204-212(_sku_exists) andbackend/publish.py:215-224(_create_product) callclient._requestdirectly with hand-built header dicts. A recording transport shows what each path actually sends:Reproduce:
backend.woo.WooClient.from_settings(base, user, enc, request=<recorder>), then callpublish._sku_exists(client, "SLAB-01")andpublish._create_product(client, {})and inspect the recorded headers. Compare againstclient._get("/products/categories").Two compounding problems:
woo.py:63-69raisesWooForbiddenErroron 403, but_sku_exists/_create_productswallow the response and raise a bareWooError(publish.py:211,:223), so the typed error never reaches_classify(publish.py:104-112)._classifyreturnsrecoverable = True("The store create failed. You can retry."). A WAF block is not recoverable by retrying, so the owner gets a message that invites a loop, and PUBLISH-35/36 (classify recoverable vs unrecoverable) is effectively wrong for the one failure we know this store produces.Acceptance
_get/ a new client method), inheritingUser-Agentand the 401/403/404 typing.User-Agentheader on every outbound Woo request, so this cannot regress silently again.Related
b99cbdf(User-Agent + WooForbiddenError),backend/woo.py:18,63-69,106,149Closed by M3 Option A: main
0c00d25+ UAT QUALITY-110 evidence.0.5.0-m3,woo_reachable: truetest-woook (taxonomy synced)product_id=48147matching reviewed ready setcurrent_options, #83 unknown-field/taxonomy 4xx, #84 health probe+version, #89 Create title/short from review, #98 live-edge from synced edge term + attr slug resolve