26 KiB
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.