Repository navigation
LaunchUpdateDialogAutoConfirmer: arm сообщает, взвёл ли он что-то, а сборка снимает только своё взведение (#618) - #704
Conversation
…disarms only what it armed (#618) The four void arm(...) overloads dropped the result of the boolean implementation, which returns false without arming anything when no workbench Display exists yet. Their only caller, BuildExternalObjectsTool, then disarmed unconditionally in finally; disarm clamps at zero but cannot tell whose count it takes, so a no-op arm could release the count a concurrent launch had armed and leave that launch's modal dialogs waiting for a human. The overloads now return the arming result, and the build follows the autoConfirmerArmed pattern every other caller already uses: arm right before the try, disarm in finally only when the arm took effect. Job scheduling moved inside the try, so a scheduling failure releases the arm too. Javadoc that named the wrong overloads for update_database and the launch paths is corrected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0174zH13nscxbTgBU4YfXcXK
E2E Test Results (EDT 2026.2) 4 files ±0 4 suites ±0 1h 9m 27s ⏱️ - 3m 2s Results for commit d493d6b. ± Comparison against base commit d62c416. This pull request skips 2 tests. |
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Codex Review: Didn't find any major issues. What shall we delve into next? Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Closes #618.
Что было
У
LaunchUpdateDialogAutoConfirmerчетыреvoid-перегрузкиarm(...)вызывалиboolean-реализацию и выбрасывали результат. А реализация возвращаетfalse, ничего не взводя, когда workbench Display ещё нет. Единственный вызывающийvoid-варианта,BuildExternalObjectsTool, снимал взведение вfinallyбезусловно.disarmзажимает счётчик по нулю, но не знает, чей счёт снимает: после взведения-пустышки он мог забрать счёт параллельного launch, и модальные окна того launch остались бы ждать человека. Подробности и границы окна — в ишью; блокер «не берём до #631» снят мержем503a8161.Что изменилось
void arm(...)возвращают результат взведения (boolean); в javadoc —@returnи правило «парныйdisarmтолько приtrue». Перегрузки не удалены, все существующие вызовы компилируются как раньше.BuildExternalObjectsToolработает по тому же образцуautoConfirmerArmed, что уже применяютStandaloneServerSupport,LaunchTool,RunYaxunitTestsTool,UpdateDatabaseToolиExportConfigurationToFileTool:armстоит непосредственно передtry, снятие — только если взведение состоялось. Постановка задачи перенесена внутрьtry, поэтому сбой планирования тоже снимает взведение (раньше он оставлял его до конца сессии). Порядок при прерывании прежний: сначала флаг и ответ, затем снятие.update_databaseи путей запуска (они идут через семиаргументную перегрузку, трёхаргументную вне класса зовёт толькоbuild_external_objects).inputSchema, гайды, golden и MANIFEST не тронуты.Граница — объявляю явно
runBuildпередаёт в шов именноarmLaunchDialogs/disarmLaunchDialogs: в безголовой среде взведение всегда пустышка, и снятие не вызывается. Это видно по коду (шовscheduleAndJoinBuild→scheduleAndJoinArmed), не тестом.Доказательства
LaunchUpdateDialogAutoConfirmerTest: каждая из четырёх перегрузок в безголовой среде отвечаетfalse; поведенческий пин дефекта — взведение-пустышка, затем параллельный launch поднимает счёт, затем условное снятие оставляет чужой счёт нетронутым. Для этого добавлены пакетно-приватные тестовые швы и помощникAutoConfirmerArmCountsв тестовом бандле.BuildExternalObjectsToolTest: пустышка не снимается; состоявшееся взведение снимается ровно один раз после ожидания; сбой планирования всё равно снимает; прерванное ожидание сначала отвечает, потом снимает; продуктовыйarmLaunchDialogsотдаёт результат конфирмера; снятие возвращает ровно те матчеры, что взялarm.void), поэтому поведенческую красноту доказывают мутации — 14: безусловныйdisarm; результат взведения проигнорирован; перегрузки по одной теряют результат делегата; планирование снова доtry; планирование до взведения; снятие пропало; флаг прерывания потерян; и т.д. — каждая роняет свой пин. Восстановление по sha256,target/тестового бандла чистится перед каждым прогоном.🤖 Generated with Claude Code
https://claude.ai/code/session_0174zH13nscxbTgBU4YfXcXK