Контекст
Расследование IngvarConsulting/unica#76 выявило отдельный воспроизводимый residual-сценарий для change detection в v8-runner master 7ce1b062843d86644fe55741dbe0ee79f7ca767d. Его нужно закрыть внутри #39 либо в узком successor PR, если #39 будет разделён.
В проверенном сценарии format=DESIGNER, builder=DESIGNER, configuration source-set успешный dump --mode full заменяет source tree результатом платформы, но не reconciles и не invalidates workPath/hash-storages/designer-<source-set>.redb. Snapshot продолжает описывать дерево до dump.
Из-за этого следующий ordinary build для той же ИБ и того же source-set видит собственную только что опубликованную выгрузку как внешние изменения и снова загружает её в ИБ.
Наблюдаемое поведение
Live-сценарий на macOS, 1С 8.3.27.2214, builder DESIGNER:
build --full-rebuild — успешно;
- ordinary
build — Skipped;
dump --mode full — успешно;
- ordinary
build без пользовательских изменений — найдено 36 изменённых файлов, затем выполнен долгий Full load по partial-load rules;
- ещё один ordinary
build — Skipped.
В итоговом diff также было ровно 36 файлов. Это сильная атрибуция по количеству и моменту, но не exact per-path receipt: текущий build receipt не сохраняет обработанные пути.
Детерминированный unit-level repro без платформы:
- создать
SourceSetContext и выполнить rescan_and_commit_full для дерева before;
- выполнить успешный full dump, fake platform публикует дерево
after;
- запустить обычный
build для той же пары ИБ/source;
- ожидается
BuildMode::Skipped и отсутствие platform invocation;
- сейчас analyzer возвращает
Changes::Modified, и платформа вызывается повторно.
Ожидаемый контракт
Успешный full dump устанавливает fixed point для той же runtime identity, которую должен изолировать #30/#39.
Если после публикации никто не менял отслеживаемые source-файлы, следующий ordinary build той же пары обязан вернуть Skipped и не вызывать платформу.
Нельзя просто вызвать текущий rescan_and_commit_full() после dump на master: существующий storage key не содержит identity ИБ/source root, поэтому такой commit может создать ложный NoChanges при переключении на другую ИБ. Reconciliation должен использовать identity contract #30/#39 или его узкого successor.
Atomicity / failure contract
- snapshot строится по sealed staged tree либо по доказанно опубликованным exact bytes;
- snapshot становится current только после успешной публикации того же поколения;
- platform failure, interruption/cancellation, validation failure или publication failure до commit boundary сохраняют прежние target bytes и прежнее поколение snapshot;
- interruption после зафиксированной публикации может быть deferred; current state тогда обязан целиком описывать уже опубликованное новое поколение;
- mismatch identity, generation race или ошибка reconciliation должны fail safe: следующий build не может быть
Skipped.
Acceptance
Граница вывода
Этот дефект доказан для рассинхронизации опубликованного declarative tree и redb snapshot. ConfigDumpInfo.xml — отдельное platform-generated состояние, scanner его игнорирует; причинная роль CDFI в 36 изменениях не доказана. Rollback/приватизация CDFI остаются отдельной задачей (#24, #30/#39).
Контекст
Расследование IngvarConsulting/unica#76 выявило отдельный воспроизводимый residual-сценарий для change detection в
v8-runnermaster7ce1b062843d86644fe55741dbe0ee79f7ca767d. Его нужно закрыть внутри #39 либо в узком successor PR, если #39 будет разделён.В проверенном сценарии
format=DESIGNER,builder=DESIGNER, configuration source-set успешныйdump --mode fullзаменяет source tree результатом платформы, но не reconciles и не invalidatesworkPath/hash-storages/designer-<source-set>.redb. Snapshot продолжает описывать дерево до dump.Из-за этого следующий ordinary
buildдля той же ИБ и того же source-set видит собственную только что опубликованную выгрузку как внешние изменения и снова загружает её в ИБ.Наблюдаемое поведение
Live-сценарий на macOS, 1С
8.3.27.2214, builderDESIGNER:build --full-rebuild— успешно;build—Skipped;dump --mode full— успешно;buildбез пользовательских изменений — найдено 36 изменённых файлов, затем выполнен долгийFullload по partial-load rules;build—Skipped.В итоговом diff также было ровно 36 файлов. Это сильная атрибуция по количеству и моменту, но не exact per-path receipt: текущий build receipt не сохраняет обработанные пути.
Детерминированный unit-level repro без платформы:
SourceSetContextи выполнитьrescan_and_commit_fullдля дереваbefore;after;buildдля той же пары ИБ/source;BuildMode::Skippedи отсутствие platform invocation;Changes::Modified, и платформа вызывается повторно.Ожидаемый контракт
Успешный full dump устанавливает fixed point для той же runtime identity, которую должен изолировать #30/#39.
Если после публикации никто не менял отслеживаемые source-файлы, следующий ordinary build той же пары обязан вернуть
Skippedи не вызывать платформу.Нельзя просто вызвать текущий
rescan_and_commit_full()после dump наmaster: существующий storage key не содержит identity ИБ/source root, поэтому такой commit может создать ложныйNoChangesпри переключении на другую ИБ. Reconciliation должен использовать identity contract #30/#39 или его узкого successor.Atomicity / failure contract
Skipped.Acceptance
successful full dump -> ordinary build same pair -> Skipped/no platform call;interruption before publish -> target and snapshot generation unchanged;Граница вывода
Этот дефект доказан для рассинхронизации опубликованного declarative tree и redb snapshot.
ConfigDumpInfo.xml— отдельное platform-generated состояние, scanner его игнорирует; причинная роль CDFI в 36 изменениях не доказана. Rollback/приватизация CDFI остаются отдельной задачей (#24, #30/#39).