# QUALITY-REPORT.md — [Fase/Feature]

**Fecha**: [YYYY-MM-DD]
**Evaluador**: [agente o persona responsable]
**Proyecto**: [nombre-del-proyecto]
**Commit/PR**: [hash corto o número de PR]

---

## Score Final: [X.X / 10.0] — [VEREDICTO]

> Umbrales: **9.0-10.0** = APROBADO | **7.0-8.9** = APROBADO CON OBSERVACIONES | **5.0-6.9** = RECHAZADO | **<5.0** = RECHAZADO CRÍTICO

---

## Desglose de métricas

| # | Métrica | Peso | Puntuación | Score ponderado |
|---|---------|------|-----------|----------------|
| 1 | Bugs encontrados | 25% | [X.X]/10 | [X.X × 0.25 = Y.Y] |
| 2 | Cobertura de tests | 20% | [X.X]/10 | [X.X × 0.20 = Y.Y] |
| 3 | Conformidad con spec | 20% | [X.X]/10 | [X.X × 0.20 = Y.Y] |
| 4 | Alucinaciones de código | 15% | [X.X]/10 | [X.X × 0.15 = Y.Y] |
| 5 | Principio DRY | 10% | [X.X]/10 | [X.X × 0.10 = Y.Y] |
| 6 | Seguridad SIGAF | 5% | [X.X]/10 | [X.X × 0.05 = Y.Y] |
| 7 | Arquitectura | 5% | [X.X]/10 | [X.X × 0.05 = Y.Y] |
| **TOTAL** | | **100%** | | **[SCORE FINAL]** |

---

## Hallazgos por métrica

### M1 — Bugs encontrados ([X.X]/10)

**Método**: `pytest -v` / `npm test` / `mypy .` / `ruff check .`

| Severidad | Descripción | Archivo / línea |
|-----------|-------------|----------------|
| Mayor | [descripción] | [ruta:línea] |
| Menor | [descripción] | [ruta:línea] |

> Si no hay bugs: _Sin bugs encontrados._

---

### M2 — Cobertura de tests ([X.X]/10)

**Comando ejecutado**: `pytest --cov=. --cov-report=term-missing`

| Módulo | Cobertura |
|--------|-----------|
| [módulo] | [X]% |
| **Total** | **[X]%** |

**Observaciones**: [notas sobre branches sin cubrir, tests sin assertions, etc.]

---

### M3 — Conformidad con spec ([X.X]/10)

**Criterios de aceptación revisados**:

| # | Criterio | Estado | Nota |
|---|----------|--------|------|
| 1 | [criterio del CONTEXT.md / PLAN.md] | PASS / FAIL | [nota] |
| 2 | [criterio] | PASS / FAIL | |

**Penalizaciones aplicadas**:
- [ ] -1.0: Feature implementada diferente a la spec sin notificación
- [ ] -0.5: Feature parcialmente implementada sin documentar qué falta
- [ ] -1.5: Feature de seguridad omitida

---

### M4 — Alucinaciones de código ([X.X]/10)

| Tipo | Descripción | Severidad |
|------|-------------|-----------|
| [Import inexistente / Firma incorrecta / Lógica falsa] | [descripción] | Mayor / Menor |

> Si no hay alucinaciones: _Sin alucinaciones detectadas._

---

### M5 — Principio DRY ([X.X]/10)

**Violaciones encontradas**:

| Tipo | Ubicación | Descripción |
|------|-----------|-------------|
| Función duplicada | [ruta] | [descripción] |
| Lógica repetida | [ruta] | [descripción] |

> Si no hay violaciones: _Sin violaciones DRY encontradas._

---

### M6 — Seguridad SIGAF ([X.X]/10)

| Item | Estado |
|------|--------|
| `selectinload` en todas las relaciones serializadas | PASS / FAIL |
| `lazy="selectin"` en relaciones a `Usuario` | PASS / FAIL |
| Services no hacen `db.commit()` | PASS / FAIL |
| `Literal[]` en campos enum en schemas Pydantic | PASS / FAIL |
| RBAC en todos los `POST`/`PUT`/`DELETE` | PASS / FAIL |
| `get_current_user` explícito en todos los endpoints | PASS / FAIL |
| Filtros de datos del JWT, no de query params | PASS / FAIL |
| `@if`/`@for` en Angular (no `*ngIf`/`*ngFor`) | PASS / FAIL / N/A |
| `computed()` para derivaciones en templates Angular | PASS / FAIL / N/A |

---

### M7 — Arquitectura ([X.X]/10)

| Item | Estado |
|------|--------|
| Services no importan modelos de otros dominios directamente | PASS / FAIL |
| Endpoints sin lógica de negocio incrustada | PASS / FAIL |
| Componentes Angular usan services para HTTP | PASS / FAIL / N/A |
| Modelos ORM sin lógica de negocio compleja | PASS / FAIL |
| Nuevas dependencias justificadas y documentadas | PASS / FAIL |

---

## Plan de mejora

> Rellenar solo si el score es menor a 9.0.

| Acción correctiva | Métrica afectada | Impacto estimado en score | Tiempo estimado | Prioridad |
|-------------------|-----------------|--------------------------|----------------|-----------|
| [descripción de la acción] | M[N] | +[X.X] | [Xh / Xd] | Alta / Media / Baja |

---

## Decisión

- [ ] **Aprobar** — Score ≥ 9.0, continuar con siguiente fase
- [ ] **Aprobar con compromisos** — Score 7.0-8.9, mejoras antes de siguiente fase
- [ ] **Rechazar** — Score < 7.0, requiere iteración con plan de mejora

**Observaciones del evaluador**:

> [Texto libre con contexto adicional, riesgos identificados o recomendaciones.]

---

_Generado con la habilidad `checklist-calidad` del sistema SWL._
