metis-desk/docs/coherencia-filtros-l03-3.md
2026-10-25 01:19:17 +02:00

26 KiB
Raw Blame History

L03.3 — Coherencia, visibilidad y limpieza de filtros

Fecha: 24 de octubre de 2026. Referencias: L01, L03.1, L03.2, L02.2, L02.3, patrón de listados y Playwright MCP.

1. Resumen ejecutivo

Se integra el filtro de archivadas de Sedes en el contrato existente de EntityTable; se preserva el ámbito de compañía al limpiar el directorio de Compañías y se conecta el cambio de cerradas de instalaciones de software al reinicio de página. La tabla compartida diferencia búsqueda efectiva vacía de texto visible formado por espacios y devuelve el foco al buscador después de limpiar, sin desplazarlo programáticamente.

No se introducen filtros, componentes, props, dependencias, estilos ni otro motor de consulta. No cambia la comparación L03.2, el proveedor remoto ni la arquitectura de History. Los cambios previos y simultáneos del workspace se conservan.

2. Inventario dirigido y estado por consumidor

Inventario basado en las APIs y controladores instalados. «Correcto» significa que el contrato de código ya encajaba; la cobertura de navegador se detalla aparte. En todos los casos la búsqueda por defecto es ""; no se amplían los campos buscables.

Consumidor / responsable Criterios y defaults; dónde viven Activación, dependencia y visibilidad Limpieza / página Resultado de L03.3
Sedes · SiteSection / useSiteSectionController Búsqueda local EntityTable; showArchived=false local Checkbox marcado incluye las archivadas además de activas; listado de la compañía recibida q vacía y false; filterKey reinicia página, conserva sort/tamaño/columnas Corregido: faltaban las tres conexiones de filtro
Personas · PeopleSection q y contactsOnly=false en URL Checkbox «Solo contactos», búsqueda visible; ambos se combinan dentro de compañía Borra q y contactsOnly, página 1 por mecanismo L03.1 Ya correcto
Perfiles · WorkProfilesPage / controlador q y archived=false en URL Checkbox archivados y texto; inicialización/configuración de perfil es navegación independiente Borra q y archived; conserva selección/configuración y compañía; página 1 Ya correcto
Activos · AssetInventoryPage / AssetList q y template=null en URL; picker usa estado propio Pestaña Todo/plantilla y texto; estado/sede son columnas y campos buscables actuales, no filtros nuevos Borra q/plantilla, página 1; conserva selección, orden y preferencias Ya correcto
Recursos · ResourcesPage / controlador q y template=null en URL Pestaña y texto; recurso seleccionado en ruta tiene contrato independiente Borra q/plantilla y página, conserva ruta de selección Ya correcto
Compañías · CompaniesPage / controlador q y activeOnly=false en URL; initialActiveOnly procede de navegación Checkbox «Solo activas»; companyId/initialCompanyId se muestra como ámbito, no selector borrable Borra q/activeOnly; conserva companyId; filterKey reajusta página Corregido: se borraba companyId y faltaba filterKey. Vacío del ámbito usa noResults existente
Puestos · WorkstationsPage / controlador de Assets Búsqueda local No hay filtro adicional de sede, responsable o archivadas Limpia solo búsqueda; página local al inicio Ya correcto; no se migra a URL
Procesos · ProcessesPage / controlador q y closed=false en URL Checkbox incluye cerrados; compañía sigue siendo ámbito q/closed a defaults; filterKey y setter ajustan página Ya correcto
Accesos remotos · RemoteConnectionsPage / controlador q y closed=false locales Checkbox incluye removed/never_configured; initialPersonId limita ámbito Limpia q/closed; conserva persona; filterKey reajusta página Ya correcto en código
Software del ordenador · SoftwareInstallationsPanel q y closed=false locales Checkbox incluye instalaciones cerradas; assetId fija ordenador Limpia q/closed; conserva activo; ahora filterKey reajusta página al cambiar closed Corregido: página podía permanecer en 3 al cambiar conjunto
Carpetas, correo, certificados, aplicaciones e impresoras de perfil · controladores de configuraciones q en URL; sin otro filtro de cerradas initialProfileId es ámbito recibido, no un filtro borrable; recursos/perfiles relacionados se consultan antes de presentar Limpia q, conserva perfil; página local se reinicia Ya correcto en código
Teletrabajo · TeleworkAuthorizationsPage / controlador q en URL initialPersonId fija persona de origen; sin filtro adicional de cerradas Limpia q, conserva persona Ya correcto en código
Cuentas y accesos · AccessWorkspacePage / controlador q en URL; kind/env/resource contextuales Tabs de categoría; environmentId y resourceId tienen indicadores y acciones explícitas de quitar ámbito Limpiar borra solo q; las acciones específicas quitan cada ámbito; filterKey compuesto reajusta página Contrato específico preservado
Catálogos activos/recursos · CatalogPage / controladores q y tab en URL, tab validada con fallback tab identifica colección de plantillas/campos/relaciones, no un filtro de la misma colección Limpia q; conserva tipo y alcance global/compañía Ya correcto en código
Marcas · BrandsPage / controlador q genérica y status="" local Selector de estado visible; vacío equivale a todos q/status a defaults; filterKey existente Ya correcto en código
Infraestructura · InfrastructurePage q genérica y role="" local Selector de rol, sin implicar topología detallada q/rol a defaults; conexiones de filtro existentes Ya correcto en código
Otros EntityTable sin filtro propio Búsqueda genérica local Texto visible Solo búsqueda Reciben corrección compartida de vacío/foco
PickerList / RemoteOptionPicker Estado local provisional / consulta delegada por cursor Selección y criterios del selector; no equivalen al listado padre No se alteran selección, cursor ni contratos del proveedor Sin cambios; regresiones específicas

Persistencia, vuelta y ausencia de coincidencias

Los criterios locales (Sedes, Puestos, accesos remotos, software, marcas y roles) se conservan mientras su componente sigue montado, incluido abrir/cancelar su diálogo; una recarga completa restablece los defaults. No se les promete restauración de ficha. Los criterios URL sobreviven recarga/enlace compartido según su parser vigente. contactsOnly=invalid se interpreta false; archived=invalid se rechaza en la frontera de ruta estricta, antes de presentar tabla. No se unifican esas políticas existentes. El retorno con scroll/foco de L03.1 se conserva en sus pilotos Activos/Recursos/Personas; no se generaliza esa garantía a todos los consumidores.

En EntityTable sin coincidencias, q efectiva o filtersApplied seleccionan el mensaje de criterios. Sin ellos se usa el vacío aportado por el consumidor. Un ámbito sin compañía coincidente muestra el noResults existente, sin invitar a crear la primera compañía ni ofrecer borrar el ámbito con Limpiar filtros. Los listados que esperan referencias antes de montar la tabla conservan esa política de carga.

3. Clasificación de estado y casos ambiguos

  • Datos: q, contactos, archivadas, cerradas, plantilla de inventario, estado y rol. Incluye controles que amplían el conjunto respecto al default, como archivadas.
  • Presentación: visibilidad de columnas y tamaño de página. El orden válido se conserva también; la página se ajusta cuando cambia el conjunto. No existe una nueva preferencia de densidad en esta entrega.
  • Contexto: compañía, persona/perfil/activo de origen, tipo de catálogo, categoría/entorno/recurso en accesos y selección contextual mediante ruta.
  • Temporal: apertura de menú/diálogo, foco y selección provisional del picker.

template en inventarios sí es criterio limpiable; tab de catálogo identifica otra colección. companyId del directorio viene de navegación y se muestra como ámbito. Los botones para quitar entorno/recurso de accesos son acciones explícitas distintas de limpiar la búsqueda. Esta clasificación no intenta borrar todos los parámetros URL.

4. Contrato común de limpieza

Se reutilizan filtersApplied, filterKey y onClearFilters. El consumidor define los defaults y restablece exclusivamente sus criterios; EntityTable limpia su búsqueda, reajusta página y enfoca el input con preventScroll. El componente genérico no conoce DTOs, nombres de filtros, permisos ni endpoints.

filtersApplied representa desviaciones de los criterios propios respecto a defaults; filterKey identifica cambios del conjunto relevantes para página local. Con navegación controlada, los setters del consumidor mantienen el ajuste de página L03.1. No se reemplaza ese mecanismo ni se copia el estado completo a localStorage.

5. Corrección de Sedes y reproducción de L01-03

Antes de editar producción se reprodujo con 50 sedes GET (40 activas, 10 archivadas): activar archivadas, escribir l03, limpiar. El resultado fue búsqueda vacía, checkbox marcado, 50 resultados, botón de limpieza ausente y foco en BODY. Las capturas históricas de L01 permanecen; esta reproducción está en before/ de L03.3.

SiteSection ahora aporta filtersApplied={showArchived}, filterKey={String(showArchived)} y callback a false. El default false está declarado en su controlador; no se convierte una preferencia persistente en filtro. Se conservan permisos, mutaciones y diálogos.

6. Consumidores equivalentes

Compañías integra exclusivamente activeOnly como criterio adicional, preserva companyId y utiliza ambos en la clave de conjunto. Se retira el setter interno de companyId que solo utilizaba la limpieza. SoftwareInstallationsPanel añade la clave de closed; sus flags y limpieza ya estaban conectados. Personas, Perfiles, inventarios, Procesos y accesos remotos ya usaban las conexiones correspondientes y no requieren duplicarlas.

7. Visibilidad

Se mantienen búsqueda, checkbox/selector/tab, contador y botón existentes. No se añade una barra ni chips que resten filas en móvil. El checkbox activo por sí solo ya ofrece Limpiar filtros en Sedes; tras limpiar desaparece porque no hay criterios que borrar. Estado marcado, etiquetas y pestaña seleccionada no dependen solo del color.

8. Página, orden y preferencias

Cambiar archivadas, activas o cerradas reinicia página local mediante filterKey; los filtros navegables siguen sus setters. Limpiar vuelve a página 1, mantiene sort válido, tamaño y columnas. Se comprueba desde página 3 y con tamaño 25/columna oculta. No se reinterpreta una respuesta provisional vacía como conjunto definitivo.

9. URL y History

Los setters existentes modifican sus parámetros con el mecanismo de History vigente; los parámetros admitidos ajenos a la acción se conservan. La ruta rechaza claves desconocidas; no se altera ese contrato para simular tolerancia. No se añaden rutas, claves de sesión ni push por pulsación. L03.1 sigue definiendo los consumidores con restauración de contexto completa. No es necesaria una modificación de rutas del cliente.

10. Búsqueda normalizada

No cambia createTextMatcher ni los campos de cada consumidor. La tabla decide el mensaje de vacío con currentSearch.trim(); una cadena de espacios puede permanecer visible/en URL y disponer de acción para borrarla, pero no significa búsqueda efectiva activa ni obliga a mostrar «sin coincidencias». Se conservan caja/tildes, Unicode, ñ diferenciada, puntuación técnica y consulta original según L03.2.

11. Carga, error y vacío

No se modifica la máquina de estados de L02.3. La limpieza cambia criterios del usuario, sin invalidar consultas ajenas ni borrar criterios ante errores. Las pruebas de carga usan demoras GET liberadas por señal, sin esperas arbitrarias. Se distinguen carga inicial, refetch con caché, vacío definitivo y cero coincidencias. Software/Sedes no adquieren artificialmente la máquina de estados del inventario.

12. Accesibilidad y skills

La acción usa los botones y nombres es/en existentes. Se prueba activación por teclado, checkbox, foco al buscador, cancelación y siete tamaños; no se añaden aria-live. El contraste y foco de los componentes compartidos se contrastan en regresiones, sin afirmar una auditoría WCAG completa.

Skill principal ux-search: criterio visible y recuperación sin perder ámbito. Complementarias: ux-tables para página/orden; ux-microcopy y ux-empty-states para distinguir vacíos; ux-navigation para contexto; shadcn para controles reales; vercel-composition-patterns y vercel-react-best-practices para conservar responsabilidades y evitar nuevo estado derivado. rdx-solid guía la corrección mínima y las pruebas rojas/verdes. Se respetan DESIGN y los patrones frente a sugerencias genéricas de autosuggest, chips o nuevas barras. Los auditores especializados citados por skills no están instalados: no se instalan ni sustituyen pruebas realizadas.

13. Playwright: entorno y evidencias

Se reutiliza una sesión ordinaria válida de una instalación desechable ya activa, mediante el MCP Docker fijado por el proyecto. No se inicia otra instalación visual ni se retira el preparador de su propietario. visual-audit-volume.py prepara de forma idempotente 15 compañías, 50 personas, 51 activos y 66 recursos persistidos en esa instalación metis_desk_test. Las pruebas de UI bloquean escrituras de negocio.

Las 50 sedes, 50 perfiles y 50 instalaciones son interceptaciones GET controladas con IDs, schemas y estados reales, no registros persistidos. Hay 40 activos/vigentes y 10 archivados/cerrados en cada conjunto de prueba. Usan personas, ordenadores y aplicaciones sintéticos existentes. No se acredita integración de escritura con ellas.

Procedimiento reproducible: mantener abierto el preparador documentado, ejecutar el preparador de volumen y pasar su ruta privada mediante METIS_PLAYWRIGHT_STORAGE_STATE a python3 scripts/filter-ui.test.py. No guardar sesiones en Git ni incluir su contenido en logs. Para ejecutar únicamente L03.3 seleccionar los métodos test_21 a test_31; sin selección incluye las regresiones de contexto heredadas. El script intercepta únicamente el WebSocket del origen de desarrollo para evitar HMR durante un recorrido: las recargas por cambios simultáneos del workspace interrumpieron intentos anteriores. No se intercepta el inicio de sesión ni se sustituye la lógica de filtros.

El índice local de evidencias y los resultados por ejecución se encuentran en .artifacts/playwright/l03-3/. Los resultados técnicos y la cobertura ejecutada figuran en las secciones siguientes.

Cobertura específica ejecutada

Los once métodos específicos pasan juntos en browser-filters-stable.log (263,935 s):

Escenario Verificado Datos / evidencia representativa
Sedes, ambos criterios 50→40, búsqueda vacía, checkbox false y foco input GET; before/sites-after-clear-1440.png frente a after/sites-after-clear-1440.png
Sedes, solo archivadas y ningún criterio Checkbox y limpieza coherentes, 40 defaults, sin overflow global GET; siete tamaños, after/sites-cleared-1920.png, -390.png y -320.png
Página 3 y preferencias Cambio de criterio→1; limpiar conserva desc, tamaño 25 y Dirección oculta GET; measurements sites-preferences
Cero resultados / diálogo / vacío real Limpiar recupera 40; Escape mantiene criterios; espacios no anuncian cero coincidencias GET vacío y poblado; after/sites-empty-spaces-390.png
Personas y Perfiles q/flag desaparecen de URL; 50 y 40; foco vuelve a búsqueda Personas persistidas / perfiles GET; capturas de ambos después de limpiar
Activos y Recursos Plantilla+búsqueda sin coincidencias→51/66; selección de recurso en ruta y orden conservados Persistidos; measurements assets/resources-empty-cleared y resources-selection-after-clear
Compañías q/activas se borran; companyId y compañía resultante permanecen; sin falsa acción de borrar ámbito. Desde página 2, activas→1 y limpiar conserva desc Persistidos; after/company-scope-cleared-1440.png
Software Página 3→1 al incluir cerradas (50); limpiar→40 y foco input GET; measurements software-after-clear
Carga inicial / refetch Limpiar Sedes con GET retenida→40; inventario pendiente no anuncia vacío y termina con 51 Sedes GET / API de activos retenida; after/assets-clear-during-loading-1440.png
Idioma y teclado Espacio/Enter activan limpieza; idioma conserva criterios; es/en y foco input GET Sedes; after/english-keyboard-clear-390.png
Parámetros contactsOnly inválido tolerado como false; archived inválido rechaza ruta sin tabla; booleano válido permite limpiar URL real; measurements invalid-archived-rejected
Ámbito accesos Limpiar solo q conserva kind=account, environmentId y companyId API real vacía; ID de entorno sintético sin entidad, prueba de ámbito/URL, no de relaciones pobladas

Resoluciones de Sedes: 1920×1080, 1440×900, 1366×768, 1024×768, 768×1024, 390×844 y 320×640. Los controles cambian de distribución sin añadir bandas; se abren las capturas de 1440, 320 y 390 en inglés. El contenedor conserva el scroll horizontal de tabla; en 320 las columnas laterales siguen requiriendo ese desplazamiento. La densidad vertical y otras decisiones pendientes de L01-01 no se declaran resueltas.

Intentos conservados: la reproducción roja de Sedes y dos pruebas SSR fallidas preceden al cambio. La primera suite detectó dos errores de instrumentación (texto 25▼ y espera inapropiada de estado de inventario en una ficha). Otra usó una clave desconocida de URL, que la ruta estricta rechaza correctamente. Se ajustan las pruebas al contrato real, sin relajar producción. Hubo recargas Vite registradas y una ejecución de contexto interrumpida con GET retenidas; no cuentan como verdes. Tras aislar HMR, los once métodos pasan juntos.

14. Pruebas técnicas

Se conservan las pruebas rojas previas a la corrección y sus resultados verdes. La prueba de compañía comprueba es/en, ámbito sin criterios borrables y vacío del ámbito; la prueba de EntityTable distingue espacios visibles del vacío efectivo. Los resultados globales se comparan por diagnóstico y archivo con la línea base; no se corrige vendor ni trabajo ajeno para obtener una suite verde.

Resultados realmente ejecutados

Comprobación Resultado de esta ejecución Evidencia local
pnpm typecheck Falla, salida 2; mismo TS2375 de calendar.tsx:165 que la línea base, locale opcional typecheck.log / baseline-typecheck.log
Tipos dirigidos: pnpm exec tsc -p de rdx-ui, companies, assets y resources --noEmit Los cuatro pasan rdx/companies/assets/resources-typecheck.log y .exit
pnpm lint Falla: 17 errores, 2 warnings, 4 infos; baseline 15/1/4 lint.log / baseline-lint.log
pnpm check Falla: 173 errores, 2 warnings, 4 infos; baseline 167/1/4. Inspección ampliada posterior: 183/2/4 sobre 2013 archivos check.log, baseline-check.log, check-full.log
Biome dirigido a los ocho archivos TSX/TS/JSON propios y ESLint de espaciado Pasa; sin supresiones ni cambios vendor scoped-check.log / spacing.log
pnpm test, con MariaDB temporal separada Falla, 7 tareas pasan de 8; Compañías 225/228; no suite global verde test.log / test.exit
Compañías: prueba específica nueva Pasa es/en, compañía presente y ámbito sin coincidencia companies-filters-final.log
rdx-ui, pruebas dirigidas Pasa, 13 archivos; en ejecución global, 78 casos pasan rdx-test.log / test.log
Activos, pruebas dirigidas Pasa, 27 archivos; ejecución global 144 casos assets-tests.log / test.log
Recursos, pruebas dirigidas Pasa, 11 archivos; ejecución global 80 casos resources-tests.log / test.log
Core/navegación, pruebas dirigidas Pasa, 3 archivos; ejecución global 11 casos navigation-tests.log / test.log
pnpm build Pasa, 2 tareas; conserva aviso de chunk web grande build.log / build.exit
Python py_compile del script nuevo pasa No se instala framework adicional

Los recuentos de archivos y casos del runner se indican por separado; el reporte directo resume archivos, mientras Turbo muestra los casos de cada suite. La base de integración usa solo metis_desk_test, credenciales efímeras fuera de Git y eliminación automática; no se usa la base de auditoría para fixtures destructivas.

Comparación de fallos, sin atribución por simple recuento: el TS2375 de vendor coincide en archivo/línea/mensaje antes y después. Lint conserva diagnósticos de person-photo y migraciones existentes. La inspección ampliada encuentra además formato/espaciado en workstation-configuration-item.tsx, workstation-configuration-metadata.tsx, workstation-profile-identity.tsx y workstation-detail.test.tsx, archivos de trabajo simultáneo ajeno a los cambios de filtros. Los ocho archivos propios pasan la comprobación separada; no se declara que el aumento global completo fuera ya preexistente.

La ejecución global mantiene los dos fallos SSR documentados en L03.2: companies-page.test.tsx:180 (recuento de Personas) y :210 (microcopy del formulario). Aparece también workstation-detail.test.tsx:863, «perfiles: total conocido, alcance del preview y fila expandida fuera de los primeros cinco», que espera un contador cero. Este último no se etiqueta como fallo histórico L03.2: pertenece al trabajo simultáneo sobre la ficha de puestos y ese archivo no se modifica en L03.3. No se oculta ni se corrige automáticamente fuera del alcance. La lista de fallos se conserva en test.log.

Archivos propios: EntityTable y su prueba; SiteSection; CompaniesPage, su controlador y la nueva prueba company-filters; SoftwareInstallationsPanel; inclusión de la prueba en package.json de Companies; scripts/filter-ui.test.py y los seis documentos de esta entrega. No se modifican AGENTS, rutas, hooks de History, comparación textual, backend o vendor. Los diffs generales del workspace también contienen cambios anteriores/simultáneos.

15. Regresiones y alcance de los hallazgos

Se contrastan L03.1/L03.2 y los escenarios aplicables de L02/V01/V02/V06. Las mediciones históricas permanecen y la resolución de L01-03 se limita al comportamiento reproducido. V05/V07/V08/V12 conservan su alcance documentado; no se convierte esta entrega en L04.

Regresiones ejecutadas

Se verifican 57 métodos distintos de navegador contando L03.3 y las regresiones, no las repeticiones como casos adicionales:

Familia Resultado real Log / mediciones
L03.3, criterios y limpieza 11/11 juntos; Compañías ampliada se repite y pasa browser-filters-stable.log, company-page-browser.log; after/measurements-522693.json y -535976.json
L03.2, comparación y consulta original 8/8 juntos, 301,235 s search-regressions.log; regressions/search/
L02.3, carga/error/actualización y V02/V06 8/8 juntos, 279,181 s states-regressions.log; regressions/states/
L02.2, columnas, responsive, teclado y preferencias 8/8 juntos, 197,278 s columns-regressions.log; regressions/columns/
L02.1, pickers locales/remoto de prueba, selección provisional, zoom y foco 8/8 juntos, 207,715 s pickers-regressions.log; regressions/pickers/
L03.1, retorno/URL/orden/página/scroll/foco y capacidad V01 12/14 en lote; los dos restantes pasan en repetición limpia (38,422 s). El lote completo no es verde context-regressions-stable.log, context-page-size-repeat.log; after/measurements-529969.json y JSON de la repetición

La primera ejecución de contexto se interrumpe tras fallos de recarga y respuestas GET retenidas. En la repetición con HMR aislado pasan los primeros doce; el método 13 recibe un documento sin contenido (snapshot ready-timeout, 75 errores indicados por MCP), antes de completar la prueba de tamaño. No se conserva el detalle de esos 75 errores tras la navegación siguiente y no se inventa una causa. Deja tamaño 25 sin restaurar; el método 14 espera 10 y observa página 2. Los métodos 13 y 14 pasan juntos al repetir exclusivamente esos dos en navegador limpio, sin cambiar producción ni sus aserciones. No se presenta el lote de catorce como aprobado.

Las consolas finales de los once escenarios propios, Compañías, búsquedas, columnas y selectores no muestran errores ni warnings. Estados registra cuatro 503 controlados sobre /api/assets/:company, esperados en su prueba de fallo. Las guardas de escritura registran []. La consola final se refiere al documento activo: no sustituye los errores intermedios conservados en snapshots y logs. El índice completo está en .artifacts/playwright/l03-3/INDICE.md; incluye capturas abiertas, consola, medidas, volumen, pruebas rojas/verdes y todos los intentos.

16. Limitaciones y pendientes L04

La revisión de código no acredita una interfaz poblada de todas las configuraciones, administración o relaciones. No se certifica el proveedor remoto completo contra servicios reales ni se cambia SQL/HTTP. Se mantienen las limitaciones históricas de V05, V07, V08 y V12 y el problema de densidad L01-01. No se implementan L04 ni filtros de sede/responsable/estado inexistentes en los inventarios actuales.

La comprobación general de enlaces añadidos en el diff del workspace detecta una referencia simultánea a implementacion-uiux-ficha-puesto-v2.1.md que todavía no existe. No pertenece a L03.3 y se conserva; los destinos documentales añadidos por esta entrega sí existen. git diff --check es correcto. La sesión visual reutilizada permanece con su preparador original; solo se retiran navegadores y MariaDB de integración propios. Las credenciales, sesiones y capturas de esta entrega quedan fuera de Git.

Seguimiento L04.1

L04.1 adopta URL de orden/página, preferencias explícitas de columnas y retorno de scroll/foco en Puestos, Perfiles y directorio de Compañías. Conserva la búsqueda normalizada y los campos de cada entidad, los filtros de archivados/activas y el ámbito. La limpieza controlada agrupa criterios y página en un único replace. Las medidas y limitaciones anteriores se conservan; los resultados nuevos se registran en el informe L04.1. Restan L04.2–L04.4 y no se declara V05 ni L04 resueltos universalmente.