Skip to content

0.3.8 — Strict WSDL parity: убрать категорию «Helper/legacy» из DRY_RUN_PAYLOAD_EXCLUSIONS #199

Description

@axisrow

Контекст

В ходе milestone 0.3.8 повторилась одна и та же ошибочная цепочка рассуждений вокруг bidmodifiers.delete:

  1. Изначально в tests/api_coverage_payloads.py запись имела rationale: "Helper/legacy surface; not part of strict WSDL parity claim." — то есть формально объявлена как «не часть строгой проверки WSDL».
  2. PR feat(coverage): bidmodifiers add/set typed fixtures (#137, #183) #185 (Unit A — bidmodifiers add/set) явно подтвердил в body: «bidmodifiers.delete kept excluded per DRY_RUN_PAYLOAD_EXCLUSIONS lifecycle batch (14 entries) #136 (Helper/legacy surface).» — наклейка перенесена.
  3. Audit-комментарий в 0.3.8 — Integration coverage tracker: DRY_RUN_PAYLOAD_EXCLUSIONS audit (refs #136, #137) #176 классифицировал её как legitimate-helper-or-legacy permanent exclusion. Закреплено как «постоянно правильное» исключение.
  4. Финал-отчёт milestone 0.3.8 повторил это же обоснование.
  5. PR fix(coverage): add bidmodifiers.delete schema gate fixture #194 в итоге всё-таки добавил bidmodifiers.delete в schema gate, но в PR-body представил это как реакцию на Codex review, а не как исправление изначально неверной классификации.

Что нашли при перепроверке кода

В WSDL tests/wsdl_cache/bidmodifiers.xml:

  • <wsdl:operation name="delete"> — полноценная операция в portType + binding (строки 474–478, 518–529).
  • <xsd:element name="DeleteRequest"> с required SelectionCriteria (minOccurs=1) → требует IdsCriteria (строки 415–421).
  • <xsd:element name="DeleteResponse"> со стандартным ActionResult (строки 422–428).
  • Никаких маркеров helper, legacy, deprecated в WSDL.

В CLI direct_cli/commands/bidmodifiers.py:delete():

  • Строит body: {"method": "delete", "params": {"SelectionCriteria": {"Ids": [modifier_id]}}}.
  • Делает реальный destructive POST: client.bidmodifiers().post(data=body).
  • Никаких маркеров helper/legacy в коде или docstring.

Вывод: наклейка «Helper/legacy surface; not part of strict WSDL parity claim» была неоправданна с самого начала.

Принцип, который мы должны соблюдать

CLI должен совпадать с API Яндекса 1-в-1, без «helper», «legacy», «удобных skip'ов».

Любая запись в DRY_RUN_PAYLOAD_EXCLUSIONS с rationale, которая по сути говорит «эта команда не считается частью строгой проверки», — это плохая классификация. Она маскирует баги (как было с bidmodifiers.delete) и приводит к реактивным правкам через цикл Codex review.

Что сейчас в main

После PR #194:

  • bidmodifiers.delete — в PAYLOAD_CASES, под gating. ✅
  • В DRY_RUN_PAYLOAD_EXCLUSIONS больше нет записей с rationale, содержащей «helper» или «legacy». ✅
  • Остались только маркеры про сломанные параметры --campaign-id/--type в bidmodifiers.py:set() — это про конкретные legacy-флаги, не про операции.

Acceptance criteria для этого issue

  • В tests/api_coverage_payloads.py ни одна запись DRY_RUN_PAYLOAD_EXCLUSIONS больше не использует фразы:
    • helper
    • legacy
    • not part of strict WSDL parity
    • аналогичные «удобные skip» формулировки.
  • В PR-bodies, в комментариях к issue, в CLAUDE.md зафиксирован принцип: «CLI должен совпадать с API Яндекса 1-в-1; никаких категорий helper-or-legacy-исключений».
  • Бывшая запись bidmodifiers.delete уже исправлена в PR fix(coverage): add bidmodifiers.delete schema gate fixture #194 — этот issue лишь фиксирует почему это было правильно и закрывает policy-gap.

Refs

Что не входит в этот issue

  • Не trogaем 23 остальные exclusion-записи в DRY_RUN_PAYLOAD_EXCLUSIONS (read-path *.get, v4-not-in-v5-wsdl, runtime-deprecated, custom-endpoint) — у них другая природа обоснования (физическое отсутствие в WSDL рантайма, другой транспорт, и т.п.). Это уже не «удобный skip». Этот issue только про категорию «helper/legacy» как ошибочную классификацию.
  • Не trogaем legacy-маркеры в bidmodifiers.set() про параметры --campaign-id/--type — это про сломанные параметры одной операции, не про саму операцию.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions