Web responsiva en móvil + política de seguridad con cargo audit en CI (2 vulnerabilidades preexistentes arregladas)#3
Merged
Conversation
… 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Qué trae
Dos temas independientes de la campaña ya fusionada, en una rama con nombre propio:
1. Web responsiva para smartphone vertical (
8e962eb8e)aria-expanded+ claves i18n es/en.complex=onoculto cambiaría la semántica sin rastro visible. Con opciones abiertas,body.options-openamplía la holgura para que la última celda no quede tapada (defecto cazado midiendocardBottomcontrabarTopen navegador).mjx-containerde tarjetas y paneles panea en horizontal con scroll táctil; una fórmula larga nunca fuerza scroll lateral de página.2. SECURITY.md +
cargo auditen CI (dbd92020d)bytes1.11.0 (RUSTSEC-2026-0007, overflow enBytesMut::reserve) ycrossbeam-epoch0.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.server.pyescucha en todas las interfaces y no es desplegable), y best-effort sin SLA.audit.yml:rustsec/audit-checken cambios del árbol de dependencias + semanal (los runs programados abren issue por advisory nueva). Vulnerabilidades fallan; warnings informan.Para el revisor
web/index.html(+201); los toggles móviles viven bajo la media query de 720px que ya existía.🤖 Generated with Claude Code