# Matriz de trazabilidad (inicial)

Estados: `Pendiente` · `En curso` · `Hecho (verificado)` · `Bloqueado`.
Un requisito solo pasa a *Hecho* con código, pruebas ejecutadas y documentación.

**Núcleo de dominio verificado:** `php tests/run.php` → 103/103 pruebas correctas (11-oct-2026). Además, 51 mutaciones deliberadas del código (fallos introducidos a propósito en copias). Las que sobrevivieron a la primera ronda revelaron huecos de pruebas, que se cerraron. Queda **1 mutante equivalente conocido** (la comprobación de longitud del comodín de `SsrfGuard`, ya cubierta por la validación de formato de host); no es un hueco de pruebas.
"En curso (dominio ✔)" significa: la regla de negocio está implementada en PHP puro y probada; **falta** la integración con Laravel (persistencia, middleware, rutas, interfaz). No es "Hecho".

| Requisito | Componente | Prueba | Entrega | Estado |
|---|---|---|---|---|
| FR-IAM-001/002/003/004 | Identity | Feature: autenticación, sesiones, recuperación | 2 | Pendiente |
| FR-IAM-005/006 | Identity | Verificación de correo; punto de extensión MFA | 2 | Pendiente |
| FR-IAM-007 | Identity | Suspensión revoca sesiones | 2 | Pendiente |
| FR-TEN-003/004/005, INV-016 | `Domain/AccessControl/AccessPolicy` | `tests/Security/TenantIsolationTest.php` | 2 | En curso (dominio ✔) — falta middleware y consultas con `tenant_id` |
| FR-TEN-001/002 | Organizations | Feature: alta y membresías | 2 | Pendiente |
| FR-RBAC-001…004 | `Domain/AccessControl/PermissionCatalog`, `AccessPolicy` | `TenantIsolationTest.php` | 2 | En curso (dominio ✔) — falta persistencia de roles y Policies de Laravel |
| FR-DOS-002 | `Domain/Dossiers/DossierStateMachine` | `tests/Unit/DossierStateMachineTest.php` | 3 | En curso (dominio ✔) |
| FR-DOS-001/003…006 | Dossiers | Feature de expedientes, metadatos, búsqueda | 3 | Pendiente |
| FR-DOC-002/003, FR-DOC-007 | `Domain/Documents/UploadPolicy`, `Infrastructure/Storage/StreamHasher` | `tests/Unit/DocumentsTest.php` | 3 | En curso (dominio ✔) — falta detección real de MIME (finfo) y endpoint |
| FR-DOC-004/005/006 | `StoragePathBuilder`, `DocumentStorage` | `DocumentsTest.php` (solo clave) | 3 | En curso (solo generación de clave ✔) — falta almacenamiento privado, descarga y versionado en BD |
| ADR-010 (cuotas Stellar) | `Domain/Documents/StorageQuota` | `DocumentsTest.php` | 3 | En curso (dominio ✔) |
| FR-AUD-002/004/005/007 | `Domain/Audit/AuditChain`, `AuditPayloadSanitizer`, `Shared/CanonicalJson` | `tests/Unit/AuditChainTest.php` | 4 | En curso (dominio ✔) — falta inserción transaccional y comando `artisan` de verificación |
| AC-009 (parcial) | `AuditChain::verify` | `AuditChainTest.php` | 4 | Detecta alteración, borrado y reordenación; no detecta truncado de cola (FR-AUD-006) |
| FR-JOB-004/005 | `Domain/Jobs/RetryPolicy` | `DocumentsTest.php` | 4 | En curso (dominio ✔) |
| FR-IAM-002 (política) | `Domain/Identity/PasswordPolicy` | `tests/Security/IntegrationSecurityTest.php` | 2 | En curso (dominio ✔) — falta hash (Laravel), recuperación y caducidad de tokens |
| FR-INT-009 | `Domain/Integrations/WebhookVerifier`, `ReplayStore` | `IntegrationSecurityTest.php` | 6 | En curso (dominio ✔) — falta `ReplayStore` en BD y rutas |
| NFR-SEC-006, FR-INT-004 | `Domain/Integrations/SsrfGuard` | `IntegrationSecurityTest.php` | 6 | En curso (dominio ✔) — el cliente HTTP debe fijar la IP resuelta y no seguir redirecciones |
| FR-API-007, AC-011 | `Domain/Integrations/IdempotencyGuard` | `IntegrationSecurityTest.php` | 6 | En curso (dominio ✔) — falta tabla `idempotency_keys` y middleware |
| FR-JOB-001…003/006…008 | BackgroundJobs | Cola en BD, lotes, cron | 4 | Pendiente |
| FR-NOT-001…005 | Notifications | Plantillas escapadas, reintentos | 4 | Pendiente |
| FR-WF-001/003/005/006/010 | `Domain/Workflow/WorkflowDefinitionValidator`, `ConvergencePolicy` | `tests/Unit/WorkflowTest.php` | 5 | En curso (dominio ✔) |
| FR-WF-004/005/008…015, FR-TASK-003/004/005, INV-004…006/011/013 | `Domain/Workflow/WorkflowEngine` | `tests/Unit/WorkflowEngineTest.php` (25 casos: secuencial, paralelo, join, decisión, devolución, vencimiento, reasignación, idempotencia, versión) | 5 | En curso (dominio ✔) — falta persistencia transaccional y proyección a `workflow_tasks` (ver `docs/architecture/integracion-laravel.md`) |
| FR-WF-002, FR-WF-007 | Workflow | Versionado/publicación en BD; validación previa al envío (documentos requeridos, responsables) | 5 | Pendiente |
| FR-RULE-001/002/004/005, FR-WF-006 | `Domain/Rules/ConditionEvaluator` | `tests/Unit/ConditionEvaluatorTest.php` | 5 | En curso (dominio ✔) |
| FR-RULE-003 | BusinessRules | Versionado de reglas en BD | 5 | Pendiente |
| FR-TASK-001…005 | TaskManagement | Bandeja, concurrencia | 5 | Pendiente |
| FR-API-001…009 | API / OpenAPI | Tokens, límites, idempotencia | 6 | Pendiente |
| FR-INT-001…010 | Integrations | HMAC, SSRF, timeouts | 6 | Pendiente |
| FR-AI-001…008 / FR-SIG-001…005 | Adaptadores | Estado "no configurado" | 6 | Pendiente |
| FR-ADM-001…004 | Administration | Panel y métricas | 7 | Pendiente |
| NFR-SEC-001…015 | Transversal | Security tests | 2–7 | Pendiente |
| NFR-SEC-013 | Security | Acceso cruzado entre organizaciones | 2–7 | En curso — política verificada; faltan pruebas por recurso con BD (expedientes, documentos, tareas, API) |
| ADR-010 (Stellar) | Despliegue | Cuotas de inodos, lotes, streaming | 3–4, 8 | En curso (documentado) |
| Marca Minka | Presentación | Contraste AA verificado; revisión visual | 1 | En curso |
| AC-001…AC-015 | Todos | Informe final | 7 | Pendiente |
