Releases: psbella/remediar
Release list
v2.2.1
🔒 Seguridad
admin.htmlsacado del repo público por una vulnerabilidad XSS (campos sin sanitizar en innerHTML/handlers inline), en la misma página donde se ingresa un GitHub PAT con scope contents:write. Se sube puntualmente cuando se necesite usar.
✨ Agregado
- 15 tests unitarios nuevos para las funciones puras de
scripts/etl/(utils, blacklist, outliers, droga_fixes, reparaciones, parser) — 28 tests en total. - Ruff y ESLint configurados (set inicial pragmático, sin bloquear CI todavía).
🐛 Corregido
presentacion.py: 'pda' estaba definido dos veces (PARCHE y POMADA) — se confirma POMADA como correcto y se elimina la entrada muerta.store.js: indentación incorrecta en el cierre de_extraerFiltros.
📝 Documentado
- CHANGELOG: se corrige el encabezado faltante de
## [2.2.0], que había quedado como contenido huérfano.
v2.2.0 — Footer con licencia/versión + fix de contraste WCAG AA
✨ Agregado
- Footer: link a la licencia MIT (opensource.org/license/mit) y número de versión, leído dinámicamente desde
package.json.
🐛 Corregido
- Contraste de
--text-5(#999999 → #6c6c6c) para cumplir WCAG AA en el placeholder del buscador y los íconos de filtros/footer. - Declaración duplicada de
.celda.valor.uppercaseenstyle.css. - Cache del Service Worker (
CACHE_NAME) actualizado para forzar la baja de los assets estáticos nuevos.
Full Changelog: v2.1.9...v2.2.0
[2.1.9] - Modularización de pdf_to_json
[2.1.9] - 2026-07-10
♻️ Refactor
scripts/pdf_to_json.pymodularizado: las 8+ capas de normalización se movieron a un paquetescripts/etl/de 10 módulos (config,parser,reparaciones,droga_fixes,presentacion,pami,blacklist,outliers,enriquecimiento,utils).pdf_to_json.pyqueda como orquestador puro (~110 líneas, antes ~2000).
🐛 Corregido
github_release_helper.pyysnapshot_semanal.py:REPOestaba hardcodeado apsbella/remediar; ahora usaGITHUB_REPOSITORY(seteada automáticamente por Actions), con ese valor como fallback. El hardcodeo rompía la subida de assets con 403 en cualquier repo derivado (detectado al probar enremediar-refactor).
📝 Documentado
- README: árbol de directorios, diagrama de arquitectura y tabla de scripts actualizados para reflejar el paquete
scripts/etl/.
Full Changelog: v2.1.8...v2.1.9
v2.1.8 — CSP sin unsafe-inline + validación formal de schema
🔒 Seguridad
- Cierra el ítem M1, pendiente desde el inicio de la auditoría técnica:
style-srcde la CSP ya no necesita'unsafe-inline'. Se migraron los 12style="..."inline deindex.html/admin.htmla clases CSS, y los bloques<style>embebidos deadmin.htmlymantenimiento.htmlse movieron a archivos externos (admin.css,mantenimiento.css). Verificado en producción concurl -Iy consola del navegador sin errores de CSP. - Actualizada la Response Header Transform Rule de Cloudflare con la CSP reforzada.
- Desactivado Cloudflare Web Analytics (no se usaba; generaba un bloqueo de CSP en consola).
✨ Agregado
- Validación formal de schema (
tests/test_schema.py+tests/medicamentos.schema.json) paramedicamentos.json— valida el contrato estructural completo (claves, tipos, opcionalidad) contra un JSON Schema versionado, separado de los umbrales de calidad de negocio que ya cubretest_etl_sanidad.py. La suite de sanity tests pasa de 12 a 13 checks.
📝 Documentado
- README actualizado: conteo de tests, sección de seguridad, salida de ejemplo de la suite.
Changelog completo: CHANGELOG.md
What's Changed
- chore(deps): bump actions/checkout from 4 to 7 by @dependabot[bot] in #16
Full Changelog: v2.1.7...v2.1.8
What's Changed
- chore(deps): bump actions/checkout from 4 to 7 by @dependabot[bot] in #16
Full Changelog: v2.1.7...v2.1.8
v2.1.7 — Dedup del ETL + consolidación de seguridad, a11y y CI
✨ Agregado
- Deduplicación de registros exactos del PDF de SIAFAR antes de las capas de reparación del ETL.
🐛 Corregido
js/main.js: el listener depageshowleíatimestampen vez detsdel cache ensessionStorage— la limpieza de cache vieja al volver con el botón "atrás" nunca se ejecutaba..gitignore: línea concatenada que impedía ignorardata/pami.xlsxy.wrangler/correctamente.
♻️ Refactor
- Unificadas las dos heurísticas duplicadas de detección de laboratorio corrupto (
filters.js/utils.js) en una sola función.
🔒 Seguridad
- Confirmado en producción:
remedi.arywww.remedi.arentregan CSP,X-Frame-Options: DENYy el resto de los headers de seguridad vía Cloudflare Response Header Transform Rules (ambos hosts proxied, GitHub Pages como origen). Verificado concurl -I. Strict-Transport-Securitysumado a_headers.
♿ Accesibilidad
- Contraste de texto teal corregido a AA (WCAG) en 7 selectores de
style.css.
⚙️ CI/CD
timeout-minutesyconcurrencyagregados a los 4 workflows — evita corridas superpuestas y jobs colgados sin límite.
🧹 Eliminado
pami.xlsxyscripts/__pycache__/destrackeados de git.
Changelog completo: CHANGELOG.md
v2.1.6 — Permisos en workflows + CodeQL versionado + SEO + filter.js
🔒 Seguridad
- Bloque
permissions: contents: writeexplícito enmaintenance-on.yml— quedó afuera cuando se aplicó el mismo fix aupdate_prices.ymlymaintenance-off.ymlen la 2.1.4. Cierra el último de los tres workflows sin permisos acotados delGITHUB_TOKEN. - Se versiona
.github/workflows/codeql.yml(antes CodeQL corría vía configuración de la pestaña Security sin quedar reflejado en el código del repo). Cubre JS, Python y los propios workflows de Actions.
🔍 SEO
-
robots.txtya no bloquea/data/ni/js/📝 Documentado
-
SECURITY.md— política de reporte de vulnerabilidades y canal de contacto directo. -
🐛 Corregido
-
js/main.js: el listener depageshowleíatimestampen vez detsdel cache ensessionStorage— la limpieza de cache vieja al volver con el botón "atrás" nunca se ejecutaba.
🧹 Eliminado
scripts/__pycache__/ destrackeados de git (ya estaban en .gitignore, pero seguían en el índice desde antes de esa regla).
♻️ Refactor
- Unificadas
esValorCorrupto(filters.js) yesLaboratorioCorrupto(utils.js) en una sola función — evita que las dos heurísticas diverjan con el tiempo.
Changelog completo: CHANGELOG.md
New Contributors
- @dependabot[bot] made their first contribution in #14
Full Changelog: v2.1.5...v2.1.6
Historial July 2026
Snapshots semanales de precios — Historial July 2026
v2.1.5
- Fix: onLimpiar() no reseteaba el checkbox visual de #togglePami
- Elimina variable duplicada
todosen main.js (usa getTodos()) - Refactor: js/core/store.js → js/store.js
- Agrega skip navigation link
- admin.html sin Google Fonts externas
- Sincroniza package.json/README con el CHANGELOG real (2.1.2 → 2.1.5)
Full Changelog: v2.1.4...v2.1.5
v2.1.4 — Permisos de CI, limpieza de commits automáticos y optimizaciones en el ETL
🐛 Corregido
update_prices.ymlseguía agregandodata/pami.xlsxydata/droga_fixes.json
al commit en cada corrida pese a que un release anterior ya lo daba por
resuelto — el cambio no había quedado aplicado en el YAML. Ahora ninguno
de los dos se toca en el paso de commit.
🔒 Seguridad
- Bloque
permissions: contents: writeexplícito enupdate_prices.yml
(hallazgo de CodeQL: el workflow no limitaba los permisos delGITHUB_TOKEN).
⚡ Mejorado
_build_re_lab_pegado()ya no se reconstruye dos veces sobre el dataset
completo enpdf_to_json.py— se cachea una sola vez y se reutiliza entre
extraer_presentacion_de_marca()ylimpiar_dosis_residual_en_marca().- Reemplazado
iterrows()porto_dict('records')/itertuples()en los
dos loops del crosswalk PAMI (_build_pami_index()y el fallback de
dosis desde nombre de marca).
📝 Documentado retroactivamente
data/pami.xlsxno se versiona en git desde algún punto entre 2.1.0 y
2.1.2 (fecha exacta no registrada en el changelog): se descarga fresco
en cada corrida del ETL desde el portal de datos abiertos de PAMI (CKAN),
con retry y backoff, y está en.gitignore. Corresponde al ítem de
roadmap de la auditoría técnica sobre migrarpami.xlsxfuera de git,
que en los hechos ya estaba resuelto pero nunca había quedado asentado.
v2.1.2
- Elimina setTodos() (store.js) y ordenarPorPrecio() (filters.js),
sin referencias en el repo - Agrega prefers-reduced-motion en @Keyframes pulse del update-pill
- Consolida import urllib.parse en snapshot_semanal.py (estaba
duplicado dentro de main() y del bloque main) - Bump version 2.1.1 → 2.1.2 (package.json + badge README)
Full Changelog: v2.1.1...v2.1.2