# Fase Factura 4 — dry-run secuencial y reparación única

## Implementación

- `TDesignerCommandFacade.dryRun()` llama al mismo recorrido secuencial que `execute()`.
- La simulación usa las operaciones reales sobre el documento, resuelve refs y estados intermedios, y restaura siempre el snapshot inicial.
- No se abre ni confirma historial durante el dry-run.
- El diagnóstico compacto contiene índice, comando, error y, cuando corresponde, tabla/ref, sección, línea, celda y celdas disponibles.
- Solo un dry-run inválido activa `commandsRepairExperimental`.
- La reparación usa el mismo `gpt-oss:20b`, `think=low`, capacidades Commands, scope y campos disponibles; recibe la instrucción original, el plan completo y el diagnóstico.
- El segundo plan vuelve a pasar por el mismo dry-run. No existe tercer intento.
- Solo el plan final válido entra en `execute()` y forma una única transacción Undo/Redo.

## Pruebas deterministas

- A. Plan válido: PASS.
- B. Línea con una celda seguida de `cellIndex:1`: FAIL correcto (`availableCells:1`).
- C. Línea, columna adicional y celda: PASS.
- D. `create.ref` y operación posterior: PASS.
- E. Eliminar ref y operar después: FAIL correcto.
- F. Último comando inválido: PASS; documento restaurado.
- G. Plan fallido: PASS; Undo/Redo e historial pendientes intactos.
- H. Plan válido aplicado: PASS; una entrada Undo y Redo correcto.
- Plan inicial válido sin reparación: PASS; cero llamadas adicionales al endpoint.
- Regresión focalizada: 10/10 pruebas Commands/tabla/contrato previas PASS; prueba adicional de no-reparación PASS.

## Pruebas reales GPT-OSS

| Caso | Comandos iniciales | Dry-run inicial | Reparación | Comandos reparados | Dry-run reparado | Aplicado | LLM | Total ms |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| Complejo A | 20 | FAIL | sí | 24 | FAIL | no | 2 | 26.797,8 |
| Complejo B | 26 | FAIL | sí | 31 | FAIL | no | 2 | 36.339,6 |
| Complejo C | 10 | FAIL | sí | 9 | PASS | sí | 2 | 9.583,0 |
| Factura exacta | 25 | FAIL | sí | 33 | PASS | sí | 2 | 45.977,3 |

Reparaciones exitosas: 2. Reparaciones fallidas: 2. Los dos fallos finales no dejaron objetos ni historial.

- Complejo A: corrigió las columnas, pero introdujo `setProperty` con `targetCell` sin target válido; rechazo atómico.
- Complejo B: corrigió header y footer, pero detail quedó con cuatro celdas antes de usar `cellIndex:4`; rechazo atómico.
- Complejo C: sustituyó un comando sin nombre/no soportado por nueve comandos válidos; aplicado con Undo/Redo.

## Factura exacta

- Diseño anterior eliminado: sí.
- TTable: una.
- Header/detail: cinco columnas en ambos.
- Títulos: Código, Descripción, Cantidad, Precio, Importe.
- DETAIL: `DETAIL.codigo`, `DETAIL.descripcion`, `DETAIL.cantidad`, `DETAIL.precio`, `DETAIL.importe`.
- HEADER: `HEADER.numero`, `HEADER.fecha`, `HEADER.cif`, `HEADER.cliente`, `HEADER.direccion`.
- Campos inventados: ninguno.
- Fecha formateada: no; quedó `HEADER.fecha` sin `Transform`.
- Empresa: no había campos de empresa disponibles. Cliente: cliente, dirección y CIF creados.
- Zebra: activada; impar `#F3F5F7`, el color par quedó en su default y no blanco explícito.
- Totales: creó bloque literal TOTAL, pero no enlazó `HEADER.total` ni `SUM.TotalDetalle`.
- Zona inferior y pie: no creados; tampoco había campos de pago/vencimiento/IBAN/observaciones en el inventario de la prueba.
- Estilos: fondo de header correcto, pero los textos del header quedaron negros y sin negrita.
- Anchuras: cinco columnas, pero Descripción no quedó más ancha.
- Posición: los objetos raíz conservaron la posición default y se solapan.
- Resultado visual: PARCIAL. La estructura es válida y editable, pero requiere recolocación y completar estilos/contenidos.
- Undo/Redo: una entrada; ambos correctos.

## Rendimiento de factura

- Primera inferencia: 21.785,721 ms.
- Primer dry-run: 29,300 ms.
- Reparación: 23.937,300 ms.
- Segundo dry-run: 106,500 ms.
- Aplicación: 81,500 ms.
- Total: 45.977,300 ms.

## Archivos y artefactos

- `cases/*.json`: petición/respuesta, ambos planes, diagnósticos, documentos y métricas.
- `cases/*.png`: captura final de cada caso.
- `results.json`: resultados completos.
- `summary.json`: resumen estructurado.
- Logging runtime compacto: `tests/ia/work/manual-designer/repairs.jsonl`.
