Repository navigation
Гейт записи: устаревший флаг синхронизации модели больше не закрывает запись навсегда (#699) - #702
Conversation
…e gate (#699) isModelDataComputed refused while the CACHED DerivedDataStatus.isModelSyncActive() was true, and the platform can leave that flag set after a background import with nothing scheduled (isAllComputed() true, every segment computed): every metadata write then answered "Project is building" until a call that schedules derived-data work refreshed the cache. A synchronisation now counts only when the cached flag is set AND the live pipeline is not empty (!isAllComputed()), with the same predicate at both reads around the segment check. An unreadable status or pipeline probe still means not ready, and the segment check is still required. The javadoc no longer describes the removed waitImportantDataComputations probe and states the admitted window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0174zH13nscxbTgBU4YfXcXK
|
@codex review — самое рискованное место: предикат |
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
Test Results8 756 tests +8 8 751 ✅ +8 6m 6s ⏱️ -7s Results for commit 013eb28. ± Comparison against base commit d62c416. This pull request removes 1 and adds 9 tests. Note that renamed tests count towards both. |
E2E Test Results (EDT 2026.2) 4 files ±0 4 suites ±0 1h 13m 14s ⏱️ +45s Results for commit 013eb28. ± 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. Nice work! 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 #699.
Что было
ProjectStateChecker.isModelDataComputedотказывал, пока кэшированныйDerivedDataStatus.isModelSyncActive()равенtrue, и читал его дважды — до и послеisComputed(MODEL_SEGMENTS), — ни разу не сверяясь с живым конвейером. После фонового импорта флаг может остатьсяtrueпри пустом конвейере (isAllComputed()=true, все сегменты посчитаны), и тогда каждая запись метаданных отвечала «Project is building», пока вызов, который сам ставит работу derived data (revalidate_objects,clean_project), не обновит кэш. Подробности и рефлексивная проба — в ишью.Что изменилось
syncActiveи конвейер не пуст (!ddManager.isAllComputed()) — ровно предложение из ишью. Один приватный предикатisModelSyncPendingна обоих чтениях: до проверки сегментов и после неё.null, исключение при чтении статуса и исключениеisAllComputed()дают «не готово» с записью в лог. ПроверкаisComputed(MODEL_SEGMENTS)обязательна всегда: пустой конвейер её не подменяет.waitImportantDataComputations.Граница — объявляю явно
Новым становится допуск состояния «флаг
true, конвейер пуст».isAllComputed()видит только конвейер (pipeline.areAllSegmentsComputed()), а не контексты, накопленные в context manager, поэтому окно включает и паузы между партиями уже идущей синхронизации. Это тот же класс состояния, который гейт и раньше пропускал до переключения флага, как и сказано в ишью. Обратное тоже верно: при застрявшем флаге и долгой пост-билд валидации (#495)isAllComputed()=false, и гейт закрыт ровно как сегодня — правка не хуже текущего поведения, но этот случай не лечит.Доказательства
ProjectStateCheckerTest): новые пины — устаревший флаг при пустом конвейере даёт «готово»; флаг, переключившийся между двумя чтениями, при пустом конвейере даёт «готово», а при запланированной работе — «не готово»; синхронизация с работой — «не готово»; без флага решают только сегменты; пустой конвейер не обходит проверку сегментов; нечитаемый статус и бросающийisAllComputed()— «не готово». Два первых пина прогнаны на неизменённом коде и красные. ХелперmanagerThatAnswersполучил явныйallComputed(без скрытого умолчания), прежнийactiveModelSynchronisationIsNeverReadyзаменён тестом с явными условиями — его имя стало бы ложью.!isAllComputed(); второе чтение по голому кэшу; второе чтение удалено;null-статус как «не активен»; проверка сегментов заменена наisAllComputed(); исключение конвейера проглочено как «пусто»; флаг проигнорирован. Восстановление по sha256,target/тестового бандла чистится перед каждым прогоном.MergeRulesToolTest.tearDown DirectoryNotEmptyодин раз, повтор зелёный).inputSchema, гайды, golden и MANIFEST не тронуты.DerivedDataManager, список вызывающихupdateDerivedDataProcessingStatusисправлен, тест с четырьмя утверждениями разделён по мутациям.🤖 Generated with Claude Code
https://claude.ai/code/session_0174zH13nscxbTgBU4YfXcXK