josemoreupeso.es
06-score-estado.md β€” TLOTP
# πŸ“Š MΓ³dulo 06 β€” Score y Estado del Reino

## PropΓ³sito

Calcular la puntuaciΓ³n de seguridad (0–100) a partir de todos los hallazgos
recolectados por los scanners, determinar el estado narrativo LOTR y presentar
el veredicto al usuario antes de iniciar el flujo asistido.

---

## PASO 1 β€” Unificar hallazgos

Combinar todos los arrays producidos por los scanners ejecutados:

```
HALLAZGOS = AGENTES_HALLAZGOS
         + SKILLS_HALLAZGOS
         + MCPS_HALLAZGOS
         + CONFIGS_HALLAZGOS
         + TLOTP_HALLAZGOS     (si se ejecutΓ³ el auto-anΓ‘lisis)
```

Contar hallazgos por severidad:

- `N_CRITICOS`  = cuantos con `severidad: "critico"`
- `N_ALTOS`     = cuantos con `severidad: "alto"`
- `N_MEDIOS`    = cuantos con `severidad: "medio"`
- `N_INFO`      = cuantos con `severidad: "info"`

---

## PASO 2 β€” Calcular el score

Aplicar la fΓ³rmula:

```
DEDUCCION = (N_CRITICOS Γ— 25) + (N_ALTOS Γ— 15) + (N_MEDIOS Γ— 5) + (N_INFO Γ— 1)

SCORE = max(0, 100 - DEDUCCION)
```

**Notas**:
- El score **nunca** baja de 0 (aunque la deducciΓ³n teΓ³rica fuera 500+)
- El score es entero
- Si no hay ningΓΊn hallazgo (reino limpio), `SCORE = 100`

---

## PASO 3 β€” Determinar el estado narrativo

Mapear el `SCORE` al estado correspondiente:

| Rango     | Estado narrativo                                                             |
|-----------|------------------------------------------------------------------------------|
| `90–100`  | *"El Bosque Antiguo estΓ‘ en paz. El Anillo duerme."*                         |
| `70–89`   | *"Hay murmullos en los matorrales. Permanece alerta."*                       |
| `50–69`   | *"Sombras se agitan en el este. Tom huele el peligro."*                      |
| `25–49`   | *"Mordor llama a tus puertas. El reino estΓ‘ en riesgo."*                     |
| `0–24`    | *"El Ojo de Sauron te observa. AcciΓ³n inmediata necesaria."*                 |

Mapear tambiΓ©n el estado a un emoji de alerta:

| Rango     | Emoji |
|-----------|-------|
| `90–100`  | 🟒    |
| `70–89`   | 🟑    |
| `50–69`   | 🟑    |
| `25–49`   | 🟠    |
| `0–24`    | πŸ”΄    |

---

## PASO 4 β€” Presentar el veredicto

Mostrar el siguiente banner, reemplazando los placeholders con los valores
reales calculados:

```
══════════════════════════════════════════════════════════════
🌾 EL VEREDICTO DE TOM BOMBADIL
══════════════════════════════════════════════════════════════

  PUNTUACIΓ“N DE SEGURIDAD: {SCORE} / 100

  {EMOJI_ESTADO} "{ESTADO_NARRATIVO}"

──────────────────────────────────────────────────────────────
  πŸ”΄ CrΓ­ticos  Β·  {N_CRITICOS}   (-25 c/u = -{N_CRITICOS * 25})
  🟠 Altos     ·  {N_ALTOS}      (-15 c/u = -{N_ALTOS * 15})
  🟑 Medios    ·  {N_MEDIOS}     (-5 c/u = -{N_MEDIOS * 5})
  🟒 Info      ·  {N_INFO}       (-1 c/u = -{N_INFO * 1})
──────────────────────────────────────────────────────────────
  Total de hallazgos: {TOTAL}
  Tom te guiarΓ‘ uno a uno. ΒΏComenzamos?
══════════════════════════════════════════════════════════════
```

**OmisiΓ³n condicional**: si una categorΓ­a tiene 0 hallazgos, puede omitirse
la lΓ­nea correspondiente para limpiar la salida.

Si el total es 0:

```
══════════════════════════════════════════════════════════════
🌾 EL VEREDICTO DE TOM BOMBADIL
══════════════════════════════════════════════════════════════

  PUNTUACIΓ“N DE SEGURIDAD: 100 / 100   ✨

  🟒 "El Bosque Antiguo estÑ en paz. El Anillo duerme."

──────────────────────────────────────────────────────────────
  No se ha detectado ningΓΊn comportamiento sospechoso.
  Tom Bombadillo se retira a su casa, complacido.
══════════════════════════════════════════════════════════════
```

En este caso, saltar directamente al loop del `tom-bombadil-main.md`
(volver al menΓΊ de escaneo), sin pasar por el mΓ³dulo 07.

---

## PASO 5 β€” Pregunta para iniciar el flujo asistido

Si hay al menos un hallazgo, preguntar con `AskUserQuestion`:

```json
{
  "questions": [{
    "header": "Tom Bombadil β€” ΒΏComenzamos a purificar?",
    "question": "🌾 Tom ha reunido los hallazgos. ¿Quieres revisarlos uno a uno?",
    "multiSelect": false,
    "options": [
      {
        "label": "βœ… SΓ­, Tom me guΓ­a hallazgo a hallazgo",
        "description": "Flujo asistido con 4 opciones por cada hallazgo"
      },
      {
        "label": "⏭️  Ahora no, volver al menú",
        "description": "Dejar el reino como estΓ‘ y volver al menΓΊ principal"
      }
    ]
  }]
}
```

- Si elige **SΓ­**: continuar con el mΓ³dulo `07-workflow-hallazgos.md`.
- Si elige **Ahora no**: volver al menΓΊ principal de Tom Bombadil.

---

## Guardar el score inicial

Registrar `SCORE_INICIAL = SCORE` para usarlo en el resumen final del
mΓ³dulo 07.

---

**MΓ³dulo**: `06-score-estado.md`
**Invocado desde**: `tom-bombadil-main.md` (PASO 4)
**Siguiente**: `07-workflow-hallazgos.md` (si el usuario acepta purificar)