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
direct masters — follow-up: незавершённые этапы и живая верификация
Context
Умбрелла-issue для хвостов, оставшихся после серии #628 (list/get), #630 (suspend/resume), #633 (archive, было delete — переименован после живой разведки, удаления в UI МК нет), #631 (update, только Этап A), #632 (add). Все пять смержены в main (PR #629, #641, #645, #646, #647), но у трёх есть незакрытые хвосты, которые issue-автоклоуз (Closes #NNN в
squash-merge) скрыл, поскольку каждый PR закрывал свой issue целиком, хотя объём был
покрыт частично.
Пункты
1. masters update — Этапы B/C/D (было issue #631, закрыт автомёржем PR #646 не по объёму)
#631 описывал 4 этапа; реализован и смержен только Этап A (недельный бюджет, цель
продвижения, «Директ помогает»). Не реализованы:
Подход и риски по каждому этапу — см. исходный текст #631 (в истории issue, ссылка ниже).
Каждая под-секция — отдельный PR с независимым парсером/сеттером, чтобы редизайн одной
секции не ломал остальные.
2. Живая верификация всех трёх мутирующих команд
masters update, masters add, masters archive реализованы и покрыты только офлайн-
тестами на fake Page/Locator — ни одна ни разу не проверялась живым вызовом на реальном
аккаунте (нет sandbox для браузерных мутаций, живые проверки делались только read-only
через claude-in-chrome, реальные изменения откатывались до сохранения).
masters update — живая проверка каждого поля Этапа A (бюджет/цель/toggle) через
реальный direct masters update <id> --weekly-budget ... с последующей сверкой через masters get.
masters add — живой запуск (--dry-run недоступен для browser-команд) на одноразовой
тестовой кампании, с последующей архивацией через уже готовый masters archive.
masters archive — живая архивация той же одноразовой тестовой кампании.
Риск: PR #646 уже поймал один HIGH-severity баг именно на этапе живой проверки (promotion-
goal verification сравнивал двухстрочный inner_text с однострочным label — юнит-тесты
этого не ловили). Аналогичные скрытые баги вероятны в add/archive, которые живую
проверку не проходили вовсе.
#645 и #646 прошли по два раунда ревью (cycle-review с Codex для #645, ручной code-reviewer х2 для #646). #647 не проходил формального ревью — было только сверено
вручную, что паттерны (get_by_role(exact=True), _verify_created) портированы из уже
проверенного #646. Стоит прогнать /cycle-review на смерженном коде для очистки долга.
Верификация
По каждому пункту — см. подпункты выше. Общий инвариант: живая проверка обязательна перед
закрытием пунктов 1 и 2, т.к. это DANGEROUS-команды без песочницы.
direct masters— follow-up: незавершённые этапы и живая верификацияContext
Умбрелла-issue для хвостов, оставшихся после серии #628 (list/get), #630 (suspend/resume),
#633 (archive, было
delete— переименован после живой разведки, удаления в UI МК нет),#631 (update, только Этап A), #632 (add). Все пять смержены в main (PR #629, #641, #645,
#646, #647), но у трёх есть незакрытые хвосты, которые issue-автоклоуз (
Closes #NNNвsquash-merge) скрыл, поскольку каждый PR закрывал свой issue целиком, хотя объём был
покрыт частично.
Пункты
1.
masters update— Этапы B/C/D (было issue #631, закрыт автомёржем PR #646 не по объёму)#631 описывал 4 этапа; реализован и смержен только Этап A (недельный бюджет, цель
продвижения, «Директ помогает»). Не реализованы:
Этап B — списки с весами: заголовки и тексты объявлений (добавление/удаление/✅ covered byредактирование элемента + вес)
--headline/--text(feat(masters): add masters update --headline/--text — Этап B point-replacement #669) +--clear-headline/--clear-text(fix(masters): stop asserting a single cause from a bounded timeout in _add_target_action #786/feat(masters): add --clear-headline/--clear-text tomasters update(#786) #787) — weighted add/remove UI не существуетв Мастере кампаний, подтверждено дважды живьём, см. issue comment.
быстрые ссылки✅ done via feat(masters): add --add-sitelink/--remove-sitelink tomasters update#803, аудитория (интересы —теговый список) — done via masters update: Этап C — быстрые ссылки, аудитория/интересы, счётчики Метрики, целевые действия #681,
счётчики Яндекс.Метрики✅ done via feat(masters): add --add-metrika-counter/--remove-metrika-counter tomasters update#801 (empty-identityguard follow-up: fix(masters): guard against an empty Metrika counter identity #808), целевые действия/CPA.
видео✅ done via feat(masters): add --add-video/--remove-video tomasters update#806 (--image's modal, upload/save behavior never exercised end to end, see PR body),изображения✅ done via masters update — Этап D (изображения): точечная замена изображения в слоте #670/feat(masters): add
masters update --image— Этап D point-replacement (#670) #672 (point-replacement--image) + feat(masters): adddirect masters adimages get#675-feat(masters): adddirect masters adimages delete/set#677 (masters adimages get/add/delete/set— genuine variable-length add/remove, shipped as its own commandgroup rather than
updateflags, a deliberate split — see those issues). Live re-verified2026-08-08: every
ImageSuggestionsEditor*/ImageSuggestionsEditorModal*testid stillmatches the live DOM 1:1 (unlike video's feat(masters): add --add-video/--remove-video to
masters update#806→fix(masters): correct guessed video upload-modal testids to real values #811 correction, images needed none), andthe previously-unverified batched
set_input_files([path1, path2])upload now confirmedworking live too.
Подход и риски по каждому этапу — см. исходный текст #631 (в истории issue, ссылка ниже).
Каждая под-секция — отдельный PR с независимым парсером/сеттером, чтобы редизайн одной
секции не ломал остальные.
2. Живая верификация всех трёх мутирующих команд
masters update,masters add,masters archiveреализованы и покрыты только офлайн-тестами на fake Page/Locator — ни одна ни разу не проверялась живым вызовом на реальном
аккаунте (нет sandbox для браузерных мутаций, живые проверки делались только read-only
через
claude-in-chrome, реальные изменения откатывались до сохранения).masters update— живая проверка каждого поля Этапа A (бюджет/цель/toggle) черезреальный
direct masters update <id> --weekly-budget ...с последующей сверкой черезmasters get.masters add— живой запуск (--dry-runнедоступен для browser-команд) на одноразовойтестовой кампании, с последующей архивацией через уже готовый
masters archive.masters archive— живая архивация той же одноразовой тестовой кампании.Риск: PR #646 уже поймал один HIGH-severity баг именно на этапе живой проверки (promotion-
goal verification сравнивал двухстрочный
inner_textс однострочным label — юнит-тестыэтого не ловили). Аналогичные скрытые баги вероятны в
add/archive, которые живуюпроверку не проходили вовсе.
Частично закрыто задним числом:
✅ done via fix(masters): require --weekly-budget for masters add (#796) #804 (closes masters add --draft: клик 'Сохранить как черновик' не создаёт кампанию, redirect timeout (5/5 live-попыток) #796) — живая верификация поймалаmasters addweekly_budget багsilent-rejection на create без
--weekly-budget.TOCTOU archive/copy hardening✅ done via fix(masters): harden archive_master/copy_master — TOCTOU race, transient verify errors #799 (closes masters archive/copy: same TOCTOU race + non-tolerant verify loop that #793 fixed for delete #797).TOCTOU delete hardening (re-open row menu)✅ done via fix(masters): re-open the grid row menu after delete_master's TOCTOU re-check #807 (closes masters delete: DeleteCampaignAction click times out on campaign 713359607 (3/3 live attempts, incl. headful) #805).3. Формальное ревью PR #647 (
masters add)#645 и #646 прошли по два раунда ревью (cycle-review с Codex для #645, ручной
code-reviewerх2 для #646). #647 не проходил формального ревью — было только свереновручную, что паттерны (
get_by_role(exact=True),_verify_created) портированы из ужепроверенного #646. Стоит прогнать
/cycle-reviewна смерженном коде для очистки долга.Верификация
По каждому пункту — см. подпункты выше. Общий инвариант: живая проверка обязательна перед
закрытием пунктов 1 и 2, т.к. это DANGEROUS-команды без песочницы.
Продолжение #628, #630, #633, #631, #632 (все смержены).