Что такое Xenkey?
Xenkey — атомарная единица смысла о реальном объекте — бизнесе, продукте, сервисе, месте, человеке, процессе или событии. Он написан для понимания ИИ, а не для маркетингового убеждения.
Каждый Xenkey представляет одну минимальную, проверяемую идею. Версия спецификации указывается в каждом документе:
{ "spec": "1.0" }Цели дизайна
Правда вместо убеждения
Опишите реальность, а не продвижение.
Контекстность
Фиксируйте когда, где и для кого это применимо.
Композиционность
Многие Xenkey описывают один объект.
Читаемость для ИИ
Строгая структура для поиска и индексации.
Идентичность
| Поле | Тип | Описание |
|---|---|---|
| id | string | Основной идентификатор. Формат: xk_ + ULID |
| ulid | string | Опционально. Производен от суффикса id (должен совпадать, если указан) |
| spec | "1.0" | Версия спецификации |
Жизненный цикл и изменяемость
Xenkey следует строгому жизненному циклу, обеспечивающему целостность данных и доверие.
Правила изменяемости
- •Черновик — можно свободно редактировать
- •Опубликован — неизменяемый. Изменения требуют нового Xenkey
- •Если
published_atзадан, статус не может бытьdraft
| Поле | Тип | Описание |
|---|---|---|
| status | enum | draft | unpublished | published | archived |
| created_at | datetime | Время создания (RFC 3339) |
| published_at | datetime | Когда Xenkey был опубликован |
| updated_at | datetime | Внутреннее/только чтение, задаётся API |
| etag | string | Внутреннее/только чтение, контроль конкурентности |
Смысловое ядро
Сердце каждого Xenkey. Четыре обязательных поля, фиксирующие структурированную единицу правды.
| Поле | Тип | Описание |
|---|---|---|
| title | string | Короткий описательный идентификатор опыта |
| fact | string | Фактическое, проверяемое утверждение о реальности |
| meaning | string | Почему этот факт важен для людей |
| context | string | Когда, где и для кого это применимо |
| constraints | string | Свободные нюансы, не отражённые в структурных полях |
Область и якоря
Якоря привязывают Xenkey к реальным сущностям. Каждый Xenkey должен иметь хотя бы один якорь. Поддержка нескольких якорей позволяет одному Xenkey описывать пересечение нескольких объектов.
| Поле | Тип | Описание |
|---|---|---|
| organization_id | string | Организация‑владелец |
| base_id | string | Логическая группа (workspace/project) |
| unit_id | string | Опциональная ссылка на запись в структурных данных |
| anchors[] | array | Массив объектов‑якорей (минимум 1) |
{
"anchor_id": "anchor_001",
"anchor_type": "product",
"role": "primary"
}| Поле | Тип | Описание |
|---|---|---|
| tags | string[] | Классификационные теги (например, booking_required, wifi) |
| emotions | string[] | Коды эмоционального контекста (из emotion-codes.json) |
| vibe | string | Описание атмосферы / настроения |
| seasons | string[] | Применимые сезоны |
| time_of_day | string[] | Применимое время суток |
| meal | string[] | Применимые приёмы пищи |
Демография
| Поле | Тип | Описание |
|---|---|---|
| age_min | integer | Минимальный рекомендуемый возраст |
| age_max | integer | Максимальный рекомендуемый возраст (должен быть >= age_min) |
| gender | string | Целевая гендерная аудитория (если применимо) |
География
Xenkey может быть глобальным или гео‑ограниченным. Поле geo_scope определяет, какие географические поля обязательны.
| Поле | Тип | Описание |
|---|---|---|
| geo_scope | enum | Уровень географической точности |
| country | string | Код страны ISO 3166-1 alpha-2 |
| region | string | Регион / штат / провинция |
| city | string | Название города |
| timezone | string | Название часового пояса IANA (например, Europe/Rome) |
| geo | [lng, lat] | Координаты как [долгота, широта] |
| availability_countries | string[] | Страны, где это доступно (не местоположение) |
Правила области: Если geo_scope=country то country обязателен. Если geo_scope=region то country и region (or city) обязательны. Если geo_scope=point то geo обязателен.
Локализация
| Поле | Тип | Описание |
|---|---|---|
| locale | string | Языковой тег (например, en-US, ja-JP) |
| source_locale | string | Исходный язык контента |
| translation_group | string | Группирует переводы. Формат: tg_ + ULID |
| is_source_locale | boolean | True, если это исходная языковая версия |
Правило: Если is_source_locale = true, то locale должен совпадать с source_locale. Переводы используют ту же translation_group.
Целостность
Опубликованные Xenkey включают криптографический хэш, вычисленный при публикации, что обеспечивает целостность контента.
| Поле | Тип | Описание |
|---|---|---|
| hash_alg | "sha256" | Используемый алгоритм хэширования |
| hash_id | string | Уникальный идентификатор хэша. Формат: hash_ + ULID |
| hash | string | SHA-256 хэш канонического payload |
Индексация и приватность
Xenkey может публиковаться в нескольких каналах. Каждый канал включает разные возможности извлечения.
| Поле | Тип | Описание |
|---|---|---|
| publication | string[] | Каналы: vector, graph, aidex |
| is_published | boolean | True, если опубликован хотя бы в одном канале |
| is_vector | boolean | Индексируется в векторном хранилище (Qdrant) |
| is_graph | boolean | Проецируется в граф знаний (Neo4j) |
| is_aidex | boolean | Опубликован в Aidex robot‑oriented wiki |
| is_private | boolean | Виден только в рамках организации |
Правила:
- •
aidexтребуетvector(оба должны быть в publication) - • Если
is_published=truepublication должен содержать хотя бы одну запись - • Aidex — робот‑ориентированный слой wiki с более строгими квотами, чем векторная индексация
Векторный и графовый поиск
Опубликованные Xenkey автоматически превращаются в две взаимодополняющие структуры данных, обеспечивая гибридный поиск для ИИ.
Векторный индекс (Qdrant)
- • Источник текста:
fact + meaning + context - • Преобразуется в высокоразмерные эмбеддинги
- • Обеспечивает семантический поиск по сходству
- • Фильтры payload: status, geo, tags, emotions, time
- • Идемпотентность: ключ (id, version)
Граф знаний (Neo4j)
- • Узлы: Xenkey, Organization, Object, Tag, Emotion
- • Рёбра: OWNS, DESCRIBED_BY, TAGS, EXPRESSES
- • Показывает связи и структуру
- • Идемпотентный MERGE по естественным ключам
- • Позволяет выполнять графовые запросы
Гибридный поиск сочетает векторное сходство со структурными фильтрами графа, обеспечивая обоснованные и объяснимые ответы ИИ. Индексационный конвейер асинхронный, с повторами и очередями dead-letter.
Инварианты
- ✓
anchorsдолжны быть заданы и не пусты - ✓Если присутствуют
age_minиage_maxто age_max >= age_min - ✓Если
geoзадан, он должен быть[longitude, latitude] - ✓
geo_scope=countryтребуетcountry - ✓
geo_scope=regionтребуетcountry + region (or city) - ✓
geo_scope=pointтребуетgeo - ✓
aidexв publication подразумеваетvectorв publication - ✓
is_published=trueтребует непустойpublication[]
Примеры
Черновой Xenkey (минимальный)
{
"spec": "1.0",
"id": "xk_01J8Y6S4V9ZQ3M9K2W2M8JQY5C",
"status": "draft",
"created_at": "2026-01-21T12:00:00Z",
"organization_id": "org_123",
"base_id": "base_123",
"anchors": [
{ "anchor_id": "anchor_1", "anchor_type": "product", "role": "primary" }
],
"title": "Fresh espresso",
"fact": "A 30 ml espresso shot made from 100% Arabica beans.",
"meaning": "Represents the cafe's standard espresso offering.",
"context": "Default menu item available all day.",
"locale": "en-US",
"source_locale": "en-US",
"translation_group": "tg_01J8Y6S6Q4K8FKJ1PS2H0WQ1B8",
"is_source_locale": true,
"hash_alg": "sha256",
"hash_id": "hash_01J8Y6S6Q4K8FKJ1PS2H0WQ1B9",
"hash": "6e4f8c9d8b0f7a6d3b3a0f3c1f8e9d6e...",
"is_vector": false,
"is_graph": false,
"is_aidex": false,
"publication": [],
"is_published": false,
"is_private": false
}Опубликованный Xenkey (с гео + векторной индексацией)
{
"spec": "1.0",
"id": "xk_01J8Y6S9QH8P2G8P6X1K3R2H5A",
"status": "published",
"created_at": "2026-01-21T12:05:00Z",
"published_at": "2026-01-21T12:10:00Z",
"organization_id": "org_123",
"base_id": "base_123",
"unit_id": "unit_456",
"anchors": [
{ "anchor_id": "anchor_1", "anchor_type": "product", "role": "primary" }
],
"title": "Fresh espresso",
"fact": "A 30 ml espresso shot made from 100% Arabica beans.",
"meaning": "Represents the cafe's standard espresso offering.",
"context": "Default menu item available all day.",
"tags": ["coffee", "espresso", "menu_item"],
"time_of_day": ["morning", "afternoon"],
"meal": ["breakfast", "coffee_time"],
"vibe": "energetic",
"geo_scope": "point",
"country": "IT",
"city": "Milan",
"timezone": "Europe/Rome",
"geo": [9.1900, 45.4642],
"locale": "en-US",
"source_locale": "en-US",
"translation_group": "tg_01J8Y6S6Q4K8FKJ1PS2H0WQ1B8",
"is_source_locale": true,
"hash_alg": "sha256",
"hash_id": "hash_01J8Y6S6Q4K8FKJ1PS2H0WQ1B9",
"hash": "6e4f8c9d8b0f7a6d3b3a0f3c1f8e9d6e...",
"is_vector": true,
"is_graph": false,
"is_aidex": false,
"publication": ["vector"],
"is_published": true,
"is_private": false
}Эта спецификация — каноническая ссылка для Xenkey spec=1.0.
Каноническая JSON‑схема: xenkey_schema_v1_0.json