Documentación técnica

Especificación Xenkey v1.0

La especificación autorizada y legible de Xenkey spec=1.0. Esquema, modelo de significado, reglas de ciclo de vida, indexación y comportamiento técnico.

¿Qué es un Xenkey?

Un Xenkey es una unidad atómica de significado sobre un objeto del mundo real — un negocio, producto, servicio, lugar, persona, proceso o evento. Está escrito para comprensión de IA, no para persuasión de marketing.

Cada Xenkey representa una sola idea mínima y falsable. La versión de la especificación se declara en cada documento:

encabezado del esquema
{ "spec": "1.0" }

Objetivos de diseño

Verdad sobre persuasión

Describe la realidad, no la promoción.

Contextualidad

Captura cuándo, dónde y para quién aplica.

Componibilidad

Muchos Xenkeys describen un objeto.

Legibilidad para IA

Estructura estricta para recuperación e indexación.

Identidad

CampoTipoDescripción
idstringIdentificador primario. Formato: xk_ + ULID
ulidstringOpcional. Derivado del sufijo de id (debe coincidir si está presente)
spec"1.0"Versión de la especificación

Ciclo de vida y mutabilidad

Los Xenkeys siguen un ciclo de vida estricto que garantiza la integridad y la confianza de los datos.

Estados:
draftunpublishedpublishedarchived

Reglas de mutabilidad

  • Draft — se puede editar libremente
  • Published — inmutable. Los cambios requieren un nuevo Xenkey
  • Si published_at está establecido, el estado no puede ser draft
CampoTipoDescripción
statusenumdraft | unpublished | published | archived
created_atdatetimeMarca de tiempo de creación (RFC 3339)
published_atdatetimeCuándo se publicó el Xenkey
updated_atdatetimeInterno/solo lectura, establecido por la API
etagstringInterno/solo lectura, usado para control de concurrencia

Núcleo de significado

El corazón de cada Xenkey. Cuatro campos obligatorios que capturan una unidad estructurada de verdad.

CampoTipoDescripción
titlestringIdentificador corto y descriptivo de la experiencia
factstringAfirmación factual y verificable sobre la realidad
meaningstringPor qué este hecho importa a las personas
contextstringCuándo, dónde y para quién aplica
constraintsstringMatiz en texto libre no capturado por campos estructurados

Alcance y anclas

Las anclas vinculan Xenkeys a entidades del mundo real. Cada Xenkey debe tener al menos una ancla. El soporte multiancla permite que un Xenkey describa la intersección de múltiples objetos.

CampoTipoDescripción
organization_idstringOrganización propietaria
base_idstringAgrupación lógica (workspace/proyecto)
unit_idstringReferencia opcional de entrada de datos estructurada
anchors[]arrayArreglo de objetos ancla (mín 1)
objeto ancla
{
  "anchor_id": "anchor_001",
  "anchor_type": "product",
  "role": "primary"
}
Tipos de ancla:
productservicepersonlocationeventprocessresource

Etiquetas, emociones y vibe

CampoTipoDescripción
tagsstring[]Etiquetas de clasificación (p. ej., booking_required, wifi)
emotionsstring[]Códigos de contexto emocional (de emotion-codes.json)
vibestringDescripción de atmósfera / estado de ánimo
seasonsstring[]Temporadas aplicables
time_of_daystring[]Momentos del día aplicables
mealstring[]Periodos de comida aplicables
Temporadas:
springsummerautumnwinterall_yearholidaynew_yearchristmasorient_new_year
Hora del día:
all_dayearly_morningmorningnoonafternooneveningnightlate_night
Comida:
breakfastbrunchlunchdinnersuppertea_timecoffee_timesnack_time

Demografía

CampoTipoDescripción
age_minintegerEdad mínima recomendada
age_maxintegerEdad máxima recomendada (debe ser >= age_min)
genderstringGénero objetivo (si aplica)

Geografía

Los Xenkeys pueden ser globales o con alcance geográfico. El campo geo_scope determina qué campos geográficos son obligatorios.

Alcances geográficos:
globalcountryregionpoint
CampoTipoDescripción
geo_scopeenumNivel de precisión geográfica
countrystringCódigo de país ISO 3166-1 alpha-2
regionstringRegión / estado / provincia
citystringNombre de la ciudad
timezonestringZona horaria IANA (p. ej., Europe/Rome)
geo[lng, lat]Coordenadas como [longitud, latitud]
availability_countriesstring[]Países donde está disponible (no ubicación)

Reglas de alcance: Si geo_scope=country entonces country es obligatorio. Si geo_scope=region entonces tanto country como region (o city) son obligatorios. Si geo_scope=point entonces geo es obligatorio.

Localización

CampoTipoDescripción
localestringEtiqueta de idioma (p. ej., en-US, ja-JP)
source_localestringIdioma original del contenido
translation_groupstringAgrupa traducciones. Formato: tg_ + ULID
is_source_localebooleanVerdadero si esta es la versión en el idioma original

Regla: Si is_source_locale = true, entonces locale debe ser igual a source_locale. Las traducciones reutilizan el mismo translation_group.

Integridad

Los Xenkeys publicados incluyen un hash criptográfico calculado en el momento de publicación, garantizando la integridad del contenido.

CampoTipoDescripción
hash_alg"sha256"Algoritmo de hash utilizado
hash_idstringIdentificador único de hash. Formato: hash_ + ULID
hashstringHash SHA-256 del payload canónico

Indexación y privacidad

Los Xenkeys pueden publicarse en múltiples canales. Cada canal habilita capacidades de recuperación diferentes.

CampoTipoDescripción
publicationstring[]Canales: vector, graph, aidex
is_publishedbooleanVerdadero si se publica en al menos un canal
is_vectorbooleanIndexado en el store vectorial (Qdrant)
is_graphbooleanProyectado al grafo de conocimiento (Neo4j)
is_aidexbooleanPublicado en Aidex, wiki orientada a robots
is_privatebooleanVisible solo para acceso con alcance de organización

Reglas:

  • aidex requiere vector (ambos deben estar en publication)
  • • Siis_published=true publication debe tener al menos una entrada
  • • Aidex es una capa wiki orientada a robots con cuotas más estrictas que la indexación vectorial

Recuperación vectorial y de grafos

Los Xenkeys publicados se transforman automáticamente en dos representaciones de datos complementarias, habilitando recuperación híbrida para IA.

Índice vectorial (Qdrant)

  • • Fuente de texto:fact + meaning + context
  • • Convertido a embeddings de alta dimensionalidad
  • • Habilita búsqueda de similitud semántica
  • • Filtros de payload: estado, geo, etiquetas, emociones, tiempo
  • • Idempotencia: clave (id, version)

Grafo de conocimiento (Neo4j)

  • • Nodos: Xenkey, Organization, Object, Tag, Emotion
  • • Aristas: OWNS, DESCRIBED_BY, TAGS, EXPRESSES
  • • Revela relaciones y estructura
  • • MERGE idempotente sobre claves naturales
  • • Habilita consultas de recorrido de grafos

Recuperación híbrida combina similitud vectorial con filtros estructurales de grafo, habilitando respuestas de IA fundamentadas y explicables. El pipeline de indexación es asíncrono con reintentos y colas de mensajes muertos.

Invariantes

  • anchors deben estar presentes y no vacíos
  • Si ambosage_min y age_max están presentes: age_max >= age_min
  • Sigeo está presente, debe ser [longitude, latitude]
  • geo_scope=country requiere country
  • geo_scope=region requiere country + region (or city)
  • geo_scope=point requiere geo
  • aidex en publication implica vector en publication
  • is_published=true requiere publication[] no vacía

Payloads de ejemplo

Xenkey en borrador (mínimo)

draft-xenkey.json
{
  "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 publicado (con geo + indexación vectorial)

published-xenkey.json
{
  "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
}

Esta especificación es la referencia canónica de Xenkey spec=1.0.

Esquema JSON canónico: xenkey_schema_v1_0.json