LM-STD-02 v1.0 2026 VIGENTE

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.

Prerequisito: LM-STD-01

1. Propósito y Alcance

Función del JSON Schema en el ecosistema
El JSON Schema no reemplaza el proceso de auditoría humana. Lo complementa: la auditoría humana evalúa coherencia semántica y contexto; el JSON Schema evalúa corrección técnica. Un certificado que pasa la validación del esquema pero falla la auditoría semántica NO es conforme. Ambas validaciones son obligatorias.

Á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

{ "$schema": "https://json-schema.org/draft-07/schema", "$id": "https://estandar.luvameta.com/schemas/certification_record_v1.json", "title": "LM Certification Record", "description": "Registro de certificacion del Estandar LM — Version 1.0", "type": "object", "required": [ "type", "cert_id", "status", "country", "issued_by", "authorized_by", "root_authority", "subject", "verification", "protocols", "issued_at", "updated_at" ], "additionalProperties": false, "properties": { "type": { "type": "string", "const": "certification_record" }, "cert_id": { "type": "string", "pattern": "^[A-Z]{2}-[0-9]{4,}$" }, "status": { "type": "string", "enum": ["ACTIVE","SUSPENDED","REVOKED"] }, "country": { "type": "string", "pattern": "^[A-Z]{2}$" }, "issued_by": { "type": "string", "format": "uri", "pattern": "^https://[a-z]{2}\\.luvameta\\.com$" }, "authorized_by": { "type": "string", "format": "uri", "pattern": "^https://[a-z]+\\.luvameta\\.com$" }, "root_authority": { "type": "string", "const": "https://luvameta.com" }, "subject": { "$ref": "#/$defs/subject" }, "verification": { "$ref": "#/$defs/verification" }, "protocols": { "$ref": "#/$defs/protocols" }, "issued_at": { "type": "string", "format": "date" }, "updated_at": { "type": "string", "format": "date" } }, "$defs": { "subject": { "type": "object", "required": ["domain","category","title","description", "language","territory_scope","owner"], "additionalProperties": false, "properties": { "domain": { "type": "string", "format": "uri", "pattern": "^https://" }, "category": { "type": "string", "enum": ["semantic_identity_company","digital_project", "organization","tech_platform","personal_professional"] }, "title": { "type": "string", "minLength": 2, "maxLength": 100 }, "description": { "type": "string", "minLength": 10, "maxLength": 280 }, "language": { "type": "string", "pattern": "^[a-z]{2}$" }, "territory_scope": { "type": "string", "pattern": "^[A-Z]{2}$" }, "legal_form": { "type": "string" }, "owner": { "$ref": "#/$defs/owner" } } }, "owner": { "type": "object", "required": ["type","name"], "additionalProperties": false, "properties": { "type": { "type": "string", "enum": ["Person","Organization"] }, "name": { "type": "string", "minLength": 2 }, "role": { "type": "string" } } }, "verification": { "type": "object", "required": ["method","proof_url","challenge","hash_algo","hash"], "additionalProperties": false, "properties": { "method": { "type": "string", "const": "well-known-file" }, "proof_url": { "type": "string", "format": "uri", "pattern": "^https://.+/\\.well-known/luvameta\\.txt$" }, "challenge": { "type": "string", "pattern": "^LM-[A-Z]{2}-[0-9]+-[0-9]{8}-[a-f0-9]{8}$" }, "hash_algo": { "type": "string", "const": "sha256" }, "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" } } }, "protocols": { "type": "object", "required": ["investigation","operation","policy"], "additionalProperties": false, "properties": { "investigation": { "type": "string", "format": "uri", "pattern": "^https://" }, "operation": { "type": "string", "format": "uri", "pattern": "^https://" }, "policy": { "type": "string", "format": "uri", "pattern": "^https://" } } } } }

3. Especificación de Campos — Nivel Raíz

CampoTipoNivelPatrón / ValoresDescripción y reglas
"type"stringDEBEconst: "certification_record"Valor fijo. Cualquier otro string invalida el objeto.
"cert_id"stringDEBE^[A-Z]{2}-[0-9]{4,}$Dos letras mayúsculas + guión + mínimo 4 dígitos. Ej: CL-0001.
"status"stringDEBEACTIVE | SUSPENDED | REVOKEDSolo estos tres valores son válidos. En la emisión inicial DEBE ser "ACTIVE".
"country"stringDEBE^[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"stringDEBEconst: "https://luvameta.com"Valor fijo absoluto. No se acepta ninguna variación incluyendo www o http.
"issued_at"string (date)DEBEAAAA-MM-DDFecha real de emisión. DEBE ser igual o anterior a updated_at.
"updated_at"string (date)DEBEAAAA-MM-DDEn 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.

CampoTipoNivelRestricciónDescripció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)DEBE5 valores controladosSolo se aceptan los cinco valores del vocabulario controlado. Cualquier otro valor invalida el campo.
"title"stringDEBEmin: 2 / max: 100Nombre real de la entidad. NO DEBE estar vacío ni ser un placeholder. DEBE coincidir con el nombre visible del sitio auditado.
"description"stringDEBEmin: 10 / max: 280DEBE estar en el idioma declarado en language. DEBE ser coherente con el contenido del sitio.
"language"stringDEBE^[a-z]{2}$ISO 639-1 en minúsculas. Conformes: "es", "en". No conformes: "ES", "ESP".
"territory_scope"stringDEBE^[A-Z]{2}$ISO 3166-1 alpha-2 en mayúsculas. DEBE coincidir con el campo country a nivel raíz.
"legal_form"stringDEBERÍATexto libreCampo recomendado. Si está presente DEBE ser coherente con la naturaleza de la entidad.
"owner"objectDEBEVer sección 5Objeto 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.

CampoTipoNivelRestricciónDescripció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"stringDEBEmin: 2Nombre real del operador. NO DEBE ser anónimo, genérico ni placeholder.
"role"stringDEBERÍATexto libreRol 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.

Regla de validación crítica del hash
El hash declarado en el campo "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.
CampoTipoNivelRestricciónDescripción y reglas
"method"stringDEBEconst: "well-known-file"Valor fijo en v1.0. Único método de verificación aceptado.
"proof_url"string (uri)DEBE.well-known/luvameta.txtDEBE terminar en /.well-known/luvameta.txt. DEBE usar https. DEBE corresponder al dominio del subject.domain.
"challenge"stringDEBELM-[CC]-[ID]-[AAAAMMDD]-[hex8]Formato exacto. Ej: LM-CL-0001-20260412-a3f7b2c9
"hash_algo"stringDEBEconst: "sha256"Valor fijo. Único algoritmo de hash aceptado en v1.0.
"hash"stringDEBE^[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.

CampoTipoNivelRestricciónDescripció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

{ "type": "certification_record", "cert_id": "CL-0001", "status": "ACTIVE", "country": "CL", "issued_by": "https://cl.luvameta.com", "authorized_by": "https://chile.luvameta.com", "root_authority": "https://luvameta.com", "subject": { "domain": "https://ejemplo-empresa.com", "category": "semantic_identity_company", "title": "Ejemplo Empresa SpA", "description": "Plataforma de servicios digitales para el mercado latinoamericano, especializada en soluciones para pymes.", "language": "es", "territory_scope": "CL", "legal_form": "Digital Company", "owner": { "type": "Person", "name": "María Francisca Romero Lagos", "role": "Founder and CEO" } }, "verification": { "method": "well-known-file", "proof_url": "https://ejemplo-empresa.com/.well-known/luvameta.txt", "challenge": "LM-CL-0001-20260412-a3f7b2c9", "hash_algo": "sha256", "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "protocols": { "investigation": "https://cl.luvameta.com/protocolo-investigacion.json", "operation": "https://cl.luvameta.com/protocolo-operacion.json", "policy": "https://cl.luvameta.com/politica.json" }, "issued_at": "2026-04-12", "updated_at": "2026-04-12" }

9. Errores de Validación Frecuentes

#Campo afectadoError frecuenteCorrecció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)

const Ajv = require("ajv"); const addFormats = require("ajv-formats"); const ajv = new Ajv({ strict: false }); addFormats(ajv); const schema = require("./lm_certification_record_v1.json"); const validate = ajv.compile(schema); const cert = JSON.parse(fs.readFileSync("CL-0001.json", "utf8")); const valid = validate(cert); if (!valid) { console.error("Errores de validacion:", validate.errors); } else { console.log("Certificado conforme con LM-STD-02 v1.0"); }

Python (jsonschema)

import json from jsonschema import validate, ValidationError with open("lm_certification_record_v1.json") as f: schema = json.load(f) with open("CL-0001.json") as f: cert = json.load(f) try: validate(instance=cert, schema=schema) print("Certificado conforme con LM-STD-02 v1.0") except ValidationError as e: print(f"Error de validacion: {e.message}")
Versionado del esquema
La URL del esquema incluye el número de versión (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ónFechaDescripciónAutorizado por
1.02026Versió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