# Eliminación de cuentas — validación del 27/10/2026 Se añade «Eliminar cuenta» al menú de fila de las cuentas de compañía. La confirmación identifica la cuenta y explica que el borrado incluye su historial propio y no elimina la cuenta externa. Las referencias actuales e históricas bloquean la operación con `ACCOUNT_IN_USE`; no se borran titulares, pertenencias, permisos ni perfiles en cascada. La API valida compañía, UUID, cuerpo y query, usa sesión/CSRF y ejecuta el borrado transaccional con bloqueos y comprobación de referencias entrantes por FK. Archivos principales: - `modules/companies/src/api/infrastructure/persistence/remove-access-account.ts` - `modules/companies/src/api/infrastructure/http/access.routes.ts` - `modules/companies/src/web/access/delete/ui/account-delete-dialog.tsx` - `modules/companies/src/web/access/list/ui/access-workspace.tsx` - `apps/server/src/account-deletion.integration.test.ts` - `scripts/account-deletion-ui-audit.py` ## Comprobaciones correctas - `pnpm --filter @metis/companies typecheck`. - `pnpm --filter @metis/server typecheck`. - `TSX_TSCONFIG_PATH=tsconfig.json node --import tsx --test modules/companies/src/web/shared/client-contracts.test.ts modules/companies/src/web/access/shared/access.test.tsx`. - `DB_NAME=metis_desk_test NODE_ENV=test node --env-file=../../.env --import tsx --test src/account-deletion.integration.test.ts` desde `apps/server`: borrado de cuentas activas/inactivas, historial propio, unicidad liberada, aislamiento, repetición y protección de referencias externas incluso con una FK CASCADE. - Biome dirigido a los archivos de código cambiados: sin errores; una advertencia de complejidad 16/15 en `AccessWorkspacePage`. - `git diff --check` y ESLint dirigido a los archivos añadidos y modificados del servidor y del diálogo. - `python3 scripts/visual-audit.py --account-deletion --check`: 17 comprobaciones correctas mediante Playwright MCP en Docker stdio; login ordinario real, HTTP, cancelación, Escape, retorno del foco al menú, reintento tras 503, listado actualizado y rechazo de cuentas con relaciones. - Volumen real: 15 compañías; principal con 50 personas, 51 activos, 66 recursos, 50 perfiles, 50 puestos y 62 cuentas creadas durante el recorrido. Únicamente `metis_desk_test` desechable; entorno retirado y sesión eliminada. - Capturas de 1440, 390 y 320 px; abiertas e inspeccionadas las de 320 px y el error por cuenta en uso de escritorio. Sin desbordamiento horizontal del diálogo en los tres tamaños. - La compilación de producción pasó; conserva el aviso de tamaño de chunks. Evidencias de la auditoría: [Informe de navegador](../playwright/authenticated-jjxhf9iu/account-deletion-report.json), [diálogo a 320 px](../playwright/authenticated-jjxhf9iu/account-delete-320.png), [cuenta en uso](../playwright/authenticated-jjxhf9iu/account-delete-in-use.png). ## Comprobaciones globales con fallos ajenos al cambio Se ejecutaron `pnpm typecheck`, `pnpm lint`, `pnpm test`, `pnpm check` y `pnpm build`. Los cuatro primeros no quedaron verdes: - Typecheck global: `packages/shadcn-ui/src/components/calendar.tsx:165`, propiedad `locale` incompatible con exactOptionalPropertyTypes. Vendor sin modificar. - Tests globales: dos aserciones de textos de `modules/companies/src/web/companies/shared/companies-page.test.tsx`; el fichero y los componentes de personas no forman parte del cambio. El fallo de Companies detuvo Turbo antes de completar la suite global. - Lint/check globales: diagnósticos de archivos ajenos (incluidos person-photo y evidencias JSON). No se reformatearon otros cambios del workspace. - Integración antigua `identity.test.ts`: el primer intento requiere migración global R2.1b; con gates cerrados falla antes de llegar a los nuevos casos de cuentas porque una ruta archivada devuelve 401 y su prueba espera 404. Los casos HTTP añadidos en `access.integration.ts` no llegaron a ejecutarse en esa suite; la operación se verificó con la prueba de persistencia específica y la auditoría HTTP aislada. ## Skills y límites Consultadas `rdx-solid` (capas, contratos y pruebas), `ux-error-recovery` (confirmación y recuperación), `shadcn` (reutilización de las primitivas instaladas) y `vercel-react-best-practices` (estado derivado sin efectos ni cachés remotas duplicadas). Se reutiliza `ConfirmDeleteDialog` de rdx-ui y los tokens y patrones de DESIGN.md. Los auditores especializados ux-*-audit de la skill no están instalados; no se invocaron ni instalaron. No se declara una auditoría WCAG completa, lector de pantalla, contraste global, tema oscuro ni todos los estados de carga del listado. No se borraron datos de Abeto Design ni de ninguna compañía real durante la validación.