ADR-017: Cadena multi-fuente para el IPC — override del INE como último recurso
Fecha: 2026-08-12
Estado: proposed
Decision: La serie ipc de indicadores se entrega por una cadena
multi-fuente con override de último recurso: la serie histórica viene del
agregador (mindicador.cl) y, cuando el IPC del año en curso falta o falla,
ine_ipc.py scrapea la variación mensual de la página pública del INE
(fuente autoritativa del índice). El delivery queda visible como
ine_override (Plan 069) para que el gate de publicación evalúe el dato
real, y la edad del dato entregado se mide igual que un backfill (ADR-016).
Contexto
mindicador.cl dejó de publicar la serie IPC en diciembre de 2025 (issue #43).
El INE es el emisor original del índice y publica la variación mensual en su
página pública. El override replica el patrón validado del proyecto Monedario
(ineIpc.ts, observado estable desde 2026-05-16): ancla el match al
encabezado <h1> del IPC para no tomar la tarjeta de un índice hermano
(ICT/IPP) si el INE reordena el layout (refinado en el Plan 075).
AGENTS.md §10 prohíbe el scraping HTML frágil como fuente principal — esta es la excepción de último recurso: la fuente principal sigue siendo mindicador.cl, y solo cuando una serie mensual esperada llega vacía o falla se consulta al INE. El HTML no se república: se extrae el dato y su fecha.
La dependencia de la cadena diaria sobre un parseo HTML anclado era
silenciosa: el publish de indicadores podía romperse ante un rediseño
de ine.gob.cl sin señal previa. Este ADR la hace visible y decide el
escape hatch.
Decision
1. La cadena multi-fuente es el diseño, no un parche
bcentral_extractor.py procesa en orden: serie del agregador → fallback a
staging/raw → override INE → backfill del artefacto publicado. El
override gana sobre el backfill en la etiqueta de delivery (ine_override
se asigna después de published_backfill — Plan 069), porque etiquetar un
valor recién scrapeado del INE como "reutilización del artefacto publicado"
sería falso y escondería el dato real al gate.
2. El delivery es visible y la edad se gatea (ADR-016)
indicator_delivery.ipc = "ine_override" expone el origen a
verify_pipeline.py, que trata el override con el mismo criterio que
published_backfill: la edad se mide sobre el dato entregado, con el
umbral de cadencia mensual (70 días). Un override INE con el mismo valor mes
tras mes es tan stale como un backfill repetido (P1 de la review del Plan
069).
3. Escape hatch si el INE rediseña y el regex falla
Si el scrape falla (HTML reestructurado, clase o <h1> cambiados), el
extractor degrada al backfill publicado en vez de abortar: la serie se
entrega con su última versión y el gate de edad (ADR-016) empieza a contar.
El mantenedor ve published_backfill + la señal de edad, y el issue se
reabre con evidencia — no se insiste en el scrape roto.
Alcance exacto del escape hatch (matiz operativo — P2 de la review del
PR #72): la degradación graciosa solo ocurre cuando el delivery llega como
published_backfill, es decir en dos escenarios: (a) la request live a
mindicador.cl tiene éxito pero devuelve la serie IPC vacía, o (b)
todas las requests del refresh fallan y entra la rama all-backfill. En
el escenario mixto — la request de IPC lanza excepción mientras el resto
de los indicadores refresca bien, y el scrape INE además falla — el
extractor registra preserved_existing_pairs, que la política de
publicación rechaza a propósito (los recovery diagnostics no son
published_backfill): no hay publicación graciosa. Ese caso queda
bloqueado por diseño y requiere intervención humana, no sorprende a un
operador que confíe en el escape hatch.
Consecuencias
- El publish diario de
indicadoresdepende de un parseo HTML del INE; su edad está gateada por ADR-016 y su origen visible enindicator_deliverydepipeline_metadata.json. docs/extraction-lanes.mddocumenta el override como parte del carril diario deindicadores(regla 2).- AGENTS.md §1 y
docs/datasets/indicadores.mdreferencian este ADR.
Preguntas abiertas
- ¿API de series del INE cuando exista? Si el INE publica una API de series estable, el override HTML se migra a la API y este ADR registra la transición.
- ¿UTM tiene un override análogo (SII)? La UTM es emitida por el SII y el agregador la entrega al día; si deja de hacerlo, la misma cadena multi-fuente aplica con la página del SII — decidir al momento, con ADR propio o extensión de este.
- ¿Backfill congelado vs retirar la serie? Si el INE deja de publicar IPC y mindicador.cl no lo retoma, la decisión es congelar la serie en su última versión (ADR-016 ya la gatea) o retirarla — del mantenedor, con evidencia del issue.
Alternativas descartadas
- Retirar la serie IPC del bundle: el IPC es un indicador central de la capa económica; perderlo por un hueco del agregador castiga a los consumidores por un fallo ajeno a la fuente autoritativa.
- Scrapear el INE como fuente principal: violaría AGENTS.md §10 y duplicaría el trabajo del agregador sin beneficio.
- Override sin etiqueta visible: el valor INE se vería como "live" o "backfill" según la ruta tomada, y el gate de publicación no podría distinguir el dato real del reuso — exactamente el modo de falla que ADR-016 existe para exponer.