JSON Schema Formal del Objeto de Certificación
Define el JSON Schema formal del objeto de certificación del Estándar LM v1.0. Es la fuente de verdad para la validación automática de certificados por cualquier sistema — portal territorial, herramienta de auditoría, validador de terceros o agente de IA.
1. Propósito y Alcance
Ámbito de aplicación: todo registro JSON emitido por un portal territorial, toda herramienta de validación que declare conformidad con el Estándar LM, todo sistema de terceros que consuma o referencie certificados del ecosistema.
2. JSON Schema — Objeto de Certificación LM v1.0
El siguiente es el JSON Schema completo y oficial del objeto de certificación. DEBE usarse con JSON Schema Draft 07 o superior.
URL pública del esquema: https://estandar.luvameta.com/schemas/certification_record_v1.json
3. Especificación de Campos — Nivel Raíz
| Campo | Tipo | Nivel | Patrón / Valores | Descripción y reglas |
|---|---|---|---|---|
"type" | string | DEBE | const: "certification_record" | Valor fijo. Cualquier otro string invalida el objeto. |
"cert_id" | string | DEBE | ^[A-Z]{2}-[0-9]{4,}$ | Dos letras mayúsculas + guión + mínimo 4 dígitos. Ej: CL-0001. |
"status" | string | DEBE | ACTIVE | SUSPENDED | REVOKED | Solo estos tres valores son válidos. En la emisión inicial DEBE ser "ACTIVE". |
"country" | string | DEBE | ^[A-Z]{2}$ | ISO 3166-1 alpha-2 en mayúsculas. DEBE coincidir con el prefijo de cert_id. |
"issued_by" | string (uri) | DEBE | ^https://[a-z]{2}.luvameta.com$ | URL del portal emisor. Solo subdominio de dos letras en minúsculas. |
"authorized_by" | string (uri) | DEBE | ^https://[a-z]+.luvameta.com$ | URL del nodo territorial correspondiente en estado ACTIVE. |
"root_authority" | string | DEBE | const: "https://luvameta.com" | Valor fijo absoluto. No se acepta ninguna variación incluyendo www o http. |
"issued_at" | string (date) | DEBE | AAAA-MM-DD | Fecha real de emisión. DEBE ser igual o anterior a updated_at. |
"updated_at" | string (date) | DEBE | AAAA-MM-DD | En emisión inicial DEBE ser idéntica a issued_at. Se actualiza en cada cambio. |
4. Especificación del Bloque subject
El bloque subject contiene la identidad semántica de la entidad certificada. Es el bloque más rico semánticamente del certificado y el que los sistemas externos —incluyendo IAs y motores de búsqueda— usarán para entender qué entidad opera el dominio certificado.
| Campo | Tipo | Nivel | Restricción | Descripción y reglas |
|---|---|---|---|---|
"domain" | string (uri) | DEBE | ^https:// | DEBE comenzar con https://. DEBE ser el mismo dominio donde está publicado el .well-known/. DEBE resolver al momento de la auditoría. |
"category" | string (enum) | DEBE | 5 valores controlados | Solo se aceptan los cinco valores del vocabulario controlado. Cualquier otro valor invalida el campo. |
"title" | string | DEBE | min: 2 / max: 100 | Nombre real de la entidad. NO DEBE estar vacío ni ser un placeholder. DEBE coincidir con el nombre visible del sitio auditado. |
"description" | string | DEBE | min: 10 / max: 280 | DEBE estar en el idioma declarado en language. DEBE ser coherente con el contenido del sitio. |
"language" | string | DEBE | ^[a-z]{2}$ | ISO 639-1 en minúsculas. Conformes: "es", "en". No conformes: "ES", "ESP". |
"territory_scope" | string | DEBE | ^[A-Z]{2}$ | ISO 3166-1 alpha-2 en mayúsculas. DEBE coincidir con el campo country a nivel raíz. |
"legal_form" | string | DEBERÍA | Texto libre | Campo recomendado. Si está presente DEBE ser coherente con la naturaleza de la entidad. |
"owner" | object | DEBE | Ver sección 5 | Objeto con datos del operador responsable. DEBE contener al menos type y name. |
5. Especificación del Bloque owner
El bloque owner identifica al operador responsable de la entidad certificada. Es el vínculo entre la identidad digital y la persona natural u organización que la opera.
| Campo | Tipo | Nivel | Restricción | Descripción y reglas |
|---|---|---|---|---|
"type" | string (enum) | DEBE | "Person" | "Organization" | Solo se aceptan exactamente estos dos valores con esta capitalización. "person" o "PERSON" invalidan el campo. |
"name" | string | DEBE | min: 2 | Nombre real del operador. NO DEBE ser anónimo, genérico ni placeholder. |
"role" | string | DEBERÍA | Texto libre | Rol del operador dentro de la entidad. Ejemplos: "Founder and Owner", "CEO", "Director". |
6. Especificación del Bloque verification
El bloque verification contiene los datos criptográficos que demuestran el control técnico del dominio certificado. Es la prueba técnica central del sistema.
"hash" DEBE ser el resultado de aplicar SHA-256 sobre el valor exacto del campo "challenge" como string UTF-8 sin espacios adicionales ni saltos de línea. Cualquier diferencia —incluyendo un solo carácter— produce un hash completamente distinto y la verificación FALLA.
| Campo | Tipo | Nivel | Restricción | Descripción y reglas |
|---|---|---|---|---|
"method" | string | DEBE | const: "well-known-file" | Valor fijo en v1.0. Único método de verificación aceptado. |
"proof_url" | string (uri) | DEBE | .well-known/luvameta.txt | DEBE terminar en /.well-known/luvameta.txt. DEBE usar https. DEBE corresponder al dominio del subject.domain. |
"challenge" | string | DEBE | LM-[CC]-[ID]-[AAAAMMDD]-[hex8] | Formato exacto. Ej: LM-CL-0001-20260412-a3f7b2c9 |
"hash_algo" | string | DEBE | const: "sha256" | Valor fijo. Único algoritmo de hash aceptado en v1.0. |
"hash" | string | DEBE | ^[a-f0-9]{64}$ | Resultado de SHA-256(challenge). Exactamente 64 caracteres hexadecimales en minúsculas. El auditor DEBE recalcular y verificar. |
7. Especificación del Bloque protocols
El bloque protocols referencia las tres URLs de los documentos normativos del portal territorial que regularon el proceso de evaluación y emisión.
| Campo | Tipo | Nivel | Restricción | Descripción |
|---|---|---|---|---|
"investigation" | string (uri) | DEBE | ^https:// | URL del protocolo de investigación del portal. DEBE resolver con HTTP 200 y devolver JSON válido. |
"operation" | string (uri) | DEBE | ^https:// | URL del protocolo de operación del portal. DEBE resolver y pertenecer al portal declarado en issued_by. |
"policy" | string (uri) | DEBE | ^https:// | URL de la política general del portal. DEBE resolver con HTTP 200. |
8. Ejemplo de Registro JSON Conforme
9. Errores de Validación Frecuentes
| # | Campo afectado | Error frecuente | Corrección requerida |
|---|---|---|---|
| E01 | "language" | Valor "es" escrito como "ES", "ESP" o "Espanol". | Usar exactamente dos letras minúsculas según ISO 639-1. El patrón ^[a-z]{2}$ rechaza mayúsculas. |
| E02 | "country" / "territory_scope" | Valor "CL" escrito como "cl", "Chile" o "CHL". | Usar exactamente dos letras mayúsculas según ISO 3166-1 alpha-2. |
| E03 | "issued_by" | URL con www, con http:// o sin el patrón de dos letras del subdominio. | Solo se acepta https://[dos-letras].luvameta.com. Sin www, sin http. |
| E04 | "root_authority" | Valor con www, con http:// o con barra final. | El valor DEBE ser exactamente "https://luvameta.com" sin variaciones. |
| E05 | "hash" | Hash en mayúsculas, con longitud distinta a 64 o calculado sobre un valor distinto al challenge exacto. | El hash DEBE ser SHA-256 del challenge exacto, en minúsculas, exactamente 64 caracteres. |
| E06 | "challenge" | Formato incorrecto: falta prefijo LM, fecha con separadores, hex con mayúsculas o menos de 8 chars. | Formato exacto: LM-[CC]-[NNNN]-[AAAAMMDD]-[8hex]. Fecha sin separadores. Hex en minúsculas. |
| E07 | "category" | Valor no listado en el vocabulario controlado o con capitalización incorrecta. | Usar exactamente uno de los cinco valores del enum en minúsculas con guión bajo. |
| E08 | "owner.type" | Valor "person", "PERSON" o "persona". | Solo se aceptan "Person" y "Organization" con esa capitalización exacta. |
| E09 | "proof_url" | URL que no termina en /.well-known/luvameta.txt o que usa http://. | La URL DEBE seguir el patrón exacto: https://[dominio]/.well-known/luvameta.txt. |
| E10 | "issued_at" / "updated_at" | Fecha en formato DD/MM/AAAA, "abril 2026" o con hora incluida. | Usar formato ISO 8601: AAAA-MM-DD. Sin hora, sin separadores distintos al guión. |
10. Uso del Esquema para Validación Automática
JavaScript / Node.js (AJV)
Python (jsonschema)
v1). Cuando se publique una nueva versión del Estándar LM, el esquema de la versión anterior permanecerá disponible en su URL original. Los certificados emitidos bajo v1 siguen siendo válidos contra el esquema v1 aunque exista una versión posterior.
11. Control del Documento
| Versión | Fecha | Descripción | Autorizado por |
|---|---|---|---|
| 1.0 | 2026 | Versión inicial. Define el JSON Schema completo, especificación campo por campo de los cinco bloques, tabla de errores frecuentes y ejemplos de validación en código. | Nodo Raíz |