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