Cargando…
Cargando…
Especificación de los indicadores no evaluativos: comunas, Fondo Común Municipal, proveedores, seguridad, personas y buscador. Incluye control de calidad transversal y deuda declarada.
La tabla cubre 345 municipios. Chile tiene 346 comunas: la Antártica carece de municipalidad propia y es administrada por Cabo de Hornos. El conteo es el denominador de todo porcentaje comunal. Un validador bloquea escribirlo hardcodeado en el código.
normalizar: NFKD → ascii → minúsculas → colapsar espacios
slug: eliminar no-alfanuméricos → unir con guiones
"O'Higgins" → ohiggins
"La Florida" → la-floridaEl slug es la clave de conflicto del UPSERT. El roster de códigos INE se enumera desde el JSON de la BCN; nunca se fabrica un código.
| Dominio | Normalización | Ejemplos |
|---|---|---|
| BCN → SII | Slug + alias | Calera → La Calera, Concón → Con Con, Tiltil → Til-til |
| Seguridad | NFKD + MAYÚSCULAS + alias | Llay-Llay → Llaillay, San Vicente de Tagua Tagua → San Vicente, Puerto Natales → Natales |
| Comunas base | Slug | — |
Tres tablas de alias independientes para el mismo problema. Sin unificar.
pct_aporte = 65 si comuna ∈ {santiago, providencia, las-condes, vitacura}
60 en otro caso // DL 3.063 art. 38
bruto = bruto_miles / 1000 // SII, M$ → millones
aporte = bruto × pct_aporte / 100
retiene = bruto − aporte
recibe = ingresos_fcm // BCN; puede ser null
neto = retiene + recibe // null si recibe es null
es_receptora = (neto ≥ bruto) // null si neto es nullEl conjunto de comunas con aporte 65% está fijado por ley, no se infiere del dato. Sin fila del SII (bruto = null), el bloque completo se omite de la ficha: no se estima.
dependencia_fcm_pct = recibe / ingreso_total_municipal × 100 // 1 decimal
// null si falta cualquieracoeficiente, pct_fondo_nacional, monto_anual_millones, compensacion_millones y pool_nacional_millones provienen del Boletín Técnico SUBDERE/SINIM. Se validan con schema y se persisten. No se derivan.
| Indicador | Procedencia | Fuente / nota |
|---|---|---|
| Ingresos propios permanentes | Importado | SINIM. Sin transformación. |
| Ingreso total municipal | Importado | SINIM. |
| Gasto total y desglose por área | Importado | BCN. El pct del desglose viene calculado en origen. |
| Pobreza multidimensional | Importado | CASEN vía Reporte Comunal BCN. Se toma la serie más reciente (CASEN 2022). El año de la CASEN no se persiste junto al valor. |
| Pobreza por ingresos | Importado | Ídem. |
| Envejecimiento · hacinamiento · mortalidad infantil · participación electoral · delitos violentos (tasa) | Importado | Columnas sembradas desde BCN. Ninguna se computa. |
| Matrícula, establecimientos, inscritos APS | Importado | SINIM. |
| Gasto per cápita | No existe | No se calcula ni se publica. |
Explorador y comparador no aplican cálculo: leen columnas persistidas. El comparador admite un máximo de 4 comunas y su estado vive en la URL.
Fuente: gasto devengado municipal, Presupuesto Abierto. Agregación por RUT normalizado, no por documento. Sumas internas en pesos; salida en millones (1 decimal).
top10 = 10 RUTs con mayor devengado
concentracion_top10_pct = Σ devengado(top10) / devengado_total × 100 // enteroNo se usa HHI. El indicador publicado es share del top-10.
PYME ⟺ tamaño ∈ {M, P} // mediana, pequeña/micro
// G (grande) y SD (sin dato) NO cuentan
pct_pyme_cabeza = n_RUTs_pyme / n_proveedores × 100 // entero
pct_pyme_monto = Σ devengado_pyme / devengado_total × 100 // enteroEl tamaño de un proveedor se define por su fila de mayor devengo (desempate estable: primera fila observada). Las filas SD quedan fuera del numerador: la ausencia de dato no se cuenta como pyme verificada.
| Campo | Cómputo |
|---|---|
devengado_total_millones | round(Σ devengo / 1e6, 1) |
n_proveedores | RUTs distintos tras normalizar (sin puntos, sin guión, mayúsculas) |
delta_pct_vs_anterior | (total[t] − total[t−1]) / total[t−1] × 100. Null si no hay año previo o el previo es 0. |
| Ranking | Top-100 RUTs por devengado. pct_total con 1 decimal. |
| Matriz rubro × tamaño | Top-12 rubros + fila «Otros». Columna SD solo si existen filas SD. El total por rubro suma celdas ya redondeadas para que cuadre. |
desde | Primer año en que aparece el par (comuna, RUT). Calculado cruzando años. |
Todo porcentaje con denominador 0 devuelve 0. No se divide por cero.
El payload es un objeto curado manualmente. No existe job que lo pueble ni refresco automático. Actualización manual.
| Campo | Origen declarado |
|---|---|
| Homicidios · víctimas | Observatorio de Homicidios (cifra validada caso a caso) |
| Variación anual de homicidios | Ídem |
| Percepción de aumento del delito | ENUSC · INE |
| Tasa de denuncia / cifra negra | ENUSC. Valor literal en el componente de frontend; no es una estimación propia ni un cálculo del backend. |
| Balance delictual | Subsecretaría de Prevención del Delito |
Matriz comuna × familia de delito × año (2005–2026). Unidad: casos policiales absolutos.
No se aplica denominador poblacional en ningún punto del endpoint. La interfaz rotula «casos totales». Las comunas no son comparables entre sí sin normalizar por población, y la plataforma no lo hace.
| Regla | Detalle |
|---|---|
| Familias | Columna familia del CSV. Orden alfabético estable. Sin subgrupos: la granularidad es comuna × familia × año. |
| Pseudo-familia TOTAL | La fila «TOTAL casos policiales» del CSV se excluye para evitar doble conteo. El total se recalcula sumando familias. |
| Celdas vacías | Se rellenan con 0 para poder graficar. El cero es relleno, no afirmación de ausencia de casos. |
anios_completos = anios_ordenados[:-1] // el último año cargado es SIEMPRE parcial
tendencia_pct = (total[t] − total[t−1]) / total[t−1] × 100 // sobre años completos
// null si total[t−1] == 0Se descarta el año en curso. Compararlo contra un año cerrado produce variaciones espurias (en enero, caídas del orden de −77%).
Entrega periódica de Carabineros, en CSV. El backend agrupa y mapea; no computa.
| Campo publicado | Origen |
|---|---|
ytd | registros_2026 del CSV (acumulado año a la fecha) |
ytdA | registros_2025_mismo_corte |
s7 / s7A | casos_semana_N / casos_semana_N−1. Ventana de 7 días. |
tasa_registro | Del CSV. Denominador desconocido: se transporta sin reinterpretar. |
delito_top | Del CSV. |
Metadata de la semana (id, rango, fecha de corte) se pasa por CLI, no se deriva del CSV. Región sin mapeo ⟹ id 0; no se fabrica identificador.
roster expandido: una fila por (persona × votación del período)
ausencia de registro en una votación ⟹ opcion = 'ausente'
total = todas las votaciones del período
emitidos = filas con opcion ≠ 'ausente'
asistencia_pct = round(100 × emitidos / total, 2) // 0.0 si total == 0
vocabulario: a_favor · en_contra · abstencion · pareo · ausente
valor desconocido ⟹ 'ausente'El registro oficial no publica asistencia (el campo viene vacío). El indicador es participación en votaciones, derivado de emitidos / total. No es asistencia de sala.
| Regla | Detalle |
|---|---|
| Pareo | Cuenta como voto emitido, no como ausencia. Es un acuerdo reglamentario entre parlamentarios de bandos opuestos. |
| Denominador | Roster expandido sobre todas las votaciones del período. Sin expansión, solo se contarían las votaciones donde la persona figura, y toda la serie converge a 100%. |
| Persistencia | La asistencia se recomputa desde la tabla acumulada, no desde las filas de la corrida. |
| Backfill | Primera corrida: purga de filas del período anterior antes de insertar, para no arrastrar votaciones fuera de período. |
| Campo | Procedencia | Cómputo |
|---|---|---|
votos_emitidos | Calculado | count(opcion ≠ 'ausente') sobre la tabla acumulada. |
proyectos_autor | Calculado | count(rol = 'autor' OR rol IS NULL). El rol nulo cuenta como autoría. |
intervenciones | En cero | Constante 0 para todas las personas. Sin fuente disponible. Se muestra el campo; no se computa ni se importa. |
| Lobby recibido | Importado | Registro InfoLobby (CPLT). |
| Patrimonio declarado | Importado | Registro InfoProbidad (CPLT). |
Existe una función separada de asistencia de Sala del Senado (asiste / celebradas). No alimenta este indicador.
Determinista, sin modelo de lenguaje. Cada fila publicada declara método, confianza y estado de verificación.
| Confianza | Método | Verificado | Condición |
|---|---|---|---|
| 1.00 | id | Sí | Identificador oficial coincidente (Cámara / Senado). |
| 1.00 | rut | Sí | RUT normalizado idéntico. Gana sobre cualquier match por nombre. |
| 0.90 | nombre | No | Conjuntos de tokens idénticos. |
| 0.75 | nombre | No | Subconjunto propio con ≥ 2 tokens compartidos. |
| < 0.75 | — | — | Se descarta. |
similitud: comparación de CONJUNTOS de tokens. Sin fuzzy, sin Levenshtein.
partículas descartadas: de, del, la, las, los, y, san, santa, da, do, von, van
mínimo de 2 tokens: evita que un apellido común dispare un match
normalize_name: la ñ se protege con centinela ANTES del NFKD
(Muñoz ≠ Munoz)
normalize_rut: CUERPO-DV, sin ceros a la izquierda, DV en mayúsculaUn match por nombre nunca se auto-verifica (verified = false).
normalización: NFD → sin marcas diacríticas → sin apóstrofes → minúsculas
"nunoa" ≡ Ñuñoa · "ohiggins" ≡ O'Higgins
matchRank(query, nombre, extra): // menor es mejor; null = sin match
0 nombre == query
1 nombre.startsWith(query)
2 nombre.includes(query)
3 extra.includes(query) // campo secundario: región, partido
null en otro caso| Parámetro | Valor |
|---|---|
| Consulta mínima | 2 caracteres |
| Resultados por categoría | 8 |
| Orden | Rango ascendente; dentro de cada rango se preserva el orden alfabético del backend (sort estable). |
| Categorías indexadas | Personas, comunas. |
persona: nombre = nombre_completo extra = región + partido
comuna: nombre = nombre de comuna extra = regiónEl rango se aplica antes del corte a 8 resultados. Sin él, el orden alfabético sobre un índice que aplanaba nombre y región dejaba inalcanzables 5 comunas homónimas de su región (Santiago, Valparaíso, Maule, Los Lagos, O'Higgins).
La ñ se colapsa en el buscador y se protege en el cruce de personas (§09). Es deliberado: en búsqueda amplía el recall, en matching produciría falsos positivos.
Los proyectos se cargan (hasta ~3.200 boletines) pero no se indexan en el buscador universal. Solo se buscan personas y comunas.
| Salida | Alcance | Nota |
|---|---|---|
| Reportes gasto/congreso, análisis publicado, análisis privado | Documento dedicado, renderizado headless. Cacheado por hash de datos; los cambios de plantilla exigen bump de versión de render. | |
| CSV | Ídem | Se sirve como ZIP. |
| API pública | Políticas, personas, comunas, proyectos, seguridad, calendario, leyes, reportes | Sin autenticación. Mismos datos que la interfaz, en JSON. |
| Servidor MCP | 16 herramientas de solo lectura | Anónimo, sin llave. Límite: 60 solicitudes por minuto por IP. |
El acceso al PDF de un análisis no publicado exige el secreto interno; sin él, 404.
Validados en el schema de datos. Fallan la corrida; no advierten.
| Regla | Condición |
|---|---|
L1.pct_rs_inconsistent | |pct_rs − round(100 × rs_count / total)| > 1.0 pp |
L1.pct_rs_zero_with_no_total | total_iniciativas == 0 ∧ pct_rs ≠ 0 |
L1.brechas_count_inconsistent | El conteo declarado difiere del número de temas con |deficit_pp| ≥ 30 |
| Buckets RATE | total ≠ rs + fi + ot + in |
Fuente de verdad: data_dictionary.yaml (v1.0). Declara por campo citable: semantic, formula, source, typical_range, ok_claims y forbidden_claims. 12 campos declaran fórmula explícita.
Un juez semántico evalúa cada par «afirmación narrativa + valor interpolado» contra el diccionario, en dos puntos: hook de code-time sobre los componentes y prompts afectados, y regla L2 en runtime tras el Writer. Mismatch con confianza ≥ 0.7 ⟹ quality_status = blocked; el reporte no se publica.
Caso que originó la regla: el texto «97,3% obtiene resultados favorables en sus evaluaciones formales» interpolaba ejecucion_total_pct, que mide velocidad de pago. La aritmética era correcta; la afirmación, falsa.
| Producto | Revisión |
|---|---|
| Análisis | El Critic recalifica el DEM a ciegas; reemplaza si difiere en más de 1.0 punto. |
| Reporte de gasto | Verificación de números inventados, confusión BIP/BIPS, aritmética interna y período. |
| Reporte de Congreso | Verificación de IC = 100 − L1/2 (tolerancia 2 puntos), conteo de hallazgos, período. |
Estados de una afirmación: validada (cita verificable), con observaciones (respaldo indirecto; se publica marcada), bloqueada (sin respaldo; no se publica).
| Componente | Estado | Impacto |
|---|---|---|
| Panorama nacional de seguridad | Curado | Actualización manual. Sin pipeline. |
| Cobertura por segmento y región (gasto) | Curado | Estimación del equipo, no medición CASEN. Alimenta la dimensión Cobertura territorial (0.20) del Índice de Calidad del Gasto. |
| Cifra negra (ENUSC) | Curado | Literal en el componente de frontend. |
| Intervenciones parlamentarias | En cero | Sin fuente. Campo visible con valor 0. |
tasa_registro (Ley STOP) | Importado | Denominador desconocido. No reinterpretado. |
delta_vs_mes_anterior se computa en pipeline.