Skip to content

Гейт записи: устаревший флаг синхронизации модели больше не закрывает запись навсегда (#699) - #702

Merged
DitriXNew merged 1 commit into
masterfrom
fix/699-model-sync-gate
Oct 3, 2026

Conversation

@Jimmo910

@Jimmo910 Jimmo910 commented Oct 2, 2026

Copy link
Copy Markdown
Collaborator

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) обязательна всегда: пустой конвейер её не подменяет.
  • javadoc больше не описывает удалённую пробу waitImportantDataComputations.

Граница — объявляю явно

Новым становится допуск состояния «флаг true, конвейер пуст». isAllComputed() видит только конвейер (pipeline.areAllSegmentsComputed()), а не контексты, накопленные в context manager, поэтому окно включает и паузы между партиями уже идущей синхронизации. Это тот же класс состояния, который гейт и раньше пропускал до переключения флага, как и сказано в ишью. Обратное тоже верно: при застрявшем флаге и долгой пост-билд валидации (#495) isAllComputed() = false, и гейт закрыт ровно как сегодня — правка не хуже текущего поведения, но этот случай не лечит.

Доказательства

  • Юнит (ProjectStateCheckerTest): новые пины — устаревший флаг при пустом конвейере даёт «готово»; флаг, переключившийся между двумя чтениями, при пустом конвейере даёт «готово», а при запланированной работе — «не готово»; синхронизация с работой — «не готово»; без флага решают только сегменты; пустой конвейер не обходит проверку сегментов; нечитаемый статус и бросающий isAllComputed() — «не готово». Два первых пина прогнаны на неизменённом коде и красные. Хелпер managerThatAnswers получил явный allComputed (без скрытого умолчания), прежний activeModelSynchronisationIsNeverReady заменён тестом с явными условиями — его имя стало бы ложью.
  • Мутации — 7, каждая роняет свой пин: только кэш без !isAllComputed(); второе чтение по голому кэшу; второе чтение удалено; null-статус как «не активен»; проверка сегментов заменена на isAllComputed(); исключение конвейера проглочено как «пусто»; флаг проигнорирован. Восстановление по sha256, target/ тестового бандла чистится перед каждым прогоном.
  • Сборка: BUILD SUCCESS, 8756 юнит-тестов, 0 падений (известный локальный флейк MergeRulesToolTest.tearDown DirectoryNotEmpty один раз, повтор зелёный).
  • Живая гонка из ишью (шаги 1–4, ~10 повторов) не воспроизводилась: доказательство — на уровне предиката. Провод не меняется: описания, inputSchema, гайды, golden и MANIFEST не тронуты.
  • Ревью до push: два независимых гейта (корректность; честность тестов) — SHIP и 4 замечания P3, все вшиты: граница уточнена по байткоду DerivedDataManager, список вызывающих updateDerivedDataProcessingStatus исправлен, тест с четырьмя утверждениями разделён по мутациям.

🤖 Generated with Claude Code

https://claude.ai/code/session_0174zH13nscxbTgBU4YfXcXK

…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
@Jimmo910

Jimmo910 commented Oct 2, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review — самое рискованное место: предикат isModelSyncPending (кэш syncActive и !isAllComputed()) на обоих чтениях — есть ли состояние, в котором запись теперь проходит по устаревшей модели при реально идущей синхронизации, которое старый гейт отсекал.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Repo admins can enable using credits for code reviews in their settings.

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Test Results

8 756 tests  +8   8 751 ✅ +8   6m 6s ⏱️ -7s
  351 suites ±0       5 💤 ±0 
  351 files   ±0       0 ❌ ±0 

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.
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ activeModelSynchronisationIsNeverReady
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ aFlagThatFlipsBetweenTheReadsWithAnEmptyPipelineIsReady
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ aFlagThatFlipsBetweenTheReadsWithScheduledWorkIsNotReady
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ aStaleSyncFlagWithAnEmptyPipelineIsReady
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ aSyncFlagWithScheduledWorkIsNotReady
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ aThrowingPipelineProbeIsNotReady
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ anEmptyPipelineDoesNotBypassTheSegmentCheck
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ anUnreadableStatusStaysNotReadyEvenWithAnEmptyPipeline
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ withoutASyncFlagAnEmptyPipelineStillNeedsTheSegments
com.ditrix.edt.mcp.server.utils.ProjectStateCheckerTest ‑ withoutASyncFlagScheduledWorkDoesNotRefuse

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

E2E Test Results (EDT 2026.2)

    4 files  ±0      4 suites  ±0   1h 13m 14s ⏱️ +45s
1 381 tests ±0  1 339 ✅  - 2  42 💤 +2  0 ❌ ±0 
1 384 runs  ±0  1 342 ✅  - 2  42 💤 +2  0 ❌ ±0 

Results for commit 013eb28. ± Comparison against base commit d62c416.

This pull request skips 2 tests.
create_git_branch::test_branch_already_exists_errors_without_creating_anything
switch_git_branch::test_switching_to_the_current_branch_is_rejected

@DitriXNew

Copy link
Copy Markdown
Owner

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-03T20:24:26.428957Z 013eb28 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit: 013eb28083

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

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".

@DitriXNew
DitriXNew marked this pull request as ready for review October 3, 2026 20:22
@DitriXNew
DitriXNew merged commit 67b4864 into master Oct 3, 2026
16 checks passed
@Jimmo910
Jimmo910 deleted the fix/699-model-sync-gate branch October 3, 2026 21:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants