Carriles de extracción
Cómo se actualiza cada dataset y con qué cadencia. Resuelve el hueco de documentación del split diario-vs-mensual (TECHDEBT-06): la fuente de verdad operativa son los workflows, esta página es la vista de referencia.
Los carriles
| Carril | Workflow / comando | Cadencia | Datasets |
|---|---|---|---|
| Diario | make extract · job build-and-test de pipeline-check.yml |
diaria (10:00 UTC) | regiones, provincias, comunas, comunas_enriquecidas, indicadores, censo_comunal, censo_hogares_viviendas, establecimientos_salud, distritos_electorales, establecimientos_educacionales, resultados_educacionales, indicadores_urbanos_siedu, empresas, pobreza_comunal, consumo_electrico_comunal, partidos_politicos, autoridades_electas, estadisticas_vitales, permisos_edificacion, calidad_aire |
| Trimestral (DGAC) | dgac-publish.yml |
trimestral (cron día 15 de ene/abr/jul/oct, 07:17 UTC) + manual | precipitaciones_dgac (precipitaciones_dgac_extractor.py). Un mes nuevo exige revisar fuente, licencia, contrato y cuarentenas antes de sumarlo |
| Mensual | monthly-scrape.yml |
mensual (manual + workflow_dispatch) | finanzas_municipales (sinim_finanzas_live_extractor.py) — delincuencia_comunal degradado a rejected 2026-09-15 y removido de este workflow |
| Ad hoc / candidate | manual (workflow_dispatch, sin schedule) | a demanda | geometria_comunal (geometria-comunal.yml), autoridades_locales (BCN SIIT + Wikipedia, sin cadencia automática) |
| Stub (no operativo) | — | nunca desde jobs programados | sinim_finanzas_extractor.py es un fallback de desarrollo; el job diario no debe invocarlo (guardrail: tests/test_ci_config.py::SinimDailyJobGuardrailTests) |
Reglas
- Un extractor por carril. Los extractores diarios corren en
make extract; los mensuales, enmonthly-scrape.yml; los candidate, en su workflow propio. Nunca mezclar un extractor en dos carriles. - El override INE es parte del carril diario de
indicadores. Cuando mindicador.cl no entrega el IPC del año en curso,ine_ipc.pyscrapea la variación mensual de la página pública del INE (fuente autoritativa) ANTES de recurrir al backfill — el publish diario depende de ese parseo HTML, y su edad está gateada (ADR-016). La cadena multi-fuente completa (agregador → override → backfill) y su escape hatch están decididos en ADR-017. - El stub SINIM nunca corre en un job programado.
sinim_finanzas_extractor.pysiempre escribe 3 filas de muestra; el snapshot real mensual vive versionado en git y lo restaurapipeline-check.ymltras un restore de caché obsoleto. - Degradación de
autoridades_electassin scrapling. En CI este extractor se invoca conuv run --no-project --with "scrapling[fetchers]"(entorno efímero, conflicto declickcon el extradev— verpyproject.toml). Sin scrapling degrada a 155 registros (0 senadores) y el guard de caída derecord_countdeverify_pipeline.py --profile publicationbloquea el publish (plan 108). Para reproducir la extracción completa en local (mismas versiones pinneadas que CI, Plan 112):
bash
PYTHONPATH=src uv run --no-project --with "scrapling[fetchers]==0.4.10" \
--with polars==1.44.2 --with requests==2.34.2 --with structlog==26.1.0 \
--with tenacity==9.1.4 --with curl_cffi==0.16.3 --with defusedxml==0.7.1 \
python src/extractors/autoridades_electas_extractor.py
5. perfil_territorial_comunal no tiene extractor: es derivado en
build_dev_db.py a partir de otros datasets.
6. geometria_comunal es candidate (ADR-012): su artefacto se publica desde
geometria-comunal.yml, fuera del bundle estable y del guard de 500 KB.
Cómo verificar el carril de un dataset
La fuente de verdad del mapeo dataset↔extractor es data/dataset_catalog_config.json
(campo extractor); el carril de publicación (candidate/stable_publishable),
maturity_status y confidence_tier viven en data/source_registry.json.