Skip to content

bug(runtime): изолировать hash/CDFI state по ИБ и не изменять ConfigDumpInfo в source tree #30

Description

@zeegin

Контекст

Связано с:

Повторный анализ #24 и интеграционного сценария Unica показывает, что backup/target-scoped merge tracked-файла устраняет симптом, но сохраняет неверное владение состоянием.

ConfigDumpInfo.xml содержит внутренние id/configVersion платформы и является локальным состоянием синхронизации конкретной редактируемой конфигурации/ИБ. Методика 1С для Git исключает его из репозитория. Значения configVersion нельзя синтезировать или коллективно согласовывать.

Проблемы текущего контракта

1. Hash state не изолирован по информационной базе

ADR-0002 и ADR-0012 адресуют redb context через workPath и source-set (designer-<sourceSetName>/edt-<sourceSetName>), но не через identity ИБ.

Если тот же checkout и workPath переключить на другую infobase.connection через primary/local config, runner может повторно использовать snapshot первой ИБ и вернуть Skipped, хотя выбранная ИБ этот source ещё не получала.

2. Платформа изменяет CDFI в пользовательском source root

Designer build вызывает:

/LoadConfigFromFiles <source-root> -updateConfigDumpInfo

Платформа создаёт/перезаписывает <source-root>/ConfigDumpInfo.xml. В результате локальное состояние ИБ оказывается внутри пользовательских исходников; при двух ИБ они перетирают один файл, а при tracking через Git возникает бессодержательный churn и конфликты.

3. Build receipt не доказывает обработанные targets

Текущий BuildStep сообщает source_set, mode, ok и для partial только file_count. Точные requested/processed/skipped пути и их raw hashes отсутствуют. Интегратор не может корректно очистить target-level dirty state после partial build.

4. Incremental/partial dump пишет прямо в source

Full dump использует staging publication, но incremental и partial Designer dump направлены непосредственно в platform_target_path. Если source отличается от последнего успешно загруженного baseline, dump может молча перезаписать более новое содержимое версией из ИБ.

Дополнительно текущий Designer DSL передаёт -updateConfigDumpInfo для /DumpConfigToFiles, хотя документированный platform contract относит этот параметр к /LoadConfigFromFiles; это нужно отдельно проверить реальной platform acceptance.

Ожидаемая архитектура

Per-IB runtime identity

Ввести identity runtime-контекста как минимум из:

normalized/redacted infobase identity
+ source-set raw identity
+ canonical source root
+ source format/backend

Секреты не сохраняются: для пути/state используется стабильный fingerprint нормализованной identity.

Runtime state размещается только под workPath, например:

workPath/ib-state/<ib-fingerprint>/<source-set>/
  ConfigDumpInfo.xml
  hash-storage.redb
  transactions/

Смена connection/local overlay выбирает другой state либо явно инвалидирует прежний; она никогда не должна приводить к Skipped по snapshot другой ИБ.

Private ConfigDumpInfo lifecycle

  • ConfigDumpInfo.xml не требуется в tracked source и не является source target.
  • Full load выполняется через private staging source; -updateConfigDumpInfo создаёт platform-generated CDFI, который сохраняется в per-IB state.
  • Partial load получает private staging source, seeded соответствующим CDFI выбранной ИБ.
  • Runner никогда не публикует CDFI в пользовательский source root.
  • Никакие id/configVersion не создаются и не merge-ятся вручную.
  • Missing/corrupt/incompatible CDFI приводит к безопасному full bootstrap, а не к попытке partial операции.

Exact build receipt

Typed JSON result должен возвращать для каждого source set:

requested[]
processed[]
skipped[]
conflicted[]

Для каждого пути нужны raw pre/post hash и terminal status. Persisted hash state обновляется только для фактически успешно загруженных и применённых targets.

Safe incremental/partial dump

  • Платформа всегда пишет в private shadow/staging.
  • Runner сравнивает current source, last successfully loaded/dumped hash и shadow output.
  • При divergence по умолчанию source не меняется и возвращается structured conflict.
  • Явный force, если будет поддержан, публикует только полностью проверенный owner/target bundle.
  • Обновлённый CDFI остаётся в per-IB state; в source публикуются только декларативные XML/BSL-файлы.

Критерии готовности

  • Чистый clone без ConfigDumpInfo.xml успешно проходит full build; после операции Git tree остаётся чистым по CDFI.
  • Две disposable ИБ используют один checkout/workPath и получают независимые hash/CDFI states.
  • Переключение infobase.connection при неизменных source не возвращает Skipped до синхронизации новой ИБ.
  • Failed/cancelled/timeout build не изменяет пользовательский source root.
  • Partial build возвращает точные processed paths/hashes и подтверждает только их.
  • Partial/incremental dump при source↔IB divergence ничего не записывает без явного force.
  • Restart сохраняет per-IB baseline и не смешивает states разных ИБ.
  • CDFI не включается в source scanner, source receipt или publication manifest.
  • Acceptance выполнена на disposable file ИБ как минимум для Designer backend.

Отношение к #24

Эта задача уточняет root cause #24. Transactional rollback остаётся полезной защитой, но target-scoped merge tracked CDFI не должен становиться целевой моделью: CDFI должен быть полностью выведен из пользовательского source tree и изолирован по ИБ.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions