Skip to content

ADR-039 — Стандартные артефакты: Association, Group и Text Annotation как model-only носители

Поле Значение
Статус Принято
Версия v.1
Дата 2026-08-25
Владелец Руслан Габитов
Уточняет ADR-024 v.5 §2.9 (артефактные строки таблицы диспозиций импорта), SAD-001 v.1.2 §14 (область конформности; её утверждение о model-only носителях приземляется вместе с этим решением)

EN-оригинал — канонический: ADR-039-standard-artifacts.md. Этот файл — его перевод (twin).

Область решения. Артефакты BPMN §8.4.1 — Association, Group, Text Annotation — становятся элементами, которые модель носит: они хранятся ради загрузки BPMN и round-trip и никогда не исполняются. Это та самая возможность модели, которую ADR-024 §2.16 регистрирует для простой <association> (#323); по его правилу «сначала возможность» она приземляется собственным решением — этим документом; реализацию описывает сопутствующий SRD. Ничто из решённого здесь не исполняется.

1. Контекст

«BPMN provides three standard Artifacts: Associations, Groups, and Text Annotations» (§8.4.1) — способ моделиста «показать дополнительную информацию о процессе, не связанную напрямую с его Sequence Flow и Message Flow» (§8.4.1). Это представление, а не семантика:

  • «An Association is used to associate information and Artifacts with Flow Objects», в частности «to connect user-defined text (an Annotation) with a Flow Object»; тот же элемент «is also used to show the Activity used for compensation» — единственная форма тега с исполняемым смыслом (§8.4.1).
  • «Text Annotations are a mechanism for a modeler to provide additional information for the reader of a BPMN Diagram» (§8.4.1).
  • «The Group object is an Artifact that provides a visual mechanism to group elements of a diagram informally»; его необязательный categoryValueRef «specifies the CategoryValue that the Group represents», принадлежащий корневому элементу Category уровня Definitions (§8.4.1).

Каждый контейнер flow-элементов владеет этим семейством: и Process, и SubProcess несут artifacts 0..* (elements/process.md, elements/activities.md).

Позиция движка двусторонняя. §2.3.1 позволяет исполнению игнорировать неоперационные элементы — у артефакта нет token-семантики. Но §2.3.2 обязывает поддерживать импорт диаграмм процессов, а ADR-024 v.5 §2.8 гарантирует семантический round-trip, который может переиздать только то, что модель хранит. Модель не держала ни одного элемента семейства, и цена записана на границе конвертера: ADR-024 §2.16 §1.3 — аннотация пропускается, линия к ней отвергается, и обычная аннотированная диаграмма не загружается.

2. Решение

2.1 Модель несёт три стандартных артефакта — ради загрузки

Association, TextAnnotation и Group становятся элементами модели под model-only контрактом, заданным ярусом lanes: их несёт определение объявившего их контейнера (Process или SubProcess, упорядоченно — у артефактов нет имени и не нужен ключ, а порядок объявления — то, что воспроизводит round-trip), их можно авторить в Go, они сохраняются при обмене и никогда не исполняются. Ни одно решение движка не читает артефакт; на инстансе нет артефактного состояния.

Коллекцией владеют оба вида контейнеров, потому что стандарт даёт её обоим (artifacts 0..* на Process и SubProcess, §1).

Этот ярус существует для загрузки BPMN, а не для исполнения, и SAD-001 §14 фиксирует это разделение на уровне архитектуры: артефакты стоят при обязательстве загрузки §2.3.2, по другую сторону таблицы от семантики §2.3.1, которую движок оживляет.

2.2 Носимый набор закрыт на трёх стандартных

Artifact стандарта — абстрактный супертип без собственных свойств — модель представляет его как классификацию носимых видов, а не как конструируемый элемент, и набор видов закрыт: ровно то, что допускает это решение.

Стандарт явно разрешает больше — «a modeler or modeling tool MAY extend a BPMN diagram and add new types of Artifacts» (§8.4.1). Заметка движка: gobpm отклоняет эту точку расширения. Носимый элемент заслуживает место тем, что переиздаваем, а движок не может переиздать вид, которого не знает; открытый набор впускал бы инертные значения, умирающие на первом же экспорте. Новый вид — это поправка к этому решению, а не поверхность для плагинов.

2.3 Group несёт своё значение категории; каталог категорий — вход загрузки

Group носится со встроенным CategoryValue, который он представляет — значение и есть смысл группы (§8.4.1), а модель не держит хранилища корневых элементов уровня Definitions, куда можно было бы сослаться. При загрузке объявления <category> документа читаются как вход разрешения, превращающий categoryValueRef группы в её значение; при экспорте они переиздаются из носимых значений. Сам Category отдельным элементом модели не носится. Заметка движка: принадлежность отдельных flow-элементов категориям (FlowElement.categoryValueRef) остаётся вне носимого набора — исполнение игнорирует категории, а диаграмма утверждает именно артефакт группы.

2.4 Компенсационная ассоциация — не артефакт

Второй смысл тега — «the Activity used for compensation» (§8.4.1) — это семантика исполнения, и у неё уже есть представление в модели: компенсационная обвязка ADR-026 v.1 — прикреплённый к границе обработчик и его разрешённая ссылка. Один факт документа — одно представление в модели. Ассоциация, потреблённая компенсационной границей, не материализуется дополнительно как носимый артефакт: вторая копия могла бы разойтись с первой (поменяйте обработчик — устаревший артефакт всё ещё называет старую активность), и экспорт говорил бы два разных факта. Когда приземлится экспорт компенсации, ассоциация переиздаётся из обвязки — единственного источника истины, — а не из яруса артефактов.

2.5 Концы и направление: правила стандарта — и никаких выдуманных

Концы носимой ассоциации — ссылки на элементы модели, оба обязательны — схема делает sourceRef и targetRef required (§8.4.1); её направление — None | One | Both с собственным умолчанием стандарта None (§8.4.1).

Дальше стандарт молчит: ни правила вложенности, ни правила типов концов — конец есть любой BaseElement (§8.4.1). Движок ничего не выдумывает. Моделист вправе провести ассоциацию от аннотации уровня процесса к узлу внутри под-процесса, и более строгое правило отвергало бы конформные файлы во имя ограничения, которого спецификация не ставила. Весь инвариант модели — то, что утверждает стандарт: два настоящих конца, настоящее направление.

2.6 Конвертер следует за моделью

Диспозиции импорта потребляют возможность (уточняя артефактные строки ADR-024 v.5 §2.9):

  • <textAnnotation>, <group> и простая <association> отображаются — разбираются и сохраняются в ярус артефактов — в каждом контексте, где контейнер читает детей, на уровне процесса и во вложении одинаково. Диспозиция, зависящая от глубины вложения, — дефект, а не политика.
  • Ссылка, которую модель не может разрешить, — конец ассоциации или categoryValueRef, называющий то, чего модель не держит, — деградирует до отчёта ADR-024 §2.14: файл загружается, артефакт отбрасывается, хост узнаёт, какая ссылка не разрешилась. Никогда не отказ — отказывать целому файлу из-за линии к комментарию и есть тот сбой, который эта возможность устраняет, — и никогда не молчание: ассоциация утверждает связь, а тихий пропуск ADR-024 §2.9 резервирует за содержимым, чьё отсутствие ничего не меняет.
  • <group> и <category> сохраняют свою диспозицию consume/carry единообразно (§2.3).

Компенсационная форма сохраняет своё существующее чтение (§2.4).

2.7 Экспорт должен переиздание — по расписанию экспорта

Аргумент round-trip, оправдывающий ношение (§1), обязывает экспорт переиздавать всё носимое — тексты, форматы, направления, ссылки концов, значения категорий. Этот долг запланирован на экспортный срез работ по обмену, рядом с тем же долгом, который уже несут lanes; это решение фиксирует форму модели, которую те экспортеры будут читать, и сознательно не двигает само расписание.

3. Последствия

  • Аннотированная диаграмма загружается. Строка реестра #335 для #323 потреблена, и абзац о «файле, отвергнутом из-за комментария» уходит вместе с ней.
  • Модель может авторить то, что загружает — аннотации, группы и их линии строятся в Go и доживают до обмена: та же симметрия, что и у остальной модели.
  • Поверхность исполнения не появляется. Как и у lanes: ни один runtime-тип не читает артефакт, поэтому «никогда не исполняется» остаётся проверяемым отсутствием пути, который мог бы.
  • Round-trip групп заметно отстаёт — по решению. Категорийная принадлежность flow-элементов не носится (§2.3) — принятая цена, и реестр не даёт принять её за небрежность.
  • Долг экспорта явный (§2.7): носимые артефакты, как и носимые lanes, хранятся, но пока не переиздаются, пока не приземлится экспортный срез.

4. Рассмотренные альтернативы

Отчёт-и-сброс вместо ношения (модель остаётся без артефактов; каждая простая ассоциация — запись отчёта §2.14). Отклонено: снимает отказ, но проваливает оба обязательства загрузки — вычищать каждый комментарий не есть «поддержка импорта» (§2.3.2), а ADR-024 §2.8 не может переиздать то, чего модель не хранила, — и оставляет модель неспособной авторить аннотированное определение вовсе.

Носить Association и TextAnnotation, без Group (первый черновик этого решения). Отклонено: раскалывает одно стандартное семейство на две диспозиции, оставляет ассоциацию с концом-группой навсегда деградированной и заново открывает тот же вопрос при первой диаграмме с группами. Категорийная механика, нужная группе, ограничена правилом встроенного значения §2.3.

Локальный для конвертера тип артефакта. Отклонено без нового аргумента: ADR-024 §2.16 уже запрещает конвертеру компенсировать отсутствующую возможность модели — приватный тип есть тот же раскол импорт-против-исполнения в другом костюме.

Открытый, расширяемый хостом набор артефактов (по «MAY extend» §8.4.1). Отклонено — §2.2: движок не может переиздать вид, которого не знает, и открытый набор превращает верность обмена в тихую лотерею по видам. Стандарт предлагает эту точку инструментам моделирования; этот движок — не они.

5. Открытые вопросы

Нет. Единственная сознательная отсрочка — переиздание экспортом — записана в §2.7 как расписание, а не как вопрос.

6. Ссылки

  • ADR-024 v.5 — таблица диспозиций, которую уточняет §2.6, и контракт отчёта §2.14.
  • ADR-024 §2.16 — реестр возможностей, на который отвечает это решение, и порядок «сначала возможность», которому оно подчиняется.
  • ADR-026 v.1 — компенсационная обвязка, владеющая исполняемым смыслом тега (§2.4).
  • SAD-001 v.1.2 §14 — позиция конформности; её утверждение «загрузка, не исполнение» приземляется вместе с этим решением (§2.1).
  • conformance.md — вендоренный экстракт области, чью строку визуальных артефактов это решение переклассифицирует.
  • BPMN 2.0.2 §8.4.1 Artifacts — все утверждения о стандарте; цитаты сверены с текстом спецификации OMG (стр. 64–71).

История документа

Версия Дата Автор Изменения
v.1 2026-08-25 Руслан Габитов Первоначальное решение. Модель несёт три стандартных артефакта — Association, TextAnnotation, Group — под model-only контрактом в стиле lanes: на Process/SubProcess ради загрузки BPMN и round-trip (§2.3.2, ADR-024 §2.8), никогда не исполняются (§2.3.1), никогда не на инстансе; SAD-001 §14 фиксирует разделение «загрузка, не исполнение». Набор закрыт (точка расширения §8.4.1 отклонена — движок не может переиздать вид, которого не знает). Group встраивает представляемый CategoryValue; каталог <category> уровня Definitions — вход разрешения при загрузке, переиздаётся из носимых значений, элементом модели не является. Компенсационная ассоциация — не артефакт (один факт — одно представление: ею владеет обвязка ADR-026). Концы и направление — по §8.4.1 (оба конца обязательны, умолчание None); правило вложенности не выдумывается там, где стандарт молчит. Диспозиции конвертера следуют за моделью: отображать все три в каждом контексте контейнера; неразрешимая ссылка деградирует этот один артефакт до отчёта ADR-024 §2.14 — никогда не отказ и не молчание. Переиздание экспортом — явный запланированный долг (§2.7).