# Nota fiscal 3: ejecución frente a su historia

Post 14, ES/EN. Corte entregado: agosto de 2026; información EOG publicada hasta
2026-10-22; consulta de documentos y partidas: 2026-10-23. Rama
`notas/ejecucion-2026`. Sin publicación ni merge a `main`.

## Rehacer cada trimestre

Desde la raíz del sitio, con Node y las dependencias ya instaladas:

```bash
PYTHONDONTWRITEBYTECODE=1 /data/projects/EjecucionScraper/.venv/bin/python scripts/notas/ejecucion-2026/extraer.py --corte 2026-08 --as-of 2026-10-22
python scripts/notas/ejecucion-2026/fuentes.py
node scripts/notas/ejecucion-2026/figuras.mjs
node scripts/notas/ejecucion-2026/portada.mjs
PYTHONDONTWRITEBYTECODE=1 /data/projects/EjecucionScraper/.venv/bin/python scripts/notas/ejecucion-2026/recalcular.py
npm run build
npm run links:check
npm run preview
node scripts/notas/ejecucion-2026/revisar.mjs http://127.0.0.1:5173
node scripts/screenshots.mjs --routes /blog/14,/en/blog/14 --viewports desktop,mobile --out screenshots/notas-ejecucion-2026/paginas
```

Para el siguiente trimestre, cambiar `--corte` (AAAA-MM) y `--as-of` (fecha hasta
la que se admiten publicaciones del EOG). `--as-of` toma hoy si se omite.
`--fuentes` y `--infra` permiten reubicar los dos repos fuente. `--salida` permite
comprobar otro corte en una carpeta temporal sin sobrescribir los CSV de agosto. Se requieren
`openpyxl` y las dependencias existentes del entorno de EjecucionScraper; no se
agregaron dependencias al sitio. No ejecutar el ETL ni refrescar la base fuente.

El extractor acepta cualquier mes con cobertura disponible y se detiene si el
EOG no existe o la API no entrega el corte exacto. Genera observaciones, bandas,
ranking, exclusiones y sensibilidad. Los SVG, tabla y explorador se regeneran
con `figuras.mjs`. La fuente del texto y los titulares del post corresponden a
agosto de 2026: antes de publicar otro corte hay que editar ambos artículos,
actualizar los títulos descriptivos, las referencias documentales de
`fuentes.py`, la portada y el protocolo de verificación. Rehacer datos no
publica ni valida automáticamente una interpretación editorial futura.

Los SVG y el explorador usan los datos recalculados. El explorador incluye los
12 meses históricos en el CSV y muestra enero al corte en la vista interactiva;
la figura principal muestra el año completo con hueco después del último dato
actual. Las etiquetas y notas del nuevo corte deben revisarse visualmente.

## Fuentes, almacenamiento y reproducibilidad

- EOG: `CatalogoEOG` de `dipres-infra`, con filtro `as_of`; tabla larga y Excel
  originales archivados en EjecucionScraper. Por año histórico se usa el último
  libro de diciembre disponible a esa fecha. 2013–2014 quedan fuera porque no
  tienen diciembre completo legible en el paquete. Serie nominal nacional más
  extranjera, Gobierno Central presupuestario, cuadro 6.
- Se importa `_load_document_progress` de `macro/historical_progress.py` para la
  selección canónica local y los montos. Su porcentaje sobre **vigente** no se
  usa como porcentaje sobre Ley: se recalcula `ejecutado / approved_law * 100`.
  La función es interna: su estabilidad no es un contrato. Si cambia, revisar
  el adaptador y el cotejo de totales, sin parchear el upstream.
- La base local llegaba a junio. Julio y agosto se resuelven con dos respuestas
  del explorador público, únicamente para identificar documentos oficiales;
  luego se abren los XML de Dipres, se usa `etl.parser`, y se aplica el predicado
  canónico de hojas en SQLite **en memoria**. Se cotejan gasto y vigente con
  la respuesta de la API. No se consume su banda, porque tiene otro denominador
  y otros años. La caché versionada evita repetir las consultas (límite público:
  60 por día). No hay llamadas API desde el explorador del artículo.
- Las respuestas y XML oficiales consultados están en `fuentes/`. Los XML
  históricos se leen donde ya existen: el inventario CSV conserva su URL y
  SHA-256. Los Excel originales no se duplican: sus huellas están en el mismo
  inventario. El EOG, PDF y encabezados se abrieron realmente.
- Los XML no permiten reconstruir un vintage de publicación exacto al 22 de
  octubre. Se documenta la consulta del día 23, sin atribuirles esa propiedad.
  Los CSV preservan nulos de avance cuando la Ley es cero. No se imputan ceros.
- `etl/institutional/registro.jsonl` restringe la comparación por cruces de
  partida, creación o división; se excluye el año del evento y los anteriores.
  Cambios de nombre y movimientos internos no alteran por sí solos el perímetro
  agregado de la partida. Se exigen tres años; el registro no certifica una
  homogeneización completa ni reexpresa montos.
- Biblioteca visual: `scripts/notas/lib/figuras.mjs`, con d3. Adaptación aditiva
  `scripts/notas/lib/cotejo_eog.py`: contrasta el bloque anual del Excel. Corrige
  únicamente la asignación errónea de columnas de 2021 a 2022 en diciembre de
  2022, sin modificar el lector fuente ni inventar celdas.

`avance-mensual.csv` publica unidad, cobertura, documento, hoja/celda o campos
XML, fecha de publicación cuando existe, consulta y huella. `banda.csv` identifica
los años exactos y los documentos de cada muestra; `anios-excluidos.csv` explica
las omisiones. `ranking.csv` incluye ambas medianas (Ley y vigente), la posición
en el rango y la nota institucional. `fuentes.csv` lista cada documento utilizado.

## Criterio fijado antes del cálculo

Banda principal de nueve años: 2015–2019, 2022–2025. Se excluyen 2020 y 2021 por
las autorizaciones extraordinarias de la pandemia. `sensibilidad.csv` conserva
la banda que los incluye. La mediana no pondera por montos. Un año fuera del
mínimo–máximo es excepcional respecto de esta muestra; estar sobre la mediana
sin salir del rango no lo es. El protocolo previo se conserva en el primer
commit `a2c3c9d`.

El agregado nacional y las partidas tienen coberturas diferentes: el primero
es gasto no financiero consolidado en moneda nacional más extranjera; las
segundas son gasto presupuestario bruto en pesos de subtítulos 21–35, con
operaciones financieras. No se suman ni se atribuye el desvío nacional a sus
montos. El presupuesto inicial y el vigente son denominadores distintos.

No hay comparación monetaria interanual ni párrafo de ingresos: se mantiene el
foco en el ritmo. Si se añade, seguir la convención Dipres (IPC promedio enero al
corte, no IPC final), declarar base y cotejar el deflactor con el EOG.

## Revisión

`recalcular.py` abre el Excel sin el lector de tablas y reconstruye tres avances
actuales como monto acumulado / Ley. Contrasta también el bloque anual de cada
año de la banda y el total sintético GASTOS de todos los XML de agosto, por un
camino distinto de la suma de hojas del extractor. La evidencia queda en
`fuentes/recalculo.json`. `revisar.mjs` es una comprobación puntual de aceptación,
sin instalar un test runner: comprueba prerender, ambos idiomas, todos los
selectores, nulos, teclado, crosshair, tabla, tamaños de texto y ausencia de red
adicional en el explorador. Revisar las capturas a ojo; la revisión editorial
con contexto limpio queda a cargo de Alonso.

El prerender descubre los ID numéricos de los archivos del blog automáticamente
(`getBlogPostIds` en `scripts/prerender.mjs`): al registrar el post 14 se generan
`dist/blog/14/index.html` y `dist/en/blog/14/index.html` sin añadir rutas
manualmente ni modificar ese script.


## Presentación tras la revisión editorial

Titular y apertura priorizan la distancia entre corriente (+2,5 pp) y capital
(−4,0 pp), manteniendo la comparación agregada como contexto. `figuras.mjs`
genera HTML con grillas y SVG separados para las curvas y para el ranking:
el orden por desvío se conserva entre los dos paneles y la escala es común.
La anchura máxima del conjunto es 680 px. Para revisar esta presentación:

```bash
node scripts/notas/revisar-editorial.mjs http://127.0.0.1:5175
```

`portada.mjs` usa la función compartida en `scripts/notas/lib/portada.mjs` y el
archivo local de Space Grotesk; el gráfico ocupa 67,2% del lienzo. El recibo queda
en `portadas-editorial.json`. Las fuentes repetidas se agrupan por serie en
la bibliografía y los localizadores técnicos quedan en los datos y la verificación.
