Карта стандартов
Карта стандартов показывает все стандарты Framework, их версии и то, на что каждый опирается. По карте видно, какие требования действуют для вашего компонента: каждый следующий уровень добавляет требования и не отменяет предыдущие.
Уровни стандартов
Читайте таблицу снизу вверх по уровням: уровень 1 задаёт форму, уровень 5 — самые конкретные требования.
| Уровень | Стандарт | Имя (id) |
Версия | Что задаёт | Опирается на |
|---|---|---|---|---|---|
| 1 | Standard Contract | standard-contract |
1.0.0 | Форму любого стандарта | — |
| 2 | Recipe | simai.composition-recipe |
1.1.0 | Правила сборки документа страницы | Standard Contract |
| 2 | Манифест Smart-компонента | simai.smart-component-manifest |
2.5.0 | Контракт одного компонента | Standard Contract |
| 3 | Составной компонент | simai.composite-component |
1.0.3 | Внешнюю сторону составного компонента | Recipe, манифест |
| 3 | Пакет компонентов | simai.component-package |
1.1.1 | Пакет Smart-компонентов владельца: устройство, сборку, квитанцию, поставку и подключение | манифест (uses); ссылается на составной, динамический составной, порт хоста, жизненный цикл изменений |
| 4 | Динамический составной компонент | simai.dynamic-composite-component |
1.0.3 | Поведение составного компонента на стыке с приложением | наследует уровень 3 |
| 4 | Порт хоста | simai.composite-host-port |
1.0.4 | Сам стык: объявленный и версионированный порт | наследует динамический |
| 5 | Фрагмент интерфейса | simai.interface-fragment |
1.0.2 | Составной компонент в области страницы рядом с другими: описание фрагмента, типы значений страницы, навигацию по областям | наследует порт хоста |
| сквозной | Жизненный цикл изменений | simai.change-lifecycle |
1.0.0 | Как публичное имя уходит из Framework | схема журнала, политика сроков |
| сквозной | Правила взаимодействия | simai.interaction-rules |
1.0.0 | Как любой Smart-компонент загружается, говорит с соседями и рисует | — |
| сквозной | Разработка с ИИ | simai.ai-development |
1.0.0 | Как ИИ-агент разрабатывает на Framework и вместе с ним: контракты, публичная поверхность, выпуски, проверка и приёмка | — |
| 2 | Фоновый эффект | simai.effect |
1.1.0 | Анимированный фон в области страницы: манифест, модуль, правила работы, набор проверок | Standard Contract; схема манифеста эффекта; правила взаимодействия |
Переиздания без новых требований. Стандарт закрепляет то, на что
опирается, по версии и хешу (см. Закрепление по хешу), поэтому новое издание опоры
переиздаёт всю цепочку над ней. Recipe 1.1.0 принимает имена форматов без
версии (см. Recipe (simai.composition-recipe)). Составной компонент закрепил новый lock-файл
Recipe и вышел изданием 1.0.3. Динамический составной компонент (1.0.3) и
порт хоста (1.0.4) переизданы, потому что каждый наследует (extends)
предыдущий по хешу. Пакет компонентов (1.1.1) переиздан, потому что ссылается
(references) на эти издания по хешу. Требования ни в одном из них не
изменились. Фрагмент интерфейса 1.0.2 закрепляет схему описания фрагмента
1.2.0, которая принимает тип значения по имени без версии, и требование
closed-value-types называет типы без версии; остальные требования те же
(см. Фрагмент интерфейса).
Прежние издания хранятся в истории исходников Framework
(contracts/standards/history/).
Форматы данных и их старшие версии. Старшая версия формата равна старшей версии стандарта, который его определяет (см. Имена и версии).
Формат (schema) |
Старшая версия (schema_version) |
Определяет стандарт |
|---|---|---|
simai.composition.recipe |
1 | simai.composition-recipe |
simai.composition.document |
1 | simai.composition-recipe |
simai.composition.inputs |
1 | simai.composition-recipe |
simai.composition.dependencies |
1 | simai.composition-recipe |
Манифест Smart-компонента (smart.manifest.json) |
2 | simai.smart-component-manifest |
simai.composite.host-port — объявление порта |
1 | simai.composite-host-port |
simai.interface-fragment — описание фрагмента |
1 | simai.interface-fragment |
simai.effect — манифест эффекта (effect.json) |
1 | simai.effect |
simai.change-journal |
1 | simai.change-lifecycle |
simai.framework.product-package-source-lock |
1 | simai.component-package |
simai.framework.product-package-receipt |
1 | simai.component-package |
Где записана версия, зависит от формата. Квитанция пакета записывает имя в
поле schema_id, а версию — в schema_version. Форматы композиции (Recipe,
документ, входы, перечень зависимостей), журнал изменений и
framework.lock.json пакета, описание фрагмента и манифест эффекта несут старшую
версию в самой метке schema ("simai.framework.product-package-source-lock.v1")
и отдельного поля schema_version не имеют. Такую метку пишут точно, как в
примерах (см. Имена и версии).
Порты хоста и их текущие версии. Все изданные версии лежат в поставке ui
в distr/core/contracts/ports/<порт>/<версия>/ (см. Объявление порта); текущая —
последняя изданная:
| Порт | Компонент | Текущая версия | Изданы | Случаев в наборе проверок |
|---|---|---|---|---|
simai.dataview-port |
smart.data-view-composite (sf-data-view) |
1.12.0 | 1.0.0–1.12.0 | 44 |
simai.property-view-port |
smart.property-view (sf-property-view) |
1.13.0 | 1.0.0–1.13.0 | 42 |
simai.admin-navigation-port |
smart.admin-menu (sf-admin-menu) |
1.0.0 | 1.0.0 | 37 |
Компоненты этих портов поставляет пакет larena (см. Пакеты компонентов продуктов); порты
и наборы проверок входят в поставку Framework.
Машиночитаемые копии на сайте документации:
Копии берутся из закреплённого выпуска при каждой сборке сайта: схема манифеста — действующее издание 2.5.0, порты — все версии, которые поставляет выпуск.
Версии стандартов, форматов и портов руководство называет только в этих таблицах; остальной текст называет их по имени.
Действующие версии — в исходниках Framework (contracts/standards/); сайт
документации публикует конверты в /ai/standards/ (Машиночитаемые источники).
Профили продуктов в карту не входят. Роли полей, типы представлений, устройство запроса к хранилищу — вопросы конкретного продукта. Такие профили описываются поверх стандартов в документации продукта; Framework о продуктах не знает.
Recipe (simai.composition-recipe)
Стандарт Recipe — правила сборки страницы: как из шаблонов, фрагментов, мест вставки, выбора вариантов и объявленных входов получить проверенный документ композиции (Document). На этих правилах держатся и сервер, и браузер: одна и та же запись даёт одну и ту же страницу.
Грамматику самого дерева — какие бывают узлы, как они вкладываются, какие у
узла слоты и в каком порядке они отрисовываются — задают схема Document
(simai.composition.document) и манифест типа. Recipe описывает, как это
дерево собирается.
Recipe издаётся нормативным комплектом, а не одним файлом:
- схемы Recipe, входных данных и зависимостей;
- ограничения (
limits.json); - проверенные примеры;
- lock-файл, хеш которого покрывает каждый нормативный файл комплекта.
Изменение любого файла комплекта сразу видно по хешу.
Издание 1.1.0 принимает имена форматов без версии: схемы Recipe, манифеста
шаблона, входов и перечня зависимостей принимают и прежнюю метку
simai.composition.<имя>.v1, и имя simai.composition.<имя> с
"schema_version": 1, а профиль канонизации называется
simai.recipe.canonical-json.v1 или simai.recipe.canonical-json. Рецепт в
прежней форме даёт те же байты Document и те же digest, что и в издании 1.0.1;
рецепт без версии в имени даёт Document и перечень зависимостей без версии в
имени. Подробно — в Где взять спецификацию.
Комплект лежит в исходниках Framework (src/core/contracts/composition-recipe-v1/),
в поставке ui (distr/core/contracts/composition-recipe-v1/) и на сайте
документации; ИИ находит его в индексе по идентификатору
urn:simai:framework:composition-recipe:specification.
Требования к слотам, порядку и глубине вложенности составных компонентов
(Составной компонент (simai.composite-component)) сформулированы в терминах грамматики композиции. Подробно Recipe и
Document описаны в Три представления страницы: Recipe, Document и HTML, Шаблоны, вставки и варианты и Где взять спецификацию.
Манифест Smart-компонента (simai.smart-component-manifest)
Манифест Smart-компонента — контракт одного компонента. Он описывает: входные свойства со схемой, методы, события, состояния, доступность, владение данными, безопасность, готовность, происхождение вплоть до хешей файлов исходника и указания для ИИ.
Схема манифеста закрытая: поле, которого в ней нет, не принимается. Поэтому
манифест пригоден для машинного чтения и для проверки в гейте владельца.
Версию схемы называет поле x-simai-version, действующая версия — в карте
стандартов (см. Уровни стандартов). Схема лежит в исходниках Framework
(contracts/schema/smart-component-manifest.v2.schema.json); машиночитаемая
копия на сайте — в таблице выше. Все Smart-компоненты Framework описаны
манифестом версии 2. Манифест — опора составного компонента и место, где
компонент объявляет свой порт хоста.
Манифест обязательно содержит разделы schema_version, id, version,
title, summary, kind, reuse_mode, lifecycle, tags,
capabilities, custom_element, composition, inputs, methods,
events, state, persistence, ownership, security, accessibility,
presentation, adapter, artifacts, readiness, compatibility,
provenance и ai_guidance; форму каждого задаёт схема.
idSmart-компонента начинается сsmart.: у компонентов Framework этоsmart.и имя папки (smart.buttonsвdistr/smart/buttons/).custom_element— тег с дефисом (sf-button).readiness.level— один из уровнейinventoried,described,runnable,composable,exportable,accepted,host-requiredи список проверокrequired_checks.
Устройство манифеста описано в Манифест.
Составной компонент (simai.composite-component)
Стандарт составного компонента задаёт внешнюю сторону компонента,
собранного из других компонентов: таблицы с панелью и меню,
административного меню, редактора страницы. Он покрывает состав, слоты, вид,
серверную разметку и подхват, поведение без скриптов и доступность. Работу с
данными приложения задаёт следующий стандарт (Динамический составной компонент (simai.dynamic-composite-component)).
Требования:
| Требование | Уровень | Суть |
|---|---|---|
slot-order-complete |
обязательно | Слоты и порядок отрисовки объявлены; неизвестный, пропущенный или повторный слот — ошибка, а не повод догадываться |
nesting-bounded |
обязательно | Глубина ограничена; повтор пары «компонент и вид» в стеке — цикл |
deterministic-placement-id |
обязательно | Идентификатор места — из экземпляра и позиции, не из данных и не случайный |
instance-isolation |
обязательно | Экземпляры не делят идентификаторы, ключи хранилища и записи реестров |
presentation-declared |
обязательно | Вид выбирается только объявленными в манифесте настройками |
asset-contract-exact |
обязательно | Объявленные ресурсы — ровно те, что нужны отрисовке: ничего не пропущено и ничего лишнего |
accessible-name-and-keys |
обязательно | Есть доступное имя; ориентир или виджет объявляет клавиши и сохраняет видимый фокус |
hydration-claim-truthful |
обязательно | Компонент, который заменяет серверную разметку, не называет это подхватом |
render-deterministic |
обязательно | Те же документ, данные и язык дают ту же разметку |
owns-its-subtree |
обязательно | Меняет только своё поддерево и созданные им поверхности, удаляет их вместе с собой |
direction-and-theme-neutral |
обязательно | Одна разметка для обоих направлений письма и любой темы |
no-script-equivalent |
следует | Без скриптов — осмысленный эквивалент или прямое сообщение |
handlers-scoped-to-host |
следует | Обработчики привязаны к своему элементу и действуют на экземпляр, который отправил событие |
escaped-structural-props |
следует | Структурные свойства экранируются; структурный документ вида не содержит разметки |
style-contained |
следует | Без глобальных селекторов и сброса стилей страницы |
Опоры стандарта: Recipe (simai.composition-recipe) и схема манифеста
Smart-компонента (simai.smart-component-manifest) — замороженная копия той
версии схемы, на которой стандарт издан; обе закреплены по версии и хешу.
Стандарт рамочный: имена событий, классы и ширины колонок — документация конкретного компонента. Требования проверяются вручную: автор компонента показывает, чем выполнено каждое; соответствие доказывают конкретные компоненты, а не стандарт. Уровень «следует» означает, что отступление объясняют в документации компонента.
Динамический составной компонент (simai.dynamic-composite-component)
Стандарт динамического составного компонента задаёт границу между составным компонентом и приложением, когда компонент показывает записи, сохраняет настройки и просит выполнить действия. Он наследует стандарт составного компонента целиком и отвечает на вопросы: кто чем владеет, как компонент просит, как приложение отвечает, что происходит при конфликте.
| Требование | Уровень | Суть |
|---|---|---|
structure-and-data-separated |
обязательно | Структурные свойства и данные запроса идут разными каналами; данные — только через свойства, объявленные связанными с запросом |
request-data-not-persisted |
обязательно | Данные запроса не сохраняются как определение, рецепт или общий снимок |
intent-not-patch |
обязательно | Компонент сообщает намерение; решает и проверяет приложение |
intent-carries-no-transport |
обязательно | В намерении нет адреса, запроса, токена |
intent-payload-exact |
обязательно | Содержимое намерения сверяется по точному набору ключей |
identity-by-reference |
обязательно | Идентификаторы из браузера — только ссылки; приложение перечитывает данные само |
mutation-carries-revision |
обязательно | Каждое изменение несёт последнюю увиденную ревизию |
server-compares-revision |
обязательно | Приложение сравнивает ревизию под блокировкой и на конфликт отвечает текущей ревизией |
conflict-keeps-draft |
обязательно | При конфликте несохранённый ввод не выбрасывается |
batch-all-or-nothing |
обязательно | Групповое изменение — всё или ничего |
sequenced-responses |
обязательно | Ответ старше последнего запроса отбрасывается |
dispose-releases |
обязательно | Уничтожение экземпляра отменяет его подписки и незавершённые запросы и не задевает другие |
settings-layers |
обязательно | Настройки: пакет → общие → личные; поля только общего слоя объявлены |
reset-is-a-write |
обязательно | Сброс настройки — запись со сравнением ревизии, а не удаление |
shared-and-personal-separated |
обязательно | Общие и личные настройки идут разными адресами с разными правами; владелец — из сессии |
endpoints-are-relative |
обязательно | Адреса — относительные пути; путь сам по себе не даёт доступа |
honest-unavailable |
следует | Без адреса компонент прямо говорит, что возможность не подключена |
shared-state-in-link |
следует | Состояние, которое другой человек должен увидеть по ссылке, живёт в адресе |
data-states-declared |
следует | Загрузка, есть данные, пусто, ошибка — объявлены и показаны |
Роли полей, типы представлений и модель запроса — профиль продукта поверх этого стандарта, а не он сам. Проверка ручная: автор компонента показывает, чем выполнено каждое требование.
Как это выглядит в компоненте — см. Связь с приложением: порты хоста и намерения.
Порт хоста (simai.composite-host-port)
Стандарт порта хоста делает сам стык между динамическим компонентом и приложением предметом договора. Стык объявлен, версионирован и проверяется набором проверок, поэтому изменение компонента не обнаруживается приложением только по поломке.
| Требование | Уровень | Суть |
|---|---|---|
port-declared |
обязательно | Порт объявлен в манифесте: данные, намерения, настройки — каждое со схемой |
port-versioned-separately |
обязательно | У порта своя версия, независимая от компонента |
port-schemas-closed |
обязательно | Схемы закрыты; лишний ключ отклоняют обе стороны |
intent-answers-declared |
обязательно | У намерения устойчивое имя, схема, признак «несёт ревизию» и перечень ответов хоста |
capabilities-negotiated |
обязательно | Необязательные части — именованные возможности; компонент предлагает только данные хостом |
permissions-come-with-data |
обязательно | Права приходят с данными, по каждой записи; компонент не выводит их сам |
answer-echoes-request |
обязательно | Ответ повторяет запрос, на который отвечает |
minor-is-additive / major-for-breaking |
обязательно | Младшая версия только добавляет; всё ломающее — новая старшая |
previous-major-kept |
обязательно | Прежняя старшая версия остаётся в изданных выпусках объявленный срок; отказ называет замену и дату |
host-declares-supported |
обязательно | Хост объявляет, какие версии порта реализует |
mismatch-is-honest |
обязательно | Если хост не реализует нужную версию, компонент сообщает, что возможность не подключена |
conformance-kit-published |
обязательно | С каждой версией порта издаётся набор проверок |
kit-is-transport-neutral |
обязательно | Набор описывает данные, намерения и ответы, а не адреса и форматы передачи |
host-claim-backed-by-kit |
обязательно | Поддержка заявляется только после прохождения набора |
reference-host-tested |
следует | Владелец проверяет каждый выпуск на эталонном хосте |
port-owned-by-component-owner |
обязательно | Продукт просит изменить порт, но не расширяет его у себя |
product-rules-in-profiles |
обязательно | Правила продукта — хранилище, права, типы полей — живут в профиле поверх порта |
change-recorded-with-recheck |
обязательно | Версия порта записывает, что изменилось и что хосту перепроверить |
pinned-by-exact-release |
следует | Продукт закрепляет компонент и порт точным изданным выпуском |
Стандарт наследует динамический составной компонент целиком. Проверка автоматическая у владельца: гейт сверяет объявление порта со схемой, байты порта — с закреплёнными в манифесте, намерения — с событиями, отпечаток набора — с самим набором, а эталонный хост проходит весь набор.
Порты и наборы проверок описаны в Порты и наборы проверок.
Фрагмент интерфейса (simai.interface-fragment)
Стандарт фрагмента интерфейса описывает страницу, собранную из составных компонентов, которые обновляют друг друга через объявленные контракты, и оболочку, у которой область содержимого меняется без полной загрузки страницы. Фрагмент — составной компонент с одним портом хоста, поставленный в именованную область страницы. Стандарт наследует порт хоста целиком; доступ к данным, права и ответы областей остаются за продуктом, а описание фрагмента, типы значений, маршруты и навигация по областям — за Framework.
| Требование | Уровень | Суть |
|---|---|---|
fragment-is-a-composite |
обязательно | Фрагмент — составной Smart-компонент в именованной области страницы: один порт хоста и опубликованные порты композиции; не страница, не шаблон и не серверная вставка со своим поведением |
descriptor-published |
обязательно | У каждого фрагмента есть описание simai.interface-fragment.v1: имя, элемент, области, стандарт и версия порта, выходы и входы с типами значений, операция доступа, ключи адреса и бюджет |
descriptor-checked |
обязательно | Гейт пакета проверяет каждое описание по схеме (SF.Composition.checkFragmentDescriptor) до выпуска; фрагмент без верного описания на страницу не ставится |
no-direct-calls |
обязательно | Фрагмент не вызывает методы и порт хоста другого фрагмента и не ищет его в DOM; сказанное другому уходит через опубликованный выход и приходит на объявленный вход |
routes-on-the-page |
обязательно | Страница — один layout.scope: фрагменты — его конечные точки, маршруты между портами объявляет страница; типы значений на концах маршрута совпадают |
closed-value-types |
обязательно | Значения между фрагментами — из закрытого перечня типов (record-changed, record-removed, collection-changed, files-moved, counter, navigation, preference-changed и типы композиции); имя типа без версии, прежняя метка (record-changed.v1) называет тот же тип и читается до 2026-12-01; у каждого типа схема и проверка; значение, не прошедшее проверку, отклоняется, а не приводится |
values-say-what-changed |
обязательно | Значение говорит, что и где изменилось, но не несёт сами данные: фрагмент перечитывает запись через свой порт со своими правами |
host-is-an-endpoint |
обязательно | Хост страницы — конечная точка layout.scope: последствия ответа порта публикуются на его выходах типизированными значениями и доставляются объявленными маршрутами |
failure-is-contained |
обязательно | Фрагмент, упавший при загрузке или отрисовке, заменяется на своём месте состоянием ошибки с повтором; остальная страница и маршруты работают |
five-states |
обязательно | Пять состояний, как у любого Smart-компонента: загрузка, есть данные, пусто, нет доступа, ошибка; загрузка — скелетон в своей области, а не пустой ответ |
access-before-placement |
обязательно | Фрагмент, операция которого человеку недоступна, не ставится или ставится в состоянии «нет доступа»; элементов управления, которые хост отклонит, он не показывает |
shareable-state-in-the-address |
обязательно | Состояние, которым делятся или к которому возвращаются, живёт в адресе под ключами из url_state; двум фрагментам страницы один ключ не принадлежит |
region-navigation |
обязательно | Ссылка внутри оболочки меняет область содержимого, а не страницу: заголовок запроса области, замена на месте со скелетоном только в этой области, адрес в истории, «Назад» и «Вперёд» с возвратом прокрутки, фокус на новом заголовке |
full-load-fallback |
обязательно | Если ревизия оболочки другая, ссылка просит полную загрузку, адрес на другом источнике или ответ области не такой, как объявлено, страница загружается целиком; наполовину заменённая страница не остаётся |
assets-once |
обязательно | Область приносит ресурсы своих фрагментов; ресурс, который уже есть на странице, повторно не запрашивается |
release-on-leave |
обязательно | Фрагмент, ушедший при замене области, отключается: маршруты, слушатели и таймеры освобождаются |
budget-declared |
обязательно | Фрагмент объявляет бюджет — килобайты сверх общей основы и миллисекунды до первого ответа; бюджет измеряют проверки пакета, превышение не проходит гейт |
versioned-with-its-port |
обязательно | Описание следует версиям порта: младшая версия только добавляет необязательные выходы, входы и ключи адреса; удаление, переименование или смена типа значения — новая старшая |
Проверка ручная: автор фрагмента показывает, чем выполнено каждое
требование. Форму описания и значения проверяет Framework
(SF.Composition.checkFragmentDescriptor по закреплённой схеме описания
1.2.0 и проверки типов значений). Маршруты между фрагментами задаёт комплект
Composition Routing 1.1.0: он сравнивает типы по имени без версии и записывает
обе формы имён в контрольном примере fixtures/value-type-names.json.
Как устроены описание и страница из фрагментов — см. Фрагменты интерфейса; типы значений — Типы значений маршрутов; навигация по областям — Навигация по областям страницы.
Правила взаимодействия (simai.interaction-rules)
Стандарт правил взаимодействия задаёт, как любой Smart-компонент —
простой или составной — загружается, говорит с другими компонентами и
рисует: одно действие — одна отрисовка, пять состояний со скелетоном для
загрузки и sf-empty-state для остальных, ожидание вместо «недоступно»,
свойства вниз и события вверх, маршруты между соседями, настройки вида через
SF.Preferences, лёгкая разметка для повторов, ресурсы вместе и один раз,
устойчивая геометрия, уменьшение движения, изоляция сбоев, работа без кадров
анимации и проверка каждого правила в сборке. Стандарт сквозной: он
относится ко всем компонентам и составным компонентам и не наследует другие
стандарты. Восемнадцать требований с пояснениями — на странице
Правила взаимодействия компонентов.
Разработка с ИИ (simai.ai-development)
Стандарт разработки с ИИ задаёт, как агент работает над Framework и с ним: сначала читает машинные контракты, пользуется только публичной поверхностью, не правит сгенерированное, закрепляет точные выпуски, обновляется по журналу изменений, называет форматы без версий, подключает порты по их наборам проверок, проверяет видимое в браузере и сдаёт работу доказательствами. Стандарт сквозной и не наследует другие. Шестнадцать требований с пояснениями — на странице Разработка с ИИ.
Фоновый эффект (simai.effect)
Стандарт фонового эффекта задаёт анимированный фон в одной области
страницы: манифест effect.json с типизированными настройками в границах,
один модуль с mount, update, pause, resume и destroy, неподвижный
кадр при уменьшении движения, покой в скрытой вкладке, отсутствие сетевых
запросов, чистое уничтожение, чужие эффекты в изолированном фрейме и набор
проверок перед показом в списке. Издание 1.1.0 содержит двадцать требований и
использует (uses) схему манифеста эффекта 1.2.0; на правила взаимодействия
оно опирается в части движения и сбоев. Требования о теме и окнах:
| Требование | Суть |
|---|---|
schemes-and-pair-declared |
Манифест называет схемы, для которых эффект нарисован: тёмную, светлую или обе, основную первой; каждая схема рисуется под свой фон, а не переворотом картинки. Без схем — обе. Эффект одной схемы может назвать пару — эффект другой схемы с той же ролью |
theme-follows-the-placement |
У размещения есть режим темы: как у страницы (по умолчанию), всегда тёмная или всегда светлая. Если эффект не рисует нужную схему, показывается пара; без пары тёмный эффект остаётся тёмным на светлой странице, а светлый на тёмной не показывается — вместо него ровная поверхность этой темы. Редактор предлагает только те режимы, которые эффект или его пара рисуют |
area-takes-the-drawn-theme |
Область эффекта получает тему, в которой он нарисован (theme-dark или theme-light), поэтому текст и элементы управления над ним берут роли этой темы. При настройках по умолчанию на самом светлом кадре основной текст даёт контраст не ниже 4.5:1, приглушённый — не ниже 3:1. Поэтому приглушённым над эффектом пишут только крупный текст, а мелкий текст берёт основную роль |
drawn-with-palette-tones |
Эффект рисует тонами палитры (--sf-primary-40, --sf-neutral-98): они одинаковы во всех темах и несут цвета проекта. Роли темы эффект не использует |
windows-are-mask-safe |
Эффект с возможностью windows рисует одну сплошную сцену за группой карточек, видную только сквозь них, следует размеру группы и не полагается на то, что скрыто маской. Тему эффекта получают только карточки-окна |
pair-under-the-same-trust |
Пара загружается под тем же доверием, что любой эффект: идентификатор проверяется по каталогу и его SHA-256, адрес вне закреплённого каталога — чужой и выполняется только в изолированном фрейме. В этом выпуске исполнителя для изолированного фрейма нет, поэтому такая пара отклоняется |
Как написать, подключить и проверить эффект и все требования — на странице Фоновые эффекты.
Жизненный цикл изменений (simai.change-lifecycle)
Стандарт жизненного цикла изменений задаёт, как публичное имя уходит из Framework, не ломая проекты. Он сквозной: применяется не к виду компонента, а ко всем публичным именам Framework — компонентам, утилитам, токенам.
Сроки записаны в политике contracts/lifecycle-policy.json, изменения — в
журнале contracts/changes/journal.json.
| Требование | Уровень | Суть |
|---|---|---|
one-version-line |
обязательно | Одна линия версий; имя уходит по календарю, а не с номером версии |
two-stages |
обязательно | Совместимость и удаление; третьего, недатированного состояния нет |
journal-records-every-change |
обязательно | Изменение, которое требует действий потребителя, без записи не выпускается |
record-says-what-to-write |
обязательно | Запись называет старую форму, замену и, если замена не механическая, инструкцию с примером «было — стало» |
record-dated-by-policy |
обязательно | Запись несёт дату отметки и день чистки, вычисленный по политике |
journal-append-only |
обязательно | Записи не удаляются; удалённое имя остаётся «надгробием» |
journal-chronological |
обязательно | Журнал идёт по датам и читается как история публичных имён |
no-alias-without-record |
обязательно | Прежнее имя в коде без записи в журнале роняет гейт |
sweep-on-schedule |
обязательно | Просроченная запись совместимости роняет гейт |
compat-out-of-the-way |
следует | Совместимость решается в общих местах (таблицы псевдонимов), а не в коде компонентов |
runtime-notes-use |
обязательно | Страница видит свои прежние имена в SF.deprecations.list() |
upgrade-from-the-journal |
обязательно | Обновление продукта читает журнал инструментом, а не прозу |
consumers-scanned-before-sweep |
следует | Перед чисткой известных потребителей проверяют инструментом обновления и переводят |
documented-for-readers |
обязательно | Политика, журнал и порядок обновления опубликованы; замена видна на странице компонента |
verified-by-gate |
обязательно | Гейт держит форму журнала, даты, правило дописывания и покрытие псевдонимов; браузерная проверка — заметку в работе |
extension-once-with-reason |
можно | Одно продление с причиной |
Как этим пользоваться в проекте — два этапа, календарь удалений, продление,
журнал и инструмент sf-upgrade — описано в Жизненный цикл изменений и совместимость и Как обновить проект; у Smart-компонентов —
в Ошибки и диагностика.
Пакет компонентов (simai.component-package)
Стандарт пакета компонентов задаёт, как владелец продукта или сторонний
автор расширяет Framework набором своих Smart-компонентов, в том числе
составных. Он покрывает устройство папки пакета, закрепление ревизии
Framework, правило и манифест каждого компонента, имена, воспроизводимую
сборку с квитанцией, поставку, объявление на странице, лицензию и доверие к
коду пакета. Владелец стандарта — Framework; стандарт лежит в исходниках
Framework (contracts/standards/simai.component-package/<версия>/).
Связи с другими стандартами (см. Связи между стандартами):
uses— манифест Smart-компонента (simai.smart-component-manifest), замороженная копия схемы 2.5.0 — той же, что действует для компонентов Framework;references—simai.composite-component,simai.dynamic-composite-component,simai.composite-host-portиsimai.change-lifecycle, каждый по версии и хешу. Их требования действуют для компонентов пакета так, как изданы, и в этом стандарте не повторяются.
Стандарт не наследует ни одного требования (extends у него нет): он
относится к отдельному виду — пакету компонентов.
Издания. Действующее издание — 1.1.1. С издания 1.1.0 стандарт закрепляет
схему манифеста 2.5.0, поэтому манифест компонента пакета объявляет те же
поля, что и компоненты Framework, в том числе presentation.skeleton и
персональный вид. Издание 1.1.1 только обновляет хеши изданий, на которые
стандарт ссылается (см. Переиздания без новых требований).
Требования во всех изданиях те же, что в 1.0.0. Издание 1.0.0 закрепляло схему 2.2.0,
хотя компоненты Framework, а значит и пакет, построенный на них, уже
объявляли поля до 2.5.0. Издания 1.0.0 и 1.1.0 остались в истории: их байты хранятся в
исходниках Framework (contracts/standards/history/simai.component-package/<версия>/),
а сайт документации публикует только действующее издание.
| Требование | Уровень | Суть |
|---|---|---|
extension-points-only |
обязательно | Пакет только добавляет к Framework через объявленные точки расширения; не заменяет его файлы и не меняет Loader, основу Smart-компонентов, компоненты и глобальные объекты Framework |
layout-like-framework |
обязательно | Папка устроена как исходники Smart-компонентов Framework: framework.lock.json, src/smart/<папка>/, tests/, по желанию docs/; остальное в пакет не входит |
package-may-be-a-folder |
можно | Пакет — корень репозитория или любая вложенная папка; папка в src/smart без файла правил — вспомогательная и как компонент не собирается |
framework-lock-form |
обязательно | framework.lock.json объявляет формат simai.framework.product-package-source-lock той старшей версии, которую задаёт стандарт |
one-framework-revision |
обязательно | Пакет собирается и тестируется на одной ревизии исходников Framework — полный коммит; переход на новую — правка lock-файла после выхода выпуска, тесты и новая сборка |
component-complete |
обязательно | У компонента есть index.js, rule.js, smart.manifest.json, объявленные шаблоны и стили; связи правила ведут к правилам пакета или выпуска Framework |
rule-is-own-plain-data |
обязательно | Файл правил компонента пишет ровно одно правило cl-<папка> простыми данными: без регулярных выражений, функций и поля пакета |
manifest-conforms |
обязательно | Манифест соответствует закреплённой схеме манифеста и называет тот же элемент, что и правило; составной компонент объявлен составным |
package-name-grammar |
обязательно | Одно имя пакета — строчные латинские буквы, цифры и дефис, начинается с буквы — во всех местах: lock-файл, сборка, файл правил, квитанция, страница |
names-do-not-collide |
обязательно | Папки, правила и элементы пакета не совпадают с Framework и с другими пакетами страницы; два правила пакета не называют один элемент |
own-element-prefix |
следует | Новый элемент получает префикс владельца, а не sf- |
tests-travel-with-package |
следует | Пакет несёт свои тесты и прогоняет их на закреплённой ревизии и своей сборке до использования |
builds-reproducibly |
обязательно | Сборка — только из закоммиченных файлов, дважды в новых каталогах, с побайтным совпадением |
receipt-for-every-build |
обязательно | Каждая используемая сборка сопровождается квитанцией; квитанция не объявляет пакет готовым к промышленной эксплуатации |
delivered-in-owners-distribution |
обязательно | Владелец поставляет пакет в своей поставке, рядом с выпуском Framework из квитанции, каждую сборку по своему пути |
declared-before-core |
обязательно | Страница объявляет пакет в SF_BOOT_CONFIG.packages.<имя>.base до запуска ядра; не загруженный компонент пакета не ищется среди компонентов Framework |
licence-is-owners |
обязательно | Пакет распространяется по лицензии владельца; код Framework внутри сборки сохраняет лицензию Framework |
package-code-is-trusted |
обязательно | Код пакета работает на странице с теми же правами, что и Framework; страница объявляет только пакеты, которым доверяет владелец |
ports-pinned-by-bytes |
обязательно | Компонент, который реализует порт Framework, объявляет его в манифесте по имени, версии и хешу байтов; порт не копируется и не меняется |
public-names-follow-lifecycle |
обязательно | Публичные имена пакета уходят по жизненному циклу изменений, записанному в журнале владельца |
Требование framework-lock-form проверяется машинно (equals), остальные
показывает автор пакета (manual).
О требовании own-element-prefix: новые элементы пакета получают префикс
владельца (shop-catalog), поэтому будущий элемент Framework не займёт их
имя. Loader это поддерживает: он загружает любой тег, который перечислен в
правиле пакета, а тег без префикса sf- может занять только правило пакета
(см. Пакеты компонентов). Компонент, перенесённый из Framework в пакет, сохраняет имя с
sf-, пока его не переименуют через жизненный цикл изменений. В манифесте
компонента пакета custom_element называет тег с префиксом владельца, а id
начинается с smart. (см. Разделы манифеста).
О требовании tests-travel-with-package: тесты лежат в tests/ папки пакета
и запускаются в дереве, где исходники Framework закреплённой ревизии
соединены с src/, tests/ и docs/ пакета, — том же, из которого
собирается пакет (см. Пакеты компонентов продуктов). sf-build их не запускает: пакет
запускает их сам стандартным исполнителем Node — node --test с файлами
tests/*.test.mjs в этом дереве. Так делает пакет larena: его
scripts/test.mjs раскладывает дерево и запускает в нём свои тесты и общие
проверки Framework.
Как устроен, собирается и подключается пакет — см. Пакеты компонентов продуктов, Сборка пакета: sf-build и Пакеты компонентов.
Имена и версии
Имя стандарта, формата данных или порта не содержит версии. Версия меняется с каждым изданием, имя остаётся прежним, поэтому тексты, документы и ссылки, которые называют имя, при выпуске не правятся.
Правила:
- Стандарт —
idбез версии иversionотдельно, полная версия<старшая>.<младшая>.<исправление>(см. Конверт). Пример:simai.composite-host-port. - Формат данных — имя в поле
schema(simai.<имя>) без версии и старшая версия отдельно, в полеschema_version, целым числом. Совместимое добавление её не меняет, поэтому сохранённые файлы ради него не переписываются. - Старшая версия формата равна старшей версии стандарта, который его
определяет. Стандарт
simai.composition-recipeопределяетsimai.composition.document, и старшие версии у них совпадают (см. Уровни стандартов). - Тексты называют только имя. Версия записана в поле самого файла, в карте стандартов (см. Уровни стандартов) и в записи о выпуске (см. Выпуск и запись о выпуске). Где требование зависит от версии, текст говорит «по версии и хешу» или «новая старшая версия», не называя номер.
- Путь может содержать версию там, где рядом лежат несколько версий:
contracts/standards/<id>/<version>/,distr/core/contracts/ports/<порт>/<версия>/, закреплённые копии вpinned/. В тексте такой путь записывается с подстановкой<версия>.
Форматы со старшей версией в самой метке (всего 40 меток) переходят на пару
schema и schema_version путём, описанным ниже: запись
журнала format-names-without-version (совместимость до 2026-12-01). Каждый
читатель Framework, sf-build и читатель файла закрепления Larena принимают
обе формы — simai.<имя>.v<n> и simai.<имя> с schema_version рядом, поэтому
документ в любой из них читается одинаково.
Писатели Framework выпускают форму без версии: документы композиции
("schema": "simai.composition.document", "schema_version": 1), манифесты
типов, портов и редакторов композиции, виды полей, реестры типов, портов и
манифестов редакторов,
журнал изменений (simai.change-journal) и файлы данных поставки —
публичные переменные, уведомления о стороннем коде и другие. Документ,
собранный из рецепта, берёт форму рецепта: рецепт с версией в метке даёт
simai.composition.document.v1. С версией в метке пишутся реестр
контрактов Smart-компонентов, порты хоста и их
наборы проверок, закрепления контрактов возможностей и рецептов, lock-файл и
примеры комплекта Recipe (рецепт с версией в метке даёт те же digest), а также форматы продуктов и инструментов: описание фрагмента
(simai.interface-fragment.v1), манифест эффекта (simai.effect.v1), файл
закрепления пакета (simai.framework.product-package-source-lock.v1) и файл
настроек sf-build (simai.sf-build.config.v1). Примеры документации
записаны в той форме, в которой их пишет Framework.
Типы значений маршрутов называются без версии (record-removed);
метка с версией (record-removed.v1) называет тот же тип и читается до
2026-12-01 (запись журнала value-types-without-version). Манифест sf-table,
выходы <sf-page-host> и ключи SF.Composition.VALUE_TYPES записаны
метками с версией, поэтому их байты и digest не меняются (см. Имя типа).
Обе формы разбирает модуль Framework core/js/composition/schema-name.mjs (в поставке — рядом с модулями композиции):
readSchema() сводит simai.<имя>.v<n> и simai.<имя> с schema_version к
одному {name, version}, а schemaFields() выдаёт писателю новую форму.
Несовместимое изменение формата проходит жизненный цикл изменений (см. Жизненный цикл изменений и совместимость и Как обновить проект):
- Совместимость. Читатели принимают обе формы, писатели выпускают новую; журнал изменений получает запись об изменении формата (см. Журнал изменений).
- Перевод проекта.
sf-upgradeпереписывает данные проекта в новую форму, при несовместимом изменении — преобразователем (см. Инструментsf-upgrade). - Удаление. Старая форма удаляется на плановой чистке по календарю (см. Календарь).
Новый формат сразу использует пару schema и schema_version.
Смотрите также
- Форма стандарта: Standard Contract — форма, в которой записан каждый стандарт.
- Порты и наборы проверок — порты и наборы проверок.
- Составные компоненты–Манифест — составные компоненты, порты хоста и манифест на практике.
- Пакеты компонентов продуктов и Пакеты компонентов — пакет компонентов на практике.
- Жизненный цикл изменений и совместимость–Как обновить проект — жизненный цикл изменений и обновление проекта; там же — смена формата данных (Имена и версии).
- Recipe, документ и HTML — Composition Recipe и Document.