✔ contexto AD: creación pura con identidades propias, sin cuentas, grupos ni activos (4.523835ms) ✔ clasificación independiente del nombre; no se adopta un sistema existente por llamarse AD (1.169609ms) ✔ se rechazan compañías distintas, referencias inexistentes y entornos sin clasificación (0.579104ms) ✔ DNS repetido no crea dos entornos; otro dominio comparte sistema y obtiene un entorno distinto (0.623805ms) ✔ identidad local: vínculo por UUID, alta y retirada idempotentes con identidad e historial protegidos (1.539512ms) ✔ identidad local: clasificación explícita rechaza AD por sistema o entorno, sin comparar etiquetas (0.419404ms) ✔ identidad local: crear entorno utiliza AccessWorkspace y conserva cuentas y sistema existentes (0.638505ms) ✔ catálogos globales no se duplican con adiciones locales y no se admiten grupos anidados (1.050908ms) ✔ renombrar una cuenta conserva UUID, historial y semántica de repetición; su uso permanece fijo (1.188209ms) ✔ cerrar una autorización configurada deja retirada pendiente y cerrar una pendiente no inventa un acceso (1.819814ms) ✔ titulares no se solapan incluso en periodos cerrados; el relevo conserva una retirada anterior (0.819007ms) ✔ responsabilidad técnica no concede acceso y se permite sobre una cuenta caducada o inactiva (0.616505ms) ✔ valores reconstruyen UUID y fechas, rechazan fechas imposibles y no permiten credenciales (1.569712ms) ✔ las referencias UUID se normalizan y no permiten duplicar cuentas variando mayúsculas (0.827106ms) ✔ aplicaciones: contrato estricto, versión opcional y solo instalada (1.814814ms) ✔ aplicaciones: UUID, idempotencia, versión auditada, destino fijo y retirada (2.474119ms) ✔ aplicaciones: ámbito y clasificación explícita, duplicados abiertos y reapertura nueva (1.735514ms) ✔ aplicaciones: inactividad conserva notas y permite retirada, impide reconfigurar (1.514312ms) ✔ aplicaciones: persistencia preserva historial y rechaza claves y orden incoherentes (2.096117ms) ✔ R2.5: global conserva perfil, delivery e historial; disponibilidad distinta de lectura histórica (0.772806ms) ✔ certificados: contrato estricto, ubicación opcional y límites (0.965307ms) ✔ certificados: UUID, idempotencia, ubicación auditada, destino fijo y retirada (1.420811ms) ✔ certificados: ámbito y clasificación explícita, duplicados abiertos y reapertura nueva (1.26921ms) ✔ certificados: inactividad conserva notas y permite retirada, impide reconfigurar (0.682406ms) ✔ certificados: persistencia preserva historial y rechaza claves y orden incoherentes (1.555612ms) ✔ certificados: caducidad inclusiva, revisión y retirada sin perder historial (0.766006ms) ✔ compañía, contacto y sede tienen UUID v7 propios y se conserva la identidad al editar (0.729206ms) ✔ la pertenencia impide asociar o editar entidades de otra compañía (0.600304ms) ✔ la dirección y el teléfono son optativos y se pueden borrar (0.284702ms) ✔ nombres, email, teléfono y longitud de dirección se validan en los Value Objects (0.474504ms) ✔ sedes: archivar y reactivar conserva identidad y datos; repetir el estado es idempotente (0.399904ms) ✔ FolderMapping: cuenta desconocida, cuenta alternativa y cobertura independiente de la necesidad (4.578036ms) ✔ FolderMapping: ausencia conserva cuenta, null la retira y cada cambio real crea revisión (2.119217ms) ✔ FolderMapping: rechaza cuenta ausente, otro subtipo, otra persona, caducada o desactivada (2.010215ms) ✔ FolderMapping: Coverage por grupo exige pertenencia directa de la cuenta y configuración vigente (3.279525ms) ✔ FolderMapping: cobertura derivada cambia al retirar concesión, necesidad, cuenta o asociación personal (4.788537ms) ✔ FolderMapping: todas las autorizaciones necesarias deben proceder de la cuenta seleccionada (0.964907ms) ✔ Correo: UUIDv7, normalización, no-op, historial y retirada explícita (1.418511ms) ✔ Correo: buzón independiente, vigencia, perfiles, varios buzones y duplicados abiertos (2.061416ms) ✔ Correo: persistencia conserva identidad e historial y rechaza corrupción (35.405076ms) ✔ Correo: vinculación explícita del legado conserva UUID e historial, sin inferir propiedad (2.129316ms) ✔ Buzón: identidad, dirección única, cuenta opcional, ámbito y cambios auditados (0.859307ms) ✔ Uso de buzón: fechas inclusiva/exclusiva, mismo día, solapes, varias personas e historial (1.041608ms) ✔ Buzones: mapper conserva identidad y revisiones, rechaza corrupción (1.801614ms) ✔ personas con datos opcionales no requieren cuenta de acceso y conservan su UUID (0.314902ms) ✔ departamentos únicos por compañía, ignorando mayúsculas y espacios exteriores (0.520605ms) ✔ varios departamentos, un único principal y sin periodos solapados (1.093508ms) ✔ ediciones conservan revisiones y una repetición semántica no añade historial (1.468711ms) ✔ inactivos no reciben nuevas asignaciones; se conservan y pueden cerrarse las existentes (0.468304ms) ✔ asignaciones rechazan pertenencias cruzadas y fechas inválidas (0.488604ms) ✔ la persistencia rechaza periodos inválidos y revisiones que no reflejan el estado actual (0.965107ms) ✔ impresoras: contratos estrictos, notas opcionales y predeterminada solo vigente (0.778506ms) ✔ impresoras: UUID, historial, igualdad semántica, destino fijo y retirada terminal (1.398011ms) ✔ impresoras: duplicados por perfil, predeterminada única y destinos del ámbito (0.775406ms) ✔ impresoras: indisponibilidad señala revisión y permite notas y retirada (0.597505ms) ✔ impresoras: rehidratación conserva identidades y detecta corrupción (4.413435ms) ✔ procesos: contratos estrictos, normalización y límites (2.816222ms) ✔ procesos: UUID v7, tareas con identidad, actualización idempotente e historial (1.684713ms) ✔ procesos: completar exige todas resueltas; cierre terminal y sujeto/tareas fijos (2.059916ms) ✔ procesos: añadir revisiones conserva las resueltas e identidades y no duplica (2.391319ms) ✔ plantillas: copia de instrucciones, igualdad semántica y cambios independientes (0.738606ms) ✔ procesos: rehidratación bidireccional y rechazo de raíces/historial alterados (2.268618ms) ✔ revisión: personales, retirada pendiente y relaciones finalizadas aún configuradas (0.288202ms) ✔ revisión: incluye configuraciones de perfiles archivados, excluye cerradas y evita duplicar (0.128801ms) ✔ remotos: origen personal sin detalle, destinos tipados y contrato estricto (1.170909ms) ✔ remotos: UUID e historial, destino fijo, idempotencia y cierre terminal (1.194709ms) ✔ remotos: referencias de compañía y duplicados abiertos por recorrido y herramienta (0.912407ms) ✔ remotos: configuración y autorización independientes; caducidad y revocación no borran acceso (1.111809ms) ✔ remotos: disponibilidad de origen y destino, retirada y método personalizado (0.362603ms) ✔ remotos: persistencia conserva auditoría y detecta referencias, claves e historial corruptos (2.268617ms) ✔ remotos: una sede archivada conserva conexiones existentes pero rechaza nuevas (0.411903ms) ✔ instalaciones: pertenecen al equipo, admiten SO/aplicaciones y rechazan recursos ajenos y destinos variables (1.579012ms) ✔ instalaciones: versiones, idempotencia, retirada, revisión y persistencia de historial (2.68862ms) ✔ licencia del software: opcional, misma compañía y tipo, vigencia, desvinculación e historial idempotente (2.838322ms) ✔ R2.4: global activo e inactivo separan alta, reconfiguración y recuperación histórica (0.613205ms) ✔ teletrabajo: ausencia, límites, fechas reales y contrato estricto (0.553104ms) ✔ teletrabajo: UUID, renovación y revocación auditadas, igualdad y destino fijo (0.837506ms) ✔ teletrabajo: vigencia inclusiva, programación, caducidad y persona inactiva (0.764806ms) ✔ teletrabajo: ámbito, unicidad incluso revocada, disponibilidad y retirada (0.582805ms) ✔ teletrabajo: rehidratación preserva identidad y detecta corrupción de raíz e historial (3.225625ms) ✔ Perfil: cuenta opcional, UUID, historial, identidad fija e idempotencia (0.981707ms) ✔ Perfil: desactivar conserva valores e historial, es idempotente y precede al borrado (0.423103ms) ✔ Perfil: misma persona/dispositivo único vigente, múltiples dispositivos/personas y revisión sin pérdida de datos (0.801806ms) ✔ Perfil: cuenta autorizada, vigencia inclusiva de caducidad, cierre de autorización y cuenta técnica (0.692606ms) ✔ Perfil: persistencia conserva revisiones y rechaza raíz o cuenta histórica incoherentes (2.887322ms) ✔ Perfil: solo un ordenador principal activo admite altas y reactivaciones; el historial se conserva (0.487304ms) ✔ PNG, JPEG y WebP se normalizan sin recorte y sin metadatos a un avatar ligero (59.965167ms) ✔ se rechazan archivos vacíos, corruptos, SVG y GIF aunque simulen un MIME válido (0.904207ms) ✔ se rechazan excesos de peso y dimensión antes de almacenar (2.112816ms) ✔ los PNG animados se rechazan antes de decodificarlos (1.455812ms) ✔ el contexto distingue cuentas y grupos del entorno, sin incluir otros entornos o datos globales (0.337503ms) ✔ recurso contextual: incluye identidades de sistemas distintos sin mezclar necesidades y concesiones ajenas (0.884007ms) ✔ filtro vacío no incluye elementos ajenos y las rutas validan UUID y contexto de compañía (1.903715ms) ✔ los catálogos presentan alta mediante acción y no un formulario junto al listado (60.671172ms) ✔ cuentas ofrecen caducidad opcional y campos sin contraseña (14.451313ms) ✔ la ayuda explica todos los elementos en ambos idiomas y distingue el ámbito (31.223543ms) ✔ los ejemplos del sistema orientan sin rellenar datos del alta (3.129924ms) ✔ las altas rápidas respetan el contexto, ámbito y relaciones históricas (0.526104ms) ✔ los formularios ofrecen altas relacionadas y el segundo modal evita altas anidadas (65.035106ms) ✔ aplicaciones: listado sin formularios, alta en cabecera y traducciones (17.470736ms) ✔ aplicaciones: selectores con alta rápida y ayuda inferior antes de guardar (13.715607ms) ✔ R2.5: perfil muestra nombre, origen y versión global sin ResourceDTO local ni mezcla de perfiles (32.873556ms) ✔ certificados: listado sin formularios, alta en cabecera y traducciones (16.538729ms) ✔ certificados: selectores con alta rápida y ayuda inferior antes de guardar (12.360096ms) ✔ la compañía de origen es ámbito visible, no un filtro eliminable con Limpiar filtros (49.387184ms) ✔ directorio: orden y página proceden de URL sin perder la consulta (20.258258ms) ✔ el dashboard no ofrece selector de compañía y conserva las métricas de cada ámbito (19.497952ms) ✔ el resumen de compañía es la entrada por defecto y ofrece destinos reales (28.582922ms) ✔ los índices de catálogos distinguen definiciones globales y variantes de compañía (4.279033ms) ✔ el listado presenta estado vacío y acceso al alta sin formularios visibles (8.388865ms) ✖ la ficha presenta datos de la compañía, contactos y acceso a sedes (15.284819ms) ✔ el formulario de sede ofrece dirección y teléfono opcionales (1.700613ms) ✖ el formulario de persona distingue contactos de cuentas de acceso y permite datos opcionales (3.012124ms) ✔ asignar un departamento permite añadir el primero y conserva el selector en edición (4.144632ms) ✔ el tablero de compañía tiene composición propia, acciones arriba y métricas limitadas a su ámbito (3.894931ms) ✔ el menú de compañía ordena trabajo y personas por grupos sin repetir las acciones de usuario (7.165556ms) ✔ sedes: listado traducido con filtro de archivadas y solo sedes activas por defecto (11.462489ms) ✔ la navegación de compañía conserva 21 enlaces reales, sección activa y contexto es/en (28.700723ms) ✔ el logo sustituye iniciales con URL versionada, dimensiones fijas y carga diferida (0.532004ms) ✔ sin logotipo aparecen iniciales y las listas consultan la misma caché de compañías (0.440003ms) ✔ cuentas del mapeo: exige asociación vigente y catálogos activos; no atribuye por login o por perfil (0.640805ms) ✔ actualización del mapeo: omitir cuenta conserva semántica distinta de retirarla explícitamente; admite revisión capturada (0.448803ms) ✔ uso de impresora: agrupa perfiles de un mismo equipo y separa pendientes e historial (0.738606ms) ✔ uso de impresora: referencias sin resolver no se presentan como ausencia de uso (0.137601ms) ✔ identidades locales: entorno del activo, navegación por UUID y estado vigente en es/en (3.413127ms) ✔ propietario local: vínculo retirado conserva navegación y no ofrece reasignación (0.431303ms) ✔ cuenta del mapeo: seleccionar perfil es una acción explícita; el render no infiere ni cambia cuenta (2.315518ms) ✔ correo: listado traducido, alta en cabecera y formularios ocultos (6.473151ms) ✔ correo: selectores reutilizables con altas y ayuda inmediatamente antes de guardar (3.676329ms) ✔ Buzones: alta en modal, cuenta opcional y ayuda al final (6.754252ms) ✔ L04.2: correo mantiene tabla y criterios mientras faltan sus referencias (3.966831ms) ✔ Personas conserva búsqueda por nombre, contactos, consulta y distinción ñ/n en es/en (52.71641ms) ✔ organización: resuelve departamento y cargo vigentes del responsable (0.267702ms) ✔ organización: sin responsable o asignación no infiere datos desde perfiles ni cargo genérico de persona (0.1015ms) ✔ organización: periodos semiabiertos, históricos y futuros (0.0768ms) ✔ organización: varias vigentes conservan todas, principal primero y orden estable sin mutar (0.150301ms) ✔ organización: dos principales no ocultan información seleccionando una arbitrariamente (0.077401ms) ✔ organización: aislamiento de compañía y persona, y referencias incompletas (0.091401ms) ✔ organización: cambios y refetch se derivan de la fuente actual (0.117201ms) ✔ impresoras: listado sin formularios, alta en cabecera y traducciones (6.249649ms) ✔ impresoras: selectores con alta rápida y ayuda inferior antes de guardar (6.027247ms) ✔ L04.2: Procesos recupera búsqueda, cerrados, orden y página en sus enlaces (13.449205ms) ✔ procesos: listados es/en sin formularios junto a los datos (13.290503ms) ✔ procesos: alta rápida y ayuda inferior antes del pie (5.541243ms) ✔ plantillas: instrucciones, desactivación y ayuda global es/en sin datos de compañía (4.110332ms) ✔ seguimiento: origen personal, revisión actual y edición sin afirmar retirada real; cerrados sin editar (17.681837ms) ✔ remotos: consulta sin formularios y traducciones (5.499642ms) ✔ remotos: formulario, altas rápidas y ayuda antes del pie (9.768376ms) ✔ remotos: origen personal, acceso configurado sin autorización y VPN separada (1.24441ms) ✔ las consultas de compañías conservan sus rutas y rechazan respuestas inválidas (20.336958ms) ✔ lectura y guardado de accesos están separados sin cambiar el contrato HTTP (1.31591ms) ✔ el guardado de usos de buzón mantiene su endpoint y no se confunde con la consulta (1.155609ms) ✔ los adapters mantienen la ausencia semántica sin modificar los campos del formulario (0.145101ms) ✔ las instrucciones de proceso conservan el orden y excluyen líneas vacías (0.114801ms) ✔ la validación de logos conserva tipos permitidos, vacío y límite exacto de tamaño (0.131101ms) ✔ la tabla espera todas sus referencias y distingue actualización de disponibilidad (0.0774ms) ✔ un fallo recuperable conserva datos anteriores sin presentarlos como actualizados (0.0996ms) ✔ una fuente denegada impide mostrar la caché de todo el listado compuesto (0.208401ms) ✔ dashboard: HTTP 401 conserva la semántica de disponibilidad (0.345302ms) ✔ dashboard: HTTP 403 conserva la semántica de disponibilidad (0.141601ms) ✔ dashboard: HTTP 503 conserva la semántica de disponibilidad (0.177201ms) ✔ dashboard: una lectura correcta valida y conserva la página del proveedor (0.746105ms) ✔ iniciales y siglas soportan nombres vacíos, Unicode y separadores (0.481804ms) ✔ el color es estable con variaciones de espacios, mayúsculas y acentos (0.155901ms) ✔ los colores generados mantienen contraste AA para texto pequeño (0.630705ms) ✔ el avatar conserva su nombre accesible y puede ser decorativo dentro de un botón etiquetado (0.424103ms) ✔ OSUI-01/02/17: SO actual desde instalación, independiente de cualquier valor de fábrica (1.092308ms) ✔ OSUI-03/04/05/18: vacío, pendiente y retirado no son SO actual (4.290433ms) ✔ OSUI-06/07: varios SO, orden determinista y aplicaciones excluidas (1.730613ms) ✔ OSUI-08/12: cambiar de activo conserva solo su SO, sin aceptar compañías ajenas (1.048708ms) ✔ OSUI-09: versión de instalación y redundancia literal sin reglas de fabricante (2.851622ms) ✔ OSUI-10: referencia no resoluble no significa ausencia; inactiva resoluble conserva información (1.431712ms) ✔ OSUI-11: error con datos previos, error de resolver y carga no se presentan como vacío (3.226925ms) ✔ OSUI-13/14: servidor sin puesto y plantilla propia consumen la misma lectura por activo (1.616113ms) ✔ OSUI-16: presentación es/en y versión opcional (2.675721ms) ✔ SO global: selector conserva scope y destino SO; la versión instalada sigue separada (0.222002ms) ✖ software del puesto es/en: SO actual, versión, enlaces y separación por ordenador sin formularios incrustados (6.377449ms) ✔ formulario software: recurso fijo en edición, estados permitidos, ayuda y ausencia de persona/perfil (3.118824ms) ✔ R2.4: nombre, origen y enlace global se resuelven sin ResourceDTO local; licencia continúa particular (8.764668ms) ✔ teletrabajo: consulta sin formularios y traducciones (4.797537ms) ✔ teletrabajo: formulario con alta rápida de persona, fechas opcionales y ayuda inferior (3.301326ms) ✔ teletrabajo: sin autorización no se presupone permiso; persona inactiva requiere revisión (1.342011ms) ✔ teletrabajo: alta desde un perfil fija la persona y no abre otra alta rápida (1.705414ms) ✔ teletrabajo es/en: conserva estado documental, vigencia y revisión como mensajes independientes (6.536251ms) ✔ entorno: reúne varios correos y configuraciones, distingue pendiente, retirada y revisión (0.777306ms) ✔ entorno: excluye cerradas, otros perfiles, compañías y correo antiguo sin adivinar relaciones (0.425204ms) ✔ entorno: composición vigente del puesto y datos actuales sin duplicación (0.457704ms) ✔ entorno: ficha es/en con estados y acciones, sin formularios; muestra falso y varios correos (12.635298ms) ✔ entorno: carga, fallo parcial sin falsa ficha vacía, perfil inexistente y aviso de archivado (11.245887ms) ✔ entorno: consulta autorización por persona, común a sus perfiles y sin confundir preparación (14.23231ms) ✔ entorno: accesos abiertos de la persona y sus orígenes sin confundirlos con configuraciones del perfil (4.617236ms) ✔ las entidades de los selectores se pluralizan en es/en sin reutilizar el verbo de acción (1.36901ms) ✔ perfiles: listado es/en, alta en cabecera y ausencia de formulario junto al listado (5.892546ms) ✔ perfiles: la cabecera breve conserva el motivo completo en la celda de revisión (9.400873ms) ✔ perfiles: alta en cuatro pasos, sin guardado intermedio y contenido de ayuda conservado (4.848338ms) ✔ perfiles: selección de persona explícita y cuenta opcional con altas independientes (6.252049ms) ✔ perfiles: el puesto fijado aporta su ordenador y no selecciona al responsable como usuario (3.230525ms) ✔ perfiles: requisitos por paso, cuenta opcional y propuesta basada en persona y ordenador (0.272803ms) ✔ perfiles: el nombre sugerido respeta el límite del contrato (0.107601ms) ✔ perfiles: resumen con listas, ordenador único y ausencias representadas por guion (1.686613ms) ✔ perfiles: edición completa con identidad fija aunque el perfil requiera revisión (2.795121ms) ✔ perfiles: orden y página navegables conservan búsqueda y archivados al abrir entorno (11.298688ms) ✔ el catálogo de aplicaciones de compañía conserva cursor, filtros y retorno a ficha (1.318811ms) ✔ las funcionalidades archivadas no tienen rutas activas (0.445704ms) ✔ el filtro de plantilla permite abrir listados y fichas de activos y recursos (0.572505ms) ✔ el filtro de plantilla se limita a los inventarios que conocen sus definiciones (0.295202ms) ✔ todas las secciones de compañía tienen una ruta propia y el índice es el resumen (0.754306ms) ✔ los índices de catálogos y los cinco catálogos globales son destinos independientes (0.212202ms) ✔ las configuraciones conservan la compañía y el UUID del perfil (0.242802ms) ✔ las rutas desconocidas y los parámetros inválidos no abren una sección por defecto (1.091609ms) ✔ la ficha de puesto tiene ruta propia, conserva el UUID y rechaza identificadores inválidos (0.525204ms) ✔ dominios: enlaces a cuentas y grupos limitados al entorno de la compañía (0.590104ms) ✔ los parámetros de contexto llegan al consumidor sin crear rutas nuevas ni aceptar claves ajenas (0.636505ms) ✔ catálogo de aplicaciones: UUID global y criterios propios sin compañía ficticia (0.468604ms) ✔ catálogo SO: ruta específica y filtros, sin confundir con aplicaciones (0.242002ms) ✔ la barra comienza desplegada sin navegador o sin una preferencia válida (0.300703ms) ✔ plegar y desplegar persisten la preferencia sin modificar otras claves (0.167901ms) ✔ un fallo de lectura, escritura o acceso a localStorage no bloquea la barra (0.175201ms) ✔ la capacidad del shell fuerza modos sin cambiar la preferencia manual (0.197802ms) ✔ un menú solo libera su modalidad si su presentación pasa a estar disponible fija (0.116601ms) ✔ layout 640px: 0 asociados y 0 instalaciones (5.066039ms) ✔ layout 640px: 0 asociados y 3 instalaciones (5.252841ms) ✔ layout 640px: 1 asociados y 0 instalaciones (1.949916ms) ✔ layout 640px: 1 asociados y 2 instalaciones (2.800522ms) ✔ layout 640px: 2 asociados y 3 instalaciones (3.637428ms) ✔ layout 748px: 0 asociados y 0 instalaciones (0.794006ms) ✔ layout 748px: 0 asociados y 3 instalaciones (2.209217ms) ✔ layout 748px: 1 asociados y 0 instalaciones (1.32501ms) ✔ layout 748px: 1 asociados y 2 instalaciones (2.203217ms) ✔ layout 748px: 2 asociados y 3 instalaciones (3.329025ms) ✔ layout 900px: 0 asociados y 0 instalaciones (0.555404ms) ✔ layout 900px: 0 asociados y 3 instalaciones (1.890015ms) ✔ layout 900px: 1 asociados y 0 instalaciones (1.030108ms) ✔ layout 900px: 1 asociados y 2 instalaciones (1.958115ms) ✔ layout 900px: 2 asociados y 3 instalaciones (3.023124ms) ✔ layout 1200px: 0 asociados y 0 instalaciones (0.710706ms) ✔ layout 1200px: 0 asociados y 3 instalaciones (2.236018ms) ✔ layout 1200px: 1 asociados y 0 instalaciones (1.120209ms) ✔ layout 1200px: 1 asociados y 2 instalaciones (2.301317ms) ✔ layout 1200px: 2 asociados y 3 instalaciones (2.930423ms) ✔ layout: dos asociados se reparten por capacidad; sin principal no se fabrican conexiones (3.512227ms) ✔ preview: conserva límites y publica solo cobertura real de fuentes conocidas (0.300702ms) ✔ WD04.4: acción estable de presentación, fuera de las relaciones y contadores, sin solapamientos (55.576631ms) ✔ WD04.5: acciones ordenadas del principal y periférico sin inferir software por categoría (0.872407ms) ✔ WD04.5: lectura sin permisos de edición, carga/error parcial y activos retirados (0.298002ms) ✔ WD04.5: distingue instalación, producto global/inactivo y licencia particular (0.435403ms) ✔ WD04.5: producto particular y gates cerrados no crean acciones administrativas (0.709905ms) ✔ WD04.5: estados terminales, refetch y cambio de principal o compañía no reutilizan acciones antiguas (0.189802ms) ✔ WD04.5: trigger es/en separado del enlace, tarjetas sin acciones y añadir sin menú (8.156964ms) ✔ dashboard: ordenador y equipamiento actuales, personas por perfiles y archivados separados (0.397804ms) ✔ dashboard: sin responsable sigue mostrando usuarios y un puesto desmantelado no cuenta historia como miembros (0.202402ms) ✔ dashboard: sustituir ordenador resuelve perfiles del nuevo host sin trasladar los anteriores (0.164401ms) ✔ dashboard: referencias ajenas o principal fuera de composición no aportan relaciones (0.119201ms) ✔ pendientes: solo pending, perfiles activos, compañía correcta y deduplicación por familia e identidad (0.613705ms) ✔ último cambio: orden cronológico sin mutación, altas de miembros y campos realmente cambiados (0.215102ms) ✔ equipamiento: principal válido primero, miembros únicos y secundarios en orden declarado (0.163001ms) ✔ equipamiento: activos sin principal no adquieren un principal por su tipo o posición (0.160701ms) ✔ equipamiento: principal fuera de composición se advierte sin añadirlo a miembros (0.112601ms) ✔ equipamiento: referencia ausente o de otra compañía no inventa datos ni marca principal (0.213802ms) ✔ equipamiento: vacío y desmantelado no recuperan miembros del historial (0.127101ms) ✔ equipamiento: averiado sigue asignado y conserva ambos estados originales (0.136301ms) ✔ expansión: todos abiertos inicialmente y plegado independiente de cada perfil (0.128801ms) ✔ refetch conserva plegados y filtros individuales, incluso con error o fuentes incompletas (0.122101ms) ✔ retirada o archivo limpia únicamente el estado del perfil afectado (0.088501ms) ✔ cambio de compañía, puesto u ordenador restablece todos los perfiles abiertos y los filtros (0.123401ms) ✔ orden estable y numérico del resumen y los pendientes, sin mutar datos remotos (0.143601ms) ✔ incluye solo perfiles del ordenador principal, distingue inactivos y deduplica personas (0.281003ms) ✔ puesto inexistente o sin composición no hereda perfiles de otros activos (0.196401ms) ✔ persona: responsabilidad y uso son independientes y solo se consideran puestos y perfiles vigentes (0.343002ms) ✔ ficha de puesto es/en: cabecera, retorno, bloques vacíos y edición modal sin formulario incrustado (16.087925ms) ✔ un UUID de puesto ausente muestra no encontrado sin cabecera ni edición de otro puesto (1.341011ms) ✔ ficha de persona es/en: distingue responsabilidad y uso, y enlaza los puestos (1.956716ms) ✔ ficha: ordenador destacado y periféricos sin repetir, perfiles solo del ordenador y personas deduplicadas (26.374705ms) ✔ personas y perfiles: carga y error no se presentan como listados vacíos (5.594643ms) ✔ ficha: no permite crear perfiles si el ordenador está retirado o el puesto está desactivado (29.037025ms) ✔ historial del puesto es/en: revisiones de más reciente a más antigua con autor y valores de cada momento (4.435735ms) ✔ personas es/en: enlaces a todos sus puestos bajo responsabilidad, sin confundirlos con puestos usados (20.126357ms) ✔ menú de compañía es/en: totales en badges alineados y cero real en secciones vacías (16.386228ms) ✔ ruta de activo de compañía abre la página con información, historial, software y solo sus perfiles (75.822589ms) ✔ equipamiento es/en: badges de principal, técnico y uso conservan su significado (5.14184ms) ✔ equipamiento: inventario fallido no se presenta como vacío y permite reintentar (3.230625ms) ✔ equipamiento: principal inconsistente se explica y no se incorpora como miembro válido (2.012815ms) ✔ personas y perfiles es/en: expansión contextual, enlaces independientes y resumen cero real (5.797345ms) ✔ cabecera es/en: responsable largo o ausente, contexto independiente y mapa con resumen (73.704572ms) ✔ perfiles: lista completa y todos desplegados por defecto, incluso con cincuenta perfiles (65.403608ms) ✔ perfiles: carga, error y datos retenidos no publican un total como actual (3.463327ms) ✔ equipamiento: contador conocido cero, uno, cinco y seis; error conserva filas sin publicar total (9.399973ms) ✔ configuración: cobertura desconocida, revisión y notas permanecen fuera del disclosure técnico (2.127716ms) ✔ perfiles: una actualización en curso conserva el total conocido y anuncia la actividad (1.27171ms) ✔ v2.2: dependencia sin principal conserva mapa y resumen y una explicación principal sin tabla vacía (10.768083ms) ✔ v2.2: un vacío confirmado de perfiles conserva el alta y evita cabeceras de una tabla sin filas (0.915007ms) ✔ v2.2: soporte distingue perfiles en carga, error, ausencia confirmada y persona no resuelta (2.074516ms) ✔ v2.2: referencia de principal no resuelta no publica cero pendientes ni ausencia de perfiles (4.727336ms) ✔ v3: Software conserva los tres estados documentales con la misma representación que las familias (20.223157ms) ✔ v3: estados técnicos de equipamiento conservan principal y asignación en es/en (10.818084ms) ✔ responsable es/en: avatar y nombre abren un único popup y la ausencia no ofrece acciones (2.780222ms) ✔ mapa visual: aísla compañías, deduplica miembros y conserva software y estados reales (2.760122ms) ✔ mapa es/en: principal solo, vacíos confirmados y error de software conservan navegación y gestión (31.968549ms) ✔ mapa: composición vacía y sin principal no fabrica relaciones ni instalaciones (0.884007ms) ✔ contexto de persona: rechaza datos de otra compañía y no ofrece acciones (0.537504ms) ✔ mapa es/en: carga inicial y carga parcial mantienen estados accesibles (15.615222ms) ✔ mapa es/en: leyenda con tres conceptos y cobertura explícita sin totales inventados (1.520912ms) ✔ mapa es/en: revisión de software traducida incluso sin referencia navegable (0.999408ms) ✔ WD04.4 es/en: acción autorizada, vacío accionable y lectura sin permiso (4.483635ms) ✔ perfiles del puesto: configuraciones de todos los activos abiertas y destinos accesibles únicos (11.467489ms) ℹ tests 305 ℹ suites 0 ℹ pass 302 ℹ fail 3 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 5488.410922 ✖ failing tests: test at src/web/companies/shared/companies-page.test.tsx:1:4385 ✖ la ficha presenta datos de la compañía, contactos y acceso a sedes (15.284819ms) AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: assert.ok(markup.includes("Personas (1)")) at TestContext. (/home/david/dev/metis-desk/modules/companies/src/web/companies/shared/companies-page.test.tsx:180:10) at async Test.run (node:internal/test_runner/test:1404:7) at async Test.processPendingSubtests (node:internal/test_runner/test:969:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' } test at src/web/companies/shared/companies-page.test.tsx:1:5801 ✖ el formulario de persona distingue contactos de cuentas de acceso y permite datos opcionales (3.012124ms) AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: assert.ok(markup.includes("Esta persona no tiene acceso a Metis Desk")) at TestContext. (/home/david/dev/metis-desk/modules/companies/src/web/companies/shared/companies-page.test.tsx:210:10) at async Test.run (node:internal/test_runner/test:1404:7) at async Test.processPendingSubtests (node:internal/test_runner/test:969:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' } test at src/web/software-installations/shared/software.test.tsx:1:2755 ✖ software del puesto es/en: SO actual, versión, enlaces y separación por ordenador sin formularios incrustados (6.377449ms) AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: assert.ok(html.includes("Windows 11 Pro")) at TestContext. (/home/david/dev/metis-desk/modules/companies/src/web/software-installations/shared/software.test.tsx:126:12) at async Test.run (node:internal/test_runner/test:1404:7) at async Test.processPendingSubtests (node:internal/test_runner/test:969:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' }