✔ contexto AD: creación pura con identidades propias, sin cuentas, grupos ni activos (5.488441ms) ✔ clasificación independiente del nombre; no se adopta un sistema existente por llamarse AD (1.42781ms) ✔ se rechazan compañías distintas, referencias inexistentes y entornos sin clasificación (0.812206ms) ✔ DNS repetido no crea dos entornos; otro dominio comparte sistema y obtiene un entorno distinto (1.033108ms) ✔ identidad local: vínculo por UUID, alta y retirada idempotentes con identidad e historial protegidos (2.006315ms) ✔ identidad local: clasificación explícita rechaza AD por sistema o entorno, sin comparar etiquetas (0.647905ms) ✔ identidad local: crear entorno utiliza AccessWorkspace y conserva cuentas y sistema existentes (0.926407ms) ✔ catálogos globales no se duplican con adiciones locales y no se admiten grupos anidados (1.28551ms) ✔ renombrar una cuenta conserva UUID, historial y semántica de repetición; su uso permanece fijo (11.771888ms) ✔ cerrar una autorización configurada deja retirada pendiente y cerrar una pendiente no inventa un acceso (2.983122ms) ✔ titulares no se solapan incluso en periodos cerrados; el relevo conserva una retirada anterior (1.550712ms) ✔ responsabilidad técnica no concede acceso y se permite sobre una cuenta caducada o inactiva (1.094808ms) ✔ valores reconstruyen UUID y fechas, rechazan fechas imposibles y no permiten credenciales (2.112416ms) ✔ las referencias UUID se normalizan y no permiten duplicar cuentas variando mayúsculas (0.594305ms) ✔ aplicaciones: contrato estricto, versión opcional y solo instalada (1.40631ms) ✔ aplicaciones: UUID, idempotencia, versión auditada, destino fijo y retirada (2.001815ms) ✔ aplicaciones: ámbito y clasificación explícita, duplicados abiertos y reapertura nueva (2.812621ms) ✔ aplicaciones: inactividad conserva notas y permite retirada, impide reconfigurar (1.40571ms) ✔ aplicaciones: persistencia preserva historial y rechaza claves y orden incoherentes (3.185124ms) ✔ R2.5: global conserva perfil, delivery e historial; disponibilidad distinta de lectura histórica (1.460611ms) ✔ certificados: contrato estricto, ubicación opcional y límites (1.34151ms) ✔ certificados: UUID, idempotencia, ubicación auditada, destino fijo y retirada (2.301517ms) ✔ certificados: ámbito y clasificación explícita, duplicados abiertos y reapertura nueva (1.072408ms) ✔ certificados: inactividad conserva notas y permite retirada, impide reconfigurar (1.158208ms) ✔ certificados: persistencia preserva historial y rechaza claves y orden incoherentes (3.502226ms) ✔ certificados: caducidad inclusiva, revisión y retirada sin perder historial (0.883007ms) ✔ compañía, contacto y sede tienen UUID v7 propios y se conserva la identidad al editar (0.982908ms) ✔ la pertenencia impide asociar o editar entidades de otra compañía (0.596105ms) ✔ la dirección y el teléfono son optativos y se pueden borrar (0.300902ms) ✔ nombres, email, teléfono y longitud de dirección se validan en los Value Objects (0.628104ms) ✔ sedes: archivar y reactivar conserva identidad y datos; repetir el estado es idempotente (0.575904ms) ✔ FolderMapping: cuenta desconocida, cuenta alternativa y cobertura independiente de la necesidad (5.42254ms) ✔ FolderMapping: ausencia conserva cuenta, null la retira y cada cambio real crea revisión (2.72752ms) ✔ FolderMapping: rechaza cuenta ausente, otro subtipo, otra persona, caducada o desactivada (2.69732ms) ✔ FolderMapping: Coverage por grupo exige pertenencia directa de la cuenta y configuración vigente (4.511632ms) ✔ FolderMapping: cobertura derivada cambia al retirar concesión, necesidad, cuenta o asociación personal (6.237445ms) ✔ FolderMapping: todas las autorizaciones necesarias deben proceder de la cuenta seleccionada (1.225109ms) ✔ Correo: UUIDv7, normalización, no-op, historial y retirada explícita (1.482111ms) ✔ Correo: buzón independiente, vigencia, perfiles, varios buzones y duplicados abiertos (2.134515ms) ✔ Correo: persistencia conserva identidad e historial y rechaza corrupción (1.596211ms) ✔ Correo: vinculación explícita del legado conserva UUID e historial, sin inferir propiedad (2.145215ms) ✔ Buzón: identidad, dirección única, cuenta opcional, ámbito y cambios auditados (1.068708ms) ✔ Uso de buzón: fechas inclusiva/exclusiva, mismo día, solapes, varias personas e historial (0.994608ms) ✔ Buzones: mapper conserva identidad y revisiones, rechaza corrupción (1.938714ms) ✔ personas con datos opcionales no requieren cuenta de acceso y conservan su UUID (0.379503ms) ✔ departamentos únicos por compañía, ignorando mayúsculas y espacios exteriores (0.448303ms) ✔ varios departamentos, un único principal y sin periodos solapados (1.329109ms) ✔ ediciones conservan revisiones y una repetición semántica no añade historial (1.830613ms) ✔ inactivos no reciben nuevas asignaciones; se conservan y pueden cerrarse las existentes (0.568004ms) ✔ asignaciones rechazan pertenencias cruzadas y fechas inválidas (0.517304ms) ✔ la persistencia rechaza periodos inválidos y revisiones que no reflejan el estado actual (0.867206ms) ✔ impresoras: contratos estrictos, notas opcionales y predeterminada solo vigente (1.023408ms) ✔ impresoras: UUID, historial, igualdad semántica, destino fijo y retirada terminal (1.160009ms) ✔ impresoras: duplicados por perfil, predeterminada única y destinos del ámbito (0.788006ms) ✔ impresoras: indisponibilidad señala revisión y permite notas y retirada (0.600705ms) ✔ impresoras: rehidratación conserva identidades y detecta corrupción (2.474418ms) ✔ procesos: contratos estrictos, normalización y límites (1.731512ms) ✔ procesos: UUID v7, tareas con identidad, actualización idempotente e historial (1.087007ms) ✔ procesos: completar exige todas resueltas; cierre terminal y sujeto/tareas fijos (1.268409ms) ✔ procesos: añadir revisiones conserva las resueltas e identidades y no duplica (1.46081ms) ✔ plantillas: copia de instrucciones, igualdad semántica y cambios independientes (0.758005ms) ✔ procesos: rehidratación bidireccional y rechazo de raíces/historial alterados (2.091715ms) ✔ revisión: personales, retirada pendiente y relaciones finalizadas aún configuradas (0.276602ms) ✔ revisión: incluye configuraciones de perfiles archivados, excluye cerradas y evita duplicar (0.131901ms) ✔ remotos: origen personal sin detalle, destinos tipados y contrato estricto (1.210309ms) ✔ remotos: UUID e historial, destino fijo, idempotencia y cierre terminal (1.300209ms) ✔ remotos: referencias de compañía y duplicados abiertos por recorrido y herramienta (0.827506ms) ✔ remotos: configuración y autorización independientes; caducidad y revocación no borran acceso (1.154608ms) ✔ remotos: disponibilidad de origen y destino, retirada y método personalizado (0.381003ms) ✔ remotos: persistencia conserva auditoría y detecta referencias, claves e historial corruptos (2.210816ms) ✔ remotos: una sede archivada conserva conexiones existentes pero rechaza nuevas (0.388903ms) ✔ instalaciones: pertenecen al equipo, admiten SO/aplicaciones y rechazan recursos ajenos y destinos variables (1.550111ms) ✔ instalaciones: versiones, idempotencia, retirada, revisión y persistencia de historial (2.885021ms) ✔ licencia del software: opcional, misma compañía y tipo, vigencia, desvinculación e historial idempotente (2.73482ms) ✔ R2.4: global activo e inactivo separan alta, reconfiguración y recuperación histórica (0.652805ms) ✔ teletrabajo: ausencia, límites, fechas reales y contrato estricto (0.620305ms) ✔ teletrabajo: UUID, renovación y revocación auditadas, igualdad y destino fijo (1.089308ms) ✔ teletrabajo: vigencia inclusiva, programación, caducidad y persona inactiva (0.640505ms) ✔ teletrabajo: ámbito, unicidad incluso revocada, disponibilidad y retirada (0.471703ms) ✔ teletrabajo: rehidratación preserva identidad y detecta corrupción de raíz e historial (2.499718ms) ✔ Perfil: cuenta opcional, UUID, historial, identidad fija e idempotencia (0.966107ms) ✔ Perfil: desactivar conserva valores e historial, es idempotente y precede al borrado (0.382803ms) ✔ Perfil: misma persona/dispositivo único vigente, múltiples dispositivos/personas y revisión sin pérdida de datos (0.652005ms) ✔ Perfil: cuenta autorizada, vigencia inclusiva de caducidad, cierre de autorización y cuenta técnica (0.570904ms) ✔ Perfil: persistencia conserva revisiones y rechaza raíz o cuenta histórica incoherentes (2.575218ms) ✔ Perfil: solo un ordenador principal activo admite altas y reactivaciones; el historial se conserva (0.463104ms) ✔ PNG, JPEG y WebP se normalizan sin recorte y sin metadatos a un avatar ligero (63.586058ms) ✔ se rechazan archivos vacíos, corruptos, SVG y GIF aunque simulen un MIME válido (1.138808ms) ✔ se rechazan excesos de peso y dimensión antes de almacenar (2.353217ms) ✔ los PNG animados se rechazan antes de decodificarlos (1.43791ms) ✔ el contexto distingue cuentas y grupos del entorno, sin incluir otros entornos o datos globales (0.276802ms) ✔ recurso contextual: incluye identidades de sistemas distintos sin mezclar necesidades y concesiones ajenas (0.753406ms) ✔ filtro vacío no incluye elementos ajenos y las rutas validan UUID y contexto de compañía (1.697812ms) ✔ los catálogos presentan alta mediante acción y no un formulario junto al listado (65.122069ms) ✔ cuentas ofrecen caducidad opcional y campos sin contraseña (14.899107ms) ✔ la ayuda explica todos los elementos en ambos idiomas y distingue el ámbito (32.113631ms) ✔ los ejemplos del sistema orientan sin rellenar datos del alta (3.027222ms) ✔ las altas rápidas respetan el contexto, ámbito y relaciones históricas (0.543104ms) ✔ los formularios ofrecen altas relacionadas y el segundo modal evita altas anidadas (61.747345ms) ✔ aplicaciones: listado sin formularios, alta en cabecera y traducciones (16.479719ms) ✔ aplicaciones: selectores con alta rápida y ayuda inferior antes de guardar (14.306603ms) ✔ R2.5: perfil muestra nombre, origen y versión global sin ResourceDTO local ni mezcla de perfiles (35.111653ms) ✔ certificados: listado sin formularios, alta en cabecera y traducciones (15.792413ms) ✔ certificados: selectores con alta rápida y ayuda inferior antes de guardar (12.022987ms) ✔ la compañía de origen es ámbito visible, no un filtro eliminable con Limpiar filtros (37.755972ms) ✔ directorio: orden y página proceden de URL sin perder la consulta (20.536548ms) ✔ el dashboard no ofrece selector de compañía y conserva las métricas de cada ámbito (20.239745ms) ✔ el resumen de compañía es la entrada por defecto y ofrece destinos reales (31.167725ms) ✔ los índices de catálogos distinguen definiciones globales y variantes de compañía (4.893735ms) ✔ el listado presenta estado vacío y acceso al alta sin formularios visibles (9.67717ms) ✖ la ficha presenta datos de la compañía, contactos y acceso a sedes (16.227217ms) ✔ el formulario de sede ofrece dirección y teléfono opcionales (1.745212ms) ✖ el formulario de persona distingue contactos de cuentas de acceso y permite datos opcionales (3.654226ms) ✔ asignar un departamento permite añadir el primero y conserva el selector en edición (4.794134ms) ✔ el tablero de compañía tiene composición propia, acciones arriba y métricas limitadas a su ámbito (4.07153ms) ✔ el menú de compañía ordena trabajo y personas por grupos sin repetir las acciones de usuario (7.439354ms) ✔ sedes: listado traducido con filtro de archivadas y solo sedes activas por defecto (12.931093ms) ✔ la navegación de compañía conserva 21 enlaces reales, sección activa y contexto es/en (30.168817ms) ✔ el logo sustituye iniciales con URL versionada, dimensiones fijas y carga diferida (0.580804ms) ✔ sin logotipo aparecen iniciales y las listas consultan la misma caché de compañías (0.536503ms) ✔ cuentas del mapeo: exige asociación vigente y catálogos activos; no atribuye por login o por perfil (0.690405ms) ✔ actualización del mapeo: omitir cuenta conserva semántica distinta de retirarla explícitamente; admite revisión capturada (0.490004ms) ✔ uso de impresora: agrupa perfiles de un mismo equipo y separa pendientes e historial (0.795606ms) ✔ uso de impresora: referencias sin resolver no se presentan como ausencia de uso (0.161601ms) ✔ identidades locales: entorno del activo, navegación por UUID y estado vigente en es/en (5.221238ms) ✔ propietario local: vínculo retirado conserva navegación y no ofrece reasignación (1.057808ms) ✔ cuenta del mapeo: seleccionar perfil es una acción explícita; el render no infiere ni cambia cuenta (3.440525ms) ✔ correo: listado traducido, alta en cabecera y formularios ocultos (7.954558ms) ✔ correo: selectores reutilizables con altas y ayuda inmediatamente antes de guardar (12.526691ms) ✔ Buzones: alta en modal, cuenta opcional y ayuda al final (7.633055ms) ✔ L04.2: correo mantiene tabla y criterios mientras faltan sus referencias (5.534739ms) ✔ Personas conserva búsqueda por nombre, contactos, consulta y distinción ñ/n en es/en (48.909853ms) ✔ organización: resuelve departamento y cargo vigentes del responsable (0.354003ms) ✔ organización: sin responsable o asignación no infiere datos desde perfiles ni cargo genérico de persona (0.112701ms) ✔ organización: periodos semiabiertos, históricos y futuros (0.0979ms) ✔ organización: varias vigentes conservan todas, principal primero y orden estable sin mutar (0.126801ms) ✔ organización: dos principales no ocultan información seleccionando una arbitrariamente (0.0686ms) ✔ organización: aislamiento de compañía y persona, y referencias incompletas (0.127701ms) ✔ organización: cambios y refetch se derivan de la fuente actual (0.135701ms) ✔ impresoras: listado sin formularios, alta en cabecera y traducciones (7.102051ms) ✔ impresoras: selectores con alta rápida y ayuda inferior antes de guardar (6.460047ms) ✔ L04.2: Procesos recupera búsqueda, cerrados, orden y página en sus enlaces (13.965901ms) ✔ procesos: listados es/en sin formularios junto a los datos (13.305196ms) ✔ procesos: alta rápida y ayuda inferior antes del pie (4.846535ms) ✔ plantillas: instrucciones, desactivación y ayuda global es/en sin datos de compañía (5.325938ms) ✔ seguimiento: origen personal, revisión actual y edición sin afirmar retirada real; cerrados sin editar (24.146474ms) ✔ remotos: consulta sin formularios y traducciones (7.855057ms) ✔ remotos: formulario, altas rápidas y ayuda antes del pie (11.784685ms) ✔ remotos: origen personal, acceso configurado sin autorización y VPN separada (1.42541ms) ✔ las consultas de compañías conservan sus rutas y rechazan respuestas inválidas (20.468347ms) ✔ lectura y guardado de accesos están separados sin cambiar el contrato HTTP (1.914814ms) ✔ el guardado de usos de buzón mantiene su endpoint y no se confunde con la consulta (1.40551ms) ✔ los adapters mantienen la ausencia semántica sin modificar los campos del formulario (0.175901ms) ✔ las instrucciones de proceso conservan el orden y excluyen líneas vacías (0.155101ms) ✔ la validación de logos conserva tipos permitidos, vacío y límite exacto de tamaño (0.155101ms) ✔ la tabla espera todas sus referencias y distingue actualización de disponibilidad (0.159701ms) ✔ un fallo recuperable conserva datos anteriores sin presentarlos como actualizados (0.146801ms) ✔ una fuente denegada impide mostrar la caché de todo el listado compuesto (0.163201ms) ✔ dashboard: HTTP 401 conserva la semántica de disponibilidad (0.427503ms) ✔ dashboard: HTTP 403 conserva la semántica de disponibilidad (0.230701ms) ✔ dashboard: HTTP 503 conserva la semántica de disponibilidad (0.194801ms) ✔ dashboard: una lectura correcta valida y conserva la página del proveedor (1.005407ms) ✔ iniciales y siglas soportan nombres vacíos, Unicode y separadores (0.634704ms) ✔ el color es estable con variaciones de espacios, mayúsculas y acentos (0.252702ms) ✔ los colores generados mantienen contraste AA para texto pequeño (0.907407ms) ✔ el avatar conserva su nombre accesible y puede ser decorativo dentro de un botón etiquetado (0.638905ms) ✔ OSUI-01/02/17: SO actual desde instalación, independiente de cualquier valor de fábrica (1.44771ms) ✔ OSUI-03/04/05/18: vacío, pendiente y retirado no son SO actual (5.953743ms) ✔ OSUI-06/07: varios SO, orden determinista y aplicaciones excluidas (1.981714ms) ✔ OSUI-08/12: cambiar de activo conserva solo su SO, sin aceptar compañías ajenas (1.283909ms) ✔ OSUI-09: versión de instalación y redundancia literal sin reglas de fabricante (3.146522ms) ✔ OSUI-10: referencia no resoluble no significa ausencia; inactiva resoluble conserva información (2.010715ms) ✔ OSUI-11: error con datos previos, error de resolver y carga no se presentan como vacío (4.040429ms) ✔ OSUI-13/14: servidor sin puesto y plantilla propia consumen la misma lectura por activo (1.821213ms) ✔ OSUI-16: presentación es/en y versión opcional (3.167823ms) ✔ SO global: selector conserva scope y destino SO; la versión instalada sigue separada (0.274102ms) ✔ REG-SO-01/11: render global configurado, inactivo e histórico conserva nombre, versión y destino es/en (6.171145ms) ✔ software del puesto es/en: SO actual, versión, enlaces y separación por ordenador sin formularios incrustados (15.092809ms) ✔ formulario software: recurso fijo en edición, estados permitidos, ayuda y ausencia de persona/perfil (3.778527ms) ✔ R2.4: nombre, origen y enlace global se resuelven sin ResourceDTO local; licencia continúa particular (13.266196ms) ✔ teletrabajo: consulta sin formularios y traducciones (7.228752ms) ✔ teletrabajo: formulario con alta rápida de persona, fechas opcionales y ayuda inferior (9.925871ms) ✔ teletrabajo: sin autorización no se presupone permiso; persona inactiva requiere revisión (1.555011ms) ✔ teletrabajo: alta desde un perfil fija la persona y no abre otra alta rápida (1.581511ms) ✔ teletrabajo es/en: conserva estado documental, vigencia y revisión como mensajes independientes (8.554462ms) ✔ entorno: reúne varios correos y configuraciones, distingue pendiente, retirada y revisión (0.845306ms) ✔ entorno: excluye cerradas, otros perfiles, compañías y correo antiguo sin adivinar relaciones (0.528104ms) ✔ entorno: composición vigente del puesto y datos actuales sin duplicación (0.432803ms) ✔ entorno: ficha es/en con estados y acciones, sin formularios; muestra falso y varios correos (13.092695ms) ✔ entorno: carga, fallo parcial sin falsa ficha vacía, perfil inexistente y aviso de archivado (11.898685ms) ✔ entorno: consulta autorización por persona, común a sus perfiles y sin confundir preparación (9.445268ms) ✔ entorno: accesos abiertos de la persona y sus orígenes sin confundirlos con configuraciones del perfil (4.853635ms) ✔ las entidades de los selectores se pluralizan en es/en sin reutilizar el verbo de acción (1.205508ms) ✔ perfiles: listado es/en, alta en cabecera y ausencia de formulario junto al listado (6.841249ms) ✔ perfiles: la cabecera breve conserva el motivo completo en la celda de revisión (8.137358ms) ✔ perfiles: alta en cuatro pasos, sin guardado intermedio y contenido de ayuda conservado (7.248852ms) ✔ perfiles: selección de persona explícita y cuenta opcional con altas independientes (8.567261ms) ✔ perfiles: el puesto fijado aporta su ordenador y no selecciona al responsable como usuario (4.837535ms) ✔ perfiles: requisitos por paso, cuenta opcional y propuesta basada en persona y ordenador (0.317702ms) ✔ perfiles: el nombre sugerido respeta el límite del contrato (0.209202ms) ✔ perfiles: resumen con listas, ordenador único y ausencias representadas por guion (2.117115ms) ✔ perfiles: edición completa con identidad fija aunque el perfil requiera revisión (3.196523ms) ✔ perfiles: orden y página navegables conservan búsqueda y archivados al abrir entorno (27.511098ms) ✔ el catálogo de aplicaciones de compañía conserva cursor, filtros y retorno a ficha (1.991415ms) ✔ las funcionalidades archivadas no tienen rutas activas (0.564804ms) ✔ el filtro de plantilla permite abrir listados y fichas de activos y recursos (0.981107ms) ✔ el filtro de plantilla se limita a los inventarios que conocen sus definiciones (0.402203ms) ✔ todas las secciones de compañía tienen una ruta propia y el índice es el resumen (1.120708ms) ✔ los índices de catálogos y los cinco catálogos globales son destinos independientes (0.277602ms) ✔ las configuraciones conservan la compañía y el UUID del perfil (0.259401ms) ✔ las rutas desconocidas y los parámetros inválidos no abren una sección por defecto (1.278209ms) ✔ la ficha de puesto tiene ruta propia, conserva el UUID y rechaza identificadores inválidos (0.417203ms) ✔ dominios: enlaces a cuentas y grupos limitados al entorno de la compañía (0.542004ms) ✔ los parámetros de contexto llegan al consumidor sin crear rutas nuevas ni aceptar claves ajenas (0.978607ms) ✔ catálogo de aplicaciones: UUID global y criterios propios sin compañía ficticia (0.596904ms) ✔ catálogo SO: ruta específica y filtros, sin confundir con aplicaciones (0.283002ms) ✔ la barra comienza desplegada sin navegador o sin una preferencia válida (0.524804ms) ✔ plegar y desplegar persisten la preferencia sin modificar otras claves (0.267202ms) ✔ un fallo de lectura, escritura o acceso a localStorage no bloquea la barra (0.546204ms) ✔ la capacidad del shell fuerza modos sin cambiar la preferencia manual (0.447903ms) ✔ un menú solo libera su modalidad si su presentación pasa a estar disponible fija (0.176701ms) ✔ layout 640px: 0 asociados y 0 instalaciones (7.395154ms) ✔ layout 640px: 0 asociados y 3 instalaciones (5.767042ms) ✔ layout 640px: 1 asociados y 0 instalaciones (2.007314ms) ✔ layout 640px: 1 asociados y 2 instalaciones (2.83982ms) ✔ layout 640px: 2 asociados y 3 instalaciones (3.908428ms) ✔ layout 748px: 0 asociados y 0 instalaciones (1.005407ms) ✔ layout 748px: 0 asociados y 3 instalaciones (2.384917ms) ✔ layout 748px: 1 asociados y 0 instalaciones (1.694412ms) ✔ layout 748px: 1 asociados y 2 instalaciones (2.532219ms) ✔ layout 748px: 2 asociados y 3 instalaciones (3.443925ms) ✔ layout 900px: 0 asociados y 0 instalaciones (0.602804ms) ✔ layout 900px: 0 asociados y 3 instalaciones (1.999014ms) ✔ layout 900px: 1 asociados y 0 instalaciones (1.159308ms) ✔ layout 900px: 1 asociados y 2 instalaciones (2.192816ms) ✔ layout 900px: 2 asociados y 3 instalaciones (3.402425ms) ✔ layout 1200px: 0 asociados y 0 instalaciones (0.745605ms) ✔ layout 1200px: 0 asociados y 3 instalaciones (2.82692ms) ✔ layout 1200px: 1 asociados y 0 instalaciones (1.508211ms) ✔ layout 1200px: 1 asociados y 2 instalaciones (2.272716ms) ✔ layout 1200px: 2 asociados y 3 instalaciones (3.130222ms) ✔ layout: dos asociados se reparten por capacidad; sin principal no se fabrican conexiones (4.012029ms) ✔ preview: conserva límites y publica solo cobertura real de fuentes conocidas (0.302003ms) ✔ WD04.4: acción estable de presentación, fuera de las relaciones y contadores, sin solapamientos (65.095069ms) ✔ WD04.5: acciones ordenadas del principal y periférico sin inferir software por categoría (0.583504ms) ✔ WD04.5: lectura sin permisos de edición, carga/error parcial y activos retirados (0.258702ms) ✔ WD04.5: distingue instalación, producto global/inactivo y licencia particular (0.553604ms) ✔ WD04.5: producto particular y gates cerrados no crean acciones administrativas (0.641505ms) ✔ WD04.5: SO global utiliza la referencia pública y su etiqueta específica (0.330802ms) ✔ WD04.5: estados terminales, refetch y cambio de principal o compañía no reutilizan acciones antiguas (0.211701ms) ✔ WD04.5: trigger es/en separado del enlace, tarjetas sin acciones y añadir sin menú (13.676298ms) ✔ dashboard: ordenador y equipamiento actuales, personas por perfiles y archivados separados (0.503003ms) ✔ dashboard: sin responsable sigue mostrando usuarios y un puesto desmantelado no cuenta historia como miembros (0.245402ms) ✔ dashboard: sustituir ordenador resuelve perfiles del nuevo host sin trasladar los anteriores (0.185902ms) ✔ dashboard: referencias ajenas o principal fuera de composición no aportan relaciones (0.112201ms) ✔ pendientes: solo pending, perfiles activos, compañía correcta y deduplicación por familia e identidad (0.537304ms) ✔ último cambio: orden cronológico sin mutación, altas de miembros y campos realmente cambiados (0.279402ms) ✔ equipamiento: principal válido primero, miembros únicos y secundarios en orden declarado (0.205002ms) ✔ equipamiento: activos sin principal no adquieren un principal por su tipo o posición (0.143101ms) ✔ equipamiento: principal fuera de composición se advierte sin añadirlo a miembros (0.1168ms) ✔ equipamiento: referencia ausente o de otra compañía no inventa datos ni marca principal (0.263502ms) ✔ equipamiento: vacío y desmantelado no recuperan miembros del historial (0.119801ms) ✔ equipamiento: averiado sigue asignado y conserva ambos estados originales (0.086901ms) ✔ expansión: todos abiertos inicialmente y plegado independiente de cada perfil (0.143501ms) ✔ refetch conserva plegados y filtros individuales, incluso con error o fuentes incompletas (0.117301ms) ✔ retirada o archivo limpia únicamente el estado del perfil afectado (0.100101ms) ✔ cambio de compañía, puesto u ordenador restablece todos los perfiles abiertos y los filtros (0.079501ms) ✔ orden estable y numérico del resumen y los pendientes, sin mutar datos remotos (0.148401ms) ✔ incluye solo perfiles del ordenador principal, distingue inactivos y deduplica personas (0.289602ms) ✔ puesto inexistente o sin composición no hereda perfiles de otros activos (0.225502ms) ✔ persona: responsabilidad y uso son independientes y solo se consideran puestos y perfiles vigentes (0.328702ms) ✔ ficha de puesto es/en: cabecera, retorno, bloques vacíos y edición modal sin formulario incrustado (27.858201ms) ✔ un UUID de puesto ausente muestra no encontrado sin cabecera ni edición de otro puesto (2.001714ms) ✔ ficha de persona es/en: distingue responsabilidad y uso, y enlaza los puestos (2.79902ms) ✔ ficha: ordenador destacado y periféricos sin repetir, perfiles solo del ordenador y personas deduplicadas (54.11959ms) ✔ personas y perfiles: carga y error no se presentan como listados vacíos (5.941443ms) ✔ ficha: no permite crear perfiles si el ordenador está retirado o el puesto está desactivado (33.977744ms) ✔ historial del puesto es/en: revisiones de más reciente a más antigua con autor y valores de cada momento (6.074044ms) ✔ personas es/en: enlaces a todos sus puestos bajo responsabilidad, sin confundirlos con puestos usados (22.949865ms) ✔ menú de compañía es/en: totales en badges alineados y cero real en secciones vacías (18.280031ms) ✔ ruta de activo de compañía abre la página con información, historial, software y solo sus perfiles (83.443601ms) ✔ equipamiento es/en: badges de principal, técnico y uso conservan su significado (6.636848ms) ✔ equipamiento: inventario fallido no se presenta como vacío y permite reintentar (2.245617ms) ✔ equipamiento: principal inconsistente se explica y no se incorpora como miembro válido (1.837613ms) ✔ personas y perfiles es/en: expansión contextual, enlaces independientes y resumen cero real (6.89065ms) ✔ cabecera es/en: responsable largo o ausente, contexto independiente y mapa con resumen (49.98596ms) ✔ perfiles: lista completa y todos desplegados por defecto, incluso con cincuenta perfiles (49.268555ms) ✔ perfiles: carga, error y datos retenidos no publican un total como actual (4.298031ms) ✔ equipamiento: contador conocido cero, uno, cinco y seis; error conserva filas sin publicar total (9.62067ms) ✔ configuración: cobertura desconocida, revisión y notas permanecen fuera del disclosure técnico (2.235816ms) ✔ perfiles: una actualización en curso conserva el total conocido y anuncia la actividad (1.596712ms) ✔ v2.2: dependencia sin principal conserva mapa y resumen y una explicación principal sin tabla vacía (10.091672ms) ✔ v2.2: un vacío confirmado de perfiles conserva el alta y evita cabeceras de una tabla sin filas (0.936107ms) ✔ v2.2: soporte distingue perfiles en carga, error, ausencia confirmada y persona no resuelta (2.185815ms) ✔ v2.2: referencia de principal no resuelta no publica cero pendientes ni ausencia de perfiles (6.474147ms) ✔ v3: Software conserva los tres estados documentales con la misma representación que las familias (29.15941ms) ✔ v3: estados técnicos de equipamiento conservan principal y asignación en es/en (11.502782ms) ✔ responsable es/en: avatar y nombre abren un único popup y la ausencia no ofrece acciones (3.594626ms) ✔ mapa visual: aísla compañías, deduplica miembros y conserva software y estados reales (2.83542ms) ✔ mapa es/en: principal solo, vacíos confirmados y error de software conservan navegación y gestión (29.134709ms) ✔ mapa: composición vacía y sin principal no fabrica relaciones ni instalaciones (0.938207ms) ✔ contexto de persona: rechaza datos de otra compañía y no ofrece acciones (0.538604ms) ✔ mapa es/en: carga inicial y carga parcial mantienen estados accesibles (21.035251ms) ✔ mapa es/en: leyenda con tres conceptos y cobertura explícita sin totales inventados (2.370217ms) ✔ mapa es/en: revisión de software traducida incluso sin referencia navegable (1.051308ms) ✔ WD04.4 es/en: acción autorizada, vacío accionable y lectura sin permiso (5.096337ms) ✔ perfiles del puesto: configuraciones de todos los activos abiertas y destinos accesibles únicos (11.916585ms) ℹ tests 307 ℹ suites 0 ℹ pass 305 ℹ fail 2 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 9004.694033 ✖ 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 (16.227217ms) 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.654226ms) 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' }