You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Issue #238 (CalloutSetting missed in ads update) revealed a systemic gap: tests/test_wsdl_parity_gate.py::test_wsdl_required_fields_have_cli_options only validates fields with minOccurs>=1 and skips the entire test for commands where the only required item field is Id (see lines 596-598). CalloutSetting is minOccurs=0 → the gate silently passed for 0.3.11 even though the CLI surface was incomplete.
get_required_item_fields() in direct_cli/wsdl_coverage.py:549-564 filters by item.get("min_occurs", 1) >= 1. Optional fields are invisible to the gate by design.
Why this matters
The original design assumed minOccurs>=1 = hard contract violation if missing (API will reject), and minOccurs=0 = optional convenience (can be added incrementally). In practice, optional WSDL fields are often the only way to express a common scenario — CalloutSetting is the only way to manage callout extensions on existing ads, and without a CLI flag the entire workflow is blocked.
Strict-WSDL-parity policy in CLAUDE.md calls for 1:1 mirroring of the WSDL surface; the gate enforces that only for required fields. The two diverge.
Audit candidates (preliminary)
High-confidence misses found by an Explore agent sweep — to be verified per-ticket:
adgroups add for rare subtypes: MobileAppAdGroup, SmartAdGroup, DynamicTextFeedAdGroup — verify all subtype-fields are mapped.
What to do
Extend test_wsdl_parity_gate.py with a soft-gate test that collects all item-fields (including minOccurs=0) for each (cli_group, cli_op) in COMMAND_WSDL_MAP, compares against known Click options, and emits a coverage table. Implementation options: pytest writing an xfail-snapshot file as a whitelist, or a CI warning that does not fail.
Background
Issue #238 (
CalloutSettingmissed inads update) revealed a systemic gap:tests/test_wsdl_parity_gate.py::test_wsdl_required_fields_have_cli_optionsonly validates fields withminOccurs>=1and skips the entire test for commands where the only required item field isId(see lines 596-598).CalloutSettingisminOccurs=0→ the gate silently passed for 0.3.11 even though the CLI surface was incomplete.get_required_item_fields()indirect_cli/wsdl_coverage.py:549-564filters byitem.get("min_occurs", 1) >= 1. Optional fields are invisible to the gate by design.Why this matters
The original design assumed
minOccurs>=1= hard contract violation if missing (API will reject), andminOccurs=0= optional convenience (can be added incrementally). In practice, optional WSDL fields are often the only way to express a common scenario —CalloutSettingis the only way to manage callout extensions on existing ads, and without a CLI flag the entire workflow is blocked.Strict-WSDL-parity policy in
CLAUDE.mdcalls for 1:1 mirroring of the WSDL surface; the gate enforces that only for required fields. The two diverge.Audit candidates (preliminary)
High-confidence misses found by an Explore agent sweep — to be verified per-ticket:
ads update+CalloutSetting— fixed by ads update: support CalloutSetting (ADD/REMOVE/SET) for managing callouts on existing ads #238.adgroups add/adgroups update+TrackingParams(AdGroupAddItem.TrackingParams,AdGroupUpdateItem.TrackingParams). Campaign-level tracking-params shipped in 0.3.11 (campaigns add/update: типизированный флаг--tracking-paramsдля CampaignBase.TrackingParams #230) — ad-group-level not covered.adgroups add/adgroups update+NegativeKeywords(ad-group-level negative keywords). Today onlynegativekeywordsharedsets(shared sets) is exposed.keywords add/keywords update+AutotargetingBrandOptions/AutotargetingCategories/AutotargetingSettings— autotargeting at keyword create/update time.ads update+VideoExtension/PriceExtension— adjacent extension fields inTextAdUpdate. If they are WSDL-supported, file follow-up issues by analogy with ads update: support CalloutSetting (ADD/REMOVE/SET) for managing callouts on existing ads #238.vcards add— 11 optional fields (InstantMessenger,PointOnMap,Ogrn, etc.).adgroups addfor rare subtypes:MobileAppAdGroup,SmartAdGroup,DynamicTextFeedAdGroup— verify all subtype-fields are mapped.What to do
test_wsdl_parity_gate.pywith a soft-gate test that collects all item-fields (includingminOccurs=0) for each(cli_group, cli_op)inCOMMAND_WSDL_MAP, compares against known Click options, and emits a coverage table. Implementation options: pytest writing an xfail-snapshot file as a whitelist, or a CI warning that does not fail.Refs
CalloutSetting)TextAdUpdateBasetyped flags)CLAUDE.md— strict WSDL parity policy