feat(F-006): users profile, addresses and RBAC

- users module: profile + address CRUD behind use cases (users_profiles,
  users_addresses)
- roles customer/admin on identity_users; role resolved from DB per request
- shared auth contract (Authenticate, requireRole, requireOwnerOrAdmin)
  injected from composition root; users never imports identity
- authorization runs before existence checks; address SQL scoped by user_id
- @fastify/cookie registered once at app root (cross-module)
- migrations 003_identity_roles + 004_users (reversible)
- no new npm dependencies; tests: unit 52, integration 22

Gates: reviewer/security/qa APPROVED; verify.sh green
This commit is contained in:
rikrdo
2026-08-15 09:27:38 +02:00
parent 75293f39bc
commit 546971280f
37 changed files with 1732 additions and 161 deletions

View File

@@ -1,139 +1,13 @@
{
"feature_id": "F-005",
"feature_id": "F-006",
"stage": "close",
"agent": "leader",
"action": "F-005 cerrada con gates aprobados",
"action": "Cierre F-006",
"state": "done",
"next_agent": "leader",
"waiting_for": "Seleccionar una feature pending y actualizar este estado",
"updated_at": "2026-08-14T20:58:24Z",
"updated_at": "2026-08-15T07:27:44Z",
"timeline": [
{
"ts": "2026-08-14T20:39:25Z",
"agent": "leader",
"stage": "intake",
"state": "done",
"message": "Intake F-005 OK"
},
{
"ts": "2026-08-14T20:39:25Z",
"agent": "architect",
"stage": "design",
"state": "running",
"message": "Diseño módulo identity (hexagonal)"
},
{
"ts": "2026-08-14T20:41:17Z",
"agent": "architect",
"stage": "design",
"state": "done",
"message": "Diseño F-005 aprobado"
},
{
"ts": "2026-08-14T20:41:17Z",
"agent": "implementer",
"stage": "build",
"state": "running",
"message": "Implementando módulo identity"
},
{
"ts": "2026-08-14T20:51:41Z",
"agent": "implementer",
"stage": "build",
"state": "done",
"message": "Build F-005 completo con evidencia"
},
{
"ts": "2026-08-14T20:53:01Z",
"agent": "implementer",
"stage": "build",
"state": "running",
"message": "Fix de review: cobertura COOKIE_SECURE"
},
{
"ts": "2026-08-14T20:54:22Z",
"agent": "implementer",
"stage": "build",
"state": "done",
"message": "Fix de review aplicado y verificado"
},
{
"ts": "2026-08-14T20:54:22Z",
"agent": "reviewer",
"stage": "review_gate",
"state": "running",
"message": "Review gate F-005"
},
{
"ts": "2026-08-14T20:54:44Z",
"agent": "reviewer",
"stage": "review_gate",
"state": "done",
"message": "Review gate APPROVED"
},
{
"ts": "2026-08-14T20:55:17Z",
"agent": "security",
"stage": "security_gate",
"state": "running",
"message": "Security gate F-005"
},
{
"ts": "2026-08-14T20:55:17Z",
"agent": "security",
"stage": "security_gate",
"state": "done",
"message": "Security gate APPROVED"
},
{
"ts": "2026-08-14T20:55:17Z",
"agent": "qa",
"stage": "qa_gate",
"state": "running",
"message": "QA gate F-005"
},
{
"ts": "2026-08-14T20:55:36Z",
"agent": "qa",
"stage": "qa_gate",
"state": "done",
"message": "QA gate APPROVED"
},
{
"ts": "2026-08-14T20:55:36Z",
"agent": "documenter",
"stage": "document",
"state": "running",
"message": "Documentación F-005"
},
{
"ts": "2026-08-14T20:55:42Z",
"agent": "implementer",
"stage": "build",
"state": "running",
"message": "Docs README: auth contract"
},
{
"ts": "2026-08-14T20:57:22Z",
"agent": "implementer",
"stage": "build",
"state": "done",
"message": "README auth contract documentado"
},
{
"ts": "2026-08-14T20:57:22Z",
"agent": "documenter",
"stage": "document",
"state": "running",
"message": "Documentación F-005"
},
{
"ts": "2026-08-14T20:58:18Z",
"agent": "documenter",
"stage": "document",
"state": "done",
"message": "Docs F-005 completas"
},
{
"ts": "2026-08-14T20:58:24Z",
"agent": "leader",
@@ -147,6 +21,132 @@
"stage": "close",
"state": "done",
"message": "F-005 cerrada con gates aprobados"
},
{
"ts": "2026-08-15T07:04:47Z",
"agent": "leader",
"stage": "intake",
"state": "running",
"message": "Intake F-006"
},
{
"ts": "2026-08-15T07:04:48Z",
"agent": "leader",
"stage": "intake",
"state": "done",
"message": "Intake F-006 OK"
},
{
"ts": "2026-08-15T07:04:48Z",
"agent": "architect",
"stage": "design",
"state": "running",
"message": "Diseño users + RBAC"
},
{
"ts": "2026-08-15T07:07:20Z",
"agent": "architect",
"stage": "design",
"state": "done",
"message": "Diseño F-006 aprobado"
},
{
"ts": "2026-08-15T07:07:20Z",
"agent": "implementer",
"stage": "build",
"state": "running",
"message": "Implementando users + RBAC"
},
{
"ts": "2026-08-15T07:22:07Z",
"agent": "implementer",
"stage": "build",
"state": "done",
"message": "Build F-006 completo: users + RBAC, tests y verify verdes"
},
{
"ts": "2026-08-15T07:22:07Z",
"agent": "reviewer",
"stage": "review_gate",
"state": "running",
"message": "Revisando users + RBAC"
},
{
"ts": "2026-08-15T07:23:01Z",
"agent": "reviewer",
"stage": "review_gate",
"state": "done",
"message": "Review gate F-006 APPROVED"
},
{
"ts": "2026-08-15T07:23:01Z",
"agent": "security",
"stage": "security_gate",
"state": "running",
"message": "Audit users + RBAC"
},
{
"ts": "2026-08-15T07:23:41Z",
"agent": "security",
"stage": "security_gate",
"state": "done",
"message": "Security gate F-006 APPROVED"
},
{
"ts": "2026-08-15T07:23:41Z",
"agent": "qa",
"stage": "qa_gate",
"state": "running",
"message": "Validación users + RBAC"
},
{
"ts": "2026-08-15T07:24:24Z",
"agent": "qa",
"stage": "qa_gate",
"state": "done",
"message": "QA gate F-006 APPROVED"
},
{
"ts": "2026-08-15T07:24:24Z",
"agent": "implementer",
"stage": "build",
"state": "running",
"message": "Actualización README requerida por document"
},
{
"ts": "2026-08-15T07:25:35Z",
"agent": "implementer",
"stage": "build",
"state": "done",
"message": "README users + RBAC documentado"
},
{
"ts": "2026-08-15T07:25:35Z",
"agent": "documenter",
"stage": "document",
"state": "running",
"message": "Cerrando documentación"
},
{
"ts": "2026-08-15T07:25:55Z",
"agent": "documenter",
"stage": "document",
"state": "done",
"message": "Docs F-006 completas"
},
{
"ts": "2026-08-15T07:25:56Z",
"agent": "leader",
"stage": "close",
"state": "running",
"message": "Verificación final antes de cerrar"
},
{
"ts": "2026-08-15T07:27:44Z",
"agent": "leader",
"stage": "close",
"state": "done",
"message": "F-006 cerrada con gates aprobados"
}
]
}