Coverage Studio en la línea de comandos 2.2026.4 — un archivo medido por dos motores se cuenta una vez, desde donde sea que inicie el comando
2026-10-04
Corregido
- La carpeta desde la que inicia el comando no decide lo que significa un informe. 2.2026.3 ancla las rutas relativas de un informe en la carpeta donde se escribió ese informe, pero solo para un comando iniciado en otro sitio. Ejecutado desde la raíz del árbol que mide —que es donde normalmente se ejecuta un comando de cobertura—, una ruta relativa seguía respondiéndose contra esa carpeta, y un archivo que llvm-cov ya había nombrado por completo se contaba una segunda vez: un árbol de 5.258 líneas se leía como 5.836. Ahora solo deciden
--cwd y la ubicación del propio informe. La misma corrección está en ambos editores, donde la carpeta era aquella desde la que se había iniciado VS Code o Visual Studio. export --format json escribía la ejecución encima de sus ajustes. Su archivo era fucini-coverage.json —el nombre del que se leen los ajustes—, de modo que en una carpeta configurada de la manera habitual la exportación destruía los umbrales con los que acababa de juzgar. La ejecución se escribe en coverage-run.json, y export y badge rechazan un --out que nombre el archivo de ajustes. --cwd acepta una carpeta la escriba como la escriba. Una relativa —--cwd ., --cwd ../tree— se tomaba tal cual y se leía con las reglas de ruta equivocadas: en Windows respondía que no podía leerse un archivo de ajustes mitad POSIX y mitad Windows, y no encontraba ningún informe. Un separador final tampoco forma ya parte de la carpeta. - Una opción que nadie ha declarado no es un informe.
summary -o out.json tomaba -o por un informe y decía que no existe ese archivo. Solo -h y -v son cortas; -- sigue pasando un archivo cuyo nombre empieza por guion, y una opción escrita antes del comando se nombra en el error en lugar de responderse con toda la ayuda. check --json dice lo que dice su código de salida. Sin umbral definido escribía "passed": false junto al código de salida 0, y una canalización que leía el JSON en vez del código de salida hacía fallar una ejecución que el comando había aprobado. passed es el código de salida en una palabra; configured es lo que dice que no había ninguna puerta. Un --lines "" vacío se rechaza en lugar de apagar esa puerta en silencio. - Una comparación coloca la línea base donde coloca la ejecución.
pathRemap y la raíz que declara un informe se aplicaban a la ejecución y no a la línea base, así que una línea base escrita en un servidor de compilación no emparejaba con nada y la comparación informaba de que nada se había movido junto a un total que claramente sí.
Coverage Studio en la línea de comandos 2.2026.3 — un archivo medido por dos motores vuelve a ser un solo archivo
2026-10-04
Corregido
- Las rutas relativas de un informe se anclan donde se escribió ese informe. llvm-cov escribe la ruta completa de un archivo; gcovr la escribe relativa a la carpeta de compilación en la que está su informe. Con ambos informes de un mismo árbol,
summary listaba dos veces cada archivo que los dos tenían en común —una vez con las cifras de cada motor— y sumaba ambos al total, porque una ruta relativa no tenía raíz contra la que resolverse y se resolvía contra la carpeta en la que estuviera el shell en ese momento. Un árbol de 5.258 líneas se informaba como 5.836, y el excedente pertenecía a archivos bajo una ruta que no contiene ninguno. Ahora cada informe se ancla a su propia carpeta y a las de encima, hasta la carpeta en la que se ejecuta el comando, como ya lo hacen ambas ediciones: así los dos se encuentran como un único conjunto de archivos, sin una regla pathRemap por directorio de compilación. - Un archivo de configuración que empieza con una marca de orden de bytes también se rechazaba. Un editor en Windows puede escribirla delante del texto; ya no se toma como parte del JSON.
- La salida canalizada a un lector que se detiene antes termina en silencio.
summary canalizado a head, o al Select-Object -First de PowerShell, moría con un EPIPE no gestionado y una traza de pila. Que el lector cierre la tubería es su decisión, no un fallo del comando: ahora termina con el código de salida al que había llegado.
Coverage Studio en la línea de comandos 2.2026.1 — se lee un archivo de configuración con patrones
2026-10-04
Corregido
- Se rechazaba un archivo de configuración con patrones. Con
**/*.lcov.info en una ruta de fuciniCoverage.coverageFile.paths y **/coverage.json en la siguiente, todos los comandos terminaban con is not JSON: lo que quedaba entre ambos se tomaba por un comentario. Ahora el archivo se lee como lo leen los editores, incluidos un comentario después de un valor y una coma antes de un corchete de cierre.
Coverage Studio en la línea de comandos 2.2026.0 — fucini-coverage, la primera versión
2026-10-04
Añadido
- El lector en la línea de comandos, gratis.
npm install -g fucini-coverage — el mismo lector que las dos ediciones, para los sitios donde no hay editor. Un paquete, un comportamiento en Windows, Linux, WSL y macOS, Node 20 o más reciente.
check, la puerta. Código de salida 1 por debajo de un umbral en líneas, ramas, funciones, MC/DC, condiciones, regiones, mutación o la puntuación ponderada, desde la configuración o la línea de comandos; --new-code 80 --base-ref origin/main juzga las líneas que una rama cambió, a partir de un git diff que ejecuta la herramienta; --require-reasons hace fallar un marcador de exclusión sin motivo.
summary, export, report, badge, compare. Los totales y cada archivo; la ejecución como CSV por archivo o por función, Markdown, LCOV, Cobertura, SARIF, la lista de exclusiones, una insignia o el JSON de Fucini; el informe HTML de varias páginas; la insignia coloreada según la escala de la configuración; esta ejecución frente a una línea base, las regresiones primero, con --fail-on-regression para una comprobación de pull request.
mcp, para un agente de IA. Las seis herramientas de las ediciones, servidas sobre la ejecución en 127.0.0.1 tras un token, con la entrada para el mcp.json del cliente impresa.
- El archivo de configuración de la edición para Visual Studio.
fucini-coverage.json junto al código, con las claves fuciniCoverage.* de la configuración de VS Code; .vscode/settings.json por debajo. Los informes se nombran como archivos, carpetas o patrones, un .gz se descomprime, y cada comando se documenta a sí mismo: fucini-coverage help <command>.
Coverage Studio for VS Code 2.2026.2 — La prueba comienza con la respuesta del servidor de licencias
2026-10-04
Cambiado
- La prueba de una instalación nueva comienza con la primera respuesta del servidor de licencias. Hasta que la extensión haya contactado una vez con fucini.software funciona en el nivel Community y explica por qué. Una instalación que ya está en su prueba, o que tiene licencia, no nota nada.
- Sin prueba en un contenedor de desarrollo o un Codespace. Allí la extensión arranca en el nivel Community; un código de suscripción, una clave o el pase de 7 días lo desbloquea todo.
- El libro de uso conoce una máquina por un segundo hash, el del identificador propio del sistema operativo. Solo se envía el hash; véase la política de privacidad.
Coverage Studio para Visual Studio 2.2026.1 — Pequeñas correcciones
2026-10-04
Corregido
- Pequeñas correcciones. Una versión de mantenimiento: pequeñas correcciones internas, y nada que cambie lo que ve ni cómo se usa.
Coverage Studio for VS Code 2.2026.1 — Pequeñas correcciones
2026-10-04
Corregido
- Pequeñas correcciones. Una versión de mantenimiento: pequeñas correcciones internas, y nada que cambie lo que ve ni cómo se usa.
Coverage Studio para Visual Studio 2.2026.0 — La cobertura en pantalla, para agentes de IA
2026-10-04
Añadido
- La cobertura en pantalla, para agentes de IA. Un agente que escribe tests podía ejecutarlos y leer un porcentaje; no podía preguntar lo que sabe Visual Studio. Seis herramientas responden a eso, en palabras con las que un agente puede actuar:
coverage_summary, coverage_gaps, tests_for_line, patch_coverage, coverage_delta y test_run_command. Un agente que hable MCP llega a ellas a través de un servidor que Visual Studio ejecuta cuando fuciniCoverage.mcp.enabled está activado — desactivado por defecto, solo en 127.0.0.1, tras un token propio, y cerrado a las páginas web. Copy MCP Server Configuration pone la entrada del cliente en el portapapeles. - Las mismas cifras que en pantalla. Las herramientas responden a partir de la ejecución cargada — las mismas exclusiones, la misma reasignación de rutas —, así que un agente al que se le pide cubrir los huecos de una función y un revisor que mira el margen hablan de las mismas líneas.
Cambiado
- El plan de una clave decide en Visual Studio lo que decide en VS Code. Un plan que deja fuera una funcionalidad — MC/DC, el informe HTML, los nombres de los tests que ejecutaron una línea — la dejaba fuera en VS Code y no aquí. Ambas ediciones leen ahora la misma tabla: una funcionalidad que el plan no incluye no se ofrece, y su comando lo dice.
- La versión mínima que pide el servidor de licencias vale también aquí. Ambas ediciones llevan la misma versión a partir de la 2.2026.0, así que una compilación anterior a ese mínimo pide actualizarse, como hace la edición para VS Code.
Coverage Studio for VS Code 2.2026.0 — La cobertura en pantalla, para agentes de IA
2026-10-04
Añadido
- La cobertura en pantalla, para agentes de IA. Un agente que escribe tests podía ejecutarlos y leer un porcentaje; no podía preguntar lo que sabe el editor. Seis herramientas responden a eso, en palabras con las que un agente puede actuar:
coverage_summary, coverage_gaps, tests_for_line, patch_coverage, coverage_delta y test_run_command. El agente propio de VS Code las tiene como herramientas de modelo de lenguaje, sin nada que configurar. Cualquier otro agente que hable MCP llega a ellas a través de un servidor que la extensión ejecuta cuando fuciniCoverage.mcp.enabled está activado — desactivado por defecto, solo en 127.0.0.1, tras un token propio, y cerrado a las páginas web. Copy MCP Server Configuration pone la entrada del cliente en el portapapeles. - Las mismas cifras que en pantalla. Las herramientas responden a partir de la ejecución cargada — las mismas exclusiones, la misma reasignación de rutas —, así que un agente al que se le pide cubrir los huecos de una función y un revisor que mira el margen hablan de las mismas líneas.
Coverage Studio para Visual Studio 1.2026.22 — un archivo medido por dos motores es un solo archivo
2026-10-04
Corregido
- Un archivo medido por dos motores es un solo archivo. llvm-cov escribe la ruta completa de un archivo; gcovr la escribe relativa a la carpeta de compilación en la que está su informe. Una ruta relativa se ancla en la carpeta del propio informe y en las carpetas por encima de ella, pero antes de eso el resolutor preguntaba si la ruta existía tal como estaba, y esa pregunta se responde desde la carpeta en la que se inició el propio Visual Studio. Si esa carpeta contenía el archivo, la ruta seguía siendo relativa: el archivo tenía dos nombres, aparecía dos veces en la ventana Coverage y se contaba dos veces en los totales. Un árbol de 5.258 líneas se leía como 5.836. Una ruta que no nombra ninguna ubicación propia ya no se pregunta siquiera; se ancla donde se escribió el informe, y la fila lo dice.
Coverage Studio para VS Code 1.2026.23 — un archivo medido por dos motores es un solo archivo, y el modo de margen que elija se queda fuera de sus ajustes
2026-10-04
Corregido
- Un archivo medido por dos motores es un solo archivo. llvm-cov escribe la ruta completa de un archivo; gcovr la escribe relativa a la carpeta de compilación en la que está su informe. Una ruta relativa se ancla en la carpeta del propio informe y en las carpetas por encima de ella, pero antes de eso el resolutor preguntaba si la ruta existía tal como estaba, y esa pregunta se responde desde la carpeta en la que se inició el host de extensiones, que tras
code . es la raíz de su proyecto. La ruta seguía entonces siendo relativa: el archivo tenía dos nombres, aparecía dos veces en la vista Coverage y se contaba dos veces en los totales. Un árbol de 5.258 líneas se leía como 5.836. Una ruta que no nombra ninguna ubicación propia ya no se pregunta siquiera; se ancla donde se escribió el informe, y la fila lo dice. - El modo de margen que elige vale para la sesión, y sus ajustes se quedan como los escribió. Elegir un modo en la barra de estado, en el selector o con Toggle Coverage Painting lo escribía en
settings.json, un archivo que en muchos proyectos está bajo control de versiones y que aquí reescribía un botón pensado para pulsarse dos veces por minuto. La elección vive ahora durante la sesión, y un modo que haya escrito en sus ajustes sigue ganando cuando se abre la ventana.
Coverage Studio para Visual Studio 1.2026.21 — ¿Lo notaría un test? Una ejecución de mutación en el cursor
2026-10-03
Añadido
- Run Mutation Tests Here. La cobertura dice que una línea se ejecutó; una herramienta de mutación dice si un test notaría que está mal. La función en la que está el cursor — o las líneas seleccionadas, o el archivo — es lo que se le pide mutar a la herramienta de mutación de la carpeta, y su informe se carga junto a la cobertura en pantalla: Stryker.NET para C#, StrykerJS para JavaScript y TypeScript, PIT con Maven para Java. La ejecución de mutación de un proyecto lleva una hora; la de una función, un minuto.
Coverage Studio for VS Code 1.2026.22 — ¿Lo notaría un test? Una ejecución de mutación en el cursor
2026-10-03
Añadido
- Run Mutation Tests Here. La cobertura dice que una línea se ejecutó; una herramienta de mutación dice si un test notaría que está mal. La función en la que está el cursor — o las líneas seleccionadas, o el archivo — es lo que se le pide mutar a la herramienta de mutación de la carpeta, y su informe se carga junto a la cobertura en pantalla: Stryker.NET para C#, StrykerJS para JavaScript y TypeScript, PIT con Maven para Java. La ejecución de mutación de un proyecto lleva una hora; la de una función, un minuto.
Coverage Studio para Visual Studio 1.2026.20 — La propia aplicación, con cobertura
2026-10-03
Añadido
- Run App with Coverage… mide lo que alcanza una persona, no solo lo que hacen los tests: la aplicación .NET de la carpeta se inicia bajo
dotnet-coverage de Microsoft, en una consola propia, y se ejecuta hasta que se cierra. Lo recorrido se carga después como cualquier ejecución, y en una sesión de cobertura se suma a lo que ejecutaron los tests. Necesita dotnet tool install --global dotnet-coverage.
Coverage Studio for VS Code 1.2026.21 — La propia aplicación, con cobertura
2026-10-03
Añadido
- Run App with Coverage… mide lo que alcanza una persona, no solo lo que hacen los tests: la aplicación .NET de la carpeta se inicia bajo
dotnet-coverage de Microsoft, en una consola propia, y se ejecuta hasta que se cierra. Lo recorrido se carga después como cualquier ejecución, y en una sesión de cobertura se suma a lo que ejecutaron los tests. Necesita dotnet tool install --global dotnet-coverage.
Coverage Studio para Visual Studio 1.2026.19 — Artefactos zip de GitHub y GitLab
2026-10-03
Añadido
- Una referencia de CI desde un artefacto zip. GitHub y GitLab publican un artefacto como archivo comprimido. Donde
baseline.report nombra uno — una URL, o un zip en disco —, se abre y se conserva el informe que contiene: el miembro nombrado tras el # (ci/artifact.zip#coverage/lcov.info), si no, el único archivo del zip, y si no, su único archivo que parece un informe.
Coverage Studio for VS Code 1.2026.20 — Artefactos zip de GitHub y GitLab
2026-10-03
Añadido
- Artefactos zip de GitHub y GitLab. La CI publica un artefacto, y un artefacto es un archivo comprimido. Un zip obtenido ahora se abre y se conserva el informe que contiene — el miembro nombrado tras el
# de la URL (…/zip#coverage/lcov.info), si no, el único archivo del zip, y si no, su único archivo que parece un informe. Para una URL en coverageFile.paths, para baseline.report, y para una referencia que es un zip en disco.
Corregido
- Los archivos de una referencia Cobertura no se encontraban bajo el
<source> del propio informe. La comparación decía 0 file(s) moved junto a un total que sí se había movido. Ahora se usa la raíz que nombra el informe, como en un informe que se carga.
Coverage Studio para Visual Studio 1.2026.18 — Código nuevo por autor y por fecha
2026-10-03
Añadido
- Código nuevo por autor y por fecha. El código nuevo eran las líneas cambiadas respecto a una ref de git. Dos ajustes preguntan lo que una ref no puede:
fuciniCoverage.gitDiff.author — las líneas que escribió una persona — y fuciniCoverage.gitDiff.since — las líneas escritas desde un día. Ambos se leen de git blame y se aplican a la cobertura del diff y al umbral del código nuevo.
Coverage Studio for VS Code 1.2026.19 — Código nuevo por autor y por fecha
2026-10-03
Añadido
- Código nuevo por autor y por fecha. El código nuevo eran las líneas cambiadas respecto a una ref de git. Dos ajustes preguntan lo que una ref no puede:
fuciniCoverage.gitDiff.author — las líneas que escribió una persona — y fuciniCoverage.gitDiff.since — las líneas escritas desde un día. Ambos se leen de git blame y se aplican a la cobertura del diff y al umbral del código nuevo.
Coverage Studio para Visual Studio 1.2026.17 — Un solo test con cobertura, en Go y Rust
2026-10-02
Añadido
- Run This Test with Coverage lee Go y Rust. En un archivo Go, el
func TestXxx del cursor se ejecuta solo, en su propio paquete y por su nombre exacto — go test ./pkg/calc -run "^TestTotal$". En un archivo Rust, la función #[test] se ejecuta por su ruta en el crate, --exact; en un mod, los tests de ese módulo; un test de integración bajo tests/, en su propio binario.
Coverage Studio for VS Code 1.2026.18 — Un solo test con cobertura, en Go y Rust
2026-10-02
Añadido
- Run This Test with Coverage lee Go y Rust. En un archivo Go, el
func TestXxx del cursor se ejecuta solo, en su propio paquete y por su nombre exacto — go test ./pkg/calc -run "^TestTotal$". En un archivo Rust, la función #[test] se ejecuta por su ruta en el crate, --exact; en un mod, los tests de ese módulo; un test de integración bajo tests/, en su propio binario.
Coverage Studio para Visual Studio 1.2026.16 — La cobertura de condiciones de GCC 14, línea por línea
2026-10-02
Añadido
- La cobertura de condiciones de GCC 14, línea por línea.
-fcondition-coverage se leía como dos recuentos por archivo; ahora cada condición se marca en su línea y se nombra en la información emergente — condición 1 nunca verdadera, condición 0 nunca en ningún sentido — a partir del JSON de gcov y de su listado de texto. threshold.conditions le pone un umbral, Copy Coverage Summary tiene una columna Conditions, badge.metric acepta conditions, y la búsqueda acepta conditions < 80.
Corregido
- La cifra de ramas de una función contaba también los resultados de sus condiciones.
branches 8/12 donde la herramienta decía 4 de 6. Las condiciones quedan fuera de ella, como lo están en las cifras del archivo y de la ejecución.
Coverage Studio for VS Code 1.2026.17 — La cobertura de condiciones de GCC 14, línea por línea
2026-10-02
Añadido
- La cobertura de condiciones de GCC 14, línea por línea.
-fcondition-coverage se leía como dos recuentos por archivo; ahora cada condición se marca en su línea y se nombra en la información emergente — condición 1 nunca verdadera, condición 0 nunca en ningún sentido — a partir del JSON de gcov y de su listado de texto. threshold.conditions le pone un umbral, Copy Coverage Summary tiene una columna Conditions, badge.metric acepta conditions, y la búsqueda acepta conditions < 80.
Corregido
- La cifra de ramas de una función contaba también los resultados de sus condiciones.
branches 8/12 donde la herramienta decía 4 de 6. Las condiciones quedan fuera de ella, como lo están en las cifras del archivo y de la ejecución.
Coverage Studio para Visual Studio 1.2026.15 — La vista Coverage sigue al editor
2026-10-02
Añadido
- La vista Coverage sigue al editor. El archivo que está mirando se resalta en el árbol, las carpetas que tiene encima se abren y su fila se desplaza hasta quedar a la vista.
fuciniCoverage.coverageView.followActiveEditor lo desactiva.
Coverage Studio for VS Code 1.2026.16 — La vista Coverage sigue al editor
2026-10-02
Añadido
- La vista Coverage sigue al editor. El archivo que está mirando se resalta en el árbol, las carpetas que tiene encima se abren y su fila se desplaza hasta quedar a la vista.
fuciniCoverage.coverageView.followActiveEditor lo desactiva.
Coverage Studio para Visual Studio 1.2026.14 — Marcas de exclusión solo de ramas, y cobertura de ramas en los informes .NET
2026-10-02
Añadido
- Marcas de exclusión solo de ramas y de gcovr.
LCOV_EXCL_BR_LINE y LCOV_EXCL_BR_START … LCOV_EXCL_BR_STOP sacan del recuento las ramas de sus líneas y dejan en él las líneas; LCOV_EXCL_EXCEPTION_BR_LINE saca solo los brazos a los que llega una excepción. Cada marca se lee también con los prefijos de gcovr: GCOVR_EXCL_LINE, GCOVR_EXCL_START, GCOV_EXCL_BR_LINE y las demás.
Corregido
- Un informe .NET no mostraba cobertura de ramas. Coverlet y
dotnet-coverage escriben el atributo branch de una línea de Cobertura como True, y solo se leía el true en minúsculas — así que todas las decisiones de un informe así se perdían. Ahora se leen ambas grafías. Las cifras se mueven: la cobertura de ramas de un proyecto .NET aparece donde no había ninguna, y con ella su puntuación. - Un informe de Cobertura fusionado a partir de varios árboles solo encontraba los archivos del primero. Un informe así nombra un
<source> por árbol; ahora se prueba cada uno, en el orden del informe.
Coverage Studio for VS Code 1.2026.15 — Marcas de exclusión solo de ramas, y cobertura de ramas en los informes .NET
2026-10-02
Añadido
- Marcas de exclusión solo de ramas y de gcovr.
LCOV_EXCL_BR_LINE y LCOV_EXCL_BR_START … LCOV_EXCL_BR_STOP sacan del recuento las ramas de sus líneas y dejan en él las líneas; LCOV_EXCL_EXCEPTION_BR_LINE saca solo los brazos a los que llega una excepción. Cada marca se lee también con los prefijos de gcovr: GCOVR_EXCL_LINE, GCOVR_EXCL_START, GCOV_EXCL_BR_LINE y las demás.
Corregido
- Un informe .NET no mostraba cobertura de ramas. Coverlet y
dotnet-coverage escriben el atributo branch de una línea de Cobertura como True, y solo se leía el true en minúsculas — así que todas las decisiones de un informe así se perdían. Ahora se leen ambas grafías. Las cifras se mueven: la cobertura de ramas de un proyecto .NET aparece donde no había ninguna, y con ella su puntuación. - Un informe de Cobertura fusionado a partir de varios árboles solo encontraba los archivos del primero. Un informe así nombra un
<source> por árbol; ahora se prueba cada uno, en el orden del informe.
Coverage Studio para Visual Studio 1.2026.13 — Los mínimos tests que aún ejecutan todas las líneas
2026-10-01
Añadido
- Show Minimal Test Set… encuentra el menor número de tests que aún ejecutan todas las líneas que ejecuta la suite, y lista debajo los tests que no aportan ninguna línea propia. Para la ejecución rápida antes de un commit, y para quien poda la suite — con el recordatorio de que redundante por líneas no es redundante por lo que un test comprueba.
Coverage Studio for VS Code 1.2026.14 — Los mínimos tests que aún ejecutan todas las líneas
2026-10-01
Añadido
- Show Minimal Test Set… encuentra el menor número de tests que aún ejecutan todas las líneas que ejecuta la suite, y lista debajo los tests que no aportan ninguna línea propia. Para la ejecución rápida antes de un commit, y para quien poda la suite — con el recordatorio de que redundante por líneas no es redundante por lo que un test comprueba.
Coverage Studio para Visual Studio 1.2026.12 — Exclusiones que dicen por qué
2026-10-01
Añadido
- Exclusiones justificadas. El código sacado del recuento allí donde está escrito puede decir por qué —
// LCOV_EXCL_LINE: defensive, unreachable by construction, [ExcludeFromCodeCoverage(Justification = "…")] — y las razones se recogen: Export Coverage Report… lista las exclusiones y sus justificaciones como Markdown y como CSV. Con fuciniCoverage.exclusions.requireReason, una exclusión que no da ninguna razón es una advertencia en su línea y hace fallar Check Coverage Thresholds.
Coverage Studio for VS Code 1.2026.13 — Exclusiones que dicen por qué
2026-10-01
Añadido
- Exclusiones justificadas. El código sacado del recuento allí donde está escrito puede decir por qué —
// LCOV_EXCL_LINE: defensive, unreachable by construction, [ExcludeFromCodeCoverage(Justification = "…")] — y las razones se recogen: Export Coverage Report… lista las exclusiones y sus justificaciones como Markdown y como CSV. Con fuciniCoverage.exclusions.requireReason, una exclusión que no da ninguna razón es una advertencia en su línea y hace fallar Check Coverage Thresholds.
Coverage Studio para Visual Studio 1.2026.11 — Un umbral para el código nuevo, y la cobertura que se movió sin una edición
2026-10-01
Añadido
- Un umbral para el código nuevo, junto a los umbrales de la ejecución entera.
fuciniCoverage.threshold.newCode es la cobertura de líneas mínima, en porcentaje, de las líneas cambiadas respecto a gitDiff.baseRef. Check Coverage Thresholds lo da por fallido en una frase propia — New code 72.00% < 80% (18 of 25 line(s) changed against origin/main ran) — y la ejecución entera sigue en pantalla. - Show Indirect Coverage Changes… lista las líneas cuya cobertura se movió aunque nadie las editó — código que dejó de ejecutarse porque desapareció un test, o porque una rama anterior ahora retorna antes. Contra la referencia de CI donde
baseline.report nombra una, y si no, contra la ejecución anterior.
Coverage Studio for VS Code 1.2026.12 — Un umbral para el código nuevo, y la cobertura que se movió sin una edición
2026-10-01
Añadido
- Un umbral para el código nuevo, junto a los umbrales de la ejecución entera.
fuciniCoverage.threshold.newCode es la cobertura de líneas mínima, en porcentaje, de las líneas cambiadas respecto a gitDiff.baseRef. Check Coverage Thresholds lo da por fallido en una frase propia — New code 72.00% < 80% (18 of 25 line(s) changed against origin/main ran) — y la ejecución entera sigue en pantalla. - Show Indirect Coverage Changes… lista las líneas cuya cobertura se movió aunque nadie las editó — código que dejó de ejecutarse porque desapareció un test, o porque una rama anterior ahora retorna antes. Contra la referencia de CI donde
baseline.report nombra una, y si no, contra la ejecución anterior.
Coverage Studio para Visual Studio 1.2026.10 — Ejecutar solo los tests que tocan sus cambios
2026-10-01
Añadido
- Run Tests Affected by My Changes… lista los tests que ejecutaron una línea que el árbol de trabajo cambia respecto a
fuciniCoverage.testImpact.baseRef (HEAD por defecto), primero el que ejecutó la mayor parte del cambio. Elegir un test lo abre; donde los informes proceden de una ejecución por test (testRun.perTest), la primera entrada ejecuta solo esos tests.
Corregido
testRun.skipWhenTestsFail se mantiene más allá de la ejecución. Los informes que escribía una ejecución en rojo se quedaban en el disco, donde el observador los cargaba un momento después. Ahora se eliminan.- La copia que un logger TRX hace de un informe de cobertura nunca se toma por un tracefile.
Coverage Studio for VS Code 1.2026.11 — Ejecutar solo los tests que tocan sus cambios
2026-10-01
Añadido
- Run Tests Affected by My Changes… lista los tests que ejecutaron una línea que el árbol de trabajo cambia respecto a
fuciniCoverage.testImpact.baseRef (HEAD por defecto), primero el que ejecutó la mayor parte del cambio. Elegir un test lo abre; donde los informes proceden de una ejecución por test (testRun.perTest), la primera entrada ejecuta solo esos tests.
Corregido
testRun.skipWhenTestsFail se mantiene más allá de la ejecución. Los informes que escribía una ejecución en rojo se quedaban en el disco, donde el observador los cargaba un momento después. Ahora se eliminan.- La copia que un logger TRX hace de un informe de cobertura nunca se toma por un tracefile.
Coverage Studio para Visual Studio 1.2026.9 — Aprobado o fallido en las marcas, y los archivos de cobertura de código del propio Visual Studio
2026-09-30
Añadido
- Aprobado o fallido en las marcas. Una línea que ejecutó un test fallido recibe una barra roja al principio, y su información emergente nombra los tests fallidos; Show Tests That Ran This Line dice cuáles de los tests fallaron. Necesita un informe que diga qué tests ejecutaron una línea, y el archivo de resultados del ejecutor de tests — TRX o JUnit XML — en la carpeta del informe o nombrado en
fuciniCoverage.testResults.paths. Run Tests with Coverage pide ahora uno a dotnet test. - La cobertura de código del propio Visual Studio, cargada. El archivo
.coverage que escribe Analyze Code Coverage de Visual Studio se convierte con dotnet-coverage y se carga por sí solo: Coverage Studio se apoya en el recolector integrado en lugar de competir con él.
Coverage Studio for VS Code 1.2026.10 — Aprobado o fallido en las marcas
2026-09-30
Añadido
- Aprobado o fallido en las marcas. Una línea que ejecutó un test fallido recibe una barra roja al principio, y su información emergente nombra los tests fallidos; Show Tests That Ran This Line dice cuáles de los tests fallaron. Necesita un informe que diga qué tests ejecutaron una línea, y el archivo de resultados del ejecutor de tests — TRX o JUnit XML — en la carpeta del informe o nombrado en
fuciniCoverage.testResults.paths. Run Tests with Coverage pide ahora uno a dotnet test.
Coverage Studio para Visual Studio 1.2026.8 — Recargas que conservan su búsqueda, su sesión y su última ejecución
2026-09-30
Corregido
- El cuadro de búsqueda conserva su consulta, y su foco, cuando la cobertura se recarga. Cada recarga lo vaciaba, a menudo mientras la consulta aún se estaba escribiendo. Una consulta como
< 80% conserva también los puntos calientes de riesgo con los que coincide. - Una sesión de cobertura ya no cuenta dos veces la misma ejecución. Cada recarga de informes sin cambios los sumaba de nuevo, y todos los contadores de ejecuciones se duplicaban. Una sesión conserva ahora cada conjunto de informes una sola vez.
- La referencia de CI ya no retrasa una carga. Primero se dibuja la carga y después llega la comparación. La referencia se prepara una vez y se conserva mientras su informe y los ajustes sigan iguales, y cuando no se puede acceder a la URL se usa la copia obtenida anteriormente.
- «Desde la última ejecución» sobrevive a una recarga de informes sin cambios. Un cambio de ajustes o una actualización convertía la ejecución en pantalla en su propia última ejecución, y desaparecían todos los cambios desde la ejecución anterior. Una relectura así tampoco se guarda ya en el historial.
- Una carga cada vez. Dos recargas pedidas a la vez se ejecutaban en paralelo, y ganaba la más lenta. Las recargas pedidas durante una carga se convierten ahora en una sola carga después de ella.
- Una referencia de CI por HTTP se obtiene como en VS Code. Un solo cliente, la última copia guardada para cuando no se puede acceder al servidor, y
remote.headers enviados solo a la dirección para la que se escribieron — nunca por HTTP sin cifrar. - Un comando cuyo trabajo falla lo dice. Un fallo en un comando o en un temporizador se silenciaba; ahora es una línea en la ventana Salida.
- Menos trabajo en el subproceso de la interfaz. Los observadores de archivos se crean en segundo plano, las entradas de la Lista de errores se calculan una vez por carga, y el registro se escribe por ráfagas en lugar de línea por línea.
- Dos ventanas de Visual Studio ya no dañan el historial de ejecuciones. Su índice se reemplaza en un solo paso bajo un bloqueo que ambas comparten, y se rehace a partir de las ejecuciones cuando se pierde.
- Run Native Project with Coverage compila la plataforma propia del proyecto, y toma
llvm-cov y llvm-profdata del LLVM del compilador, como pareja. - Los colores de advertencia, error y aprobado de la ventana Coverage siguen un tema claro igual que uno oscuro.
- Un archivo de ajustes abierto con cambios sin guardar no se sobrescribe. La página de ajustes dice que se guarde primero.
Cambiado
- Un archivo de cobertura que usted elige, y el informe que escribe una ejecución de tests, se recuerdan por usted en lugar de escribirse en
.vscode/settings.json. Ese archivo suele incluirse en los commits, así que una ejecución de tests dejaba en el repositorio un cambio que nadie había pedido. Las rutas que ya están en coverageFile.paths siguen funcionando.
Coverage Studio for VS Code 1.2026.9 — Recargas que conservan su búsqueda, su sesión y su última ejecución
2026-09-30
Corregido
- El cuadro de búsqueda conserva su consulta, y su foco, cuando la cobertura se recarga. Cada recarga lo vaciaba, a menudo mientras la consulta aún se estaba escribiendo. Una consulta como
< 80% conserva también los puntos calientes de riesgo con los que coincide. - Una sesión de cobertura ya no cuenta dos veces la misma ejecución. Cada recarga de informes sin cambios los sumaba de nuevo, y todos los contadores de ejecuciones se duplicaban. Una sesión conserva ahora cada conjunto de informes una sola vez.
- La referencia de CI ya no retrasa una carga. Primero se dibuja la carga y después llega la comparación. La referencia se prepara una vez y se conserva mientras su informe y los ajustes sigan iguales, y cuando no se puede acceder a la URL se usa la copia obtenida anteriormente.
- La comprobación de archivos de informe cambiados hace una pasada cada vez. En una unidad de red lenta, dos pasadas veían el mismo cambio y la cobertura se cargaba dos veces.
- «Desde la última ejecución» sobrevive a una recarga de informes sin cambios. Un cambio de ajustes o una actualización convertía la ejecución en pantalla en su propia última ejecución, y desaparecían todos los cambios desde la ejecución anterior. Una relectura así tampoco se guarda ya en el historial.
Cambiado
- Un archivo de cobertura que usted elige, y el informe que escribe una ejecución de tests, se recuerdan por usted en lugar de escribirse en
.vscode/settings.json. Ese archivo suele incluirse en los commits, así que una ejecución de tests dejaba en el repositorio un cambio que nadie había pedido. Las rutas que ya están en coverageFile.paths siguen funcionando.
Coverage Studio para Visual Studio 1.2026.7 — Ejecuciones de tests que ejecutan exactamente lo que nombran
2026-09-30
Corregido
- Una solución .NET con dos o más proyectos de test ya no pierde la cobertura de todos los proyectos menos uno.
dotnet test escribía un informe por proyecto y todos se movían al mismo coverage/coverage.cobertura.xml, así que solo se cargaba el último. Una carpeta así ejecuta ahora dotnet test una vez por proyecto de test, cada informe va a coverage/<Project>/, y la ejecución de un solo proyecto reemplaza únicamente el informe de ese proyecto. - Guardar varios archivos a la vez ejecuta los tests de todos los archivos guardados. Con
testRun.onSave solo se ejecutaban los tests del último archivo; los guardados que llegan mientras hay una ejecución en marcha se conservan y se ejecutan juntos después de ella. - Run This Test with Coverage y las ejecuciones por test ejecutan exactamente lo que nombran. El filtro de .NET coincidía por subcadena:
Total ejecutaba también TotalTax. Un test se ejecuta ahora por su nombre exacto, una clase por su nombre seguido de un punto, y un test en una clase anidada se encuentra (Outer+Inner). - Un test de jest o vitest cuyo título contiene
(, + o $ se ejecuta. El título se pasaba a -t, que lee una expresión regular, así que un test así no coincidía con nada y no se ejecutaba nada. - Run This Test with Coverage lee archivos de test de VB y F#.
<Fact> encima de Public Sub, y [<Fact>] encima de let o member, nunca se reconocían. - Cancelar una ejecución de tests termina todos los procesos que inició. Solo se terminaba el shell, y
dotnet test seguía ejecutándose detrás de él. Cerrar Visual Studio también cancela la ejecución. - Escribir durante una ejecución iniciada por un guardado ya no desplaza las marcas. Quedan fijadas al texto que midió la ejecución.
- Una solución en un recurso compartido de red ejecuta sus tests allí. La ejecución empezaba en
C:\Windows, porque el intérprete de comandos no acepta una ruta \\server\share como su carpeta.
Coverage Studio for VS Code 1.2026.8 — Ejecuciones de tests que ejecutan exactamente lo que nombran
2026-09-30
Corregido
- Una solución .NET con dos o más proyectos de test ya no pierde la cobertura de todos los proyectos menos uno.
dotnet test escribía un informe por proyecto y todos se movían al mismo coverage/coverage.cobertura.xml, así que solo se cargaba el último. Una carpeta así ejecuta ahora dotnet test una vez por proyecto de test, cada informe va a coverage/<Project>/, y la ejecución de un solo proyecto reemplaza únicamente el informe de ese proyecto. - Guardar varios archivos a la vez ejecuta los tests de todos los archivos guardados. Con
testRun.onSave solo se ejecutaban los tests del último archivo; los guardados que llegan mientras hay una ejecución en marcha se conservan y se ejecutan juntos después de ella. - Run This Test with Coverage y las ejecuciones por test ejecutan exactamente lo que nombran. El filtro de .NET coincidía por subcadena:
Total ejecutaba también TotalTax. Un test se ejecuta ahora por su nombre exacto, una clase por su nombre seguido de un punto, y un test en una clase anidada se encuentra (Outer+Inner). - Un test de jest o vitest cuyo título contiene
(, + o $ se ejecuta. El título se pasaba a -t, que lee una expresión regular, así que un test así no coincidía con nada y no se ejecutaba nada. - Un título de test con comillas llega entero al terminal. Un comando con
\" dentro de comillas se rompía en la primera. - Run This Test with Coverage lee archivos de test de VB y F#.
<Fact> encima de Public Sub, y [<Fact>] encima de let o member, nunca se reconocían. - Una tarea de test que termina sin iniciar un proceso ya no deja a Run Tests with Coverage esperando para siempre. El comando termina y dice que la ejecución no escribió nada.
Coverage Studio para Visual Studio 1.2026.6 — Qué Tests Ejecutaron una Línea, Cobertura Tras Cada Guardado y una Referencia de CI
2026-09-29
Añadido
- Qué tests ejecutaron esta línea. Donde el informe lo registra — coverage.py con
--show-contexts, los métodos rastreados de OpenCover, un tracefile lcov escrito por test —, el CodeLens de una función dice cuántos tests la ejecutaron, y Show Tests That Ran This Line los lista, los más activos primero, y abre el que elija. Para una ejecución de dotnet test, testRun.perTest ejecuta los tests clase por clase, de modo que cada informe dice qué clase lo escribió.
- Cobertura tras cada guardado. Con
testRun.onSave, guardar un archivo fuente ejecuta los tests que lo cubren, con cobertura, y el margen lo refleja. En una solución .NET solo se ejecutan los proyectos de test que hacen referencia al proyecto del archivo guardado; varios guardados seguidos son una sola ejecución.
- Run This Test with Coverage. Con el cursor en un método de test, una clase de test o un
describe, o en un archivo de test, un solo comando ejecuta exactamente eso con cobertura — dotnet test --filter, jest/vitest -t o un id de nodo de pytest — y carga lo que escribió. El test se lee del texto, así que funciona para C#, VB, F#, JavaScript, TypeScript y Python sin servicio de lenguaje.
- Exclude from Coverage, y dos filtros de .NET. Un clic derecho en una fila del árbol de cobertura, o Exclude This File from Coverage sobre el archivo abierto, añade el archivo o la carpeta a
fuciniCoverage.ignore, y sale de todos los totales. ignore.namespaces deja fuera los archivos de un espacio de nombres (*.Migrations), e ignore.attributes la clase, el método o la propiedad bajo un atributo — ExcludeFromCodeCoverage por defecto, que OpenCover, dotCover y un lcov convertido no respetan.
- Exclude Selection from Coverage. Seleccione líneas y elija la acción en la bombilla o en el menú contextual del editor: encima de una clase, método o propiedad de .NET escribe
[ExcludeFromCodeCoverage] — en forma corta si el archivo ya importa System.Diagnostics.CodeAnalysis —, y en otros casos LCOV_EXCL_LINE o un par LCOV_EXCL_START/STOP en el comentario propio del lenguaje. Una marca que ya está no se duplica.
- Espacios de nombres, clases y métodos. Para un informe .NET que nombra sus clases — Cobertura, Coverlet, OpenCover —, una lista Folders / Namespaces muestra la misma ejecución por espacio de nombres, clase y método, con el mismo orden y el mismo filtro; una fila de método abre el archivo en el método. Los tipos generados por el compilador, como
<>c y las máquinas de estados async, se integran en la clase para la que se generaron.
- Un cuadro de búsqueda sobre el árbol de cobertura. Escriba palabras para conservar las filas cuyo nombre o ruta las contiene todas, o una comparación —
< 80%, lines >= 90, branches = 0 — para conservar las filas cuya cifra la cumple; ambas a la vez exigen ambas. También se buscan las filas de métodos y los puntos calientes de riesgo; Escape borra.
- Run Native Project with Coverage. El proyecto de inicio en C++, desde el menú Tools: un proyecto ClangCL se vuelve a compilar con la instrumentación de cobertura de clang en
coverage/native/, se ejecuta y se carga su informe; cualquier otro conjunto de herramientas se ejecuta bajo OpenCppCoverage donde esté instalado, y donde ninguna de las dos cosas es posible, una frase dice qué instalar.
- Sesiones de cobertura y una tendencia. Start Coverage Session, y cada ejecución cargada desde entonces se suma a las anteriores — líneas, ramas y funciones por igual: lo que cualquiera de ellas ejecutó está cubierto —, así que los tests unitarios, los de integración y un recorrido por la aplicación muestran lo que alcanzaron juntos. Bajo la barra de herramientas, la cobertura de líneas del historial guardado se dibuja como tendencia, un punto por ejecución.
- Compare Two History Runs, como en VS Code: elija dos ejecuciones guardadas y los archivos que se movieron entre ellas se listan de la más antigua a la más reciente, sea cual sea la que eligió primero.
- Compare with CI Baseline.
baseline.report nombra el informe que publica la build de su rama principal — una URL, obtenida con remote.headers, o un archivo descargado —, y cada carga se mide contra él: la tarjeta de la barra de estado dice dónde está esta ejecución, y Compare with CI Baseline lista los archivos que se movieron. La referencia pasa por la misma lista de exclusiones que la ejecución, para que los totales se comparen en igualdad.
- Dónde encontrarlos. Los comandos nuevos están en Tools > Coverage Studio y en el menú contextual del editor; Show Tests That Ran This Line también es Ctrl+Shift+U, T, y Exclude Selection from Coverage es una acción de la bombilla.
Corregido
- El informe de una ejecución de tests ya no lleva su nombre de usuario y de máquina. El recolector Code Coverage de Microsoft nombra su informe
<user>_<machine>_<stamp>.cobertura.xml, y ese nombre aparecía en el árbol y en cada captura de pantalla de él; ahora el informe se renombra a coverage.cobertura.xml antes de cargarse.
- De un archivo generado se decía que lo dejaba fuera
fuciniCoverage.ignore. Cada archivo excluido se cuenta ahora bajo el ajuste que lo excluyó — ignore, ignore.generated o ignore.namespaces —, así que el nombre mostrado es el que hay que cambiar.
- Un tracefile lcov escrito por test se lee como un registro por archivo, con sus secciones de test sumadas, como lo lee VS Code; antes, el registro de cada test era un archivo aparte.
- El registro dice lo que un parser dejó fuera. Los archivos en los que un parser no encontró nada que instrumentar (
FUCINI_PARSE_030) y lo que un informe dice de sus propias lagunas (FUCINI_PARSE_031, el MissingPdb de OpenCover) se escriben en el registro, como los escribe VS Code.
- Una cabecera de macros ya no aparece en el árbol al 100 %. llvm-cov y gcov atribuyen los usos de una macro a las líneas que la definen; las ramas y funciones en líneas excluidas se van ahora con esas líneas, y un archivo que se queda sin nada medible se saca de la ejecución y se nombra en la salida (
FUCINI_EXCLUDE_001).
- Se reconocen cinco informes rechazados como formato no admitido. El XML de JaCoCo de Kover, un informe de Stryker.NET, un informe de NCover, un resultset antiguo de SimpleCov y un informe de SonarQube con muchos archivos vacíos se reconocen ahora por lo que llevan al principio. Un informe de Clover o SonarQube cuyas rutas contienen la palabra
cobertura ya no se lee como Cobertura.
- Cifras que coinciden con las herramientas que las escribieron. La cifra de ramas de una build MC/DC coincide con
llvm-cov report; las ramas de excepción de LCOV 2 (BRDA:12,e0,1,3) cuentan; una función de llvm-cov se declara solo en el archivo que la define; un bloque de Go listado por dos binarios de test suma sus contadores; una decisión de Cobertura que informan dos clases y una línea de JaCoCo listada dos veces conservan todas sus ramas, una sola vez.
- Otras menores. Un tracefile cortado a mitad de escritura ya no pierde un archivo;
gcov -t sobre varios archivos .gcda da un archivo por cada uno, las instanciaciones de plantillas se leen una vez y se conservan contadores como 1.20k de gcov -H; los archivos de GNATcoverage ya no se señalan todos como cambiados desde su cobertura; un mutante de Stryker pendiente o una ejecución de PIT interrumpida ya no cuentan contra la puntuación.
- Una edición a mano del archivo de ajustes se aplica al guardarlo, como VS Code aplica un cambio de ajustes.
Coverage Studio for VS Code 1.2026.7 — Qué Tests Ejecutaron una Línea, Cobertura Tras Cada Guardado y una Referencia de CI
2026-09-29
Añadido
- Qué tests ejecutaron esta línea. Donde el informe lo registra — coverage.py con
--show-contexts, los métodos rastreados de OpenCover, un tracefile lcov escrito por test —, el CodeLens de una función dice cuántos tests la ejecutaron, y Show Tests That Ran This Line los lista, los más activos primero, y abre el que elija. Para una ejecución de dotnet test, testRun.perTest ejecuta los tests clase por clase, de modo que cada informe dice qué clase lo escribió.
- Cobertura tras cada guardado. Con
testRun.onSave, guardar un archivo fuente ejecuta los tests que lo cubren, con cobertura, y el margen lo refleja. En una solución .NET solo se ejecutan los proyectos de test que hacen referencia al proyecto del archivo guardado; varios guardados seguidos son una sola ejecución.
- Run This Test with Coverage. Con el cursor en un método de test, una clase de test o un
describe, o en un archivo de test, un solo comando ejecuta exactamente eso con cobertura — dotnet test --filter, jest/vitest -t o un id de nodo de pytest — y carga lo que escribió. El test se lee del texto, así que funciona para C#, VB, F#, JavaScript, TypeScript y Python sin servicio de lenguaje.
- Exclude from Coverage, y dos filtros de .NET. Un clic derecho en una fila del árbol de cobertura, o Exclude This File from Coverage sobre el archivo abierto, añade el archivo o la carpeta a
fuciniCoverage.ignore, y sale de todos los totales. ignore.namespaces deja fuera los archivos de un espacio de nombres (*.Migrations), e ignore.attributes la clase, el método o la propiedad bajo un atributo — ExcludeFromCodeCoverage por defecto, que OpenCover, dotCover y un lcov convertido no respetan.
- Exclude Selection from Coverage. Seleccione líneas y elija la acción en la bombilla o en el menú contextual del editor: encima de una clase, método o propiedad de .NET escribe
[ExcludeFromCodeCoverage] — en forma corta si el archivo ya importa System.Diagnostics.CodeAnalysis —, y en otros casos LCOV_EXCL_LINE o un par LCOV_EXCL_START/STOP en el comentario propio del lenguaje. Una marca que ya está no se duplica.
- Espacios de nombres, clases y métodos. Para un informe .NET que nombra sus clases — Cobertura, Coverlet, OpenCover —, una lista Folders / Namespaces muestra la misma ejecución por espacio de nombres, clase y método, con el mismo orden y el mismo filtro; una fila de método abre el archivo en el método. Los tipos generados por el compilador, como
<>c y las máquinas de estados async, se integran en la clase para la que se generaron.
- Un cuadro de búsqueda sobre el árbol de cobertura. Escriba palabras para conservar las filas cuyo nombre o ruta las contiene todas, o una comparación —
< 80%, lines >= 90, branches = 0 — para conservar las filas cuya cifra la cumple; ambas a la vez exigen ambas. También se buscan las filas de métodos y los puntos calientes de riesgo; Escape borra.
- Sesiones de cobertura y una tendencia. Start Coverage Session, y cada ejecución cargada desde entonces se suma a las anteriores — líneas, ramas y funciones por igual: lo que cualquiera de ellas ejecutó está cubierto —, así que los tests unitarios, los de integración y un recorrido por la aplicación muestran lo que alcanzaron juntos. Bajo la barra de herramientas, la cobertura de líneas del historial guardado se dibuja como tendencia, un punto por ejecución.
- Compare with CI Baseline.
baseline.report nombra el informe que publica la build de su rama principal — una URL, obtenida con remote.headers, o un archivo descargado —, y cada carga se mide contra él: la tarjeta de la barra de estado dice dónde está esta ejecución, y Compare with CI Baseline lista los archivos que se movieron. La referencia pasa por la misma lista de exclusiones que la ejecución, para que los totales se comparen en igualdad.
Corregido
- El informe de una ejecución de tests ya no lleva su nombre de usuario y de máquina. El recolector Code Coverage de Microsoft nombra su informe
<user>_<machine>_<stamp>.cobertura.xml, y ese nombre aparecía en el árbol y en cada captura de pantalla de él; ahora el informe se renombra a coverage.cobertura.xml antes de cargarse.
- Una ejecución de tests fallaba en Windows cuando el terminal es PowerShell. Las comillas alrededor de
Code Coverage;Format=cobertura se perdían camino de pwsh, que leía el ; como el final del comando; ahora la receta se entrega al terminal palabra por palabra y se entrecomilla para el shell que inicie.
- De un archivo generado se decía que lo dejaba fuera
fuciniCoverage.ignore. Cada archivo excluido se cuenta ahora bajo el ajuste que lo excluyó — ignore, ignore.generated o ignore.namespaces —, así que el nombre mostrado es el que hay que cambiar.
- Una cabecera de macros ya no aparece en el árbol al 100 %. llvm-cov y gcov atribuyen los usos de una macro a las líneas que la definen; las ramas y funciones en líneas excluidas se van ahora con esas líneas, y un archivo que se queda sin nada medible se saca de la ejecución y se nombra en la salida (
FUCINI_EXCLUDE_001).
- Se reconocen cinco informes rechazados como formato no admitido. El XML de JaCoCo de Kover, un informe de Stryker.NET, un informe de NCover, un resultset antiguo de SimpleCov y un informe de SonarQube con muchos archivos vacíos se reconocen ahora por lo que llevan al principio. Un informe de Clover o SonarQube cuyas rutas contienen la palabra
cobertura ya no se lee como Cobertura.
- Cifras que coinciden con las herramientas que las escribieron. La cifra de ramas de una build MC/DC coincide con
llvm-cov report; las ramas de excepción de LCOV 2 (BRDA:12,e0,1,3) cuentan; una función de llvm-cov se declara solo en el archivo que la define; un bloque de Go listado por dos binarios de test suma sus contadores; una decisión de Cobertura que informan dos clases y una línea de JaCoCo listada dos veces conservan todas sus ramas, una sola vez.
- Otras menores. Un tracefile cortado a mitad de escritura ya no pierde un archivo;
gcov -t sobre varios archivos .gcda da un archivo por cada uno, las instanciaciones de plantillas se leen una vez y se conservan contadores como 1.20k de gcov -H; los archivos de GNATcoverage ya no se señalan todos como cambiados desde su cobertura; un mutante de Stryker pendiente o una ejecución de PIT interrumpida ya no cuentan contra la puntuación.
Cambiado
- Se acabó
FUCINI_ENCODING_001 en cada carga. Un informe sin marca de orden de bytes se lee como UTF-8, como lo escribe cualquier herramienta, sin una nota que lo diga.
Coverage Studio para Visual Studio 1.2026.5 — Vigilado donde aparecerá el informe
2026-09-28
Añadido
- Una entrada relativa con comodín se busca a cualquier profundidad.
*.lcov.info en coverageFile.paths encuentra el archivo esté donde esté bajo la carpeta base, como VS Code siempre lo ha leído; una entrada con raíz — ${workspaceFolder}/build/coverage-merged/*.lcov.info, ** para cualquier profundidad — mira exactamente donde dice, como antes.
- Vigilado donde aparecerá el informe. La vigilancia cubre las carpetas que nombran los ajustes, haya ya un informe en ellas o no: la carpeta de un archivo con raíz, las carpetas anteriores a un comodín — con todo lo que hay debajo cuando el patrón entra en subcarpetas — y la carpeta base para un comodín relativo. Un informe que una compilación escriba allí se carga por sí solo; una escritura en cualquier otro archivo de esas carpetas se ignora.
Corregido
- Un informe JSON de llvm-cov se rechazaba como formato no admitido. El formato se reconoce por los primeros 4096 caracteres, y llvm-cov escribe su marcador
"type": "llvm.coverage.json.export" al final del todo; una exportación cuyo primer registro de archivo lleva muchas ramas y expansiones de macros anidadas no tenía nada más reconocible en ese comienzo. Ese informe se reconoce ahora por su apertura, {"data":[{"files":[, que ningún otro formato tiene.
- Lo mismo para
gcov --json-format. gcov escribe las funciones de un archivo antes que sus líneas, y un archivo de una docena de funciones tampoco tiene ninguna entrada de línea en el comienzo inspeccionado; la clave gcc_version del propio documento lo identifica ahora.
Coverage Studio for VS Code 1.2026.6 — Un comodín en una ruta completa, vigilado donde aparecerá el informe
2026-09-28
Añadido
- Un comodín en una entrada absoluta de
coverageFile.paths. ${workspaceFolder}/build/coverage-merged/*.lcov.info carga todos los archivos así de esa carpeta, y ** representa cualquier profundidad: se buscan las carpetas anteriores al primer comodín y el resto es el patrón bajo ellas, como la edición para Visual Studio siempre ha leído una entrada así. Antes, una entrada absoluta se buscaba tal como estaba escrita, de modo que una con asterisco no coincidía con nada — y, al ser un comodín, tampoco se informaba nunca de que no coincidía con nada. Un informe que aparezca allí más tarde lo carga el observador o el sondeo como a una entrada literal; un comodín que no coincide con nada no se informa, ya que puede estar esperando a una compilación.
Corregido
- Un informe JSON de llvm-cov se rechazaba como formato no admitido. El formato se reconoce por los primeros 4096 caracteres, y llvm-cov escribe su marcador
"type": "llvm.coverage.json.export" al final del todo; una exportación cuyo primer registro de archivo lleva muchas ramas y expansiones de macros anidadas no tenía nada más reconocible en ese comienzo. Ese informe se reconoce ahora por su apertura, {"data":[{"files":[, que ningún otro formato tiene.
- Lo mismo para
gcov --json-format. gcov escribe las funciones de un archivo antes que sus líneas, y un archivo de una docena de funciones tampoco tiene ninguna entrada de línea en el comienzo inspeccionado; la clave gcc_version del propio documento lo identifica ahora.
Coverage Studio para Visual Studio 1.2026.4 — Dos informes, una respuesta, y verde donde está cubierto
2026-09-26
Añadido
- Elegir o combinar los informes de un archivo. Haga clic con el botón derecho en un archivo de la ventana Coverage y elija Choose Coverage Source... — se ofrece donde lo mide más de un informe cargado — o use Tools > Coverage Studio > Choose Coverage Source for This File...: cada informe con sus propias cifras, y luego Combine them — agree (cubierta solo donde todos los informes ejecutaron una línea: una base de código, dos compiladores) y — union (cubierta donde lo hizo cualquiera: varias suites de pruebas de una misma compilación), para el archivo, su carpeta o un patrón. Las líneas en las que los informes discrepan aparecen en verde azulado en el margen y en Annotated Source, con lo que dijo cada informe; la fila nombra los informes y el número de líneas en disputa, y la barra de estado y ambas tarjetas dicen de dónde proceden los números.
- Rojo, ámbar y verde. Gutter: Coverage pinta de verde cada línea cubierta junto al rojo y el ámbar — el modo para quien esperaba que un archivo al 100 % fuera verde. Los cinco tonos del mapa de calor son ajustes (
heatmap.colors, heatmap.colorsDark), y la ventana de ajustes muestra una vista previa de cada color mientras se elige.
Corregido
- El número del archivo en la barra de estado es el de su tarjeta. Una métrica vacía — MC/DC en un archivo sin decisiones — contaba como 100 % en el elemento y no contaba en absoluto en la tarjeta que abre.
- Un encabezado de constantes ya no marca 0 % ni 100 %. Las directivas del preprocesador cuentan como código inexistente, igual que los comentarios, cuando
excludeComments está activado.
Coverage Studio for VS Code 1.2026.5 — Dos informes, una respuesta, y verde donde está cubierto
2026-09-26
Añadido
- Elegir o combinar los informes de un archivo.
coverageFile.sources decide, archivo por archivo, cuál de varios informes cargados habla por él — o los combina: agree cuenta una línea como cubierta solo donde todos los informes la ejecutaron y marca en verde azulado las líneas en las que discrepan; union, donde lo hizo cualquiera. Choose Coverage Source... en una fila de la vista Coverage o para el archivo abierto escribe la regla por usted. Forma parte de los planes de pago; en Community decide el informe más reciente.
- Rojo, ámbar y verde, y un modo de margen a un clic. El modo
coverage pinta de verde las líneas cubiertas; los tonos del mapa de calor son ajustes con vista previa en directo en el panel de ajustes; un botón de la barra de estado y Alt+G hacen pasar el margen por desactivado, sin cubrir, cobertura y mapa de calor.
Corregido
- El número del archivo en la barra de estado es el de su tarjeta. Una métrica vacía — MC/DC en un archivo sin decisiones — contaba como 100 % en el elemento y no contaba en absoluto en la tarjeta que abre.
- Un encabezado de constantes ya no marca 0 % ni 100 %. Las directivas del preprocesador cuentan como código inexistente, igual que los comentarios, cuando
excludeComments está activado.
Coverage Studio para Visual Studio 1.2026.3 — Nada que elegir salvo el código
2026-09-24
Cambiado
- El diálogo de licencia solo pide el código. Los cuatro botones de plan han desaparecido: un código de suscripción o de invitación nombra un pool, y el pool conoce su plan, así que no había nada que una persona pudiera responder mejor que el propio código — y una invitación Business pegada con Pro aún seleccionado se rechazaba por ser del plan equivocado. Pegue el código y pulse Activate.
Coverage Studio for VS Code 1.2026.4 — Nada que elegir salvo el código
2026-09-24
Cambiado
- Enter Subscription Code solo pide el código. La pregunta del plan ha desaparecido: el código nombra un pool y el pool conoce su plan, así que el servidor se encarga a partir de ahí y ya no rechaza un código por ser del plan equivocado. Los enlaces de un clic de los correos no cambian; los correos de activación ya no tienen el paso «elija su plan», y el mismo código activa Coverage Studio para Visual Studio sin necesidad de VS Code.
Coverage Studio para Visual Studio 1.2026.2 — Cada ejecución de pruebas, cada informe, y lo que se movió
2026-09-24
Añadido
- Cobertura tras cada ejecución de pruebas. Collect Coverage in Test Explorer… coloca un
.runsettings con el recopilador Cobertura de Microsoft junto a la solución — recogido por sí solo con Tools → Options → Test → Auto detect runsettings files activado, o seleccionado una vez en Test → Configure Run Settings; desde entonces cada ejecución de Test Explorer escribe un informe bajo el proyecto de pruebas, y se carga en cuanto aparece, fusionado con lo que la configuración nombre. Nada se engancha a Test Explorer, así que Visual Studio 2026 y Microsoft.Testing.Platform funcionan tal como están. Run Tests with Coverage reconoce dotnet test, vitest, jest, pytest, go, cargo, maven, gradle, phpunit y ctest, los ejecuta con la cobertura activada en la ventana Output y carga lo que escribieron; un proyecto de pruebas sin coverlet.collector se ejecuta con el recopilador que incluye el SDK de pruebas.
- Desde la última ejecución. Cada carga se compara con la anterior: un triángulo en el margen en cada línea que empezó o dejó de ejecutarse, la tendencia junto a la puntuación, y Compare with Last Run para los archivos cuyos números se movieron.
history.enabled conserva las ejecuciones entre reinicios; gitDiff.enabled reduce la ejecución a las líneas que cambió su rama.
- Las puertas y la Error List. Check Coverage Thresholds juzga la ejecución contra
threshold.*; con compliance.diagnostics, problems.enabled, problems.perLine o deadCode.enabled los hallazgos se sitúan en la Error List junto a los del propio compilador, cada uno abriendo su archivo.
- Informes, exportaciones y una insignia. Show Annotated Source abre el archivo activo como una página en el área de documentos — cada línea en su color, los hallazgos a su lado — desplazada con el editor en ambos sentidos. Open HTML Report y Generate Full HTML Report escriben la ejecución en
htmlReport.outputDir y abren el navegador. Export Coverage Report… escribe CSV por archivo o por función, Markdown, LCOV, Cobertura, SARIF, una insignia SVG o Fucini JSON. Generate Coverage Badge mantiene la insignia en el repositorio, tras cada carga con badge.autoUpdate.
- Risk hotspots y filtros de filas en la ventana Coverage, como en VS Code: las funciones en las que el código complejo se encuentra con poca cobertura, de peor a mejor; y un desplegable junto a la ordenación para todos los archivos, los archivos con huecos, los archivos sin probar o los archivos cambiados desde la última ejecución.
- Un archivo de configuración en la raíz de la solución.
fucini-coverage.json junto a la solución se lee después de .vscode/settings.json y lo escribe la ventana de configuración cuando es el archivo que existe — para un equipo que prefiera no tener una carpeta .vscode. Ambas ediciones lo leen.
- .NET sin ceremonias.
ignore.generated deja los archivos de diseñador, los generados, obj\ y las migraciones fuera de cada total; testRun.skipWhenTestsFail mantiene en pantalla la última cobertura buena cuando una ejecución termina en rojo.
Aún no en esta edición
- El panel Test Coverage es una API de VS Code, y el Explorador de soluciones no puede mostrar insignias. Compare Two History Runs llegará cuando los suscriptores lo pidan.
Coverage Studio for VS Code 1.2026.3 — Hotspots, filtros y .NET sin paquete
2026-09-24
Añadido
- Qué archivos mostrar. Un segundo desplegable en la barra de herramientas de la vista Coverage, junto a la ordenación: todos los archivos, los archivos con huecos, los archivos sin probar o los archivos cuyos números se movieron desde la ejecución anterior. Las carpetas siguen a sus archivos y conservan sus propios números. En todos los planes.
- Risk hotspots. Bajo el árbol: las funciones en las que el código complejo se encuentra con poca cobertura, de peor a mejor, cada una abriendo su archivo en la función. Una función entra por su puntuación CRAP —
hotspots.crapThreshold, 30 por defecto, la cifra que propusieron los autores de la métrica — o solo por complejidad ciclomática, hotspots.complexityThreshold, desactivado por defecto. Community ve el recuento y la peor puntuación; la lista ordenada es Pro.
dotnet test sin paquete. Run Tests with Coverage lee primero los archivos de proyecto: donde ninguno referencia Coverlet, la ejecución usa el recopilador propio de Microsoft — --collect:"Code Coverage;Format=cobertura" — que se incluye con Microsoft.NET.Test.Sdk, y su informe se carga como el de Coverlet.
- Los archivos .NET generados quedan fuera.
ignore.generated, activado por defecto, excluye *.Designer.cs, *.g.cs, *.generated.cs, *.razor.g.cs, AssemblyInfo, los usings globales, todo lo que hay bajo Migrations/ y bajo obj/ de cada total, página y exportación. Un archivo de diseñador que nadie prueba ya no le cuesta a una solución su puerta.
- Una ejecución fallida conserva la última cobertura buena. Con
testRun.skipWhenTestsFail, una ejecución que termina con una prueba fallida deja la cobertura en pantalla tal como estaba, y lo dice en el panel Output. Desactivado por defecto.
Cambiado
- Una ejecución de Test Explorer se encuentra por sí sola. Sin nada configurado, los nombres conocidos incluyen ahora la carpeta
TestResults/<run>/ de cada proyecto de pruebas, no solo la de la propia carpeta del espacio de trabajo, y el <user>_<machine>_<date>.cobertura.xml del recopilador de Microsoft junto al de Coverlet. Una solución .NET cuyas pruebas se ejecutaron en Visual Studio muestra su cobertura al abrirse por primera vez; cada carpeta de ejecución se carga, y la fusión conserva para cada archivo lo que dice la ejecución más reciente.
Coverage Studio para Visual Studio 1.2026.1 — la misma cobertura, en el otro IDE
2026-09-23
Añadido
- Una segunda extensión, para Visual Studio 2022 y 2026 — Community, Professional y Enterprise. El mismo lector que la edición de VS Code, así que el mismo informe da las mismas cifras, dígito a dígito, en ambos editores; y la misma configuración
fuciniCoverage.*, leída de .vscode/settings.json y de la configuración de usuario propia de VS Code cuando está en la máquina. No usa la cobertura de código propia de Visual Studio: en Visual Studio 2022 es una función de Enterprise, y en Community y Professional es la única cobertura que el IDE mostrará. - En el editor: una barra en el margen por línea — rojo nunca se ejecutó, ámbar en parte, un mapa de calor por visitas — contadores en línea, una línea sobre cada función con su cobertura, complejidad, puntuación CRAP y MC/DC, rayas en la barra de desplazamiento, una información al pasar el ratón que dice qué rama no se tomó, y un punto en una línea que ha editado desde el informe.
- La ventana Coverage (View → Other Windows → Coverage): cada archivo con sus métricas y una puntuación sobre todos, ordenable, con los archivos sin medir debajo; los elementos
Coverage y File de la barra de estado, cada uno abriendo la tarjeta completa. - Comandos en Tools → Coverage Studio, con acordes de dos pulsaciones tras
Ctrl+Shift+U: N/P para la siguiente y anterior línea sin cubrir, B para la siguiente decisión parcialmente probada, R para recargar. El modo de vigilancia recarga cuando cambia el archivo que escribe su build. - Getting Started, los seis pasos con un botón para cada uno, en 18 idiomas; se abre por sí solo la primera vez.
- Configuración desde el engranaje de la barra de herramientas de la ventana Coverage, que escribe la configuración de usuario de esta edición o el
.vscode/settings.json de la carpeta y conserva los comentarios de un archivo que edita. - Licencia: incluida en todos los planes de pago. Una máquina donde Coverage Studio para VS Code está activado no necesita nada más — la clave se encuentra por sí sola; en cualquier otro sitio, Tools → Coverage Studio → Licence… acepta el código de suscripción de su correo de activación. Sin suscripción no se lee cobertura: no hay nivel gratuito en Visual Studio.
Aún no en esta edición
- Run Tests with Coverage y el panel Test Coverage son API de VS Code; el Explorador de soluciones no puede mostrar insignias. La vista Annotated Source, el informe HTML y las exportaciones, Check Thresholds, las entradas de Error List, el historial y la tendencia, y la cobertura de diferencias llegan en el orden en que los suscriptores las pidan.
Coverage Studio for VS Code 1.2026.2 — Primeros pasos, y dos editores con una suscripción
2026-09-23
Añadido
- Un recorrido guiado. Get started with Coverage Studio — en Help → Welcome → Walkthroughs, y abierto por sí solo tras la instalación — lleva a un usuario nuevo en seis pasos de un informe de cobertura a las líneas que nadie prueba, cada uno con un botón para el comando del que trata. En los dieciocho idiomas.
- El id de instalación se deja donde Coverage Studio para Visual Studio lo lee. La edición para Visual Studio verifica la clave de
license.key contra la misma huella y no puede leer el almacén de estado de esta extensión; en cada activación el id se escribe ahora también junto al almacenamiento global de la extensión, así que una máquina activada en VS Code no necesita una segunda activación en Visual Studio. Un UUID aleatorio, ligado a nada, nunca enviado a ninguna parte.
Cambiado
- Un reembolso termina la suscripción. Un reembolso o contracargo aprobado cancela ahora la suscripción de inmediato y su código de activación no emite más claves; los reembolsos son uno por cliente. Las claves ya en una máquina siguen hasta su propia caducidad, como antes. La política de reembolsos dice exactamente qué ocurre.
Coverage Studio for VS Code 1.2026.1 — Nombres de archivo que siempre se pueden leer
2026-09-21
Corregido
- Los nombres de archivo de la vista Coverage se leen con cualquier anchura. El nombre era la única parte de una fila que encogía: hasta siete caracteres en una barra lateral corriente. Ahora se dibuja entero, y las columnas de métricas, la puntuación y la barra se deslizan por debajo desde la izquierda, desvaneciéndose en el corte para que medio número nunca se lea como uno entero. Todas las cifras siguen en la información emergente de la fila.
- La marca «el archivo ha cambiado» sigue al archivo. Tras una carga seguía la primera edición y la primera restauración, y después nada la movía hasta la carga siguiente. Ahora llega cada guardado y cada cambio en disco.
- La barra de herramientas de la vista Coverage ya no parte las etiquetas de sus botones. En una barra lateral estrecha, la barra salta de línea entre sus controles, y el cuadro de ordenación pasa a una línea propia.
- La insignia de cobertura también es gratuita en el selector de exportación. Generate Coverage Badge siempre escribió la insignia SVG en todos los niveles, mientras que Export Coverage Report… rechazaba el mismo archivo en Community. Ahora ambos lo escriben.
- Show Worst-Covered Folders se licencia como las otras dos listas. Nada cambia en Community, donde las tres son gratuitas y no se cuentan, ni para ninguna clave ya emitida.
Añadido
- Una versión mínima compatible. La extensión lee ahora, aproximadamente una vez por semana, una pequeña política firmada de nuestro servidor de licencias. Cuando una compilación es más antigua que la más antigua aún compatible, la prueba y el nivel gratuito se detienen y piden una actualización; a una licencia de pago se le indica la fecha y sigue funcionando primero durante un periodo de gracia. La lectura no envía nada sobre usted ni sobre su instalación, y una instalación que no puede llegar al servidor nunca se detiene por ese motivo. Hoy no hay ningún mínimo establecido.
Cambiado
- La licencia es propietaria a partir de esta versión. La extensión se publicaba bajo los términos MIT, que nunca encajaron con un producto vendido por suscripción. Puede instalar y usar la compilación publicada dentro de su plan, también con fines comerciales; no puede copiarla, modificarla, redistribuirla ni aplicarle ingeniería inversa. Lo que produce a partir de sus datos — informes, exportaciones, insignias — es suyo, y la antigua condición de atribución desaparece. Una copia de una versión anterior sigue bajo los términos con los que llegó.
- El botón de acciones de ruta (⋯) no ocupa sitio hasta que se señala una fila. Los 25 píxeles que mantenía reservados en cada fila pasan al nombre del archivo; aparece justo después del nombre al pasar el puntero, y nada se mueve en la fila.
Coverage Studio for VS Code 1.2026.0 — Condiciones, mutantes y las pruebas detrás de una línea
2026-09-20
Corregido
- Los tracefiles de LCOV 2 listan cada función una sola vez.
FN:<línea>,<línea final>,<nombre> se lee tal como lo escribe lcov 2.0 —antes cada función aparecía dos veces, una como nunca llamada y otra en la línea 0— y los pares FNL:/FNA: de lcov 2.2 se leen con él.
- Una plantilla de C++ ya no se pinta como nunca ejecutada porque una instanciación no lo estuviera, y una función llena de macros vuelve a ser una función en lugar de una por macro.
- Los textos de consentimiento dicen lo que la instalación envía realmente: ninguna página mensual de su código, y su resumen de uso lleva el código de solicitud con el que se emitió su clave.
Añadido
- La cobertura de condiciones es una métrica propia.
a && b es una decisión y dos condiciones, y una suite puede tomar ambas ramas sin ver nunca b falso. Ahora tiene su fila, columna, exportaciones, insignia, peso en la puntuación (3, entre ramas y MC/DC) y umbral: se lee de BullseyeCoverage, de una exportación cond de TRACE32 y de -fcondition-coverage de GCC 14.
- Mutantes, donde están. Los informes de PIT y Stryker se leen mutante a mutante: los supervivientes se marcan en su propia línea del editor, con el cambio y las pruebas que lo ejecutaron al pasar el ratón, y se listan en el informe HTML y en el código anotado.
- Qué pruebas ejecutaron esta línea. coverage.py con
--show-contexts y OpenCover con -coverbytest dicen qué pruebas alcanzaron una línea; la información del contador las nombra.
- La parte de una línea ejecutada que nunca corrió se tiñe en el editor, y las funciones de C y C++ obtienen complejidad y una puntuación CRAP contadas a partir de los datos de ramas que llvm-cov ya trae.
- Los proyectos JaCoCo, Cobertura y Coverlet cargan al abrirlos por primera vez, sin configurar nada, incluidos los lugares donde Maven, Gradle y
dotnet test escriben por defecto.
- Cada métrica junto a cada archivo, con cualquier anchura, ordenada por el peso que tiene en su puntuación y con lo que no cabe desplazándose en lugar de desaparecer, y una cuenta en el icono Coverage cuando un tracefile se recarga mientras usted mira otra cosa.
- Un canal de versiones previas al que puede apuntarse, y un botón en la barra de título del editor que apaga el coloreado de cobertura y devuelve exactamente lo que había.
Cambiado
- Bullseye y TRACE32: la cobertura de ramas ya no incluye condiciones. Las decisiones son cobertura de ramas y las condiciones cobertura de condiciones, así que la cifra de ramas de tales proyectos cambia, y con ella la puntuación compuesta. Ponga
whmWeights.conditions en 0 para la puntuación de antes.
- El nivel Community gratuito tiene una asignación semanal: cinco por semana de cada una de las acciones medidas, donde había veinte al día, y en el límite se ofrece una suscripción o un pase de 7 días. Una instalación ya en uso conserva sus límites antiguos 30 días y se le avisa una vez, con la fecha.
- La prueba y el nivel gratuito llevan un registro de uso con el servidor de licencias: un hash del identificador de máquina de VS Code, la edición, el día en que empezó la evaluación y los contadores de las acciones medidas; nada más, nunca con una licencia de pago y nunca esperando por él. El canje por telemetría son ahora 30 días, una sola vez.
- La página mensual de código fuente ha desaparecido: ya no se recoge, ni se guarda, ni se envía, para nadie, y la que conservara una versión anterior se borra al primer arranque de esta.
0.2026.82 — Umbrales a la medida de su proyecto, y todo lo que contienen sus informes
2026-09-17
Corregido
- El mapa de calor se lee en el sentido correcto con un tema oscuro. Su degradado iba del amarillo pálido al marrón oscuro, de modo que el bucle más caliente tenía la barra más apagada. Un tema oscuro tiene ahora un degradado propio, del oliva tenue al naranja vivo.
- La información al pasar el cursor de MC/DC vuelve a mostrar su detalle, y una decisión de llvm-cov cuenta correctamente sus condiciones. La versión actual de VS Code plegaba esa información en una sola línea; y
(a && b) || c aparecía con una sola condición al 100 % bajo un encabezado que decía, con razón, 2 de 3 pares. - Las funciones de C++ se llaman como usted las escribió:
clamp_to<int> y gearbox::next_gear en lugar del nombre del enlazador ??$clamp_to@H@@YAHHHH@Z, para llvm-cov, lcov y gcov. - Los recuentos de líneas de Istanbul coinciden con los de nyc, se lee el XML de
dotnet-coverage, las líneas :nocov: de SimpleCov se excluyen en lugar de tratarse como defectuosas, y un informe que solo contiene un resumen conserva sus cifras sea cual sea el orden en que se lean los informes. - Áreas de trabajo con varias raíces: el informe HTML ya no nombra una carpeta dos veces, la vista Coverage encabeza una carpeta del área de trabajo con su nombre, y una regla
pathRemap puede usar ${workspaceFolder} además de ${workspaceRoot}.
Añadido
- Se muestra todo lo que contiene un informe. Las llamadas a funciones, el código objeto y una puntuación de mutación obtienen una columna en la vista Coverage, en el informe HTML y en las exportaciones CSV y Markdown, una fila en las tarjetas de la barra de estado y una insignia en el código fuente anotado; y una métrica que un informe no contiene se omite en lugar de imprimirse como cero.
- Complejidad y CRAP. Cuando un informe contiene la complejidad ciclomática (OpenCover, JaCoCo, Clover, Cobertura), cada función recibe una puntuación CRAP en su CodeLens, un archivo recibe un Max CRAP que enlaza con el método, y el informe HTML enumera los Riskiest Methods.
- Más de cada formato: brazos de rama con nombre, líneas excluidas, tramos de columnas dentro de una línea, la herramienta, la versión y la fecha del informe, y las advertencias que una herramienta escribió en él.
- Pesos opcionales para el código objeto y la puntuación de mutación en la puntuación compuesta, ambos
0 a menos que usted los establezca.
Cambiado
- Los umbrales predeterminados ya no son del 100 %. Un umbral que usted no ha establecido equivale ahora a 80 para las líneas, 80 para las funciones, 75 para las regiones, 70 para las ramas y 75 para la puntuación compuesta, sin puerta para MC/DC, instanciaciones, llamadas a funciones ni código objeto: lo que se le puede exigir a un proyecto corriente.
fuciniCoverage.threshold.profile: "safety" vuelve a poner todas las puertas en 100, exactamente como antes, y un umbral que usted sí ha establecido prevalece sobre cualquiera de los perfiles. Si confiaba en los valores predeterminados antiguos, se le juzgará con más indulgencia hasta que seleccione safety; a una instalación que ya se había utilizado antes se le indica una sola vez, con un botón que lo establece. - Una métrica sin puerta muestra un guion neutro en las tarjetas en lugar de una marca de verificación o una cruz, y el panel de ajustes previsualiza el veredicto con las puertas realmente vigentes.
0.2026.81 — Porcentajes exactos, y un informe que puede enviar
2026-09-16
Corregido
- La cobertura en un búfer con cambios sin guardar vuelve a cuadrar. Una ejecución cargada mientras un archivo tenía ediciones sin guardar desplazaba cada marca, información al pasar el cursor y CodeLens tantas líneas como esas ediciones los habían empujado. Las ediciones se recuperan ahora del archivo en disco, y una línea entera pegada encima de otra ya no cuenta esa línea como editada.
- Las fusiones y los registros LCOV repetidos se suman. Un archivo de trazas más nuevo ya no conserva los resúmenes de ramas y MC/DC de la ejecución anterior, y un archivo listado dos veces en un mismo archivo de trazas se combina como lo hace genhtml.
- La clave de licencia se queda en su máquina. Settings Sync ya no la lleva a otras instalaciones, donde bloqueaba la cobertura; una clave Business, Enterprise o Pro Plus caducada se renueva sola hasta 45 días después de caducar.
- Los archivos de trazas remotos se obtienen con más cuidado. Los
remote.headers se quedan en su origen a través de redirecciones, una descarga se rinde a los 30 segundos, una página de inicio de sesión se rechaza en lugar de guardarse en caché, y una ventana abierta sin conexión carga la última copia descargada. La actualización automática instala solo su propia edición. - Analizadores: los recuentos de líneas de llvm-cov coinciden con
llvm-cov show, las decisiones OpenCover de métodos distintos ya no se sobrescriben, xccov, TRACE32 y EMMA conservan sus cifras de líneas, las clases Cobertura que comparten archivo son un solo archivo, los informes agregados de JaCoCo se leen, y la asignación de rutas resuelve .. y compara segmentos enteros. - En el editor: el historial se guarda por área de trabajo, las marcas se quedan en archivos reales y no en el panel HEAD de un editor de diferencias, las líneas más allá del final de un archivo no se pintan, las insignias del Explorador en Windows funcionan con rutas
C:\…, y las ejecuciones grandes se consultan más rápido.
Añadido
- Enviar informe de diagnóstico. Lo ofrecen las notificaciones de una carga, descarga remota, fusión, comparación de historial o chat fallidos. Muestra exactamente el JSON que se enviaría, con una muestra de archivo de 4 KB opcional, comentario y dirección de respuesta, y no envía nada hasta que pulse Enviar.
- Informes de error. Un error
FUCINI_* se notifica sin contenido de archivos, rutas ni nombres cuando el nivel de telemetría de VS Code es all o error. Tres líneas del registro tienen código propio: FUCINI_REMOTE_002, FUCINI_REMOTE_003 y FUCINI_GITDIFF_002, cada uno descrito en la guía del usuario.
Cambiado
- Todo porcentaje de cobertura tiene dos decimales, truncados en lugar de redondeados:
87.43%, y 100.00% solo cuando la cobertura es exactamente 100. - Los umbrales deciden sobre el valor exacto. Hasta ahora cada porcentaje se redondeaba primero a un entero, así que 89,6 % superaba un umbral del 90 %. Un proyecto que solo aprobaba por redondeo mostrará ahora NON-COMPLIANT hasta que su cobertura alcance de verdad el umbral.
- La telemetría es diaria. Cada instalación envía un pequeño mensaje de licencia diario en el nivel de telemetría
all de VS Code; con telemetry.enabled activado, el resumen de uso sale a diario en lugar de mensualmente. A las instalaciones que desbloquearon funciones a cambio de telemetría se les pregunta antes de que cambien sus condiciones.
0.2026.80 — Una actualización que se ve
2026-09-14
Añadido
- La vista Coverage avisa cuando hay una actualización, y sigue avisando. Una barra sobre el banner de licencia muestra la nueva versión junto a la que tienes, con los mismos tres botones que la notificación de actualización: «Descargar & instalar», «Ver registro de cambios» y «Omitir esta versión». El icono de la vista en la barra de actividades también lleva una insignia, así que se ve con la vista cerrada. La notificación solo aparecía una vez, en la comprobación automática, y un clic en cualquier otro sitio la ocultaba hasta la siguiente comprobación, un día después; la barra permanece hasta que la actualización se instala, se omite o se desactiva
fuciniCoverage.update.checkForUpdates, y sobrevive a una recarga de la ventana.
0.2026.79 — Un ping al día
2026-09-14
Cambiado
- Los pings pequeños salen como mucho una vez al día, juntos. Una actualización, un cambio de licencia, un formato de cobertura nuevo y un archivo que no se pudo leer eran antes un ping cada uno, enviado en cuanto se detectaba — y en algunas instalaciones se volvía a detectar en cada sesión: un puesto revocado informaba de su revocación en cada arranque, y cambiar entre espacios de trabajo con formatos distintos informaba cada vez de un conjunto «nuevo». Ahora se recopilan y se envían como un solo ping, como mucho una vez al día. Un día sin nada que informar no envía nada.
- Solo se informa de lo que realmente cambió. Una licencia que cambia y vuelve a su estado dentro del mismo día no informa de nada, y los formatos son todos los que la instalación ha cargado, no los del último espacio de trabajo. El ping de instalación y el aviso de desinstalación siguen saliendo de inmediato, y no se recopila nada nuevo.
- El interruptor de telemetría propio de VS Code ahora también afecta a los pings pequeños. Con
telemetry.telemetryLevel en off, no se recopila nada para el ping diario y no se envía nada; hasta ahora solo lo respetaban el resumen mensual y el aviso de eliminación. El ping de instalación único no cambia.
- Un mes que termina mientras el editor está inactivo se informa igualmente. El resumen mensual solo se comprobaba después de cargar cobertura, así que una instalación que dejaba de usarse nunca enviaba su último mes. Ahora también se comprueba cada hora mientras VS Code está abierto — sigue siendo solo con la telemetría activada, y como mucho una vez cada 30 días.
Corregido
- Un ping que el servidor rechazó ya no cuenta como enviado. Cualquier respuesta del servidor, incluido un error, se tomaba como entrega, así que un ping diario rechazado perdía lo que había recopilado y un ping de instalación rechazado no se volvía a intentar. Ahora solo cuenta una respuesta correcta; un ping diario o un resumen mensual rechazado se conserva y se vuelve a intentar un día después.
0.2026.78 — Catorce días nuevos
2026-09-13
Cambiado
- Cada evaluación recibe 14 días nuevos, una vez. La primera vez que se inicia esta versión, la prueba se reabre en cada instalación de Pro sin licencia de pago — tanto si terminó hace tiempo como si aún le quedaban unos días — y dura 14 días a partir de ese día. Un breve aviso lo indica cuando ocurre. Una licencia de pago no se ve afectada, y la edición Community, que no tiene prueba, no cambia.
- Una licencia de pago dice «Activado», en verde. El banner de licencia mostraba a un suscriptor «Activado: quedan 30 días». Una clave de suscripción dura hasta el final del periodo pagado y se renueva con él, así que esa cuenta atrás nunca dejaría de leerse como una prueba a punto de agotarse. El encabezado ahora dice simplemente Activado, la fecha aparece en los detalles como «Vigente hasta», y la cuenta atrás solo vuelve en la última semana antes de que caduque una clave, junto al aviso de renovación próxima que ya estaba ahí.
0.2026.77 — Pegue su código, nada más
2026-09-12
Añadido
- «Enter Subscription Code» — y no se le pide nada más. Elija su plan, pegue el código del correo de compra, confirme, y su clave de licencia se emite y se aplica por usted. Hasta ahora la única vía desde dentro del editor era el cuestionario de evaluación — nombre, correo, tipo de cuenta, empresa, una encuesta —, que es el formulario equivocado para poner delante de quien ya ha comprado. La otra vía era el enlace
vscode:// del correo, y desconfiar de ese clic es sensato y no pusilánime: un enlace así puede dispararlo cualquier página que visite, y justamente por eso la activación le pide confirmar. El comando está en la paleta de comandos, y es un botón en el banner de licencia del panel de cobertura y en el diálogo de activación — en todos los estados, porque una licencia se muda de máquina y comprar a mitad de la prueba es el caso corriente, no la excepción.
- Una forma de ver los planes desde la propia prueba. La página de precios se alcanzaba desde las pantallas de la edición gratuita, pero no desde el diálogo de activación ni desde el banner de licencia — el único sitio que mira de verdad quien lee «quedan 3 días». A ese lector se le ofrecía un cuestionario y una indicación sobre
settings.json, y ningún precio.
Cambiado
- El diálogo de activación y el banner de licencia ya no empiezan con
FCK1. Ambos abrían con su código de solicitud y con «pegue la clave en settings.json», que es la vía para cuando no se puede alcanzar en absoluto nuestro servidor de licencias. Mostrado primero, se leía como la instrucción: así, un cliente con un código de suscripción FCB1… acababa en «Enter Activation Key», el único campo que con certeza lo rechaza. Ambos siguen ahí, debajo de las rutas que encajan con quien ya ha comprado, y descritos como lo que realmente son.
0.2026.76 — El comando que nombraba el correo
2026-09-12
Corregido
- «Request Activation Key» ya es un comando. Su correo de compra — y la página de activación, en todos los idiomas — le dicen que, si el enlace de un clic no sobrevive a su programa de correo, puede ejecutar Fucini Coverage: Request Activation Key desde la paleta de comandos, elegir su plan y pegar su código. Ese nombre pertenecía a la barra de título del panel y al propio enlace, nunca a un comando, así que la paleta no tenía nada bajo él; y la coincidencia más cercana por nombre, Enter Activation Key, admite la clave
FCK1… que emite nuestro servidor, no el código FCB1… que lleva su correo. Seguir las instrucciones le llevaba justo al único campo que con certeza iba a rechazar lo que tenía en la mano. Ahora sí es un comando de verdad.
- El diálogo de activación ofrece Solicitar licencia… mientras una prueba o una clave siguen vigentes. Antes se ocultaba hasta que una de las dos caducara, con el razonamiento de que una instalación que funciona no tiene motivo para contactar con el servidor de licencias. Pero comprar a mitad de la prueba es el caso corriente y no la excepción, y quien se encontraba así no tenía desde el diálogo ninguna ruta hasta el campo donde va su código: los dos botones que quedaban pedían una clave que solo se obtiene canjeando el código.
0.2026.75 — Una paleta para daltónicos
2026-09-12
Añadido
- Una paleta para daltónicos. Ponga
colorScale.preset en colorblind y la cobertura se dibuja en bermellón, naranja y azul (la paleta Okabe–Ito) en lugar de rojo, ámbar y verde: el degradado, las barras del margen, el resaltado de líneas, las insignias del Explorador y las marcas desde la última ejecución. Un color que haya definido usted mismo tiene prioridad.
0.2026.74 — Cobertura filtrada por prueba
2026-09-12
Añadido
- Filtrar la cobertura por prueba en la vista Test Coverage de VS Code. Cuando un archivo de traza nombra sus pruebas — las secciones
TN: de lcov —, cada prueba pasa a ser un elemento bajo Fucini Coverage en el Test Explorer, cada archivo de la vista Test Coverage enumera las pruebas que ejecutaron algo en él y, al elegir una, se muestran las líneas que alcanzó esa prueba. ${command:…} en los ajustes de ruta. ${command:cmake.buildDirectory}/coverage.info sigue el kit de CMake seleccionado. El comando se ejecuta antes de cada búsqueda, como mucho cinco segundos y solo en un área de trabajo de confianza; si falla, la variable queda tal como está escrita y la salida explica por qué.- Un inicio rápido de 30 segundos y una comparación con las alternativas abren ahora la página del Marketplace y la página de inicio.
Corregido
- Un archivo de traza que registraba un archivo una vez por prueba lo contaba una vez por prueba. Ahora los registros se suman por archivo de traza, como los lee genhtml: el archivo cuenta una sola vez en los totales y, con varios archivos de traza cargados, no se pierden las líneas de ninguna prueba.
0.2026.73 — Actualizaciones firmadas y una clave que sobrevive al cambio
2026-09-11
Corregido
- El identificador de instalación ahora se guarda antes de que nada lo use. La compilación 2 de 0.2026.72 dejó de calcular el identificador de nuevo en cada llamada, pero el arranque seguía sin esperar a que se escribiera, así que una ventana cerrada justo después de abrirse aún podía perderlo — y con él la huella de la máquina a la que está vinculada una clave de activación. Ahora el arranque espera.
- Pasar de Pro a Community mantiene válida tu clave de activación. Cada edición tiene su propio almacenamiento de extensión, por lo que Community empezaba con un identificador de instalación y una huella nuevos, mientras que la clave de tu configuración — incluida la que el cambio acababa de solicitar para el desbloqueo gratuito — estaba vinculada a la anterior. Ahora el cambio traspasa el identificador.
Seguridad
- Las actualizaciones de fucini.software están firmadas y se comprueban antes de instalarse. Cada
.vsix del canal de actualizaciones lleva un hash SHA-256 y una firma Ed25519 hecha con una clave que nunca está en el servidor web. El actualizador integrado y el cambio a Community comprueban ambos contra el archivo descargado y rechazan todo lo demás: la página de error de un proxy, una descarga truncada, una compilación antigua en caché o un archivo que no es nuestro. HTTPS por sí solo no cubre esto: un proxy corporativo que inspecciona TLS vuelve a firmar cada conexión que ve. - Cada versión tiene su propio nombre de archivo. El canal de actualizaciones apunta ahora a un
.vsix con número de versión en lugar de a un archivo sobrescrito en cada versión, de modo que una caché que ignora Cache-Control no puede servir la compilación del mes pasado como la de este mes. Los enlaces de la página de descargas no cambian.
0.2026.72 — Las decisiones probadas en un solo sentido
2026-09-10
Añadido
- Salte a las decisiones probadas en un solo sentido. Next Partly-Tested Decision y su gemela anterior recorren las bifurcaciones de las que algunas ramas se ejecutaron y otras nunca. Es el hueco que la navegación por líneas no cubiertas no puede mostrar: una línea cuya instrucción se ejecutó está cubierta, y lo sigue estando por muchas ramas suyas que nunca se tomaran —
if (a && b) alcanzado una vez con a falso está cubierto al 100% en líneas y probado a medias. Una parada por decisión en lugar de por rama, porque las ramas de un if/else pueden estar a páginas de distancia, y saltar a la quinta rama de un switch dice menos que saltar al propio switch. Las decisiones a las que ninguna rama llegó quedan para los comandos de líneas no cubiertas, que ya se detienen ahí, y un archivo cuyo informe no registra bifurcación alguna lo dice, en vez de afirmar que cada decisión se probó en ambos sentidos.
Reload Coverage vuelve a leer lo que ya está cargado. Con la vigilancia desactivada, el único camino de vuelta a cifras frescas tras volver a ejecutar las pruebas era Load Coverage, que repite la detección y puede volver con un conjunto distinto del que hay en pantalla. Esta orden vuelve a leer exactamente lo que está cargado ahora, incluidos los archivos de traza elegidos a mano que la detección nunca volvería a encontrar.
Copy Coverage Summary pone la ejecución en una tabla Markdown. El archivo peor cubierto primero, con una fila de totales, listo para pegar en una pull request. Las columnas de ramas y MC/DC solo aparecen cuando algo de la ejecución las midió: una columna de guiones se lee como cobertura cero en lugar de como no medida, que es lo contrario de lo cierto.
Corregido
- El identificador de instalación podía cambiar entre sesiones, y de él se deriva la huella de la licencia. Se calculaba de nuevo en cada llamada y se guardaba sin que nada esperara a la escritura, de modo que una segunda llamada, o una ventana del editor cerrada poco después del arranque, podía generar otro. Un identificador que cambia es una clave de activación que deja de coincidir; además inflaba todas las cifras contadas por instalación. Ahora se fija una vez por sesión y se guarda antes de que nada lo use. Compilación 2.
0.2026.71 — Qué archivo de traza cubrió esta línea
2026-09-08
Añadido
- Atribución de origen por línea. Con más de un archivo de traza cargado, la información al pasar el cursor termina ahora con Cubierto por: y los informes que registraron una ejecución en esa línea — y hacer clic en una fila de archivo de traza en la vista Coverage ilumina ahora las líneas que aportó, en cada editor abierto, igual que ya iluminaba los archivos que midió. Es la única pregunta que una ejecución combinada puede responder y un informe aislado no: dos archivos de traza que miden el mismo archivo discrepan sobre sus líneas, y hasta ahora la combinación allanaba esa discrepancia sin mostrarla nunca. La combinación sigue siendo por archivo — el informe más reciente gana por completo un archivo compartido —, así que los orígenes por línea se indexan antes. Solo cuentan las líneas cubiertas: un informe que anotó una línea como
0 no la cubrió.
- El registro
TN: de lcov por fin se lee. Un archivo de traza que nombra su suite — TN:integration — aparece como coverage.info (integration) dondequiera que se nombre un origen, y ese nombre sobrevive a una exportación de vuelta a lcov en lugar de escribirse vacío. La mayoría de las herramientas escriben TN: vacío y no cambian; las que lo rellenan son justamente aquellas cuyos archivos se combinan, y entonces el nombre es lo único que dice cuál es cuál.
fuciniCoverage.lineHighlight tiñe las líneas mismas. off | uncovered | heatmap, desactivado de forma predeterminada: un tinte translúcido detrás de cada línea no cubierta y parcialmente cubierta, y en heatmap también detrás de cada línea ejecutada, más cálido cuantas más veces se ejecutó. Una opción propia en lugar de un cuarto valor de editorGutter.mode, porque se quieren en parejas distintas: los huecos teñidos con el margen limpio, o barras sin color detrás del código. Translúcido porque queda bajo el texto, y tiñe los huecos y no las líneas cubiertas, por la misma razón que el margen.
fuciniCoverage.overviewRuler decide por su cuenta la franja de la barra de desplazamiento. follow (predeterminado) hace lo de siempre: una franja donde el margen dibuja una barra no cubierta o parcial, y nunca para el mapa de calor. uncovered la pinta incluso con editorGutter.mode desactivado — un mapa de los huecos del archivo a lo largo de la barra de desplazamiento y nada junto al código. off conserva las barras y quita la franja. Antes la regla estaba atada al margen, así que esas dos combinaciones no existían.
Corregido
- Un archivo de traza que no se puede analizar dice ahora como qué se leyó. «…no está bien formado» dejaba al lector adivinando si el archivo siquiera se había reconocido como el formato que cree — y un documento Cobertura rechazado por el analizador de VectorCAST es un problema distinto de uno realmente truncado. La notificación termina ahora con Se leyó como cobertura. cuando algún analizador reclamó el archivo. Si ninguno lo hizo, no se añade nada: «no está en un formato que esta extensión lea» ya lo dice por completo.
0.2026.70 — El aviso de datos obsoletos vuelve a mostrar su icono
2026-09-08
Corregido
- El aviso de datos obsoletos en la información sobre herramientas de la barra de estado vuelve a mostrar su icono de reloj, en lugar del texto
$(history). El aviso que dice que las cifras de debajo describen una versión más antigua de los archivos lleva la misma marca $(history) que la propia barra de estado. En la barra de estado esa marca se dibuja como el icono de reloj, porque StatusBarItem.text sustituye los iconos por sí solo; el aviso emergente es un MarkdownString, que debe activarlo con supportThemeIcons y nunca lo hizo, de modo que la única línea que explica por qué no se puede confiar en la cobertura empezaba con un trozo de sintaxis en bruto. Ahora lo activa.
0.2026.69 — Modos de margen, archivos de traza remotos, espacios de trabajo multirraíz y archivos no medidos
2026-09-08
Añadido
- El propio margen del editor ahora puede mostrar las líneas no cubiertas, o un mapa de calor de recuentos de aciertos. De forma predeterminada sigue mostrando solo hallazgos — barras MC/DC, triángulos de desde-la-última-ejecución, puntos de líneas editadas — y la vista codificada por colores de un archivo entero sigue siendo Annotated Source.
fuciniCoverage.editorGutter.mode permite más: uncovered pone una barra en cada línea que nunca se ejecutó y una ámbar en cada línea con una rama nunca tomada, y nada en las líneas cubiertas, de modo que una pared verde no oculte las tres rojas; heatmap añade un tono cálido en cada línea ejecutada, más intenso cuantas más veces se ejecutó. Choose Editor Gutter Mode... cambia entre los tres desde la paleta o el menú de la barra de estado. El README afirmaba sin más «márgenes nativos»; ahora dice lo que hay realmente. - Recuentos de aciertos en línea.
fuciniCoverage.hitCounts.inline escribe ×12 tras cada línea en la que empieza una sentencia, ×0 incluido — el número que siempre ha estado al pasar el cursor, sin pasar el cursor. Toggle Inline Hit Counts lo alterna; el menú de la barra de estado lo ofrece como Mostrar u Ocultar, según corresponda. ${env:NAME}, ${config:section.key}, ${userHome} y ${workspaceFolderBasename} en todos los ajustes de ruta, junto al ${workspaceFolder} que ya existía. Una variable que la extensión no conoce se deja tal como está escrita, de modo que una errata aparece en el registro de detección como la ruta que se buscó en lugar de desaparecer. - Una entrada de
coverageFile.paths puede ser una URL http(s)://. El artefacto se descarga al almacenamiento de la extensión en cada carga y se carga desde allí; la vista Coverage nombra la URL, no la ruta de la caché. Cada descarga es condicional (ETag / Last-Modified), así que volver a pedir un artefacto sin cambios no descarga nada, y cuando una descarga falla se carga en su lugar la última copia descargada y el motivo queda en la salida. fuciniCoverage.remote.headers añade cabeceras Name: value con las variables expandidas — Authorization: Bearer ${env:CI_TOKEN} mantiene el token fuera de settings.json — y fuciniCoverage.remote.refreshMinutes vuelve a descargar con un temporizador. Añada #lcov.info (u otro nombre de archivo) como fragmento de la URL cuando la propia URL no termine en uno, para que se conozca el formato. - La carga y Generate Full HTML Report muestran su progreso y se pueden cancelar. Una carga de diez o más archivos de traza, o de 8 MB o más, se ejecuta bajo una notificación de progreso con un botón Cancelar que nombra el archivo que se está leyendo y la fase (lectura, luego comprobación de fuentes); una más pequeña solo hace girar la barra de estado como antes. Cancelar deja cargada la ejecución anterior y lo dice. El informe HTML hace lo mismo por cada página renderizada y escrita.
- Dos motivos más para recargar. Una entrada absoluta de
coverageFile.paths fuera del espacio de trabajo — un árbol de compilación junto al checkout, una raíz de salida de Bazel — ahora también se sondea, de modo que un archivo que aparece allí después de abrir la ventana se carga en lugar de no volver a mirarse nunca; el observador solo veía el espacio de trabajo. Y fuciniCoverage.watch.reloadAfterTasks nombra tareas (un label de tasks.json, o source: name tal como lo muestra la lista Run Task, p. ej. npm: test) cuyo final recarga la cobertura, esté o no activado watch.enabled — para compilaciones que el observador no puede seguir: una ejecución que reemplaza un árbol de salida con enlaces simbólicos, un informe en un recurso compartido de red, un paso de cobertura que posprocesa su archivo. - Espacios de trabajo multirraíz. Cada carpeta de un espacio de trabajo se detecta ahora por su cuenta:
coverageFile.defaultLocation, coverageFile.paths, pathRemap, ignore, watch.*, remote.*, badge.*, los directorios de informes, gitDiff.*, problems.perLine, editorGutter.mode y hitCounts.inline se leen por carpeta, de modo que se aplica el .vscode/settings.json propio de la carpeta o su entrada en el .code-workspace; ${workspaceFolder} significa la carpeta de la propia entrada; los archivos de traza encontrados en todas las carpetas se fusionan en una sola ejecución, y la vista Coverage agrupa los archivos por carpeta. ${workspaceRoot} en una regla de pathRemap prueba primero la carpeta del propio archivo de traza y luego las demás. Todo lo que necesita una sola carpeta — los diálogos de archivos, la salida del informe y de la insignia, los metadatos de git, Run Tests with Coverage — toma la del editor activo, y con varias carpetas y ningún editor la ejecución de pruebas pregunta cuál. Una carpeta añadida al espacio de trabajo o quitada de él recarga la cobertura por sí sola. Antes, doce sitios tomaban la primera carpeta y una segunda raíz obtenía una base equivocada para todo. - La ejecución se publica en la propia vista Test Coverage de VS Code. Con
fuciniCoverage.testCoverage.publish (activado de forma predeterminada) cada ejecución cargada va también al panel nativo Test Coverage, a sus porcentajes por archivo en el Explorer y al propio conmutador «Show Inline Coverage» del editor — líneas, ramas y funciones, con los detalles cargados bajo demanda. Show in Test Coverage View publica la ejecución activa y abre el panel, diga lo que diga el ajuste; el menú de la barra de estado lo ofrece tras quickActions.showTestCoverage. - Se sugiere una regla de remapeo de rutas cuando los archivos no coinciden. El «se cargó pero no se ilumina nada» más habitual es un archivo de traza cuyas rutas vienen de un contenedor o de un checkout de CI (
/build/src/a.c, /home/runner/work/repo/repo/src/a.c, C:\agent\_work\1\s\src\a.c) mientras que el espacio de trabajo tiene src/a.c. Cuando una carga deja archivos sin coincidencia, la extensión busca los nombres de archivo en el espacio de trabajo, infiere la regla de prefijo que explica el mayor número de ellos, la registra como [FUCINI_REMAP_002], y el resultado de la carga ofrece Apply Suggested Remap — un clic añade la regla a fuciniCoverage.pathRemap y recarga. Suggest Path Remap Rule ejecuta el mismo análisis bajo demanda. No se escribe nada sin el clic. fuciniCoverage.ignore: archivos que nunca cuentan. Los archivos de proveedores, generados o de terceros (vendor/**, **/*.generated.ts, build/**) se descartan de la ejecución al cargarla, de modo que la vista Coverage, la barra de estado, los umbrales, las insignias, el CodeLens, el historial y las exportaciones cuentan todos sin ellos; el resultado de la carga dice cuántos se dejaron fuera y la salida los nombra. Los patrones se comparan con la ruta relativa al espacio de trabajo y con la ruta absoluta; un patrón sin / coincide con un nombre de carpeta o de archivo a cualquier profundidad, como en .gitignore. Para archivos enteros — las líneas dentro de un archivo siguen usando los marcadores de exclusión propios de la herramienta. - Entradas por línea en Problems, opcionales.
fuciniCoverage.problems.perLine (off, uncovered o uncoveredAndPartial; desactivado de forma predeterminada) pone un diagnóstico de tipo Information en cada bloque contiguo de líneas que nunca se ejecutaron — una función muerta de cuarenta líneas es una entrada, no cuarenta — y, en el segundo modo, en cada línea con una rama nunca tomada. Solo para los documentos abiertos, de modo que una ejecución de dos mil archivos no puede inundar el panel; las entradas siguen a sus líneas mientras se edita el búfer y desaparecen al cerrar el documento. La entrada por archivo que hay tras problems.enabled no cambia. - Una insignia de cobertura para el README. Generate Coverage Badge escribe un SVG al estilo de shields para la ejecución activa en el espacio de trabajo (
fuciniCoverage.badge.outputPath, de forma predeterminada coverage-badge.svg), para que un README lo incruste con  y sin ningún servicio alojado. badge.metric elige líneas, ramas, MC/DC o la puntuación ponderada; el color sigue los niveles de colorScale; badge.autoUpdate la reescribe tras cada carga. La insignia SVG que Export Coverage Report ya ofrecía comparte ahora el mismo renderizador. - No medido frente a no cubierto. Un archivo que ninguna prueba cargó nunca no está en el archivo de traza en absoluto, así que la extensión siempre lo ha mantenido aparte de un archivo medido con 0 aciertos — y fuera de las cifras, que es exactamente cómo un proyecto con la mitad de sus módulos sin pruebas se lee como «92%». Ahora la distinción se ve: abrir un archivo así pone
not measured en la barra de estado, y fuciniCoverage.unmeasured.mode decide qué más ocurre. list añade un grupo No medidos a la vista Coverage con cada archivo del espacio de trabajo de un tipo que la ejecución midió pero que la ejecución no contiene, los cuenta en el resultado de la carga, los marca con ? en el Explorer cuando las insignias están activadas, y permite que threshold.unmeasuredFiles haga fallar Check Coverage Thresholds a partir de un número elegido. count va más lejos: cada uno de esos archivos se incorpora a la ejecución como 0% — una línea sin cubrir por cada línea de código — de modo que la barra de estado, los umbrales, las insignias, el historial, las exportaciones y la vista Test Coverage ven todos la cifra honesta; el archivo se dibuja como no medido en todas partes, nunca como «ya no coincide con su cobertura». unmeasured.exclude deja fuera las cabeceras y similares (**/*.h, **/*.hpp, **/*.hh, **/*.inl, **/*.d.ts de forma predeterminada). Desactivado de forma predeterminada; el estado de la barra de estado es el único cambio que siempre está activo. - La vista de Cobertura muestra lo que hizo la fusión. Desde 0.2026.63, la repetición propia de un módulo cargada sobre una ejecución de todo el proyecto reemplaza los números de esa ejecución para los archivos del módulo, y cada fila nombraba el informe del que procede — pero una fila cuyos números anularon un informe más antiguo se veía exactamente igual que una medida por un solo informe entre varios, y nada decía cuánto de un informe había sido anulado. Ahora la insignia de tracefile de esa fila lleva contorno; cada fila de tracefile sobre el árbol cuenta lo que la fusión hizo con sus archivos («42 archivos · 7 anulados por un informe más reciente», «7 archivos · anula 7 en informes más antiguos»); y hacer clic en una fila de tracefile resalta en el árbol completo los archivos que midió, atenuando el resto, hasta volver a hacer clic.
fuciniCoverage.coverageView.mergedMarks (activado por defecto) desactiva el contorno y el resaltado; los recuentos se quedan.
0.2026.68 — Los puestos de equipo piden el código de invitación
2026-09-07
Corregido
- A un usuario Business o Enterprise ahora se le pide su código de invitación, no el código de empresa. Desde el 2 de septiembre el servidor de licencias rechaza el código de empresa compartido para un puesto Business o Enterprise: un puesto reclamado con él no nombraba a nadie, así que cada puesto de equipo está ahora ligado a la dirección a la que fue invitado, y el código que lo activa es el código de invitación
FCI1… de ese correo. El cuestionario seguía etiquetando el campo como «Código de empresa», sugería pedírselo al responsable y mostraba un marcador FCB1… — mandando a la gente a pegar justo el único código que ya no funciona, y luego pidiéndole que introdujera un código de empresa cuando lo dejaba en blanco. En los planes de equipo el campo ahora dice «Código de invitación», la ayuda indica de dónde sale el código y que el código de empresa compartido no activa un puesto, el marcador muestra la forma FCI1… y el mensaje de validación pide el código de invitación. Pro pide su código de suscripción por ese nombre. Pro Plus no cambia: conserva el código compartido a propósito. Los 17 idiomas de la interfaz llevan la nueva redacción.
0.2026.67 — ${workspaceFolder} funciona en ambos ajustes de ruta
2026-09-05
Corregido
${workspaceFolder} ahora funciona en coverageFile.paths, como siempre lo ha hecho en coverageFile.defaultLocation. Los dos ajustes están uno junto al otro y solo uno documentaba la variable, así que la gente la escribía en ambos — y una entrada que empieza por ${ no es absoluta, de modo que entraba en el glob de búsqueda como literal bajo la carpeta base, no coincidía con nada, y la extensión decía que no había cobertura. Esa entrada ahora se expande primero, lo que la convierte en una ruta absoluta, y simplemente se comprueba. Se deja tal como está escrita en el ajuste, no se escribe una segunda vez de otra forma cuando se elige el mismo archivo, y sale sola del ajuste cuando se descarga desde la vista Coverage.- Un archivo de traza configurado que no existe ahora se indica en la salida. Una entrada con una ruta errónea fallaba de la única manera que nada informaba: «no se encontró cobertura», indistinguible de un proyecto que realmente no la tiene.
[FUCINI_DISCOVERY] ahora nombra cada entrada para la que no se encontró archivo y la ruta donde buscó, una vez por entrada en lugar de en cada recarga; una entrada con comodín no se informa, ya que puede estar esperando a que una compilación escriba algo.
0.2026.66 — Ramas, MC/DC y una puntuación en el CodeLens de función
2026-08-29
Añadido
- El CodeLens por función muestra ahora ramas, MC/DC y una puntuación compuesta, no solo líneas y aciertos — «add: 92% cubierto (12/13 líneas, 52 aciertos, puntuación 88%, ramas 3/4 (75%), MC/DC 2/3 (66%))». Cada uno se omite en una función dada cuando el archivo de cobertura no tiene nada que informar ahí — una compilación en C puro sin datos de ramas, o una no instrumentada con
-fcoverage-mcdc — en lugar de mostrar un engañoso 0/0; la puntuación, igualmente, solo se muestra junto a al menos una de las otras dos, ya que con las líneas como única métrica es por definición la misma cifra con la que el lens ya empieza.
- La descripción emergente de la insignia de origen dice cuánto hace que se escribió cada archivo de cobertura, no solo su marca de tiempo — «Medido por module.info (2026-08-15 14:32 · hace 3 horas), reemplazando lo que lcov.info (2026-08-01 09:10) decía de él». Se redondea hasta «justo ahora»; pasados 30 días solo se muestra la fecha absoluta.
- Un empate en el mtime de los archivos de cobertura ya no pasa en silencio. Dos informes que caen en el mismo paso de compilación, o un sistema de archivos cuya resolución de mtime es más gruesa que un segundo, pueden informar la marca de tiempo idéntica para archivos que ambos miden — antes el ganador se decidía por el orden de
coverageFile.paths sin nada en pantalla que lo explicara. El canal de salida ahora lo dice: [FUCINI_MERGE_TIE] nombra ambos archivos de cobertura y cuántos archivos comparten.
- «Show What Changed Since Last Run» en el menú
… de la fila de un archivo, en cuanto existe una ejecución anterior con la que comparar — la misma diferencia por archivo que Compare with Last Run ya calcula, dirigida al único archivo por el que se preguntó en lugar de a todo el árbol. Un archivo en el que nada se movió lo dice sin rodeos en lugar de no ofrecer nada.
- Comando Tune Colour Scale: probar los colores y umbrales de
colorScale.* contra la vista Coverage en vivo antes de adoptarlos. Cada edición se escribe directamente en el ajuste — la vista ya se repinta ante cualquier cambio de colorScale/threshold, así que escribir el valor es la previsualización — y un «Conservar» o «Volver a los valores originales» final cierra el ciclo.
- Huecos de cobertura por archivo en el panel Problems, una entrada por cada archivo fuente cargado que quede por debajo de
threshold.statement, tras el nuevo fuciniCoverage.problems.enabled (desactivado de forma predeterminada — el umbral de sentencias predeterminado es 100). Cada entrada resume lo que queda sin cubrir («62% de líneas cubiertas — 14 líneas sin cubrir, 2 funciones sin cubrir») y lleva una corrección rápida que abre la extensión de chat que esté instalada (Copilot, Claude Code, …) con una instrucción para escribir una prueba para ese hueco — un diagnóstico por línea inundaría Problems en una base de código real, así que esto se queda en la granularidad de archivo, el nivel sobre el que un lector puede actuar de verdad.
Corregido
- El motivo de un archivo ausente, discordante o verificado, en la vista Coverage, ahora se puede seleccionar y copiar. Antes vivía solo en la descripción emergente nativa
title de la fila, que — al ser la del propio navegador — no se puede seleccionar; quien quisiera pegar el motivo exacto en un informe de error tenía que volver a teclearlo a mano. Al pasar el cursor se muestra ahora el mismo texto en un panel real, con estilo, sobre el que se puede arrastrar como sobre cualquier otro contenido de la página. La descripción emergente de un archivo corriente (solo su ruta) no cambia.
- Una función cuya lista de parámetros ocupa varias líneas ya no se informa falsamente como movida.
detectMismatch permitía que la línea registrada de una declaración discrepara de donde realmente se encuentra su nombre en como mucho dos líneas — suficiente para la discrepancia habitual entre una línea de firma, una línea de tipo de retorno y una llave de apertura, pero no para una lista de parámetros en varias líneas, que puede separar ambas tanto como quiera. void LOG_Emit(...) — siete parámetros, uno por línea — registrada en su llave de apertura, la línea 163, se informaba como "LOG_Emit" is at line 3: la coincidencia textual más cercana, que resultó ser el propio nombre de la función mencionado en el comentario de cabecera del archivo, lejos de la línea 163 y de la declaración real en la línea 156. La comprobación acepta ahora también un nombre hallado más atrás cuando cada línea entre él y la línea registrada se lee como una única declaración ininterrumpida — sin línea en blanco, sin línea que cierre la sentencia o el bloque anterior — cosa que una lista de parámetros siempre cumple y una función realmente movida casi nunca. Donde la discordancia sigue siendo real, la línea informada es ahora la coincidencia más próxima a la registrada, en lugar de siempre la primera hallada en el archivo.
- La insignia de origen ya no dice «+N». Cargar el propio informe de un módulo sobre una ejecución más amplia marcaba la insignia del archivo con el nombre del módulo más cuántos otros archivos de cobertura lo cubrían también — pensado como «estos tantos fueron anulados», se leía como «estos informes coinciden», y no había forma de saber desde el árbol a cuál de los n se refería en realidad. La insignia ahora solo nombra el archivo de cobertura cuyas cifras están en pantalla; la descripción emergente sigue detallando qué fue anulado, y cuándo.
- La insignia de origen ya no empuja el nombre de archivo junto al que se sitúa fuera del borde del panel. El ancho de la insignia era fijo (
flex: none), así que en cuanto a una fila le faltaba espacio el nombre de archivo absorbía todo el déficit y se recortaba primero, aunque la insignia es la menos importante de las dos. La insignia ahora cede su propio ancho antes de que el nombre de archivo pierda un solo carácter; el porcentaje y la barra, que ya están por encima del nombre de archivo, no se ven afectados.
0.2026.65 — La repetición de un módulo reemplaza lo que dijo una ejecución más amplia
2026-08-15
Cambiado
- La propia repetición de un módulo reemplaza lo que una ejecución más amplia dijo de él, en lugar de sumarse. Cargar un informe de todo el proyecto y luego, encima, el informe propio de un solo módulo sumaba sus conteos de aciertos para cada archivo que ambos compartían — repetir solo las pruebas de ese módulo inflaba las cifras que una ejecución más amplia, ya caducada, había informado, en lugar de refrescarlas. El archivo de cobertura con el mtime más reciente en disco gana ahora por completo para cualquier archivo que mida: sentencias, ramas, declaraciones y los resúmenes por archivo (de ramas, MC/DC, funciones, llamadas a función, objetos y mutaciones) vienen todos de ese informe solo, sin importar dónde se sitúe cada ruta en
coverageFile.paths — la repetición de un módulo gana porque de verdad es más reciente, no porque resulte cargarse la última. Un archivo de cobertura que no informa sentencia alguna de un archivo — una exportación de código objeto de TRACE32, un informe de mutaciones de Stryker cargado junto a uno real — sigue aportando solo el resumen que realmente lleva, dejando intacto el detalle de líneas/ramas de un informe anterior; ese caso no cambia. Esto elimina además un defecto de larga data por el que un resumen por archivo de MC/DC (o de funciones/llamadas a función/mutaciones) medido por dos ejecuciones veía sumado su denominador junto con su numerador, subestimando el porcentaje real. La descripción emergente de la insignia de origen dice ahora «reemplazando lo que _ decía de él» en lugar de «sumados».
Corregido
- Un nombre de archivo largo en la vista Coverage ahora se recorta en lugar de desbordarse. Al span del nombre de la fila le faltaba
min-width: 0, la única declaración que permite que el overflow/text-overflow: ellipsis de un elemento flex actúe de verdad — sin ella, un nombre largo conservaba todo su ancho cuando el panel se estrechaba lo suficiente, pasando por debajo de la insignia de origen, el porcentaje y la barra que le siguen.
0.2026.64 — Ordenar la vista Coverage por puntuación
2026-08-01
Añadido
- Ordenar la vista Coverage por puntuación, no solo por nombre. Cada fila ya lleva una puntuación WHM y un desglose por métrica; encontrar el peor archivo de un árbol grande suponía recorrer una lista alfabética en su busca. Un desplegable junto a Contraer todo / Expandir todo ofrece ahora Nombre de archivo, Puntuación compuesta, Líneas, Ramas y MC/DC — todos los modos salvo Nombre de archivo intercalan carpetas y archivos, los peores primero según el porcentaje propio de esa métrica, de modo que una carpeta mal probada se clasifica exactamente igual que un archivo mal probado en lugar de quedar agrupada aparte. Un archivo sin datos para la métrica en vista (un formato que nunca informa ramas, por ejemplo) se ordena al final en lugar de leerse como un 0%. La elección se escribe en el nuevo ajuste
fuciniCoverage.coverageView.sortBy en el momento de hacerse, de modo que sobrevive a una recarga de la ventana en lugar de empezar siempre de nuevo en Nombre de archivo.
Corregido
- Una firma de función en varias líneas ya no se marca falsamente como «movida». El
fnMap de Istanbul da a una función dos referencias de línea — dónde está su nombre y dónde empieza su cuerpo — y el analizador prefería la línea del cuerpo para la comprobación de discordancia que luego busca el nombre en el texto fuente. Para cualquier función cuya lista de parámetros ocupe más de dos líneas (habitual en una base de código ajustada a 100 columnas), la línea real del nombre quedaba demasiado lejos de la registrada, y el archivo se atenuaba en la vista Coverage con un falso aviso de «ya no coincide con su cobertura». El analizador prefiere ahora la línea del propio nombre, que es lo que la comprobación de discordancia siempre buscaba.
0.2026.63 — Cada fila nombra su archivo de cobertura
2026-07-20
Añadido
- Cada fila dice qué archivo de cobertura la midió. Cargar el informe de un módulo sobre una ejecución de todo el proyecto son los mismos archivos medidos dos veces, y el árbol no decía nada sobre qué informe estaba leyendo una fila. Con más de un archivo cargado, cada fila lleva ahora el nombre del informe que la midió — el último cargado, cuando fueron varios — con
+1 por cada uno de los demás y una descripción emergente que los nombra. Una combinación suma sus aciertos en lugar de dejar ganar a uno, y así lo dice. Con un solo archivo no se dibuja nada, porque no habría nada que distinguir.
Cambiado
- La propia página de la extensión nombra cada ajuste, con su valor predeterminado real. Veinte ajustes no tenían fila alguna — el idioma, tres umbrales, un peso y los quince interruptores de acciones rápidas — y la fila de telemetría afirmaba estar activada de forma predeterminada cuando lleva tiempo desactivada. Ahora una prueba compara la página con el manifiesto, valores predeterminados incluidos.
Corregido
- La nueva comprobación de las fuentes bajo
files.watcherExclude, añadida en la versión anterior, obedece ahora a staleWarning.enabled como el resto de esa comprobación, y no a un nombre de ajuste propio.
0.2026.62 — El Explorador se deja en paz, las fuentes silenciadas se vuelven a comprobar
2026-07-06
Cambiado
- El Explorador se deja en paz. Las insignias de cobertura junto a los archivos del Explorador están desactivadas de forma predeterminada. Esa columna es de quien la usa — VS Code pone allí la M y la U de git, y solo cabe una insignia — y la vista Cobertura enumera los mismos archivos con las mismas cifras, en un sitio que existe para ellos.
explorerBadges.enabled las devuelve tal cual.
Corregido
- Una fuente bajo
files.watcherExclude también se vuelve a comprobar. La correspondencia en vivo entre un archivo y su cobertura la impulsan los guardados y un observador del sistema de archivos, que calla ante todo lo excluido — sobre todo las fuentes generadas bajo build/, donde una marca caducada es lo más difícil de notar. Esos archivos se sondean ahora en el mismo pulso de dos segundos que los archivos de cobertura y solo se releen cuando de verdad han cambiado. Pasados los doscientos, la salida lo dice en vez de gastar el pulso.
0.2026.61 — Una sola pregunta sobre el ejecutor de pruebas, no una por ejecución
2026-06-09
Añadido
- Se pregunta por el ejecutor de pruebas una vez, no en cada ejecución. Un espacio de trabajo con más de un ejecutor reconocido — una configuración de jest y un
go.mod, por ejemplo — ponía el selector delante de cada Run Tests with Coverage, cobrando una pulsación por una decisión ya tomada. Ahora la respuesta se recuerda para el espacio de trabajo, y la pregunta lo dice. Forget the Test Runner vuelve a plantearla, y un ejecutor recordado que el espacio de trabajo ya no tiene se ignora en lugar de ejecutarse.
Cambiado
- La propia página de la extensión nombra cada comando. Catorce de los treinta y cuatro se habían salido de su tabla — documentados aquí y en la guía, pero no en la página que se lee antes de instalar. Ahora están todos, y una prueba lo mantiene así.
0.2026.60 · compilación 3 — Deshacer vuelve a quitar los puntos
2026-06-01
Corregido
- Deshacer vuelve a quitar los puntos de las líneas editadas. Un búfer editado desde la ejecución muestra puntos grises en las líneas reescritas, y la cobertura se retira de ellas. Deshacer esas ediciones dejaba los puntos donde estaban: contaba cada cambio, incluido el que devolvía el texto. Ahora se recuerda lo que el búfer contenía antes de que nadie escribiera, y en cuanto vuelve a contenerlo los puntos desaparecen y las cifras vuelven a aplicarse.
- Los números de versión se comprueban entre sí. El manifiesto, la entrada superior del registro de cambios y la etiqueta de versión llevan versión y compilación, los tres escritos a mano, y ya han divergido antes. Ahora el conjunto de pruebas los compara y verifica que las entradas van de la más nueva a la más antigua, cada una con una fecha real.
0.2026.59 — Una descarga que dura
2026-05-12
Cambiado
- Un archivo de cobertura descargado sigue descargado. Quitar un archivo de la lista de la vista Cobertura duraba exactamente lo que la ventana: sin nada configurado, la detección recurre a los nombres conocidos y volvía a encontrar
lcov.info a la mañana siguiente, y la única manera de decir otra cosa era configurar una ruta para excluir uno. Ahora la decisión se recuerda para el espacio de trabajo. Se deshace volviendo a elegir el archivo o nombrándolo en coverageFile.paths — un archivo que el ajuste nombra nunca se retiene, así que nada puede faltar sin que alguien lo haya dicho.
Corregido
- Repintado más rápido de un búfer editado. La lista de líneas reescritas se recalculaba a partir de todas las ediciones registradas en cada repintado, así que un archivo largo editado toda la tarde pagaba número de líneas por número de ediciones por una respuesta que no había cambiado desde la última pulsación. Ahora se calcula una vez por pulsación.
0.2026.58 · compilación 2 — Una ejecución de pruebas recuerda su archivo de cobertura
2026-05-01
Cambiado
- Una ejecución de pruebas recuerda su archivo de cobertura, igual que una elección manual. Run Tests with Coverage cargaba lo que la ejecución había escrito y luego preguntaba si añadirlo a
coverageFile.paths. Un archivo elegido a mano se escribe allí solo desde 0.2026.56, y una ejecución de pruebas es el mismo acto por otra vía, así que ahora lo escribe igual. Un único ajuste, coverageFile.rememberPicks, gobierna ambos; la fila del archivo en la vista Cobertura es donde cualquiera de los dos vuelve a salir.
Corregido
- Los temporizadores de fondo se detienen cuando lo hace la extensión. El observador del archivo de cobertura se liberaba con la ventana, pero el sondeo de dos segundos que hay detrás y cualquier recomprobación de fuente pendiente son temporizadores corrientes, que nada libera. Desactivar la extensión, o recargar una ventana con ella desactivada, los dejaba en marcha leyendo un espacio de trabajo que a la extensión ya no le incumbía.
0.2026.57 · compilación 4 — Una vista previa en vivo con etiquetas, banderas dibujadas, todos los formatos en el diálogo de selección
2026-04-24
Añadido
- La vista previa en vivo dice qué muestra. La vista previa del panel de configuración empieza ahora con Ejecución: coverage/lcov.info · 12 archivos y, cuando el editor activo muestra un archivo que la ejecución cubre, con Archivo activo: src/a.c y el veredicto propio de ese archivo bajo el de la ejecución. Sigue al editor y a cada carga, según lo que contenga el formulario — cambios sin guardar incluidos. Con el panel delante, un clic en la vista Cobertura cambia la vista previa a ese archivo en lugar de abrirlo.
- El diálogo de selección nombra todos los formatos. Primero Todos los formatos de cobertura, luego LCOV; JSON (llvm-cov, Istanbul/nyc, coverage.py, SimpleCov, Coveralls, gcov, xccov, Stryker); XML (Cobertura, JaCoCo, Clover, OpenCover, GNATcoverage, Bullseye, SonarQube, VectorCAST, TRACE32, EMMA, UCIS/UCDB, NCover, dotCover, PIT); perfil de cobertura de Go; listado gcov y Testwell CTC++ — y
.lcov, .gcov, .txt y .coveragexml ya no aparecen en gris.
Cambiado
- Las descripciones emergentes de la barra de estado llevan la escala de colores. Las barras de métricas de las descripciones de ejecución y de archivo toman los tres colores de
colorScale.*, escalonados por el umbral propio de cada métrica cuando está configurado y por los cortes de la escala en caso contrario; las etiquetas de veredicto conservan sus colores de estado fijos.
- Banderas dibujadas en el ajuste de idioma. Los emoji de banderas de 0.2026.56 se muestran en Windows como dos letras sueltas. El desplegable nombra ahora cada idioma en sí mismo — Nederlands (nl) — con una fila de pequeñas banderas dibujadas debajo que seleccionan en el desplegable.
0.2026.56 · compilación 3 — Las elecciones se recuerdan, tracefiles en la vista Cobertura, banderas en el ajuste de idioma
2026-04-08
Añadido
- Una elección se recuerda. Un archivo elegido con Pick Coverage File vivía solo en la ventana donde se eligió. Ahora va solo a
coverageFile.paths en la configuración del espacio de trabajo — relativo a la carpeta base si está debajo, absoluto si no — de modo que la siguiente ventana lo carga y el vigilante lo recarga. coverageFile.rememberPicks (activado por defecto) conserva el comportamiento anterior para quien lo quiera. Una entrada absoluta en ese ajuste nombra ahora un archivo esté donde esté.
- Tracefiles en la vista Cobertura. Sobre el árbol, una fila por tracefile cargado con su número de archivos y un botón de descarga que lo quita de la ejecución y de la configuración; un botón Elegir… al lado añade uno. Descargar el último tracefile vacía la ejecución.
- Banderas en el ajuste de idioma. El desplegable de idioma del panel de configuración mostraba códigos desnudos; cada entrada lleva ahora una bandera y el nombre del idioma en sí mismo — 🇳🇱 Nederlands (nl), 🇯🇵 日本語 (ja), 🌐 Automático.
0.2026.55 — La última línea de un archivo PHP no es cobertura más allá del final
2026-03-27
Corregido
- La última línea de un archivo PHP ya no cuenta como cobertura más allá del final. Xdebug y PCOV registran el return implícito de fin de archivo en la línea siguiente al último salto de línea, así que php-code-coverage escribe un acierto en la «línea 252» de un archivo de 251 líneas — y la comprobación de discrepancia lo llamaba contradicción en todo archivo PHP con salto de línea final. Ahora se admite una línea más allá de un salto de línea final; una referencia más lejos, o más allá de un archivo sin salto de línea final, sigue siendo la contradicción que era.
0.2026.54 · compilación 2 — Una fila de prueba en What Community Includes
2026-03-24
Añadido
- Una fila de prueba en What Community Includes, en la edición Community. Esa compilación nunca tuvo prueba, así que su lista ahora empieza con Iniciar una prueba de Pro de 14 días…, que abre la ficha de Pro; la activación de la compilación Pro ofrece después apartar la compilación Community. Community sigue siendo gratis decidas lo que decidas.
0.2026.53 — Show Worst-Covered Folders
2026-03-03
Añadido
- Show Worst-Covered Folders. La respuesta a nivel de carpeta a Show Worst-Covered Files: cada carpeta ordenada por la cobertura de todo lo que contiene, la peor primero, desde el mismo índice con el que se pintan las insignias del Explorador; una elección muestra la carpeta en el Explorador. En el menú de la barra de estado con
quickActions.worstCoveredFolders.
0.2026.52 — La comprobación de umbrales en el panel Problemas
2026-01-23
Añadido
- La comprobación de umbrales en el panel Problemas. Con
compliance.diagnostics activado, cada métrica threshold.* no alcanzada es un error en Problemas, sobre el tracefile que la incumplió, actualizado en cada carga y por Check Coverage Thresholds, borrado cuando la comprobación pasa. Desactivado por defecto, porque el umbral de sentencias de fábrica es 100.
Cambiado
- La descripción de
watch.enabled ya no promete una pregunta. Aún decía que al nivel gratuito se le pregunta antes de recargar — cierto hasta 0.2026.48, no desde entonces. Reescrita en los 18 idiomas.
0.2026.51 · compilación 2 — Run Tests with Coverage
2025-12-08
Añadido
- Run Tests with Coverage. Reconoce vitest, jest, pytest, go, cargo, dotnet, maven, gradle, phpunit o ctest desde la raíz del espacio de trabajo, lo ejecuta con cobertura activada en una tarea de terminal, carga lo que escribió pasaran o no las pruebas, y ofrece una vez añadir esa ruta a
coverageFile.paths para que el vigilante haga la carga a partir de entonces. Varios ejecutores se ofrecen como selección; ninguno te envía a las recetas.
0.2026.50 — La cobertura sigue al texto en un búfer editado
2025-10-23
Añadido
- La cobertura sigue al texto en un búfer editado. Las ediciones hechas en cada búfer abierto desde que se cargó la ejecución se conservan, y cada superficie que lee números de línea de la ejecución — el recuento al pasar el ratón, la barra MC/DC, el triángulo «desde la última ejecución», el CodeLens, Next Uncovered — lee a través de ellas: una marca se mueve con su línea y se retira de una línea reescrita, donde un pequeño punto gris dice por qué.
dirtyMarks.enabled desactiva los puntos.
0.2026.49 — Desde la última ejecución, en el margen
2025-09-26
Añadido
- Desde la última ejecución, en el margen. Cada línea ejecutada en la ejecución anterior y no en esta lleva un triángulo rojo en el margen del editor, cada línea que hizo el camino inverso uno verde, cada uno con una franja en la regla de vista general y los recuentos al pasar el ratón. Las líneas sin cambios no muestran nada.
sinceLastRun.enabled lo desactiva.
Cambiado
- La referencia de «última ejecución» sobrevive a un reinicio. Con
history.enabled activado, la ejecución más reciente del historial ocupa ese lugar en la primera carga de una ventana, así que una compilación terminada antes de abrir la ventana sigue mostrando lo que cambió — en el margen y en Compare with Last Run.
0.2026.48 · compilación 6 — Recarga automática en todas partes, la marca sigue al archivo, la diferencia exacta al pasar el ratón
2025-09-19
Añadido
- El veredicto sobre un archivo se mantiene al día tras la carga. Un archivo se comprobaba frente a su cobertura una vez, al cargar el tracefile, y nunca más: edítalo toda una tarde y los márgenes seguían pintando números sobre una versión que ya no existía. Ahora un guardado en el editor vuelve a comprobar ese archivo al instante, y un cambio desde fuera del editor — un
git checkout, un formateador, un generador — lo vuelve a comprobar desde disco un momento después. Un archivo que pasa a contradecir su ejecución recibe la marca; un checkout que repone la versión medida la quita.
- La diferencia exacta, al pasar el ratón. Donde un archivo ya no coincide con su cobertura, la vista Cobertura y la descripción emergente del Explorador dicen exactamente qué lo demostró: la línea tal como se lee ahora frente a lo que registró el informe cuando el tracefile conservaba el texto, la línea y una suma de comprobación fallida cuando conservaba un resumen, cobertura más allá del final del archivo, una función que ya no está donde la sitúa el informe. El mismo detalle va al canal de salida, una línea por archivo, adonde lleva Mostrar cuáles en el resultado de la carga.
- Un interruptor para las insignias del Explorador.
explorerBadges.enabled (activado por defecto) oculta la puntuación, ✓ y ⚠ junto a cada archivo cubierto en el Explorador, y con ellas la descripción emergente por métrica. Los márgenes, la barra de estado y la vista Cobertura no cambian.
Cambiado
- Todos los niveles recargan por sí solos cuando cambia el tracefile. Desde el 2026-09-02 el nivel gratuito se detenía en una pregunta nueva cobertura detectada — ¿cargarla? mientras las licencias de pago recargaban en silencio. Una compilación termina, los números son nuevos, y quien activó la vigilancia ya respondió a esa pregunta — así que la pregunta desaparece en todos los niveles, y con ella el aviso que la explicaba.
- Las cargas que el producto hace por sí solo ya no cuentan para el límite diario del nivel gratuito. Una recarga del vigilante o la detección al inicio no es una carga que alguien haya pedido; contarlas habría gastado el cupo de una instalación Community en una mañana de pruebas y dejado luego una ejecución antigua en pantalla sin nada que lo dijera. El límite ahora mide solo el comando y el selector.
- Una marca de tiempo cambiada por sí sola ya no señala un archivo. El aviso N archivo(s) cambiado(s) desde esta ejecución salía de la mtime de cada fuente, y un
git pull o un formateador cambia todas las mtime sin alterar lo medido. Ha desaparecido, junto con su marca en la barra de estado. Un archivo solo se llama cambiado ahora cuando su contenido contradice la ejecución, y la barra de estado, el resultado de la carga y una nueva línea de salida FUCINI_MISMATCH_001 leen de ahí. staleWarning.enabled conserva su nombre y ahora describe exactamente la comprobación de contenido.
- Vigilar una carpeta bajo
files.watcherExclude se indica en la salida. La salida de compilación es lo primero que se excluye del vigilante de VS Code, tras lo cual solo el sondeo cada 2 s advierte una nueva ejecución. El canal de salida ahora nombra la carpeta y el glob al arrancar el vigilante.
0.2026.47 · compilación 2 — Rutas sin coincidencia en pantalla, una pista de primer uso, dos teclas más
2025-08-09
Añadido
- Una pista de primer uso para un espacio de trabajo sin nada que cargar. La vigilancia está activada por defecto y la carga inicial es silenciosa, así que una instalación nueva en un proyecto sin archivo de traza no decía nada en absoluto. La primera carga silenciosa que sale vacía ahora lo dice — una vez, para siempre — con las dos cosas que merecen la pena: elegir un archivo de cobertura a mano, o abrir las recetas para producir uno con su cadena de herramientas. Una carga lanzada a mano conserva su propio mensaje.
- Teclas para Toggle Annotated Source y Load Coverage.
Alt+A alterna la pestaña activa entre el código y su vista anotada; Alt+Shift+R vuelve a descubrir y recarga la cobertura (Ctrl+Alt+A / Ctrl+Alt+R en macOS). Reasignables como las dos añadidas en 0.2026.45.
Cambiado
- Las rutas que no coinciden con nada del espacio de trabajo se cuentan en pantalla. Una ruta del archivo de traza que no se resuelve a ningún archivo del espacio de trabajo carga y nunca se ilumina — el «funcionó pero no se ve nada» más común que existe — y hasta ahora el único rastro era una línea
FUCINI_REMAP_001 en el canal de salida, con la regla pathRemap que lo arreglaría, sin leer. El resultado de la carga ahora las cuenta, con ¿Cuáles? para los nombres y la regla sugerida, y Abrir el ajuste pathRemap para el sitio donde ponerla. - El selector de archivos del menú de la barra de estado nombra los formatos que lee. Su descripción aún listaba los cinco formatos de la primera versión; ahora dice veinticinco, de lcov, Cobertura y JaCoCo a gcov, llvm-cov, TRACE32 e informes de mutación.
0.2026.46 — Una salida al choque de ediciones y un límite más discreto
2025-08-06
Cambiado
- Ambas ediciones instaladas: dos botones en lugar de instrucciones. Con Pro y Community presentes a la vez, ninguna puede activarse — definen los mismos comandos y vistas — y el mensaje que lo decía terminaba con indicaciones hacia la vista Extensiones. Ambos remedios son un comando cada uno, así que ahora son botones: Conservar este desinstala la otra edición y ofrece la recarga; Mostrar ambos en Extensiones abre la vista Extensiones exactamente sobre esas dos. Si la desinstalación falla, la recarga se ofrece igualmente — una recarga es lo que decide qué edición está activa.
- Un límite de uso se anuncia completo una vez y después solo en la barra de estado. La primera vez que se alcanza un límite de Community merece la respuesta completa — las cifras, el plan, el desbloqueo por telemetría, la lista de lo que incluye el nivel. La quinta vez, diez minutos después, no. Dentro de una sesión, los siguientes choques con el mismo límite ponen una línea de ocho segundos en la barra de estado y no interrumpen nada. Introducir una clave empieza de nuevo, porque una licencia nueva es un conjunto nuevo de límites.
0.2026.45 — Teclas para Next / Previous Uncovered
2025-07-26
Añadido
- Next / Previous Uncovered tienen teclas. Son los dos comandos que se pulsan una y otra vez al leer un archivo, y hasta ahora cada pulsación significaba abrir la paleta de comandos y escribir el nombre.
Alt+N salta al siguiente rango sin cubrir y Alt+P al anterior (Ctrl+Alt+N / Ctrl+Alt+P en macOS, donde Option escribe caracteres). Ambas valen solo en un editor de texto con foco y se reasignan en Keyboard Shortcuts como cualquier otro valor predeterminado.
0.2026.44 · compilación 3 — Los límites del nivel gratuito, en una sola lista
2025-07-24
Añadido
- Qué incluye Community, como una sola lista. El nivel gratuito limita ocho acciones y retiene doce funciones, y cada una de esas decisiones se aplicaba en su propia puerta — así que la única forma de conocer la forma del nivel era chocar con cada muro por turno, a mitad de tarea. Un comando nuevo, What Community Includes, lo muestra todo de una vez: cada acción limitada con cuánto de su día o mes ya está usado, cada función retenida por su nombre, y las dos formas de levantarlo — un plan de pago o el desbloqueo por telemetría.
- Se ofrece dondequiera que surja la pregunta. Una entrada en el menú de la barra de estado, un botón en el banner de licencia de la vista Coverage y un botón en los dos mensajes que una instalación Community encuentra ante un muro — límite de uso alcanzado y esta acción no está incluida. Las filas se derivan del mismo conjunto de permisos que aplican las puertas, así que lo que dice la lista es lo que ocurrirá.
Cambiado
- El modo de vigilancia dice lo que hará en el nivel gratuito. La entrada de la barra de estado prometía a todos «recargar automáticamente la cobertura», y en Community es una promesa que el vigilante no cumple — se da cuenta y pregunta. La entrada ahora lo dice ahí, y el comando se titula Toggle Tracefile Watch, ya que «Toggle Watch» nunca decía qué se vigilaba. El comportamiento en sí no cambia.
0.2026.43 · compilación 3 — Una carga fallida dice por qué, y los archivos ocultos se cuentan
2025-06-25
Cambiado
- Un archivo de traza que no carga ahora dice por qué y qué probar. Cada fallo producía la misma notificación — «no coverage could be parsed. See output.» — con la razón a un canal de distancia como código y mensaje del analizador. La notificación ahora empieza por el archivo y clasifica el rechazo según lo que fue: no está en un formato que esta extensión lea, no está bien formado (la causa habitual es una compilación que aún lo escribía), bien formado pero sin registrar nada (la ejecución no ejecutó código instrumentado) o no se pudo leer. Las palabras del propio analizador van junto, varios archivos se cuentan, y el canal de salida se ofrece tras un botón Mostrar salida en lugar de abrirse a la fuerza.
- Los archivos que una traza enumera pero en los que no hay nada que medir ahora se cuentan en pantalla. Una cabecera solo con declaraciones siempre quedó fuera de la vista Coverage en lugar de puntuar 100 % sobre 0 de 0 — y su nombre se escribía en el canal de salida, y en ningún otro sitio. El resultado de la carga ahora dice N archivo(s) sin nada que instrumentar no se muestran, con un botón ¿Cuáles? que abre el canal con los nombres.
0.2025.42 · compilación 3 — NCover y dotCover, la cobertura de .NET sin destino
2025-06-08
Añadido
- NCover y JetBrains dotCover. El Cobertura de Coverlet y OpenCover ya se leían aquí, lo que cubre la mayor parte del trabajo nuevo en .NET y nada del tipo antiguo. Una compilación que todavía escribe el
Coverage.xml de NCover, o un equipo que mide con dotCover, tenía cobertura en disco que esta extensión no podía abrir. Ninguno de los dos formatos necesita un conversor: ambos ya llevan nombres de archivo y números de línea. - Un punto excluido de NCover se descarta, no se puntúa como no ejecutado.
excluded="true" marca código deliberadamente sacado de la medición — un miembro con [ExcludeFromCodeCoverage], o un filtro de NCoverExplorer. Contarlo como no cubierto haría que una exclusión rebajara el número que se escribió para corregir. - dotCover necesita
/ReportType=DetailedXML. Su otro informe XML es un resumen sin ningún número de línea; ese informe se reconoce y se rechaza con la indicación del parámetro que lo soluciona, en lugar de fallar como formato desconocido. dotCover registra solo un sí o un no por sentencia, nunca un recuento de visitas, así que una sentencia cubierta llega como un único acierto.
0.2025.41 · compilación 4 — Pruebas de mutación: PIT y Stryker
2025-05-28
Añadido
- Pruebas de mutación. La cobertura dice que una línea se ejecutó; una puntuación de mutación dice que algo falló cuando esa línea se cambió. Una suite puede ejecutar cada línea de un archivo sin detectar ninguno de los defectos inyectados, y ningún número de cobertura lo dirá. PIT cubre Java, Kotlin y Scala; Stryker cubre JavaScript, TypeScript, C# y Scala.
- Nunca se promedia con la cobertura. Mezclar «esta línea se ejecutó» con «algo lo notó cuando la cambié» no responde a ninguna de las dos, así que no tiene peso en la puntuación compuesta y se controla por separado mediante
fuciniCoverage.threshold.mutation — 0 por defecto, porque una puntuación de mutación es un objetivo a mejorar, no un listón que superar el primer día. - Un mutante que nunca tuvo una ejecución justa no cuenta en ninguna de las dos mitades. El
NON_VIABLE de PIT y los CompileError e Ignored de Stryker son mutaciones que la herramienta no pudo crear; contarlos como no detectados penalizaría a una suite por un defecto que nunca se le ofreció.
0.2025.40 — El listado de texto plano de gcov, para compiladores anteriores a GCC 9
2025-05-16
Añadido
- El listado anotado
.gcov. gcov --json-format llegó con GCC 9, y los compiladores cruzados embebidos suelen ser mucho más antiguos; hasta ahora la respuesta era instalar primero lcov o gcovr. El contador de ejecución tiene cinco grafías y solo dos son números, y las anotaciones branch/call/function pertenecen a la línea vecina en lugar de a la suya — todo esto ahora se lee correctamente. - Las anotaciones de llamada se convierten en cobertura por punto de llamada.
call N returned X% es exactamente la métrica de llamadas a funciones añadida en 0.2025.38, que este formato llevaba mucho antes de que aquí hubiera dónde ponerla.
0.2025.39 · compilación 2 — Cobertura de código objeto, y con ella el ensamblador
2025-04-27
Añadido
- Cobertura de código objeto: cuánto del binario construido se ejecutó realmente. La única métrica aquí que no se mide en absoluto desde el código fuente: proviene de un depurador que observa el flujo de instrucciones en el destino real, sin ningún efecto de sonda sobre la temporización. Es también la respuesta honesta a "¿esto cubre el ensamblador?" — el ensamblador escrito a mano nunca se instrumenta, y ninguna otra métrica aquí puede alcanzarlo.
- Es un requisito, no otro peso. La cobertura de código objeto subsume la cobertura de sentencias — un 100% aquí implica un 100% allí, pero no al revés — así que no tiene peso en la puntuación compuesta y se controla mediante un umbral, tal como lo pide DO-178C nivel A además de MC/DC.
- La diferencia es el entregable. Una ejecución con 100% de cobertura de líneas y menos del 100% de cobertura de código objeto ha localizado exactamente el código generado por el compilador del que su fuente no da cuenta; la ficha de cumplimiento dice "312 bytes nunca ejecutados, con 100% de cobertura de líneas" en lugar de esconderlo como "94%". El caso inverso —un binario entero dado por ejecutado mientras su fuente no lo estaba— se informa como una contradicción, no como una puntuación baja.
0.2025.38 · compilación 2 — Cobertura de llamadas a funciones, y VectorCAST y TRACE32 completos
2025-04-01
Añadido
- Cobertura de llamadas a funciones — si se ejercitó cada punto de llamada. Una pregunta distinta de la cobertura de funciones: una función invocada una vez desde uno de sus tres puntos de llamada está completa bajo Funciones y aquí completa en un tercio. VectorCAST, TRACE32 y Cantata reportaban esto mientras este modelo no tenía dónde colocar el número.
- Esto completa VectorCAST y TRACE32. Las versiones anteriores se negaron deliberadamente a plegar estos datos en la cobertura de ramas, porque inflar un porcentaje de ramas infla un número que termina en una auditoría. Ambos formatos ahora cargan lo que siempre enviaron.
Cambiado
- La puerta de cumplimiento y la puntuación ponderada conocen ahora siete métricas, no seis — dos ajustes nuevos,
fuciniCoverage.whmWeights.functionCalls y fuciniCoverage.threshold.functionCalls, con descripciones en los 17 idiomas.
0.2025.37 — Cobertura de funciones como recuento, no solo como ubicación
2025-02-16
Cambiado
- La cobertura de funciones ahora cuenta incluso cuando la herramienta no dice dónde están las funciones. La exportación
func de TRACE32, los elementos <method> autocerrados de VectorCAST, y el resumen method, % de EMMA indican los tres un recuento de funciones sin ningún sitio donde colocar un CodeLens — los tres se descartaban al entrar. Las declaraciones siguen siendo la fuente preferida donde existen; el recuento ahora se usa como respaldo donde no las hay.
0.2025.36 · compilación 4 — UCIS y Aldec UCDB, y los nuevos analizadores probados hasta la línea
2025-02-03
Añadido
- UCIS y UCDB XML — VHDL y Verilog, directamente del simulador. Dos documentos responden a este nombre, y un proyecto tiene el que escribió su simulador, así que ambos se leen: la forma de intercambio estándar
<UCIS> de Accellera, y el ux:ucdb propio de Aldec, que es lo que acdb2xml produce realmente desde Active-HDL y Riviera-PRO. La cobertura de sentencias y ramas se traslada; la cobertura de toggle, FSM, aserciones y funcional no se lee, y un documento que solo contiene eso lo indica en lugar de cargarse vacío. - El VHDL de código abierto ya no necesitaba nada aquí: el backend GCC de GHDL instrumenta con
-Wc,-ftest-coverage -Wc,-fprofile-arcs, y el resultado pasa por gcov, gcovr o lcov. Esta versión es para los simuladores comerciales.
0.2025.35 · compilación 3 — EMMA XML, y Delphi por fin tiene una vía de entrada
2025-01-22
Añadido
- EMMA XML. Delphi no tenía absolutamente ninguna vía de entrada — ni lcov, ni Cobertura — y DelphiCodeCoverage escribe exactamente este esquema con
-xml. También es lo que buena parte de las herramientas Java más antiguas todavía emite, así que un solo analizador abre un lenguaje y limpia un legado a la vez. - Añada
-xmllines y el informe gana recuentos de aciertos reales por línea, así que los marcadores funcionan; sin ello solo hay un porcentaje acumulado, que obtiene un resumen de archivo y ningún marcador en lugar de una suposición. Un nombre de paquete con puntos se convierte en directorio solo cuando el archivo es una fuente de la familia Java; en un informe de Delphi ese mismo campo es un nombre de unidad, y anteponerle un prefijo inventaría una carpeta que nadie tiene en el disco.
0.2025.34 · compilación 3 — Lauterbach TRACE32, una métrica por exportación
2025-01-01
Añadido
- Exportaciones de cobertura de TRACE32.
COVerage.EXPORT.ListModule escribe lo que un depurador midió a partir de una traza en el propio destino — no fuente instrumentada, sino el flujo de instrucciones que el procesador realmente ejecutó, en el destino real, sin ningún efecto de sonda sobre la temporización. Una exportación lleva una métrica a la vez: stmt se convierte en cobertura de líneas; dec/cond se convierten en cobertura de ramas; mcdc se convierte en MC/DC. Cargue dos exportaciones de la misma ejecución y se fusionan por nombre de módulo. - Las exportaciones con cobertura
func, call u object se rechazaban por nombre en lugar de cargarse vacías, indicando qué métrica contiene el archivo — las tres tienen ahora un hogar, en 0.2025.37, 0.2025.38 y 0.2025.39 respectivamente.
0.2025.33 · compilación 4 — Testwell CTC++, leído por columna porque el texto no está delimitado por espacios
2024-12-19
Añadido
- Listados de perfil de ejecución de Testwell CTC++.
ctcpost convierte MON.sym y MON.dat en un listado de texto de ancho fijo — la herramienta que se sitúa frente a Bullseye en las evaluaciones embebidas y de seguridad europeas, y la que mide la cobertura multicondición. Se lee por posición de columna en lugar de dividir por espacios, porque una descripción puede empezar ella misma por un dígito. - La multicondición no es MC/DC, y no se informa como MC/DC. CTC++ cuenta combinaciones de condiciones; MC/DC pregunta si se demostró que cada condición afecta al resultado de forma independiente. Poner estos números tras la puerta de MC/DC daría a un auditor un número bajo un nombre que no significa eso, así que aquí son cobertura de ramas, que es lo que son.
0.2025.32 · compilación 4 — VectorCAST XML, y el MC/DC que se descartaba en silencio
2024-12-08
Añadido
- VectorCAST XML. VectorCAST escribe un informe Cobertura hasta el doctype, y luego añade atributos para lo que el Cobertura corriente no puede decir. Eso significaba que estos archivos ya se cargaban aquí y parecían completos — con
mcdcpair-coverage descartado silenciosamente al entrar, precisamente para la audiencia que compró una herramienta específicamente para producirlo. Esos recuentos de pares ahora sobreviven. Alimentan la puerta de MC/DC, el porcentaje y la puntuación compuesta. - La cobertura de llamadas a funciones deliberadamente no se aproxima. Plegarla en la cobertura de ramas inflaría un número que termina en una auditoría; espera a que el modelo tenga un nombre para ella, lo que ocurre en 0.2025.38.
Cambiado
- El lector de Cobertura ahora lleva un dialecto:
<coverage line-rate=…> es una familia, no un único formato, y qué dialecto se está leyendo viaja con el análisis en lugar de adivinarse por elemento.
0.2025.31 — Ada, Swift y cobertura que se recarga sola
2024-11-07
Añadido
- GNATcoverage XML — Ada, por fin. Los equipos de aviónica DO-178C y ferroviarios EN 50128 son justamente el público para el que se crearon la puntuación ponderada por seguridad y el soporte MC/DC de este producto, y hasta ahora no podían cargar nada aquí salvo que su
gnatcov fuera lo bastante nuevo para emitir también Cobertura, que descarta todo lo que hay por debajo de la línea. gnatcov coverage --annotate=xml escribe un directorio y no un archivo: carga los archivos *.xml por fuente — abrir index.xml te dice dónde está realmente la cobertura en lugar de fallar de forma opaca. Una línea parcialmente cubierta sigue siendo una línea cubierta con una decisión sin cubrir: la carencia aparece en la cobertura de ramas y MC/DC, que es donde corresponde. Las regiones de exención se convierten en líneas excluidas, una obligación indeterminada cuenta como no cubierta y no como cubierta, y con --level=stmt+mcdc el MC/DC se cuenta por condición y alimenta el umbral y la puntuación compuesta.
- BullseyeCoverage y Visual Studio
.coveragexml. Bullseye es la herramienta comercial de C/C++ que realmente tienen los equipos de sistemas embebidos y críticos para la seguridad; ejecuta su propio covxml y carga el resultado. Su métrica principal es la cobertura de condición/decisión y no la de líneas, y aquí ambas se mantienen separadas — además, una sonda de resultado único se puntúa sobre uno y no sobre dos, para que un switch plenamente probado no aparezca como medio cubierto. El .coveragexml de Visual Studio completa .NET para equipos con MSTest y vstest en lugar de Coverlet: convierte antes el .coverage binario con dotnet-coverage convert. Las líneas parcialmente cubiertas sobreviven al trayecto en ambos casos.
- Cobertura genérica de SonarQube — y una respuesta clara sobre Xcode. Cuatro atributos en dos elementos, y importa porque casi cualquier herramienta que no pueda emitir uno de los demás formatos sí puede emitir este: un proyecto cuya herramienta de cobertura esta extensión nunca ha conocido ya tiene una vía de entrada. Es además lo que escribe
xcresultparser, y así es como llegan aquí los proyectos Swift y Objective-C: .xcresult no tiene analizador, y la documentación ahora explica por qué en vez de dejarte adivinar — xccov informa porcentajes, no datos por línea, y el archivo con datos por línea solo puede leerse de fichero en fichero, en un documento que nunca nombra el archivo que describe.
- Los tracefiles comprimidos con gzip se cargan tal cual.
gcov --json-format escribe .gcov.json.gz de forma predeterminada, así que el formato que anunciaba la documentación era uno que la mayoría no podía cargar. La detección usa los bytes mágicos del propio archivo en lugar de su nombre, de modo que un informe comprimido que perdió su .gz sigue funcionando — y cualquier formato admitido puede llegar ahora comprimido, no solo el de gcov.
- Swift y Objective-C, desde el informe propio de Xcode.
xcrun xccov view --report --json es el único documento de cobertura que una compilación de iOS o macOS produce sin herramientas adicionales. Obtiene porcentajes por archivo, recuentos de ejecución por función y CodeLens. No contiene datos por línea, y Studio no los inventa, así que los márgenes quedan vacíos con este formato: un margen inventado es indistinguible de uno medido. Para cobertura de Swift línea a línea, use llvm-cov export -format=lcov o slather; ambos ya funcionaban.
- Coveralls JSON: lo escriben los reporteros de Elixir, Ruby, Python, Rust, Go y JavaScript por igual. Es por línea, así que los márgenes funcionan.
- Días activos, bloqueos de umbral y la licencia a la que pertenece un resumen — tres añadidos al resumen mensual de uso, para instalaciones que han activado la telemetría.
Eliminado
- El nombre del equipo ya no se envía.
hostname formaba parte de la base de telemetría desde el principio — fuera de toda comprobación, enviado por cualquiera con la telemetría activada. El nombre de un equipo suele ser el nombre de una persona, un número de mesa o el proyecto de un cliente, y no respondía a ninguna pregunta sobre el uso que el sistema operativo no respondiera mejor. Una instalación se identifica ahora solo por su id de instalación aleatorio. Con esto, nada que le nombre a usted o a su máquina sale de ella: ni el nombre del equipo, ni el usuario del sistema, ni la carpeta personal, ni las interfaces de red, ni sus rutas de archivos, ni el nombre de la carpeta de su proyecto, ni una etiqueta de cuenta iniciada. Queda el sistema operativo, su versión y su arquitectura — qué tipo de máquina, no cuál.
- La telemetría se elimina ahora en un plazo máximo de 90 días, mientras que la política solo decía que se «conservaba mientras fuera útil», lo que no es un plazo.
Cambiado
- Una licencia de pago ahora recarga la cobertura por sí sola. Vigilar un archivo de cobertura siempre significó que le preguntaran «se detectó nueva cobertura, ¿cargarla?» después de cada compilación, en todos los niveles: una pregunta con una sola respuesta sensata, hecha varias veces por hora. Ese aviso es ahora el comportamiento del nivel Community gratuito; una licencia de pago simplemente carga. Community conserva la vigilancia, la detección y el aviso que siempre tuvo.
- Un archivo que ya no coincide se nombra, con la comprobación que lo demostró, en una licencia de pago. La detección no está restringida ni lo estará: decirle a alguien que su cobertura ya no describe su archivo no es algo que se le venda. Community sigue recibiendo el hallazgo, y la fila sigue atenuada. Una licencia de pago añade el señalamiento: la marca, la insignia en el Explorador y la línea, función o suma de comprobación detrás.
- La telemetría envía menos y dice a quién pertenece. El resumen mensual ya no lleva rutas de archivos, ni el nombre de la carpeta de su proyecto, ni una etiqueta de cuenta. El canje de funciones por telemetría ahora pide una dirección de correo electrónico, para que quien lo aceptó pueda saber qué envía su instalación y hacer que se elimine si lo pide.
- Tres descripciones de ajustes corregidas.
watch.enabled, staleWarning.enabled y telemetry.enabled se habían apartado de lo que hace el código — telemetry.enabled sobre todo: describía un envío bastante mayor que el real.
Corregido
- El selector de archivos ya no oculta formatos que sí lee. Pick Coverage File filtraba por
info, json y xml, de modo que el coverage.out de Go y el .gcov.json.gz de gcov — ambos formatos que esta extensión lee — aparecían atenuados justo en el diálogo que te pide elegir uno.
- Una instalación Community normal ya no envía una página de su código fuente. La comprobación que protegía la muestra de código anotado trataba a toda instalación Community como si hubiera aceptado el canje de telemetría, no solo a las que realmente lo habían hecho.
- Una advertencia por carga en lugar de dos: un archivo que ya no coincide con su cobertura casi siempre se ha editado también desde la ejecución, y cada cosa se informaba por separado.
- Una desinstalación ya no informa del nombre de usuario del sistema ni del directorio personal de alguien cuya licencia lo prohíbe.
0.2025.30 · compilación 3 — Lo que su compilación ya escribe
2024-10-18
Añadido
- Perfiles de cobertura de Go.
go test -coverprofile es la única salida de cobertura que produce la cadena de herramientas estándar de Go —no hay un lcov al que recurrir, como sí ocurre con Rust, Dart y Elixir—, de modo que un proyecto en Go no tenía nada que esta extensión pudiera leer. Un perfil registra bloques en lugar de líneas, y cada línea que abarca un bloque toma su recuento, llave de cierre incluida, exactamente como las resalta go tool cover -html. coverage.out se suma a los nombres de búsqueda, así que un proyecto en Go sin configuración encuentra su perfil como un proyecto en C encuentra lcov.info.
- Clover XML y OpenCover XML. Clover es lo que los proyectos PHP tienen de verdad:
php-code-coverage puede emitir Cobertura, pero Clover es su formato predeterminado y el que configura casi todo phpunit.xml, de modo que la cobertura de PHP era ilegible aquí mientras un analizador de Cobertura esperaba una salida que casi nadie genera. El informador clover de Istanbul escribe el mismo documento, así que un proyecto Jest configurado así también queda cubierto. OpenCover es el equivalente en .NET: C# y VB.NET ya llegaban como Cobertura, que aplana una decisión en la cadena condition-coverage="50% (1/2)", con lo que qué rama se ejecutó desaparecía antes de que un analizador la viera. OpenCover conserva un contador por rama: la diferencia entre saber que la mitad de una bifurcación está cubierta y saber cuál mitad.
- JSON de coverage.py y de gcov/gcovr. Las exportaciones a Cobertura y lcov de coverage.py tienen que llamar a una línea con
# pragma: no cover cubierta o ausente, porque carecen de una palabra para «excluida deliberadamente», y esta extensión sí la tiene: el mismo indicador que ponen sus marcadores LCOV_EXCL. Así, las pragmas de un proyecto Python significan aquí lo que significan en el propio informe de coverage.py. La cobertura de GCC, por su parte, solo llegaba tras pasar por lcov o gcovr -x: una segunda herramienta para convertir datos que GCC ya había producido. gcov --json-format --stdout y gcovr --json emiten documentos casi idénticos, y un solo analizador lee ahora ambos.
Corregido
- Los comentarios se leen en el lenguaje en que está escrito el archivo. El analizador de líneas sin código se escribió para C y se aplicaba a todos los archivos, lo cual era correcto mientras cada formato que leía esta extensión describía un lenguaje de la familia C. Ya no lo es: un analizador de C que encuentra
# don't ve que el apóstrofo abre una cadena, nunca la ve cerrarse y cuenta la línea de comentario como código: un número discretamente algo equivocado, sin nada que lo advierta. Ahora es # para Python, Ruby, shell, Perl, R, Elixir y Julia; las tres formas para PHP, que las admite todas; y // con /* */ en todo lo demás, que sigue siendo el valor predeterminado para una extensión desconocida: #define es código, y excluirlo sería erróneo en el sentido contrario.
0.2025.29 · compilación 4 — Cada opción, explicada
2024-10-15
Añadido
- Cada opción
fuciniCoverage.* tiene ahora un lugar en ese panel, no solo las trece de cumplimiento. Las cincuenta y cinco están agrupadas en las mismas secciones, y en el mismo orden, que la referencia de configuración publicada, de modo que la página desde la que configura y la que lee coinciden sobre dónde vive cada opción. Un cuadro de búsqueda filtra por nombre, clave o descripción; una lista de saltos permite moverse entre secciones. El formulario se deriva en tiempo de ejecución del propio manifiesto empaquetado de la extensión —tipos, valores predeterminados, límites, enumeraciones y cada palabra del texto—, así que nada sobre una opción está escrito dos veces y el panel no puede desviarse de la extensión que edita.
- Las descripciones siguen el idioma que fijó. VS Code resuelve la localización de un manifiesto a partir del idioma de presentación del editor al cargar la extensión, y no ofrece forma de anularlo por extensión, de modo que poner
fuciniCoverage.language en alemán dentro de un editor en inglés traducía todo salvo la configuración. Como el panel lee y resuelve esos archivos por su cuenta, es el único sitio que puede respetar esa elección.
- Los controles que un esquema JSON no puede pedir. Nada en un esquema de configuración marca una cadena como ruta, así que la interfaz nativa no puede ofrecer un selector; las tres opciones que contienen un directorio tienen ahora un botón Examinar….
coverageFile.paths y pathRemap obtienen editores de lista reales en lugar de un cuadro JSON en bruto, y cada color de colorScale una muestra junto a su valor hexadecimal.
Cambiado
- Guardar escribe lo que usted cambió, y nada más. Con trece opciones apenas importaba que Guardar escribiera las trece; con cincuenta y cinco supondría que una sola edición estampara todo el espacio de nombres en un
settings.json que tenía dos líneas. Solo se escriben las opciones cuyo valor cambió realmente, y un valor igual al predeterminado borra la anulación en lugar de repetir lo que la extensión ya trae.
- Su clave de licencia va siempre a su configuración de usuario, y la fila lo dice.
license.key está declarada con ámbito de aplicación, lo que significa que VS Code solo la lee de allí: escribirla en un área de trabajo es un guardado que parece funcionar y no cambia nada. Restablecer ahora borra las cincuenta y cinco claves del ámbito elegido en lugar de trece, así que pregunta antes. Y una edición hecha fuera del panel ya no le cuesta su posición: la página compara antes de repintar, de modo que Guardar ya no devuelve cincuenta y cinco filas al principio.
0.2025.28 · compilación 3 — Trece filas, una decisión
2024-10-12
Añadido
- El modo de cumplimiento, los siete criterios de umbral y los seis pesos de la puntuación compuesta tienen ahora un único editor. En la interfaz de configuración son trece filas sin relación entre sí, y en la práctica una sola decisión: un umbral no hace nada mientras el modo vigente no lo consulte, y un peso no hace nada mientras no sea el criterio ponderado el que decide. Fucini Coverage: Configure Coverage Compliance & Thresholds..., en el botón de engranaje de la barra de título de la vista Coverage, reúne los tres, explica cada modo allí donde se elige el modo, y nombra las formas de dejar un criterio configurado sin que compruebe nada — un modo estricto sin ningún umbral por métrica, un modo ponderado cuyo umbral es
0, pesos que son todos 0 — como advertencias, mientras las está mirando.
- Muestra el veredicto por adelantado y escribe a través de VS Code. El COMPLIANT / NON-COMPLIANT que produciría el formulario sin guardar frente a la ejecución cargada lo calcula el propio motor de cumplimiento de la extensión, y no una segunda copia de las reglas: una vista previa que puede contradecir al criterio es peor que ninguna vista previa. Los cambios pasan por la API de configuración habitual hacia
settings.json — de usuario o del área de trabajo, usted elige —, de modo que VS Code da formato al archivo y conserva sus comentarios; una edición hecha a mano o en otra ventana vuelve al formulario abierto, haya o no una ejecución cargada. No hace falta licencia: Community obtiene el mismo editor que Pro.
Corregido
- El botón de la notificación de actualización decía
Download && Install. El ampersand duplicado es el escape de los mnemónicos, correcto en los títulos de package.json y en los diálogos modales — pero los botones de acción de una notificación toman su etiqueta como texto plano, así que ambos caracteres se imprimían exactamente como estaban escritos, en los 17 idiomas, para todo el que recibía la oferta de actualizar.
0.2025.27 · compilación 7 — Un intercambio que eliges
2024-09-30
Cambiado
- La telemetría está desactivada de forma predeterminada. Se distribuía activada, con el razonamiento de que la evaluación necesitaba esos datos. Ese razonamiento dejó de valer en cuanto el nivel Community convirtió activar la telemetría en lo que desbloquea gratis todas las funciones Pro: un intercambio solo significa algo si lo hace la persona, y un intercambio que nadie eligió no es un intercambio. No se envía nada hasta que lo actives, y Community sigue funcionando igualmente con su conjunto estándar de funciones.
- El ajuste de telemetría dice para qué sirve y enlaza el resto. Su descripción enumeraba antes cada campo que lleva un ping, lo que suponía dos copias de esa lista —una en el ajuste, otra en la política de privacidad— que debían permanecer idénticas para siempre y no lo estaban. Ahora dice qué obtienes al activarlo y enlaza a la política de privacidad para la lista de campos, de modo que hay una sola lista que mantener veraz en vez de dos.
- Instalar esta versión reabre tu periodo de evaluación, una vez. Quien ya hubiera agotado su prueba recibe 14 días nuevos, porque esta versión cambia las condiciones bajo las que evaluó: una prueba transcurrida con la telemetría activada por defecto no era una prueba del producto que ahora se ofrece. Está ligado deliberadamente a un token de un solo uso y no a la versión: reiniciarlo en cada versión significaría que la prueba nunca termina para quien se mantiene al día, lo que no es una prueba sino una licencia sin precio con pasos adicionales. El token se consume en la primera activación y vuelven a regir las reglas ordinarias. Una licencia de pago no se ve afectada, ya que la verificación de la clave retorna antes de consultar siquiera la prueba, y Community tampoco, porque esa edición no tiene prueba que reabrir.
- Una clave de licencia ya no cuesta un cuestionario. Los avisos de activación, el ajuste de clave de licencia y el diálogo de fin de prueba presentaban la clave como algo emitido a cambio de responder preguntas. No lo es: la clave se emite automáticamente a petición, y el cuestionario de opinión es voluntario y completamente independiente.
Corregido
- Tres lugares seguían prometiendo una prueba «hasta el 2026-12-31». Nunca ha existido tal fecha en el producto: la prueba dura 14 días, contados por instalación desde el primer uso. Dos versiones anteriores detectaron esta afirmación en las descripciones de ajustes y en el README; sobrevivió en el aviso de evaluación de esta misma página, en la Guía del usuario y en el README de las herramientas de licencia. La Guía del usuario era la peor de las tres: decía que la ventana se aplicaba «para cada instalación, en todo el mundo, a la vez (no una cuenta atrás por instalación)», justo al revés, y afirmaba que el renderizado de cobertura se pausa al terminar la prueba cuando en realidad la extensión pasa al nivel gratuito Community.
- Los correos de notificación de telemetría se enviaban desde el dominio equivocado. La cabecera
From: era un buzón en fucini.consulting mientras que el servidor que los envía es fucini.software: precisamente la alineación de la que advierte el propio comentario del ajuste, y una forma segura de que el correo acabe filtrado como spam o directamente rechazado.
0.2025.26 · compilación 2 — En gris, no ausente
2024-08-27
Cambiado
- Un archivo que el informe nombra pero que no está en el disco se muestra donde le corresponde, en gris, y explica por qué. 0.2025.25 dejó de inventar ubicaciones para esos archivos, lo cual era correcto, pero les dejaba una ruta relativa que no es una ubicación en absoluto — así que el árbol seguía haciendo un proyecto con su primer segmento, y las tres fuentes borradas de un submódulo quedaban en un
app fantasma junto al submódulo del que venían. La discrepancia se veía, que era la intención, pero se veía en el lugar equivocado y no decía nada sobre qué fallaba.
- Ahora aparece en el proyecto desde el que se midió, en la carpeta en que lo pone el informe — dibujado en el gris medio del tema y en cursiva en lugar del color de primer plano habitual. Al pasar por encima muestra la ruta que habría tenido y explica que allí no hay nada — con toda probabilidad renombrado o borrado después de generar el informe — y que sus números se siguen contando. No se descarta nada ni se mueve ningún total: la fila es lo que el informe dice de sí mismo, y el gris es lo que impide que se lea como una fila que abre.
- La suposición se queda dentro de la vista. La ruta registrada del archivo sigue siendo exactamente la que decía el informe, porque todo lo demás se indexa por ella — el enriquecimiento del informe externo la compara, la telemetría la relativiza, la vista anotada la abre — y darles una ubicación supuesta cambiaría algo conocido por algo inventado. Solo el árbol junta ambas cosas, y solo para una ruta que no nombra ubicación propia: una ruta absoluta que sencillamente no existe conserva lo que decía el informe y se muestra en gris donde está.
0.2025.25 · compilación 4 — Dónde se midió
2024-08-07
Corregido
- La cobertura de un submódulo aterriza donde el submódulo está de verdad, y sus filas abren. Un submódulo de git construye su propio informe junto a su propio árbol, y gcovr escribe allí
<source>.</source> — «el directorio en el que está este archivo» — con nombres como app/Application.cpp debajo. Nada anclaba ese . a ninguna parte: las rutas se resolvían una sola vez, después de la fusión, cuando la ejecución ya no sabía de qué entrada venía cada archivo, así que la única base que quedaba era la raíz del espacio de trabajo. Probar <workspace>/app/Application.cpp no encontraba nada, cada ruta seguía siendo relativa, y la vista de cobertura las dibujaba como un proyecto llamado app — por el primer segmento de una ruta que nunca fue una ubicación — cuyas filas copiaban y abrían donde no había ningún archivo.
- Las rutas se resuelven ahora por archivo de traza, antes de la fusión. Un
sourceRoot relativo se ancla al directorio donde está su archivo de traza, así que . junto al coverage.xml de un submódulo significa ese submódulo. Si eso no encuentra las fuentes, la búsqueda sube hacia arriba desde el archivo de traza — la disposición habitual de CMake escribe la cobertura varios niveles dentro de build/, y cuál de las dos formas usa un proyecto no consta en el informe, así que responde el sistema de archivos y no la configuración. La subida se detiene en la raíz del espacio de trabajo: pasar de ahí dejaría que un simple src/main.c se resolviera en una copia vecina con la misma disposición, una respuesta equivocada con aspecto de correcta. Una ruta ya absoluta y presente se deja igual, así que las ejecuciones lcov normales no cambian.
- Un submódulo sigue siendo su propio proyecto en la vista de cobertura. Los archivos que ahora se resuelven dentro del espacio de trabajo se habrían fundido en su árbol — las carpetas del submódulo entrelazadas con las del padre y sus números sumados al total del padre como si una sola base de código se hubiera medido dos veces. Cada archivo registra la raíz desde la que se midió y la vista agrupa por ella, así que un submódulo conserva su propio encabezado y sus propios totales aunque esté dentro de la carpeta abierta. Una ejecución con rutas ya absolutas no tiene tal raíz y se agrupa exactamente como antes.
- Un archivo que el informe nombra pero que ya no está se sigue notificando como ausente. No se le da una ruta plausible en la que no está: un informe que nombra archivos ya borrados es un informe obsoleto, y dibujarlos en ubicaciones inventadas lo ocultaría. Cada uno se nombra en el canal de salida bajo
FUCINI_REMAP_001, con la ruta que habría tenido.
0.2025.24 · compilación 3 — Por qué desapareció su puesto
2024-07-27
Cambiado
- Un puesto que desaparece ahora dice por qué. Cada revocación mostraba la misma línea — su puesto en este plan ya no está activo — y eso se lee como un reproche dirigido a la persona equivocada. Una suscripción de equipo reducida por debajo de los puestos en uso ahora libera el excedente tras un período de gracia, y quien pierde un puesto no hizo nada salvo ser quien llevaba más tiempo sin usarlo. Donde el servidor de licencias tiene algo útil que decir, la extensión lo dice: un puesto liberado para encajar en una suscripción reducida lo explica exactamente y señala a quien la gestiona, con Solicitar clave nueva todavía disponible — porque el camino de vuelta es real: el grupo tiene sitio en cuanto esa persona libere un puesto.
- Una suscripción finalizada no ofrece ningún botón. De una suscripción caducada no puede emitirse una clave nueva, así que la única acción de esa notificación solo podía fallar — y eso se lee como una extensión rota en lugar de como una suscripción terminada. Ahora dice qué ha pasado y se detiene ahí. Cualquier motivo que esta versión no reconozca conserva la redacción general: el servidor de licencias se despliega de forma continua y una extensión instalada no, de modo que encontrar un motivo desconocido es el caso ordinario y no el límite — nunca muestra un identificador en bruto y nunca se queda callada. Ambos mensajes nuevos están traducidos a los diecisiete idiomas.
0.2025.23 · compilación 5 — Fuera de la extensión
2024-07-17
Añadido
- La ejecución ya puede salir, en seis formatos más. Hasta ahora solo había dos salidas: Fucini JSON, que no lee nada salvo la extensión, y un informe HTML, que no lee nada de forma mecánica. Export Coverage Report... abre un selector de formato y escribe la ejecución activa como CSV por archivo (cubierto/total/porcentaje de líneas, ramas, funciones, MC/DC, regiones e instanciaciones, los peores primero, con una fila
TOTAL), como CSV por función (número de ejecuciones, si se ejecutó, ramas sin cubrir dentro de ella, pares MC/DC), como resumen en Markdown para pegar en una pull request, como archivo LCOV, XML de Cobertura, SARIF, o como insignia SVG autónoma para un README. Está en la paleta de comandos, en la barra de título de la vista Covered Files junto a Generate Full HTML Report, y en el menú rápido de la barra de estado en cuanto quickActions.exportReport está activo.
- Ahora es un conversor, no solo un visor. La extensión ya lee lcov, llvm-cov JSON, Cobertura, JaCoCo, Istanbul/nyc y SimpleCov; con los escritores de LCOV y Cobertura también puede ir en sentido contrario. Cargue un informe de JaCoCo, o varios informes fusionados en una sola ejecución, y emita el único archivo de traza que aceptan genhtml, Codecov, Coveralls y SonarQube — o el XML que Jenkins, GitLab y Azure DevOps ingieren de forma nativa. Ambos vuelven a pasar por los propios analizadores de la extensión, y los rangos de líneas se expanden línea a línea para que los
LF/LH escritos coincidan con el porcentaje en pantalla en vez de aproximarlo.
- Cada escritor dice qué descarta. Todos salvo los CSV pierden información, y en silencio: MC/DC, regiones de código e instanciaciones de C++ no tienen representación en LCOV, Cobertura ni SARIF, y Cobertura registra cuántas condiciones de una línea se cubrieron, no cuál. Fucini JSON y los dos CSV siguen siendo los formatos que llevan todo lo medido. En los CSV, una métrica que la ejecución no tiene deja sus celdas vacías en lugar de a cero — una celda vacía dice «esta herramienta no informó datos de ramas», un
0 diría «no se alcanzó ninguna rama», y después una hoja de cálculo ya no puede distinguirlos. Todo lo que una hoja de cálculo ejecutaría como fórmula — un campo que empieza por =, +, - o @, es decir cualquier ruta con ámbito npm — se entrecomilla y se desactiva antes de escribirlo.
- SARIF anota el diff; la insignia no necesita red. Los rangos sin cubrir se informan en el nivel
note, no warning: el código sin cubrir informa sobre la suite de pruebas, y el análisis de código trata una advertencia como algo que debería bloquear — la puerta que bloquea sigue siendo Check Coverage Thresholds. La insignia se dibuja aquí en lugar de pedirse a shields.io, así que funciona en un repositorio aislado o local, y toma su color de la misma colorScale que los márgenes y la barra de estado. En la edición Community gratuita el selector se abre y ambos CSV funcionan, con un tope de 20 exportaciones al día como Export Fucini JSON; los formatos de intercambio son de pago, en la misma línea que esta edición siempre ha trazado: leer tus propios números es gratis, alimentar una tubería de CI no.
0.2025.22 · compilación 3 — Nada que medir
2024-06-24
Corregido
- Un archivo sin nada que instrumentar ya no se informa como cubierto al 100 %. Una cabecera de solo declaraciones —prototipos, una macro, guardas de inclusión— no tiene cuerpos de función, así que el compilador no emite datos de cobertura para ella, y todo lo que divide cero entre cero responde 100 %. Aparecía en verde en el árbol, junto a código realmente probado. Ambos lectores toman ahora los totales de la propia herramienta como la versión que el archivo da de sí mismo —
LF/FNF/BRF en lcov, el bloque summary en el JSON de llvm-cov— y un archivo cuyos totales son todos cero queda fuera de la ejecución en lugar de puntuarse. Los registros línea a línea que hay debajo de esos totales se ignoran a propósito: la expansión de una macro se atribuye a la línea que la define, mientras que el recuento pertenece a la línea que la usa, en otro archivo, y esa línea prestada era la única razón por la que una cabecera así parecía medida. Los totales de la ejecución también la pierden, de modo que la cifra principal baja un poco y resulta mucho más veraz. Cada ruta descartada se nombra en el canal de salida, y un informe en el que todos los archivos son de solo declaraciones los conserva todos.
Cambiado
- Elegir un archivo de cobertura se suma a lo ya cargado en lugar de reemplazarlo. Una compilación que escribe un informe por módulo no tiene un único archivo que fijar, y elegir el informe del segundo módulo descargaba en silencio el primero. El diálogo admite ahora varios archivos a la vez, cada elección se añade al conjunto y todo lo elegido se fusiona en una sola ejecución, dibujada en el panel bajo el nombre propio de cada proyecto. La vigilancia los sigue a todos, y regenerar un informe ya no quita los demás de la pantalla. Show Loaded Coverage Files termina con Descargar los archivos seleccionados, que vuelve a la búsqueda habitual.
- El soporte tiene una dirección en el dominio del propio producto:
support@fucini.software. Cuando la activación no puede completarse sola, el panel de licencia y el mensaje del código de solicitud daban una dirección fucini.consulting: un dominio distinto del de todos los demás enlaces de la extensión, que se lee como otra empresa. license@fucini.software no cambia: envía claves, no es un buzón al que escribir.
0.2025.21 — ¿De quién es este src?
2024-06-21
Añadido
- Cada árbol de la vista Coverage dice ahora a qué proyecto pertenece. La 0.2025.19 daba a una ejecución fusionada un bloque con nombre por proyecto, pero una ejecución normal seguía dibujando un árbol pelado —así que un espacio de trabajo recortado a su propia carpeta abría en
src sin que nada encima dijera qué src—. Cada árbol lleva ahora su raíz: las carpetas que llevan hasta el proyecto en el color atenuado y, tras ellas, la carpeta propia del proyecto a todo color. Un árbol recortado a la carpeta del espacio de trabajo sigue diciendo hasta dónde se recortó, y dos bases de código fusionadas en una sola ejecución nunca se leen como un único árbol. Es un encabezado, no una fila: ahí no hay nada que expandir, y las carpetas de debajo se pliegan exactamente igual que antes. En un panel estrecho se acortan primero los directorios iniciales, de modo que la carpeta que de verdad nombra el proyecto es lo último en desaparecer, y al pasar el cursor se ve la ruta completa.
0.2025.20 · compilación 7 — El menú que esperabas
2024-06-08
Añadido
- Las filas de la vista Coverage tienen el menú contextual del propio Explorador. Hacer clic derecho en un archivo o una carpeta abría antes el Cortar/Copiar/Pegar de la webview: tres entradas sin nada sobre lo que actuar. Ahora abre el menú real de VS Code: Abrir, Open to the Side, Abrir con…, Reveal in Explorer View, Reveal in File Explorer, Open in Integrated Terminal, Buscar en la carpeta… para carpetas y Copy Path / Copy Relative Path, con las variantes de barras diagonales al lado en Windows, donde ambas formas difieren. El botón
⋯ y su menú no cambian y son la última entrada del nuevo.
Cambiado
- Una métrica sin datos en tu archivo de cobertura ya no se juzga. Un umbral de MC/DC sin MC/DC en la compilación contaba como fallo, de modo que un archivo con 100 % en cada métrica realmente medida quedaba bajo una tarjeta que decía «3 de 5 cumplidos», frente a un listón que nada de ese archivo podría superar jamás. Las métricas sin datos ahora se omiten allí donde se forma un veredicto: la barra de estado por archivo, la tarjeta de toda la ejecución, el banner del código anotado y el informe HTML. Check Coverage Thresholds sigue nombrando explícitamente una métrica ausente, que es donde corresponde.
- Los archivos sin nada medible quedan fuera de la vista Coverage. Una cabecera de declaraciones, un archivo de solo reexportaciones, un módulo únicamente de tipos: ninguna prueba que escribas cambiará su número, y al abrirlos no se muestra métrica alguna. En 0.2025.19 llevaban un guion; ahora sencillamente no aparecen, y las carpetas que quedan vacías se van con ellos. Una ejecución en la que nada es medible sigue listándolo todo.
Corregido
- Una letra de unidad todavía podía encabezar el árbol. Con cobertura cuyas rutas no están bajo la carpeta de trabajo abierta —un archivo combinado de otro proyecto, o una ventana sin carpeta abierta— el árbol empezaba en
W:, o en Linux y macOS en una fila sin nombre alguno: una fila con exactamente un hijo, desplegable para nada. La raíz del sistema de archivos ya no se dibuja nunca, sean cuales sean las rutas, y cada fila conserva su ruta absoluta real para el menú y el editor.
0.2025.19 · compilación 6 — Rutas, no preámbulo
2024-05-16
Añadido
- Un menú de fila en cada archivo y carpeta de la vista Coverage. El botón al final de la fila copia esa ruta en cualquiera de las cuatro formas que puede pedir un editor, un intérprete de comandos o un prompt — absoluta o relativa al espacio de trabajo, con los separadores del sistema o con barras inclinadas — y ofrece Reveal in File Explorer y Open in Integrated Terminal, abriendo el terminal en el directorio del propio archivo. Las entradas con barras inclinadas solo aparecen donde difieren de la forma nativa, así que en Linux y macOS el menú tiene dos elementos menos. Copiar una ruta antes obligaba a buscar el mismo archivo por segunda vez en el Explorador.
- Botones para contraer y expandir todo encima del árbol. Contraerlo todo y abrir después la única carpeta que le interesa es la vía más rápida por un árbol grande, y hasta ahora costaba un clic por carpeta. Lo que contraiga así se recuerda igual que una carpeta cerrada a mano, de modo que una recarga no lo deshace.
- Una ejecución combinada que abarca varios proyectos dibuja ahora cada proyecto por separado, bajo su propio nombre. Combinar un archivo de traza de una segunda base de código colgaba sus carpetas del mismo árbol que las del espacio de trabajo, de modo que
src aparecía dos veces sin explicar por qué y los directorios de ambos proyectos se entremezclaban alfabéticamente. Cada proyecto recibe ahora su propio bloque con nombre, separado por una línea, y el del espacio de trabajo va primero. Una ejecución que abarca un solo proyecto no cambia y no lleva encabezado: no habría nada de lo que distinguirla.
Corregido
- Un archivo sin nada ejecutable se informaba como 0% cubierto. Un módulo que solo contiene reexportaciones
export *, o únicamente declaraciones de tipos, compila a algo que ninguna herramienta de cobertura puede medir, de modo que el archivo de traza no registra ninguna sentencia para él. La vista Coverage lo puntuaba con un 0% y lo colocaba en rojo junto a código que sí está sin probar, cuando no hay nada para lo que escribir una prueba; el Explorador, en cambio, le ponía al mismo archivo un 100% verde, porque un total vacío se lee como «todo de nada está cubierto». Ninguna de las dos cifras era cierta y ninguna se muestra ya: la fila del panel recibe un guion y un contorno discontinuo, con una descripción emergente que explica por qué, y la insignia del Explorador se omite. Una carpeta que solo contenga archivos así tampoco se puntúa. Un archivo con el 0% de algo que sí se midió sigue mostrando 0%: el guion significa «nada que medir», no «medido y fallado». - Las filas de un proyecto combinado apuntaban al lugar equivocado. Sus rutas se construían desde la raíz del espacio de trabajo en lugar de la suya propia, de modo que para un archivo fuera del espacio de trabajo el menú de fila copiaba —y «Reveal in File Explorer» abría— una ruta en la que el archivo nunca estuvo. Ahora llevan la raíz de la que realmente proceden.
Cambiado
- La vista Coverage ya no dibuja la raíz del espacio de trabajo. El árbol empezaba en la raíz del sistema de archivos y bajaba por cada carpeta situada por encima del proyecto —la unidad, luego el directorio que contiene sus proyectos, luego el proyecto en sí— antes de llegar a la primera carpeta que era realmente suya. Eran varios niveles de sangría, en cada fila, repitiendo lo que el título de la ventana ya decía. Las rutas ahora empiezan en la carpeta del espacio de trabajo. La ruta absoluta completa sigue siendo lo que copia el menú de fila y lo que abre el editor.
0.2025.18 · compilación 4 — Se queda donde lo dejaste
2024-04-30
Corregido
- Las carpetas que había contraído en la vista Coverage se volvían a abrir en cada recarga. La vigilancia está activada de forma predeterminada, así que una compilación que regenera la cobertura vuelve a dibujar el panel, y como cada carpeta se dibujaba abierta, contraer una solo duraba hasta la siguiente compilación. En un árbol grande eso suponía repetir el mismo trabajo varias veces por hora. El panel recuerda ahora qué carpetas ha cerrado y las deja cerradas. Un directorio que aparece por primera vez en una ejecución posterior sigue mostrándose abierto, como cualquier otro: lo que se recuerda es el acto deliberado de cerrar una carpeta, no el estado predeterminado.
- Desactivar la telemetría no detenía el aviso de desinstalación. Ese aviso lo envía un pequeño script independiente que VS Code ejecuta al desinstalar. No tiene acceso a la API de VS Code ni puede leer sus ajustes, de modo que lo único que le indica que no envíe nada es la ausencia de un archivo que la extensión escribe mientras la telemetría está activada, y ese archivo nunca se eliminaba al desactivar la telemetría. Quien la hubiera tenido activada y luego la desactivara habría enviado igualmente, al desinstalar, su nombre de usuario del sistema operativo, el nombre del equipo y su directorio personal. El archivo se elimina ahora en cuanto se desactiva la telemetría.
- Una renovación de Pro podía indicar éxito para una clave que acababa de sustituir. La renovación silenciosa leía la clave configurada dos veces: una para decidir si renovar y otra después para decidir si mostrar algún mensaje. Pegar una clave nueva mientras una renovación estaba en curso hacía que la segunda lectura viera una clave distinta, y el mensaje «su suscripción Pro se ha renovado» describía la que se había sustituido. Ahora la clave se lee una sola vez.
Cambiado
- Cada módulo de la extensión está ahora cubierto por sus propias pruebas. Para una herramienta cuyo único trabajo es decirle hasta dónde llegan realmente sus pruebas, merecía la pena hacerlo bien: 53 de los 54 archivos fuente están al 100% en sentencias, ramas, funciones y líneas, y el restante —la capa de conexión con VS Code— al 95% de sus funciones. Escribirlas sacó a la luz los fallos anteriores, además de una veintena de comprobaciones que nunca podían ejecutarse: alternativas situadas detrás de verificaciones que ya las habían descartado, que parecían redes de seguridad pero no atrapaban nada. Se han eliminado en lugar de disimularlas con una prueba que no podía fallar.
0.2025.17 — Preguntado en un momento que merece respuesta
2024-04-27
Cambiado
- La encuesta opcional ahora espera a que hayas usado realmente la extensión y pregunta en un mejor momento. Contaba días naturales desde la instalación, lo que medía cuánto hacía que la habías instalado y no si alguna vez la habías visto funcionar: una instalación sin tocar durante un mes recibía la petición de valorar un producto que nunca le había mostrado nada. Ahora hacen falta cargas de cobertura reales además del tiempo transcurrido, y ya no aparece mientras arranca el editor: espera a que una carga se complete. Al cabo de un año llega una tercera y última invitación, porque dos dentro de un mismo trimestre descartaban para siempre a quien simplemente estuviera ocupado entonces.
- La traducción al neerlandés ha dejado de ser formal. Trataba de «u» en todo momento, lo que suena rígido para una herramienta de desarrollo y no encajaba con el resto de la voz del producto. Todos los textos en neerlandés usan ahora «je», reescritos frase a frase, porque el cambio arrastra consigo las formas verbales.
0.2025.16 — Un código, no una empresa
2024-04-23
Cambiado
- El formulario de activación pedía un «company code» a desarrolladores independientes. Comprar Pro o Pro Plus como una sola persona te da un código de tu propia suscripción: no hay ninguna empresa detrás, y que te pidan una sugiere que te has equivocado de formulario. Ese campo ahora se llama Subscription code para Pro y Pro Plus, y sigue siendo Company code para Business y Enterprise, donde un equipo sí comparte uno. Las indicaciones de debajo ya estaban escritas por plan; solo la etiqueta había quedado genérica.
0.2025.15 · compilación 3 — Medido según lo que pediste
2024-03-25
Corregido
- El informe HTML generado juzgaba tu código contra el 100 %, fueran cuales fueran tus umbrales. La columna Estado comparaba cada métrica con un 100 oculto, así que un proyecto que ponía sus límites en 80 y los cumplía veía un banner verde COMPLIANT justo encima de una columna de cruces rojas, para la misma ejecución y en la misma página. La leyenda de métricas hacía lo mismo. Ambas usan ahora tus umbrales configurados y, donde no se aplica ninguno, muestran un guion apagado en lugar de inventar un veredicto.
- El banner de conformidad afirmaba más de lo que había comprobado. Siempre decía «todos los umbrales configurados cumplidos», incluso en el modo predeterminado, que solo evalúa la puntuación ponderada: una ejecución podía afirmar que se cumplían todos los umbrales mientras uno fallaba a la vista en la tabla de abajo. Ahora cada modo indica qué regla aplicó realmente.
- El README decía que la extensión «funciona gratis hasta el 2026-12-31». Esa fecha no existe en el producto. Una versión anterior corrigió esa afirmación en las descripciones de ajustes pero se dejó el README, lo primero que se lee en el Marketplace. Ahora dice lo que ocurre de verdad: 14 días de prueba desde el primer uso y después el nivel Community gratuito, sin ninguna fecha tras la cual algo deje de funcionar.
0.2025.14 — Distinguirlas
2024-03-15
Cambiado
- Las dos ediciones ya no se ven idénticas en el Marketplace. Pro y Community se compilan desde un mismo árbol de código y hasta ahora eso incluía el icono, así que las dos fichas eran la misma imagen con distinto pie, una al lado de la otra en los mismos resultados de búsqueda. Ahora cada edición lleva el suyo: la misma ilustración con una banda de color en la parte inferior, turquesa para Pro y pizarra para Community. La palabra es lo que las distingue cuando el icono se muestra grande; en una fila de resultados la palabra es demasiado pequeña para leerse, así que lo hace el color.
0.2025.13 — Accesible desde donde estás
2024-02-26
Corregido
- Abrir la vista anotada ya no impide volver a abrirla. El panel de código anotado es una webview y no un editor de texto, así que mientras tenía el foco la extensión no veía ningún «archivo actual», y ejecutar Open Annotated Source desde ahí respondía «abre primero un archivo con cobertura cargada» a alguien que estaba mirando justamente la vista anotada de un archivo con cobertura. Ahora recurre al archivo que hay detrás del panel que tienes delante. Ese mismo bloqueo también se saltaba en silencio la recomprobación para la que existe una segunda ejecución: cuando hay configurado un informe HTML de llvm-cov, es esa segunda ejecución la que cambia el panel a la página de ese informe — de modo que si tu compilación de cobertura terminaba después de abrir el panel, no había forma de recogerla desde el propio panel.
0.2025.12 · compilación 2 — Decir lo que es cierto
2024-02-15
Añadido
- Una suscripción Pro de pago ahora se renueva sola. Cada clave de activación dura exactamente el periodo pagado. Los planes de equipo recogen el periodo renovado en su siguiente comprobación, pero Pro individual nunca se comunica con el servidor — funciona totalmente sin conexión —, así que nada le llevaba la renovación, y la clave de un suscriptor mensual habría caducado más o menos cada mes por muy puntualmente que pagara. La extensión pide ahora una clave nueva en silencio, solo en los días próximos a su propia caducidad y solo cuando tiene el código que demuestra que una suscripción la pagó. Estar sin conexión durante esa ventana no cuesta nada: la clave sigue funcionando hasta que caduca de verdad, y el siguiente intento la restaura.
- Activar desde el correo de compra es un clic. El enlace entrega a la extensión tu plan y tu código directamente, en lugar de abrir VS Code, buscar el comando y pegar el código a mano. Siempre pide confirmación antes de usar un puesto. Introducir el código a mano sigue funcionando igual que antes — el enlace es un atajo, nunca la única vía — y también funciona en la versión Community.
Corregido
- La descripción de un ajuste afirmaba que la extensión es "gratuita hasta el 2026-12-31". Esa fecha no existe en ninguna parte del producto. Lo que ocurre de verdad es una prueba de 14 días contados desde el primer uso, tras la cual la extensión vuelve al nivel gratuito Community. Eso es lo que dice ahora, en todos los idiomas.
- Los ajustes de umbral ya no citan la versión que cambió sus valores predeterminados: un número de versión en mitad de una frase responde a una pregunta que nadie se hace al leer la descripción de un ajuste.
- Varias descripciones traducidas nombraban un comando que ningún VS Code traducido muestra. Se referían al comando de activación por su nombre en inglés, así que quien no trabaja en inglés acababa buscando en la paleta de comandos un texto que no está allí.
0.2025.11 · compilación 3 — Contar lo que cuenta
2023-12-26
Corregido
- Un proyecto sin decisiones MC/DC podía mostrar un 0 % de cobertura total. Algunas herramientas informan de una sección MC/DC aunque no haya nada que medir en ella, y eso se interpretaba como «0 % cubierto» en lugar de «nada que cubrir». Como la puntuación global cae a cero en cuanto una métrica vale cero, un proyecto totalmente cubierto podía mostrar un 0 %. Una métrica sin nada que medir ya no entra en la puntuación, y su fila desaparece en lugar de aparecer como «0 / 0 condiciones cubiertas».
- El estado de la licencia ya está traducido a los 17 idiomas. Seguía en inglés en todas partes y, como aparece dentro de frases que sí estaban traducidas, el resultado era una línea a medio traducir en la barra de estado, en las notificaciones y en el panel de archivos cubiertos.
- La vista Código anotado y la información de cobertura al pasar el ratón también están traducidas: la tabla de desglose de conformidad, los botones de navegación y sus descripciones emergentes, y el detalle de ramas y MC/DC.
Cambiado
- Una suscripción Pro de pago ya se puede activar con su propio código. La lista de planes de la solicitud de clave incorpora una entrada Pro, de modo que el código que acompaña a una suscripción Pro por fin tiene dónde introducirse. Las claves Pro individuales siguen funcionando totalmente sin conexión y nunca contactan con el servidor tras la activación.
- El icono de la barra de actividad es más grande y se ve mejor junto a los iconos integrados.
- Cambiar a la edición Community ahora la instala desde fucini.software. Antes se intentaba desde Marketplace, donde la edición Community no está publicada, por lo que el cambio podía dejarle sin ninguna extensión instalada.
0.2025.10 · compilación 5 — Un aterrizaje más suave
2023-12-08
Cambiado
- Una suscripción caducada ahora se asienta en el nivel gratuito — cuando una clave de activación individual se agotaba, la extensión le seguía pidiendo indefinidamente que la renovara. Optar por no renovar es un final normal de una suscripción, no un fallo, así que ahora pasa al nivel Community gratuito y permanente. Los planes de equipo quedan deliberadamente al margen: una clave Pro Plus, Business o Enterprise caducada sigue notificándose como caducada, porque ahí quien debe renovarla es un administrador, y hacer caer en silencio a toda la empresa al nivel gratuito lo ocultaría.
Corregido
- Desactivar la telemetría ahora se respeta en todos los casos. Una ruta de código podía omitir la comprobación cuando el modo interno de diagnóstico detallado de la extensión estaba activado. Ese modo está desactivado en todas las compilaciones publicadas, de modo que ninguna versión se comportó nunca así, pero la comprobación ahora es incondicional.
- La configuración se aplica de inmediato en lugar de esperar a una recarga. Editar el remapeo de rutas, la exclusión de comentarios, el filtrado por git-diff o los totales de archivos excluidos ahora recarga la cobertura al instante — el remapeo de rutas en especial, ya que es justamente el ajuste al que se recurre porque las rutas no coinciden.
- «Unlock Full Features» y «Switch to Community» podían detenerse a medias sin avisar. Ambas ahora se ejecutan hasta el final.
- Su clave de activación permanece vinculada a la misma identidad de máquina. Antes, en algunas configuraciones, esa identidad podía regenerarse entre sesiones, lo que invalidaba una clave ya emitida.
0.2025.9 — Traducciones completas
2023-12-02
Añadido
- Traducciones completas en los 17 idiomas incluidos — alrededor de un centenar de los textos de interfaz más recientes, entre ellos los diálogos de activación y licencia, la encuesta de opinión opcional, el flujo de desbloqueo de Community y las notificaciones de actualización automática, seguían recurriendo al inglés en todos los paquetes no ingleses. Los 17 idiomas cubren ahora toda la interfaz en tiempo de ejecución de la extensión.
Cambiado
- Revisión de mantenimiento de los comentarios del código fuente, la documentación de los scripts de compilación y la lista de archivos del empaquetado. El conjunto de archivos incluidos en la extensión no cambia; no hay cambios funcionales ni de comportamiento.
0.2025.8 — Las ediciones ya no pueden entrar en conflicto
2023-11-20
Corregido
- Instalar a la vez las ediciones Pro y Community podía provocar que una de ellas fallara al iniciarse — ambas registran los mismos comandos y la misma vista de archivos de cobertura. Ahora se detecta de antemano: si la otra edición también está instalada, la activación se detiene limpiamente con un mensaje que le indica que desinstale una, en lugar de un fallo de activación sin explicación.
0.2025.7 — Tareas de mantenimiento
2023-10-30
Versión de mantenimiento; sin cambios funcionales.
0.2024.6 — Nivel Community y planes de equipo
2023-10-17
Un nivel gratuito permanente, planes de equipo que comparten un grupo de puestos y una edición Community independiente de la extensión.
Añadido
- Un nivel Community permanente y gratuito — en lugar de una parada en seco al terminar la prueba de 14 días, la extensión pasa ahora a Community: todas las funciones salvo MC/DC, una muestra mensual limitada del Full HTML Report y de las vistas Annotated Source persistentes, límites diarios generosos en un puñado de acciones automatizables, y todo lo demás sin límite.
- Desbloquee todas las funciones gratis — un nuevo comando «Unlock Full Features» intercambia telemetría de uso detallada por una concesión completa y sin restricciones, reversible en cualquier momento. Una encuesta de opinión opcional dentro de la aplicación recompensa en su lugar con una clave de 30 días con todas las funciones, sin compromiso alguno.
- Planes de equipo: Pro Plus, Business y Enterprise — estos comparten un grupo de puestos (un código de empresa más un número de puestos) en lugar de una clave por máquina, con una comprobación en segundo plano que mantiene al día la concesión de un puesto y señala automáticamente un puesto revocado o reducido.
- Fucini Coverage Studio Community — una ficha propia e independiente, construida a partir del mismo código fuente, en la que el código de prueba, activación y planes de equipo de los niveles de pago está realmente ausente y no solo oculto. Consulte la página de descargas.
Cambiado
- La generación del Full HTML Report y las vistas Annotated Source persistentes (simple y en paralelo) son ahora funciones de los niveles de pago en la base de Community — solo queda la vista conmutable en el mismo sitio, limitada mensualmente como antes. El desbloqueo sigue concediéndolo todo.
- Un aviso de límite de uso en el nivel Community ofrece ahora ambas salidas en un único mensaje: ver los planes de pago, o desbloquear mediante telemetría.
Corregido
- La telemetría detallada y potencialmente identificativa (nombre de usuario del sistema operativo, directorio personal, características de CPU/RAM, interfaces de red y el contenido íntegro del informe y del código fuente) ya solo puede enviarse desde Community o desde una concesión gratuita condicionada a la telemetría — nunca desde una licencia de pago Pro/Pro Plus/Business/Enterprise, sea cual sea la configuración local de telemetría.
- Una instalación que ya ejecutaba una compilación anterior deja de recibir un nuevo período de prueba solo por haberse actualizado — ahora pasa correctamente al nivel Community si su prueba anterior ya se había agotado.
- El aviso de actualización, el progreso de la descarga y los mensajes de error muestran ahora la versión sencilla
Major.Year.Minor (igual que la que muestra la vista Extensions de VS Code) en lugar de revelar el número de compilación interno, p. ej. 0.2024.6 en vez de 0.2024.6.2.
0.2024.5 — Claves de licencia ajustadas al detalle
2023-09-03
Las claves de activación ya pueden limitar cada función por separado, y los administradores de licencias pueden emitir a mano una clave ajustada al detalle desde el panel de control.
Añadido
- Límites de uso por función — las claves de activación ya pueden limitar cada función o acción de forma independiente (por ejemplo, las exportaciones de informe HTML a 1 al mes) en lugar de un único límite compartido de cargas de cobertura. Las claves existentes siguen funcionando sin cambios.
- Emisión manual de claves — los administradores de licencias ya pueden emitir a mano una clave para un código de solicitud recibido fuera del cuestionario integrado en el editor, eligiendo exactamente qué funciones conceder, una caducidad y límites por función, con la clave enviada automáticamente por correo electrónico cuando se facilita una dirección.
0.2024.4 — Fiabilidad del canal de actualizaciones
2023-07-24
Corrige un error de caché que podía ocultar las nuevas versiones a los usuarios situados detrás de determinados proxies corporativos.
Corregido
- Fiabilidad del canal de actualización automática — el manifiesto de actualización se sirve ahora con una cabecera no-cache estricta, de modo que un proxy con caché situado entre fucini.software y el lector ya no puede servir una copia obsoleta que oculte las nuevas versiones.
0.2024.3 — Correcciones menores y rendimiento
2023-07-13
Una pequeña versión de mantenimiento: algunas correcciones menores de errores y mejoras de rendimiento.
Corregido
- Corrección de errores — correcciones menores de errores y mejoras de estabilidad.
- Rendimiento — pequeñas mejoras de rendimiento en la carga y renderizado de la cobertura.
0.2024.2 — Activación automatizada
2023-06-20
Las claves de activación ahora se emiten y aplican automáticamente — ya no hay que esperar un correo electrónico.
Versión de evaluación. Cada instalación dispone de una prueba gratuita de 14 días con todo desbloqueado, contados desde el primer uso; después pasa al nivel gratuito Community en lugar de detenerse. Se emite una clave de licencia automáticamente a petición. Más información →
Cambiado
- Activación automatizada — solicitar una clave ahora envía un breve cuestionario y aplica automáticamente la clave recibida a su configuración, sin intercambio de correos.
- Renovaciones más rápidas — una solicitud de renovación solo pregunta sobre uso y deseos; sus datos de contacto de una solicitud anterior se reutilizan, nunca se piden de nuevo.
- Ventana de evaluación fija — la prueba ahora se extiende hasta el 31-12-2026 para todos, reemplazando la cuenta regresiva anterior de 14 días desde la instalación.
- Flujo de activación localizado — el cuestionario de renovación y las confirmaciones de activación ahora están traducidos a los 18 idiomas admitidos, igual que el resto de la extensión.
0.2024.1 · compilación 3 — Comprobación de actualizaciones más inteligente
2023-06-02
La extensión ahora comprueba las actualizaciones tanto en fucini.software como en el VS Code Marketplace, ofreciendo siempre la versión más reciente.
Corregido
- Comprobación de doble fuente — ahora consulta tanto fucini.software como el VS Code Marketplace, y ofrece la versión más reciente.
0.2024.0 — Versión inicial
2023-04-26
Primera versión pública de Fucini Coverage Studio — cobertura nativa para VS Code que ingiere archivos de traza de estándares del sector, los normaliza en un modelo canónico único, combina ejecuciones de forma determinista e informa a través de la API nativa Test Coverage de VS Code.
Añadido
- Ingesta multiformato — LCOV, llvm-cov JSON, Cobertura XML, JaCoCo XML, Istanbul/nyc y SimpleCov JSON, detectados automáticamente.
- Combinación determinista — varios archivos de traza combinados en una sola ejecución con procedencia registrada, estable sin importar el orden de carga.
- UI de cobertura nativa — marcadores de línea/rama/función, regla de resumen y el panel Test Coverage integrado.
- Cobertura MC/DC — desglose por decisión al pasar el cursor y un marcador de margen coloreado opcional.
- Puntuación compuesta — una media armónica ponderada por SIL sobre líneas, ramas, funciones, regiones, MC/DC e instanciaciones C++.
- Veredicto de cumplimiento — control COMPLIANT / NON-COMPLIANT con los modos
strict, whm, both y either.
- Remapeo de rutas, cobertura diferencial, insignias de Explorer y una barra de estado global.
- Análisis en el editor — CodeLens de función, información de ramas al pasar el cursor, avisos de código muerto, avisos de cobertura obsoleta y Next/Previous Uncovered.
- Vista de archivos cubiertos, informes HTML, historial y tendencias, modo de vigilancia y exportación Fucini JSON.