josemoreupeso.es
07-workflow-hallazgos.md β€” TLOTP
# πŸ”¨ MΓ³dulo 07 β€” Workflow Asistido Hallazgo a Hallazgo

## PropΓ³sito

Guiar al usuario a travΓ©s de cada hallazgo individualmente, presentando una
ficha detallada y 4 opciones de acciΓ³n (aplicar, saltar, modificar, salir).
Al terminar, mostrar el resumen final con el score actualizado.

---

## PASO 1 β€” Ordenar los hallazgos por severidad

Ordenar el array `HALLAZGOS` en orden descendente de severidad:

```
Orden: critico > alto > medio > info
```

En caso de empate (dos hallazgos con la misma severidad), mantener el
orden de recolecciΓ³n original (agentes β†’ skills β†’ MCPs β†’ configs β†’ TLOTP).

Registrar `TOTAL = len(HALLAZGOS)`.

---

## PASO 2 β€” Inicializar contadores

```
APLICADOS     = 0
SALTADOS      = 0
MODIFICADOS   = 0
ACTUAL        = 1   # Γ­ndice 1-based
```

---

## PASO 3 β€” Loop por hallazgo

Para cada hallazgo `H` en el orden definido:

### 3.1 β€” Mostrar la ficha

```
══════════════════════════════════════════════════════════════
🌾 HALLAZGO {ACTUAL}/{TOTAL} β€” {EMOJI_SEVERIDAD} {SEVERIDAD_UPPER}
══════════════════════════════════════════════════════════════
πŸ“ Fichero: {H.fichero}

πŸ” PROBLEMA DETECTADO
   {H.descripcion}

πŸ’€ CASO DE USO MALICIOSO CONOCIDO
   {H.caso_uso_malicioso}

πŸ“Œ FRAGMENTO SOSPECHOSO (lΓ­neas {H.linea_inicio}–{H.linea_fin})
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ {H.fragmento}                                            β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ’Š SOLUCIΓ“N PROPUESTA
   {H.solucion_propuesta}

══════════════════════════════════════════════════════════════
```

**Mapping de severidad a emoji y texto**:

| severidad | emoji | texto uppercase |
|-----------|-------|-----------------|
| critico   | πŸ”΄    | CRÍTICO         |
| alto      | 🟠    | ALTO            |
| medio     | 🟑    | MEDIO           |
| info      | 🟒    | INFO            |

### 3.2 β€” Pregunta de acciΓ³n

```json
{
  "questions": [{
    "header": "Tom Bombadil β€” AcciΓ³n sobre hallazgo",
    "question": "🌾 ¿Qué hacemos con este hallazgo?",
    "multiSelect": false,
    "options": [
      {
        "label": "βœ… Aplicar la soluciΓ³n propuesta",
        "description": "Tom ejecuta la soluciΓ³n que te ha mostrado"
      },
      {
        "label": "⏭️  Saltar",
        "description": "Dejar el fichero como estΓ‘ y pasar al siguiente hallazgo"
      },
      {
        "label": "✏️  Modificar antes de aplicar",
        "description": "Ajustar la soluciΓ³n antes de tocar el fichero"
      },
      {
        "label": "🚫 Salir del flujo",
        "description": "Abandonar. Los hallazgos restantes quedan sin revisar."
      }
    ]
  }]
}
```

### 3.3 β€” Ejecutar la acciΓ³n elegida

#### βœ… Aplicar

- Usar **Edit** (o **Write** si el cambio es amplio) sobre `H.fichero`
  para implementar exactamente `H.solucion_propuesta`.
- Si la soluciΓ³n implica eliminar un fichero completo (ej: agente malicioso
  irrecuperable), confirmar adicionalmente con `AskUserQuestion` antes de
  ejecutar `rm` con Bash.
- `APLICADOS += 1`
- Mostrar:
  ```
  βœ… Aplicado. El fichero ha sido purificado.
  ```

#### ⏭️ Saltar

- No tocar el fichero.
- `SALTADOS += 1`
- Mostrar:
  ```
  ⏭️  Hallazgo saltado. El fichero queda intacto.
  ```

#### ✏️ Modificar

- Preguntar al usuario en formato libre: *"ΒΏCΓ³mo quieres ajustar la soluciΓ³n?"*
- Con su respuesta, componer una soluciΓ³n revisada.
- Mostrar la nueva soluciΓ³n propuesta con `AskUserQuestion` (βœ… Aplicar /
  ⏭️ Saltar / 🚫 Salir). No volver a ofrecer "Modificar" para evitar bucles.
- Si aplica la soluciΓ³n revisada: `MODIFICADOS += 1`
- Si finalmente salta: `SALTADOS += 1`

#### 🚫 Salir

- Romper el loop inmediatamente.
- Los hallazgos no revisados no cuentan en ningΓΊn contador.
- Mostrar:
  ```
  🚫 Saliendo del flujo. Los hallazgos restantes quedan sin revisar.
  ```
- Continuar al PASO 4.

### 3.4 β€” Avanzar

`ACTUAL += 1`. Volver a 3.1 con el siguiente hallazgo hasta terminar
todos los hallazgos o haberse salido del flujo.

---

## PASO 4 β€” Recalcular el score final

Restar del `DEDUCCION` original los puntos que corresponden a los
hallazgos `APLICADOS` y `MODIFICADOS` (los `SALTADOS` y los no revisados
siguen restando).

FΓ³rmula:

```
DEDUCCION_FINAL = DEDUCCION_INICIAL
  - (puntos de todos los APLICADOS + MODIFICADOS segΓΊn su severidad)

SCORE_FINAL = max(0, min(100, 100 - DEDUCCION_FINAL))
```

---

## PASO 5 β€” Mostrar resumen final

```
══════════════════════════════════════════════════════════════
🌾 TOM BOMBADIL β€” MISIΓ“N COMPLETADA
══════════════════════════════════════════════════════════════

  PUNTUACIΓ“N INICIAL:  {SCORE_INICIAL} / 100
  PUNTUACIΓ“N FINAL:    {SCORE_FINAL} / 100  {EMOJI_FINAL}

  "{ESTADO_NARRATIVO_FINAL}"

──────────────────────────────────────────────────────────────
  βœ… Aplicados   Β·  {APLICADOS}
  ⏭️ Saltados    ·  {SALTADOS}
  ✏️ Modificados ·  {MODIFICADOS}
──────────────────────────────────────────────────────────────
  "Buen trabajo, viajero. Tom Bombadillo descansa.
   Pero volverΓ‘ a patrullar cuando lo necesites."
══════════════════════════════════════════════════════════════
```

Donde `{ESTADO_NARRATIVO_FINAL}` se obtiene aplicando la tabla del
módulo 06 al `SCORE_FINAL`, y `{EMOJI_FINAL}` es `✨` si
`SCORE_FINAL >= 90`, si no el emoji del rango correspondiente.

---

## PASO 6 β€” SesiΓ³n efΓ­mera: NO guardar informe

**No crear ningΓΊn fichero de informe**. Toda la informaciΓ³n mostrada
queda solo en la sesiΓ³n. El usuario que quiera conservarla puede
copiar la salida manualmente.

---

## PASO 7 β€” Volver al menΓΊ principal

Tras mostrar el resumen, devolver el control al loop continuo de
`tom-bombadil-main.md` (PASO 6), que ofrecerΓ‘:

- Volver al menΓΊ de escaneo
- Volver a La Comunidad del CΓ³digo
- Salir de TLOTP

---

**MΓ³dulo**: `07-workflow-hallazgos.md`
**Invocado desde**: `tom-bombadil-main.md` (PASO 5) o desde `06-score-estado.md`
**Requiere**: Read, Edit, Write, Bash, AskUserQuestion