Verificaciones
Cada verificación que el validador puede reportar, con un anclaje estable. Los mensajes de error enlazan aquí, así que estas URL no se mueven.
62 verificaciones catalogadas · 42 implementadas
Descubrimiento
Manifiesto alcanzable por HTTPS como JSON
- Regla
- El manifiesto MUST servirse por HTTPS con Content-Type: application/json.
- Arreglo
- Sirve el manifiesto por HTTPS con un tipo de contenido JSON, y compruébalo desde fuera de tu red.
Soft-404: no hay una ruta de descubrimiento que responda 200 + text/html
- Regla
- Un manifiesto es JSON. Si en una ruta de descubrimiento responde HTML, es un catch-all: el manifiesto está ausente, no presente.
- Arreglo
- Excluye esta ruta del catch-all de tu SPA para que se sirva el archivo.
robots.txt devuelve 200 text/plain
- Regla
- Las precondiciones de L2 y superiores incluyen un robots.txt real.
- Arreglo
- Sirve un robots.txt real en la raíz, con tipo de contenido text/plain.
Manifiesto en la ruta RECOMMENDED, o anunciado con <link rel>
- Regla
- El manifiesto SHOULD vivir en /.well-known/cabuya.json, o anunciarse con <link rel="cabuya">.
- Arreglo
- Mueve el manifiesto a /.well-known/cabuya.json, o anuncia su ubicación con un <link rel="cabuya-manifest">.
El manifiesto valida contra manifest.schema.json
- Regla
- El manifiesto DEBE conformar a su esquema.
- Arreglo
- Corrige el manifiesto según el esquema publicado.
publisher.canonical_url coincide con la entrada del registro
- Regla
- El manifiesto de un publicador registrado MUST coincidir con su entrada del registro en la URL canónica.
- Arreglo
- Haz que la URL canónica del manifiesto coincida con la de tu entrada en el registro, o abre un pull request para cambiar la entrada.
Toda feeds[].url es HTTPS absoluta y alcanzable
- Regla
- Los feeds declarados MUST resolver.
- Arreglo
- Dale a cada feed una URL https absoluta que resuelva desde fuera de tu red.
crawl_policy_url resuelve
- Regla
- La política declarada de rastreo y reutilización SHOULD poder descargarse — los consumidores tienen que respetarla.
- Arreglo
- Apunta crawl_policy_url a una página que exista, o quita el campo.
conformance_target no excede el nivel medido
- Regla
- conformance_target es una declaración; MUST NOT afirmar más de lo que esta ejecución mide. Se reporta como discrepancia, nunca como el nivel.
- Arreglo
- Baja conformance_target al nivel que realmente alcanzas, o corrige lo que bloquea el nivel que declaras. El objetivo es una intención, no una afirmación.
Sobre
El documento no cumple con su esquema JSON publicado
- Regla
- Todo feed y todo manifiesto DEBE validar contra su esquema versionado.
- Arreglo
- Corrige el valor para que satisfaga el esquema.
Los campos obligatorios del sobre están presentes y bien tipados
- Regla
- last_updated, ttl, version, publisher_id y license son OBLIGATORIOS en el envelope.
- Arreglo
- Agrega el campo faltante al envelope.
last_updated es RFC 3339 con desfase UTC
- Regla
- La marca de generación DEBE ser inequívoca.
- Arreglo
- Emite RFC 3339 con desfase explícito, por ejemplo "2026-08-16T04:00:00Z".
license presente
- Regla
- Un feed sin licencia no conforma: su ausencia bloquea la revisión legal de cualquier consumidor.
- Arreglo
- Declara "license" en el envelope (por ejemplo "CC-BY-4.0").
license es un identificador SPDX, o va acompañado de license_url
- Regla
- DEBERÍA usarse una licencia resoluble por máquina.
- Arreglo
- Usa un identificador SPDX, o agrega "license_url" apuntando al texto de la licencia.
permitted_use presente, con valores dentro del enum cerrado
- Regla
- El consentimiento de reuso viaja en el envelope: display | aggregate | redistribute | ai_answer | ai_train.
- Arreglo
- Agrega "permitted_use" con los valores del enum cerrado.
version es una versión de la especificación soportada
- Regla
- Las versiones soportadas abarcan como máximo dos MAJOR.
- Arreglo
- Publica una versión que este validador entienda, o actualiza el validador.
Access-Control-Allow-Origin: * presente
- Regla
- El MUST no obvio: sin esta cabecera todo consumidor de navegador necesita un proxy.
- Arreglo
- Agrega la cabecera tal cual: `Access-Control-Allow-Origin: *`
ttl es un entero positivo y plausible (1–86400)
- Regla
- ttl es el contrato de caché; valores implausibles rompen a quien hace polling.
- Arreglo
- Usa un valor positivo en segundos, típicamente 60–3600 para datos vivos.
Feed de 5 MB o menos y 10 000 registros o menos, o con fragmentos declarados
- Regla
- Pasada la guía de tamaño, los publicadores DEBERÍAN fragmentar por municipio y declarar los fragmentos en el manifiesto.
- Arreglo
- Fragmenta por código DIVIPOLA y declara los fragmentos en feeds[] del manifiesto.
Content-Type: application/json, UTF-8
- Regla
- Higiene de transporte.
- Arreglo
- Sirve el feed como `Content-Type: application/json; charset=utf-8`.
Registro
La CLAVE last_confirmed_at está en todos los registros (null es válido)
- Regla
- La clave de confirmación es OBLIGATORIA; null es el honesto "nunca confirmado". Omitirla no lo es.
- Arreglo
- Agrega "last_confirmed_at": null, o la marca de la última confirmación real. Nunca la inventes.
id sigue la forma {publisher_id}:{local_id}
- Regla
- La identidad de registro es {publisher_id}:{local_id} — única globalmente sin coordinación.
- Arreglo
- Guarda solo tu id local; los consumidores componen el id calificado.
No se acuñan identificadores en el espacio de otro publicador
- Regla
- Un publicador NO DEBE acuñar ids en el espacio de nombres de otro.
- Arreglo
- Republica los registros ajenos con tu propio id y conserva el origen en source{}.
Regla de ubicación: address_text O lat+lon presentes
- Regla
- Un lugar que nadie puede ubicar no dirige a nadie.
- Arreglo
- Agrega address_text, o lat y lon (ambos son RECOMENDADOS).
Ambas ubicaciones presentes (RECOMENDADO)
- Regla
- Dirección y coordenadas juntas sobreviven a más contextos de consumo que cualquiera por separado.
- Arreglo
- Publica address_text Y lat+lon.
public_url presente y absoluta
- Regla
- El enlace de salida es el mecanismo de contacto — los valores de contacto nunca viajan.
- Arreglo
- Agrega "public_url" con la URL absoluta de la ficha en tu sitio.
place_kind dentro del enum
- Regla
- El vocabulario compartido es lo que hace posibles las equivalencias; los tipos desconocidos usan other más una extensión con espacio de nombres.
- Arreglo
- Usa uno de los valores del enum, o "other" con x_{publisher}_{campo}.
municipality_code es un código DIVIPOLA válido
- Regla
- La codificación territorial es DIVIPOLA; el publicador conserva su cadena cruda en municipality_text.
- Arreglo
- Publica el código DIVIPOLA, o al menos municipality_text.
source{} presente, con source_id
- Regla
- La procedencia es estructurada, nunca prosa: la atribución y las cadenas dependen de ella.
- Arreglo
- Agrega source{} con al menos source_id.
CR-2: name no contiene ningún token de estado operativo
- Regla
- Los nombres NO DEBEN codificar estado operativo — el estado va en lifecycle_status / service_status.
- Arreglo
- Deja el nombre estable y humano; publica el estado en lifecycle_status y service_status.
Los campos name y status no se contradicen entre sí
- Regla
- Un registro que dice dos cosas sobre su propio estado no se puede mostrar con honestidad.
- Arreglo
- Haz que el registro diga una sola cosa: corrige el estado, o quita el estado del nombre.
CR-1: updated_at no es un last_confirmed_at reutilizado
- Regla
- Una edición no es una confirmación; las dos marcas de tiempo no se intercambian.
- Arreglo
- Fija last_confirmed_at solo cuando alguien confirmó el lugar; si no, déjalo en null.
expires_at definido en los tipos de lugar temporales por naturaleza
- Regla
- Los lugares temporales DEBERÍAN declarar cuándo dejan de ser ciertos.
- Arreglo
- Fija expires_at para que los consumidores dejen de mostrarlo cuando caduque.
Las entradas de same_as son absolutas y de un solo salto
- Regla
- same_as es una afirmación de un solo salto y no transitiva.
- Arreglo
- Usa la forma calificada {publisher_id}:{id} y no te referencies a ti mismo.
Los miembros desconocidos se conservan, nunca se rechazan
- Regla
- La extensibilidad aplica primero al validador: un miembro desconocido NO DEBE fallar la validación.
- Arreglo
- No requiere acción del publicador.
Las extensiones x_ llevan el espacio x_{publisher}_{field}
- Regla
- Las extensiones con espacio de nombres evitan que dos publicadores choquen en un campo privado.
- Arreglo
- Renómbrala a x_{publisher}_{campo}.
Hay una base en es para las cadenas localizadas
- Regla
- es es la línea base OBLIGATORIA para cadenas legibles por humanos; en es RECOMENDADO.
- Arreglo
- Agrega una entrada {text, language: "es"}.
No hay id duplicado dentro de un mismo feed
- Regla
- Dos registros con un mismo id vuelven incorrecta toda deduplicación aguas abajo.
- Arreglo
- Dale a cada registro un id local distinto.
Datos de persona
Aparece un valor de contacto en algún campo, extensiones incluidas
- Regla
- Los valores de contacto NO DEBEN viajar en los feeds — las extensiones con espacio de nombres no los eximen.
- Arreglo
- Elimina el valor. Publica contact_available: true y deja que public_url lleve al lector a tu propia página.
confirmed_by es un token de rol, nunca el nombre de una persona
- Regla
- confirmed_by ∈ team | volunteer | official_source | partner:{publisher_id}.
- Arreglo
- Reemplázalo por el rol que confirmó el lugar: team, volunteer, official_source o partner:{publisher_id}.
El texto libre coincide con un patrón de datos personales
- Regla
- El texto libre es el tercer canal de fuga: los publicadores DEBEN limpiar datos personales de description y warning_text.
- Arreglo
- Quita el nombre y los datos de contacto del texto libre; enlaza con public_url.
Aparece una entidad a nivel de persona
- Regla
- Los datos de personas no federan — es una prohibición de cruce, no una omisión de campos.
- Arreglo
- Elimínalo. El dominio de personas es solo enlace de salida a los canales oficiales.
Un nombre de campo coincide con la lista de rechazo aunque el valor parezca limpio
- Regla
- Un campo nombrado para datos de contacto terminará por llevarlos.
- Arreglo
- Renombra o elimina el campo.
Se republica una decisión de moderación sobre un tercero
- Regla
- Los veredictos de moderación no federan; los registros suprimidos se omiten, no se etiquetan aguas abajo.
- Arreglo
- Omite el registro en lugar de etiquetarlo.
Comportamiento
El feed responde en dos sondeos; el content-type se mantiene estable
- Regla
- Un feed que responde distinto en dos sondeos no se puede consumir de forma confiable.
- Arreglo
- Sirve el feed de forma determinista.
Siempre-ahora: last_updated avanza con el reloj del sondeo sobre contenido idéntico
- Regla
- last_updated DEBE generarse al construir/publicar, nunca por petición — una marca por petición es peor que no tener señal.
- Arreglo
- Sella last_updated cuando generas el feed y guárdalo; así los consumidores pueden detectar cambios reales.
last_updated más viejo que 7 × ttl (el estado de insignia obsoleta)
- Regla
- La obsolescencia es información, no fracaso — pero debe ser visible.
- Arreglo
- Regenera el feed, o sube ttl para describir tu cadencia real de actualización.
lastmod por fragmento presente (el patrón de sincronización incremental)
- Regla
- Un lastmod por fragmento es sincronización incremental funcionando a costo cero.
- Arreglo
- Publica un lastmod por fragmento para que los consumidores descarguen solo lo que cambió.
Los fragmentos declarados son alcanzables y consistentes con el sobre
- Regla
- Un fragmento declarado que no concuerda con sus hermanos rompe a todo consumidor que confíe en el manifiesto.
- Arreglo
- Haz que todos los fragmentos declarados sean alcanzables y consistentes con el sobre que los declara.
Licencias
La licencia declarada no es share-alike
- Regla
- Las licencias share-alike envenenan la agregación para los consumidores aguas abajo.
- Arreglo
- Prefiere una licencia permisiva (CC-BY-4.0, CC0-1.0) si no buscas esa restricción.
Cadena attribution presente, para que los agregadores la muestren
- Regla
- La atribución es un MUST de consumo; una cadena explícita facilita cumplirlo.
- Arreglo
- Agrega "attribution" con el crédito que quieres que se muestre.
API de lectura
La base de la API de lectura es alcanzable; la forma del sobre es idéntica a la del feed
- Regla
- Un esquema, cuatro transportes.
- Arreglo
- Sirve la API de lectura en la base declarada, con la misma forma de sobre que el feed estático.
Estático ≡ API: el mismo registro es compatible byte a byte desde ambas superficies
- Regla
- La regla de equivalencia es lo que permite que un esquema sirva cuatro transportes.
- Arreglo
- Devuelve registros compatibles byte a byte desde la API y desde el feed. Un consumidor no debe tener que saber cuál de los dos leyó.
Paginación por cursor ordenada sobre una secuencia del servidor, no sobre una marca de tiempo
- Regla
- Los cursores por marca de tiempo descartan en silencio los registros compuestos sin conexión que llegan tarde.
- Arreglo
- Pagina sobre una secuencia del lado del servidor en vez de una marca de tiempo. Las marcas de tiempo colisionan y se saltan registros.
Se aceptan los parámetros de consulta documentados
- Regla
- municipality, kind, bbox, updated_since, limit, cursor.
- Arreglo
- Acepta los parámetros de consulta documentados, o quítalos de la documentación.
CORS * en la API; sin autenticación para lecturas
- Regla
- Las lecturas son públicas por diseño.
- Arreglo
- Sirve la API con CORS * y sin autenticación para lecturas. Datos de interés público detrás de una llave no son públicos.
Consume al menos un feed de un par (en parte autodeclarado)
- Regla
- L3 exige consumir además de servir — el único requisito que un sondeo no puede medir del todo, así que se reporta como info con la limitación declarada.
- Arreglo
- Consume al menos un feed de un par. El nivel trata de interoperar, no solo de publicar.
API de escritura
POST acepta el sobre {source, external_id, place}
- Regla
- El sobre de escritura es fijo.
- Arreglo
- Acepta el sobre {source, external_id, place} en el POST.
Idempotencia en (source, external_id): un reenvío no duplica
- Regla
- Reenviar es un upsert de la contribución del propio emisor, nunca un duplicado.
- Arreglo
- Haz las escrituras idempotentes en (source, external_id). Un reenvío tras un tiempo agotado no debe crear un segundo registro.
409 ante un conflicto de id fuera del espacio del emisor
- Regla
- La disciplina de espacios de nombres se aplica en la frontera de escritura.
- Arreglo
- Devuelve 409 cuando un emisor intente escribir un id fuera de su propio espacio de nombres.
En modo auth:none se devuelve el estado de moderación y el límite de tasa es observable
- Regla
- Las escrituras abiertas REQUIRE mitigaciones: límite de tasa, cola de moderación y un estado devuelto en eco.
- Arreglo
- Devuelve en eco el estado de moderación y haz observable el límite de tasa, para que un emisor sin autenticar sepa qué pasó con su escritura.
Los registros republicados llevan source.source_id = el emisor original
- Regla
- La identidad del emisor viaja con el registro para siempre.
- Arreglo
- Conserva source.source_id como el emisor original al republicar. La atribución es lo que tiene que sobrevivir al salto.