Skip to content

Web responsiva en móvil + política de seguridad con cargo audit en CI (2 vulnerabilidades preexistentes arregladas)#3

Merged
javileyes merged 2 commits into
mainfrom
web-responsive-y-seguridad
Jul 26, 2026
Merged

Web responsiva en móvil + política de seguridad con cargo audit en CI (2 vulnerabilidades preexistentes arregladas)#3
javileyes merged 2 commits into
mainfrom
web-responsive-y-seguridad

Conversation

@javileyes

Copy link
Copy Markdown
Owner

Qué trae

Dos temas independientes de la campaña ya fusionada, en una rama con nombre propio:

1. Web responsiva para smartphone vertical (8e962eb8e)

  • Cabecera (≤720px): título + botón ☰; las 8 acciones viven en un menú desplegable bajo la cabecera sticky — el mismo nodo recolocado por CSS, sin duplicar handlers. Cierra al elegir acción, al tocar fuera y con Escape; aria-expanded + claves i18n es/en.
  • Barra de entrada: por defecto campo + ⚙️ + Evaluar; el engranaje despliega los 4 selects de modo y lleva un punto de acento cuando algún modo difiere de su default — un complex=on oculto cambiaría la semántica sin rastro visible. Con opciones abiertas, body.options-open amplía la holgura para que la última celda no quede tapada (defecto cazado midiendo cardBottom contra barTop en navegador).
  • Celdas: todo mjx-container de tarjetas y paneles panea en horizontal con scroll táctil; una fórmula larga nunca fuerza scroll lateral de página.
  • Escritorio byte-idéntico (verificado a 1280px). Verificación completa en navegador real a 375×812 con el servidor de dev; smoke de la web 4/4.

2. SECURITY.md + cargo audit en CI (dbd92020d)

  • El orden importó: antes de crear el gate se midió el árbol, y la primera pasada encontró 2 vulnerabilidades reales ya presentesbytes 1.11.0 (RUSTSEC-2026-0007, overflow en BytesMut::reserve) y crossbeam-epoch 0.9.18 (RUSTSEC-2026-0204, deref de puntero inválido, bajo el rayon del motor). Arregladas con bumps de parche; workspace completo verde después (357 suites / 12586 / 0). El gate nace verde.
  • SECURITY.md honesto: canal privado, alcance en positivo (ejecución/escape vía expresión o sesión, inyección en el server de dev, cuelgues que salten los budgets) y en negativo (lentitud dentro de budgets, resultados incorrectos, DoS contra un server.py expuesto), modelo de confianza escrito (incluido que server.py escucha en todas las interfaces y no es desplegable), y best-effort sin SLA.
  • Workflow audit.yml: rustsec/audit-check en cambios del árbol de dependencias + semanal (los runs programados abren issue por advisory nueva). Vulnerabilidades fallan; warnings informan.

Para el revisor

  • El commit responsivo toca solo web/index.html (+201); los toggles móviles viven bajo la media query de 720px que ya existía.
  • Tras el merge conviene activar el private vulnerability reporting (Settings → Security) para que el canal preferente del SECURITY.md exista.
  • El deploy de Pages se dispara solo al fusionar (workflow existente).

🤖 Generated with Claude Code

javileyes and others added 2 commits July 27, 2026 01:01
… de evaluación plegadas tras un engranaje CON indicador, y paneo táctil garantizado en todo el MathJax de celdas y paneles

En un smartphone vertical la cabecera intentaba meter 8 controles en línea y la
barra de entrada empujaba 4 selects delante del campo. Ahora (≤720px):

- CABECERA: título + botón ☰. Las acciones (idioma, tema, exportar, importar,
  variables, funciones, ejemplos, limpiar) viven en un menú desplegable bajo la
  cabecera sticky — MISMO nodo .header-buttons recolocado por CSS, así que los
  handlers no se duplican. Se cierra al elegir una acción, al tocar fuera y con
  Escape; aria-expanded en el toggle y claves i18n es/en nuevas.

- BARRA DE ENTRADA: por defecto solo campo + ⚙️ + Evaluar. El engranaje
  despliega los 4 selects de modo. COMO LOS SELECTS QUEDAN OCULTOS, un modo
  no-default cambiaría la semántica sin rastro visible: el engranaje lleva un
  punto de acento siempre que algún modo difiere de su default
  (domain=generic, branch=strict, complex=off, numeric=exact), actualizado por
  listener de change. Con las opciones abiertas la barra crece varias filas:
  body.options-open amplía el padding-bottom para que la última celda nunca
  quede tapada (defecto cazado midiendo cardBottom contra barTop en el
  navegador).

- CELDAS: todo mjx-container dentro de tarjetas y paneles panea en horizontal
  por sí mismo (overflow-x auto + -webkit-overflow-scrolling touch), de modo
  que una fórmula larga nunca fuerza scroll lateral de la PÁGINA. Los carriles
  que ya escrolaban (.result-math, .rule-change, .step-math) se verificaron
  intactos; la regla nueva cubre pasos y paneles sin envoltorio propio.

ESCRITORIO (>720px) BYTE-IDÉNTICO: los dos toggles nuevos viven bajo la media
query; capturado antes/después a 1280px.

VERIFICADO en navegador real a 375×812 con el servidor de dev y el binario
release: menú abre/cierra por las tres vías; engranaje pliega/despliega y el
punto aparece al poner complex=on; integrate(1/(x^3-2), x) y expand((1+x)^7)
renderizan con paneo propio y documentElement.scrollWidth ==
clientWidth (sin desborde de página) en todos los estados; la celda queda
visible sobre la barra con opciones abiertas. Smoke de la web: 4/4 OK.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…audit encontró 2 vulnerabilidades YA presentes, arregladas antes de crear el gate

EL ORDEN IMPORTÓ: antes de añadir el gate se midió el estado del árbol, y el
primer `cargo audit` del proyecto encontró 2 vulnerabilidades reales en
dependencias ya commiteadas:

- bytes 1.11.0 → 1.12.1 (RUSTSEC-2026-0007: overflow de enteros en
  BytesMut::reserve)
- crossbeam-epoch 0.9.18 → 0.9.20 (RUSTSEC-2026-0204: deref de puntero
  inválido — bajo el rayon que usa el motor)

Ambas con bump de parche; workspace completo verde tras los bumps (357 suites /
12586 / 0). El gate nace VERDE, no rojo. Quedan 3 warnings informativos
(bincode unmaintained, anyhow/rand unsound) que por política no gatean.

SECURITY.md, honesto y a la medida del proyecto:
- Canal privado (GitHub private vulnerability reporting + email de respaldo).
- Alcance en positivo: ejecución/escape vía expresión o JSON de sesión
  manipulados, inyección en el servidor de dev, y cuelgues que SALTEN el
  sistema de budgets (el contrato del motor es que toda evaluación está
  acotada; escaparse de eso es hallazgo de seguridad, no lentitud).
- Alcance en negativo explícito: lentitud dentro de budgets, resultados
  incorrectos (bug ordinario de primera clase, no reporte de seguridad), y
  DoS contra un server.py expuesto públicamente.
- Modelo de confianza escrito: expresiones siempre no confiables; el import
  de sesión se REPRODUCE por el motor (un JSON manipulado tiene exactamente
  el poder de teclear lo mismo); el WASM es solo cliente; y server.py escucha
  en TODAS las interfaces (deliberado, lo necesita la variante Colab) — está
  documentado como servidor de desarrollo, no desplegable.
- Best effort declarado: sin SLA ni matriz de versiones que generen deuda.

CI (.github/workflows/audit.yml): rustsec/audit-check en cada cambio del árbol
de dependencias y semanal contra la advisory database (los runs programados
abren issue por advisory nueva — las advisories llegan sin que nadie commitee).
Vulnerabilidades fallan; warnings informan.

Pendiente del lado del propietario del repo: activar el private vulnerability
reporting en Settings → Security para que el canal preferente exista.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@javileyes
javileyes merged commit d9a58ff into main Jul 26, 2026
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant