# π¨ 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