Umbral es un laboratorio de datos independiente y de código abierto. Publica sobre desapariciones, delito y gasto público en México. Todo lo que aquí se define es vinculante salvo que un humano indique lo contrario.
Umbral = el punto donde la evidencia se vuelve significativa.
1. El título es la afirmación. Una gráfica se titula con el hallazgo, no con el tema, y el hallazgo tiene que sostenerse con lo que la gráfica muestra. Si el título dice algo que la figura no puede probar, la figura está decorando una afirmación que nadie verificó.
2. La incertidumbre es visible. Intervalos en las proyecciones, IC en las estimaciones, n y denominador en las tasas. Un estimado puntual sin intervalo afirma una precisión que el método no tiene. Es la firma del laboratorio: se reconoce una gráfica de Umbral porque muestra lo que no sabe.
3. Los huecos se declaran. El dato faltante es información. Interpolarlo, rellenarlo con cero o recortar el periodo hasta que desaparezca cambia la conclusión sin que el lector pueda saberlo.
4. El lenguaje causal es deliberado. «Asociado con» para lo descriptivo. «Efecto» y «reduce» solo con una estrategia de identificación nombrada junto al estimado. Es la diferencia entre un laboratorio y una nota de opinión con gráficas.
5. Las personas se cuentan, nunca se hacen espectáculo. Detrás de cada registro del RNPDNO hay una persona y una familia. El tratamiento sobrio no es frialdad: es la forma de respeto que puede ofrecer un laboratorio de datos.
La guía es prosa; la norma es rules/rules.yaml. Cada capítulo incluye sus reglas desde ahí en vez de reescribirlas, de modo que no puedan separarse.
Cuando veas un recuadro con un identificador —UMB-COL-004— estás leyendo el texto normativo, generado. Cuando leas párrafos como éste, estás leyendo explicación, que orienta pero no obliga.
| Severidad | Qué significa |
|---|---|
■ error |
Bloquea el release. CI falla o la revisión rechaza. |
▲ advertencia |
Se reporta y hay que justificarla. |
· guía |
Orienta. |
rules/rules.yaml + tokens/src/*.tokens.json ← aquí se decide
↓ build
tokens/build/* · rules/rules.json ← generado, versionado, nunca a mano
↓ consumido por
guide/*.md · site/ · packages/ · skills/ · tools/umbral-lint
Tres consecuencias que gobiernan todo lo demás:
■ UMB-PRO-003 · Proceso · error
Es la forma concreta que toma la deriva: el valor se copia una vez, la fuente cambia, y la copia se queda.
| Sí | Importar desde tokens/build/. |
| No | Pegar #128273 en un notebook. |
Comprobación: Automática — umbral-lint, comprobación hardcoded-value.
Ver también: UMB-COL-002
Desde v1.0. Regla normativa: rules/rules.yaml.
■ UMB-PRO-002 · Proceso · error
Es el mecanismo que impide que la guía y la norma se separen. En v1.0 el brand book y el documento de ingeniería se contradecían sobre el tercer color de serie, y ganó el que fallaba contraste.
| Sí | Añadir la regla aquí, con su ID, y citarla desde el capítulo. |
| No | Escribir «nunca hagas X» en un capítulo y dejarlo ahí. |
Comprobación: Automática — verify-guide, comprobación prose-rule-drift.
Origen: audit/2026-07-conformance.md §3.5.
Desde v1.1. Regla normativa: rules/rules.yaml.
■ UMB-PRO-001 · Proceso · error
Editar la salida rompe la cadena normativa en silencio: la fuente y lo publicado dejan de coincidir y nada lo detecta hasta que alguien reconstruye.
| Sí | Cambiar tokens/src/ o rules/rules.yaml y reconstruir. |
| No | Corregir un hex en tokens/build/tokens.css. |
Comprobación: Automática — umbral-lint, comprobación generated-file-edited.
Origen: CLAUDE.md §2, tercera consecuencia dura; formalizada como regla en 1.1.
Desde v1.1. Regla normativa: rules/rules.yaml.
La versión 1.0 de la marca era buena y estaba bien aplicada. La auditoría de julio de 2026 encontró que aun así el 44% del texto del sitio principal no alcanzaba el contraste mínimo de accesibilidad — y que casi ningún defecto era un error de aplicación. Eran instrucciones que se siguieron al pie de la letra:
De ahí la arquitectura: un valor se enuncia en un solo lugar, y lo que no se puede comprobar automáticamente se comprueba en una lista corta que cabe en una página.
■ UMB-PRO-004 · Proceso · error
El semver aplica al sistema de diseño, no solo al código: un token que cambia re-renderiza todos los productos que lo consumen.
| Sí | MAYOR para un valor de token o una regla que sube a error; MENOR para una regla nueva en warning; PARCHE para prosa. |
| No | Cambiar un hex en un parche. |
Comprobación: Manual. Se verifica al preparar el release, contra CHANGELOG.md.
Desde v1.0. Regla normativa: rules/rules.yaml.
■ UMB-PRO-005 · Proceso · error
Separarlos es exactamente cómo se produce la deriva que este repositorio existe para eliminar.
| Sí | Un PR que toca rules.yaml también toca su capítulo, y al revés. |
| No | Añadir una regla y dejar la guía para después. |
Comprobación: En revisión.
Origen: CLAUDE.md §4, definición de done; formalizada como regla en 1.1.
Ver también: UMB-PRO-002
Desde v1.1. Regla normativa: rules/rules.yaml.
69 reglas · 58 error · 10 advertencia · 1 guía.
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-BRD-001 |
■ | El wordmark es «umbral_» en minúsculas, Space Grotesk 500, con el guión bajo en signal | review |
UMB-BRD-002 |
■ | La barra del isotipo guarda proporción 5:44 y cruza a la izquierda del centro | logo-geometry |
UMB-BRD-003 |
▲ | El espacio de respeto es una altura de barra en los cuatro lados | review |
UMB-BRD-004 |
■ | El logo no se distorsiona, contornea, sombrea ni recolorea fuera de los tokens | review |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-COL-001 |
■ | No se usa blanco ni negro puros | pure-black-white |
UMB-COL-002 |
■ | Ningún color se escribe a mano: todos vienen de los tokens | hardcoded-token-hex |
UMB-COL-003 |
■ | No se usan degradados | no-gradient |
UMB-COL-004 |
■ | El color signal se usa en un solo elemento de la capa de datos por vista | review |
UMB-COL-005 |
■ | Todo texto alcanza 4.5:1 contra base y contra panel | contrast-text |
UMB-COL-006 |
■ | Toda marca de datos alcanza 3:1; el mobiliario de la gráfica está exento y así se declara | contrast-mark |
UMB-COL-007 |
■ | No se mezclan los dos modos dentro de un mismo panel | review |
UMB-COL-008 |
■ | Un color categórico nuevo se deriva en OKLCH y se verifica contra dicromacia | series-separation |
UMB-COL-009 |
■ | Las dos rampas secuenciales no codifican dos variables en la misma figura | review |
UMB-COL-010 |
■ | Dato faltante, dato suprimido y cero se distinguen visualmente entre sí | review |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-TYP-001 |
■ | El display es Space Grotesk 500; nunca 700 | display-weight |
UMB-TYP-002 |
■ | Solo se usan Space Grotesk, IBM Plex Sans e IBM Plex Mono | banned-font-family |
UMB-TYP-003 |
■ | Se respetan los tamaños mínimos: 12px mono en web, 24px en slides, 11pt en documentos | minimum-font-size |
UMB-TYP-004 |
▲ | Las cifras que se alinean o se comparan van en mono; una cifra heroica aislada va en display | review |
UMB-TYP-005 |
■ | Las tres fuentes se auto-hospedan, subconjuntadas a latin y latin-ext | font-hosting |
UMB-TYP-006 |
▲ | El tracking del display va entre −0.02 y −0.03em | display-tracking |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-LAY-001 |
■ | El radio de borde nunca pasa de 2px | radius-max |
UMB-LAY-002 |
■ | No hay sombras; las reglas de 1px hacen el trabajo estructural | no-drop-shadow |
UMB-LAY-003 |
▲ | La medida del texto no pasa de 65 caracteres | measure-max |
UMB-LAY-004 |
▲ | Todo espaciado es múltiplo de 8px | spacing-scale |
UMB-LAY-005 |
■ | No hay emoji, iconos de stock ni ilustración decorativa | no-emoji |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-CHT-001 |
■ | El título de la gráfica enuncia el hallazgo como oración completa | review |
UMB-CHT-002 |
■ | Toda gráfica lleva subtítulo con geografía, periodo y unidad | review |
UMB-CHT-003 |
■ | Toda gráfica lleva su línea de fuente con licencia, sobre una regla de 1px | chart-source-present |
UMB-CHT-004 |
■ | Solo hay líneas de retícula horizontales, con la línea base más oscura | review |
UMB-CHT-005 |
■ | Las series se etiquetan directamente al final de la línea; no hay caja de leyenda | review |
UMB-CHT-006 |
▲ | Una gráfica lleva como máximo 5 series | review |
UMB-CHT-007 |
▲ | Los ejes van en mono, abreviados, con coma como separador de miles | review |
UMB-CHT-008 |
■ | El eje y de las barras empieza en cero | review |
UMB-CHT-009 |
■ | Cualquier truncamiento del eje se anota en la propia gráfica | review |
UMB-CHT-010 |
■ | No se usan pastel, 3D ni doble eje | banned-chart-type |
UMB-CHT-011 |
■ | Toda proyección o estimación muestra su incertidumbre | review |
UMB-CHT-012 |
■ | Toda tasa declara su denominador y su n | review |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-VOZ-001 |
■ | Español primero; el inglés se añade donde lo gane el público | review |
UMB-VOZ-002 |
■ | Sin palabras hype, signos de exclamación, emoji ni preguntas retóricas como titular | hype-language |
UMB-VOZ-003 |
▲ | Un adjetivo no sustituye a un número | review |
UMB-VOZ-004 |
■ | No se publica contenido de relleno | placeholder-content |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-NUM-001 |
■ | es-MX y en usan coma para miles y punto para decimales | review |
UMB-NUM-002 |
▲ | Las cifras grandes se abrevian en ejes y se escriben completas en el texto | review |
UMB-NUM-003 |
▲ | Las fechas van en ISO dentro de los datos y en prosa dentro del texto | date-format |
UMB-NUM-004 |
· | El símbolo de porcentaje va pegado a la cifra | percent-spacing |
UMB-NUM-005 |
■ | La precisión declarada no excede la del dato | review |
UMB-NUM-006 |
■ | Cero, nulo y suprimido se escriben distinto y significan distinto | review |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-DAT-001 |
■ | Todo conjunto de datos lleva su SOURCE.md | source-md-present |
UMB-DAT-002 |
■ | Los snapshots se etiquetan y la gráfica dice cuál usó | snapshot-tag |
UMB-DAT-003 |
■ | Toda figura publicada se reconstruye desde el dato crudo con un solo comando | manual |
UMB-DAT-004 |
■ | El código va bajo MIT y los datos y el contenido bajo CC BY 4.0 | license-present |
UMB-DAT-005 |
■ | Los datos faltantes o subreportados se declaran; no se omiten ni se imputan en silencio | review |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-A11Y-001 |
■ | El atributo lang corresponde al idioma real del subárbol | lang-attribute |
UMB-A11Y-002 |
■ | Toda gráfica lleva un aria-label que resume el hallazgo | chart-aria-label |
UMB-A11Y-003 |
■ | Junto a cada gráfica hay una tabla de datos o un | review |
UMB-A11Y-004 |
■ | Junto a cada gráfica se puede descargar su CSV | review |
UMB-A11Y-005 |
■ | El significado nunca se codifica solo con color | review |
UMB-A11Y-006 |
■ | El foco visible se dibuja en signal y los objetivos táctiles miden 44px o más | focus-and-target |
UMB-A11Y-007 |
■ | Se respeta prefers-reduced-motion | reduced-motion |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-MET-001 |
■ | Los verbos causales solo se usan con una estrategia de identificación nombrada | review |
UMB-MET-002 |
■ | El titular se sostiene con los datos que la gráfica muestra | review |
UMB-MET-003 |
■ | No se comparan conteos crudos entre poblaciones de distinto tamaño | review |
UMB-MET-004 |
■ | Los temas sensibles se tratan con dignidad: se cuenta a las personas, no se les hace espectáculo | review |
UMB-MET-005 |
■ | La terminología sensible sigue el glosario, que es vinculante | terminology |
| ID | Regla | Comprobación | |
|---|---|---|---|
UMB-PRO-001 |
■ | Los archivos generados nunca se editan a mano | generated-file-edited |
UMB-PRO-002 |
■ | La prosa no enuncia ninguna regla que rules.yaml no enuncie también | prose-rule-drift |
UMB-PRO-003 |
■ | Ningún archivo fuera de tokens/src/ escribe un valor que ya existe como token | hardcoded-value |
UMB-PRO-004 |
■ | Cambiar el valor de un token es un cambio MAYOR de versión | manual |
UMB-PRO-005 |
■ | El capítulo de la guía y la entrada de la regla se actualizan juntos | review |