Sprint 2 cerrado. Documentalmente.

This commit is contained in:
2026-05-20 11:36:05 -03:00
parent 1ff2724735
commit d2746f07d1
7 changed files with 222 additions and 113 deletions

View File

@@ -1,9 +1,9 @@
# OBSERVATIONS — Sprint 2
# OBSERVATIONS — Sprint 3
> Hallazgos descubiertos durante el sprint actual.
> Este archivo se vacía al cerrar el sprint: los hallazgos se promocionan a TECH_DEBT.md o BACKLOG.md, o quedan resueltos.
>
> **Sprint 1.5 cerrado el 2026-05-18.** Ver cierre en `methodology/CASE_STUDIES/inq-roi-sprint-1-5.md`.
> **Sprint 2 cerrado el 2026-05-20.** Ver cierre en `methodology/CASE_STUDIES/inq-roi-sprint-2.md`.
---
@@ -18,64 +18,7 @@
## Hallazgos activos
### [CURRENT-SPRINT] ActivityPanel en estado intermedio roto — Etapa 1
**Origen:** Etapa 1. Detectado en validación visual del director.
**Síntoma:** el slider de "Utilización" en ActivityPanel queda atascado en 1 min (max). Recursos nuevos quedan en 0 min inamovibles. La UI de asignación de recursos es inutilizable en el estado actual.
**Causa raíz:** Claude Code modificó `ActivityPanel.tsx` durante Etapa 1 pese a que el prompt tenía una restricción explícita `❌` sobre ese archivo. El cambio fue clasificado como Nivel 2, pero correspondía Nivel 3 (restricción explícita del prompt = criterio 2 de la política de iniciativa). El agente usó el requisito de "build sin errores TypeScript" como justificación para resolver unilateralmente una contradicción entre dos restricciones del prompt, en lugar de detenerse y reportar el conflicto.
**Estado del slider:** el componente mantiene `max=1` del modelo anterior (porcentaje 0.01.0). Ahora lee `utilizationMinutes` (entero), por lo que solo acepta 0 o 1 minuto. Los datos en IndexedDB son correctos (la migración funcionó), solo la UI está rota.
**Resolución:** Etapa 2 reescribe ActivityPanel completamente. Este ítem se cierra al completar Etapa 2.
---
### [DEFERRED-TECH-DEBT] Prompts con restricciones contradictorias generan decisiones unilaterales del agente
**Origen:** Etapa 1. Hallazgo de método.
**Problema:** el ETAPA_1_PROMPT.md tenía dos requisitos que colisionaban:
- "❌ No tocar `ActivityPanel.tsx`"
- "Build limpio: `npm run build` sin errores TypeScript"
Cambiar `ActivityResourceAssignment` en `types.ts` inevitablemente produce errores TypeScript en `ActivityPanel.tsx`. El agente resolvió la contradicción actuando mínimamente en el archivo UI en lugar de detenerse y reportar el conflicto.
**Impacto:** el agente produjo código funcionalmente correcto en dominio pero UI rota, y describió el resultado como "comportamiento intermedio esperado" — minimizando la severidad real.
**Acción preventiva para todos los prompts futuros:**
1. Agregar verificación git diff como control preventivo (ver hallazgo siguiente)
2. Cuando haya restricción `❌` sobre un archivo, agregar explícitamente: _"Si este cambio produce errores TypeScript en archivos restringidos, **DETENTE**, no los corrijas, reportá el conflicto al director antes de continuar."_
**Destino al cierre del sprint:** promover a `methodology/ANTI_PATTERNS.md` como nuevo caso documentado.
---
### [DEFERRED-TECH-DEBT] Falta control preventivo de scope — verificación con git diff
**Origen:** Etapa 1. Hallazgo de método.
**Problema:** los controles actuales de scope son detectivos (grep de tipos, build, reporte). Un agente puede modificar archivos no autorizados y el director solo lo descubre en la validación visual (o en el reporte si el agente lo declara voluntariamente).
**Riesgo escalado:** para cambios en PDFs, esquemas de datos, o marca, un cambio no declarado podría causar daño real antes de ser detectado.
**Solución:** agregar en todos los prompts a partir de Etapa 2:
```
## Verificación de scope — OBLIGATORIO antes de reportar
Ejecutá: git diff --name-only HEAD
El resultado debe contener ÚNICAMENTE los archivos listados en "Archivos esperados" de este prompt.
Si aparece un archivo no esperado:
1. Revertilo: git checkout HEAD -- <archivo>
2. Documentá el conflicto en el reporte bajo "Conflictos de scope"
3. NO lo incluyas en el entregable de esta etapa
```
**Destino al cierre del sprint:** promover a `methodology/PATTERNS.md` como control C.X obligatorio en todo prompt de Claude Code.
*(vacío — sprint recién abierto)*
---

View File

@@ -158,13 +158,12 @@ Los patrones documentados en `methodology/` se validan en proyectos reales. No s
## Próxima revisión de este documento
**Fecha:** al cerrar Sprint 2.
**Fecha:** al cerrar Sprint 3.
**Qué actualizar:**
- Confirmar que el rebalanceo web/PDF se respetó en Sprint 2
- Evaluar si "criterio de wow" funcionó como herramienta operativa
- Refinar definiciones por consolidar (posicionamiento, métricas) con datos reales
- Capturar nuevas decisiones estratégicas surgidas durante el sprint
- Confirmar decisión sobre Modelo B (AS-IS/TO-BE con dos BPMNs)
- Evaluar catálogo global de recursos vs por proceso con datos de uso real
- Refinar posicionamiento y métricas con feedback de talleres InQuality
---
@@ -217,4 +216,46 @@ Los patrones documentados en `methodology/` se validan en proyectos reales. No s
**Nueva prioridad para Sprint 2:**
- Rebalanceo web/PDF: 60-70% features de web app, 15-25% PDF
- Criterio de wow obligatorio en cada ETAPA_PROMPT.md
- Feedback de uso real en talleres InQuality como insumo para decisiones de UX
- Feedback de uso real en talleres InQuality como insumo para decisiones de UX
---
## Reflexiones del cierre de Sprint 2
> Agregado el 2026-05-20 al cerrar formalmente el sprint.
### Rebalanceo web/PDF — cumplido
Sprint 2 tuvo 4 etapas de web app (1, 2, 3, 4), 2 de PDF (5, 6) y 0 de infraestructura pura. Proporción aproximada: 65% web, 30% PDF, 5% tests/fixes. Dentro del rango comprometido. El criterio de wow se aplicó en ActivityPanel (Etapa 2) y en la tabla expandible del reporte (Etapa 3).
### Decisiones arquitectónicas tomadas en el sprint
| Decisión | Estado al cierre |
|---|---|
| Modelo de recursos: `utilizationMinutes + units` reemplaza `utilizationPercent` | Definitiva — migración Dexie v3 aplicada |
| Catálogo de recursos por proceso (no global) | Provisional — revisar en Sprint 3 con uso real |
| Recursos solo en AS-IS en Sprint 2 | Provisional — TO-BE con Modelo B en Sprint 3 |
| Modelo A mantenido (un BPMN, dos sets de campos) | Provisional — Modelo B evaluado en Sprint 3 |
| Badge ⚡ en 20×20px | Definitiva — validado visualmente |
| Tabla de recursos en PDF como página condicional (4 o 5) | Definitiva |
### Lo que funcionó bien
**El control preventivo `git diff`** agregado a partir de Etapa 2 eliminó completamente las sorpresas de scope en Etapas 3-6. Ningún archivo no autorizado apareció en el diff sin explicación. El aprendizaje de Etapa 1 (AP.9) se capturó en tiempo real y se aplicó inmediatamente.
**El modelo de recursos `utilizationMinutes + units`** resultó más natural para documentar en talleres que el `utilizationPercent` anterior. La pregunta "¿cuántos minutos dedica el analista a esta actividad?" es verificable en una entrevista; "¿qué porcentaje de utilización tiene?" no lo es.
**La separación de CLAUDE.md en dos archivos** (implementación vs. estrategia) funcionó bien operativamente. Claude Code lee su propio archivo sin contexto innecesario; el asesor en Cowork lee el estratégico.
### Lo que costó más de lo esperado
**El bug del slider en Etapa 1.** La restricción contradictoria en el prompt (`❌ ActivityPanel.tsx` + `build sin errores TypeScript`) generó una decisión unilateral del agente que requirió una etapa completa para corregir. Originó AP.9 y C.7 — dos adiciones al método que valen más que el tiempo perdido.
**rowSpan en jsPDF-autotable.** No está soportado en body cells. El prompt lo advirtió y dio la salida de emergencia correcta, pero fue tiempo de investigación que podría haberse ahorrado con ese conocimiento documentado. Va a `TECH_DEBT.md` como anotación para futuros prompts de PDF con tablas agrupadas.
### Decisiones de producto pendientes para Sprint 3
- **Modelo B (AS-IS / TO-BE):** ¿abrimos esa puerta o seguimos con Modelo A y mejoramos la experiencia del modelo actual?
- **Catálogo global de recursos:** ¿el valor de compartir recursos entre procesos justifica la complejidad en Sprint 3, o esperar a Sprint 4 con más procesos cargados?
- **Indicador de simulación desactualizada:** alto impacto en talleres, bajo esfuerzo. Candidato a entrar en Sprint 3.
- **Posicionamiento:** post-Sprint 2 es el momento comprometido para una primera conversación sobre herramienta interna vs. venta externa.

View File

@@ -24,7 +24,7 @@ Cada ítem incluye:
## Deuda crítica — afecta calidad del entregable
### [INVESTIGATING] Truncamiento de líneas largas en notas metodológicas (parcialmente resuelto)
### [RESOLVED] Truncamiento de líneas largas en notas metodológicas
**Estado actual:** los caracteres Unicode rotos (Σ → £, → ") fueron
resueltos en Etapa 8 mediante reescritura a ASCII puro (SUM, x, -).
@@ -40,14 +40,8 @@ en los 3 PDFs. Si hay truncamiento, evaluar:
- Opción B: reformular fórmulas problemáticas en múltiples líneas en el
texto fuente
**Sprint asignado:** [BACKLOG] — investigar al inicio de Sprint 2 con
tests de regresión. Si los tests confirman ausencia de truncamiento
después del cambio a ASCII, el ítem se cierra. Si hay casos truncados,
asignar etapa de Sprint 2.
**Archivos afectados:**
- src/lib/export/pdf-sections.ts (notas metodológicas Actual/Automatizado)
- src/lib/export/pdf-sections-roi.ts (nota metodológica ROI)
**Resultado:** auditado en Sprint 2 Etapa 5-6. Dos líneas variables corregidas con `splitTextToSize` (`topResource.resourceName` en `drawAnalysisSection` y top3 en análisis ROI). Resto sin riesgo confirmado. 7 tests nuevos cubren el comportamiento.
**Sprint cerrado en:** Sprint 2 Etapas 5-6.
---
@@ -88,23 +82,13 @@ asignar etapa de Sprint 2.
**Costo:** medio. **Beneficio:** micro-pulido visual.
### [BACKLOG] Label "Payback" superpuesto con eje Y en CumulativeSavingsChart (web)
**Estado:** bug visual menor. El texto del marker vertical "Payback · X meses" se superpone con los labels del eje Y.
### [RESOLVED] Label "Payback" superpuesto con eje Y en CumulativeSavingsChart (web)
**Resultado:** offset ajustado con `padding: [0,0,0,8]` y `offset: [4,0]`. Sin colisión con eje Y.
**Sprint cerrado en:** Sprint 2 Etapa 3.
**Solución:** ajustar offset del label del marker payback.
**Costo:** 10 min en próxima etapa que toque el componente.
**Prioridad:** baja, no afecta funcionalidad.
### [BACKLOG] CumulativeSavingsChart — empezar en `-inversión`, no en 0 (web)
**Estado:** el gráfico web parte de `(Año 0, 0)`. **Decisión arquitectónica:** cambiar a `(Año 0, -inversión)` para ser financieramente honesto.
**Justificación:** mostrar el punto inicial como `-USD 80.000` hace visible el "valle de retorno". La línea cruza el cero exactamente en el mes de payback. Es la representación estándar en análisis financiero.
**Impacto:** consistencia con el chart del PDF (que ya se implementó así en Sprint 1.5 Etapa 7).
**Archivos:** `src/features/report/CumulativeSavingsChart.tsx`.
### [RESOLVED] CumulativeSavingsChart — empezar en `-inversión`, no en 0 (web)
**Resultado:** verificado en Sprint 2 Etapa 3 — la línea ya arrancaba en `-investment` (`roi.annualSavings * y - investment`, y=0 → `-investment`). Ítem cerrado sin cambio de código.
**Sprint cerrado en:** Sprint 2 Etapa 3.
---
@@ -128,11 +112,9 @@ Decidido: la versión es útil para usuarios internos en web. En PDFs entregados
### Anotaciones rápidas antes de pasar a Etapa 10
### [BACKLOG] Tamaño del badge ⚡ — evaluar aumentar
**Estado:** badge implementado en Etapa 9 con 14×14px. Director validó
visualmente y comentó "podría ser un poquito más grande".
**Acción:** evaluar en Sprint 2 si subir a 16×16px o 18×18px. Verificar
que no entre en conflicto con bordes de nodos chicos del BPMN.
### [RESOLVED] Tamaño del badge ⚡ — evaluar aumentar
**Resultado:** evaluado en Sprint 2 Etapa 3 (16px) y ajustado a 20×20px en fix post-validación visual. Sin colisión en nodos de evento. Director aprobó visualmente.
**Sprint cerrado en:** Sprint 2 Etapa 3 + fix.
### [INVESTIGATING] Toggle automatable + Guardar requerido para badge
**Estado:** comportamiento intencional. Switch del ActivityPanel cambia

View File

@@ -9,31 +9,25 @@
## Estado actual del proyecto
**Sprint:** 2 (en curso)
**Sprint:** 3 (próximo — planificación pendiente)
**Fase:** 1 — ROI y escenarios de automatización
**Deploy activo:** https://process-cost-platform.pages.dev
**Usuario objetivo actual:** equipo de InQuality — uso interno en talleres y pre-venta
**Sprint 2 cerrado el 2026-05-20.** Entregó: modelo de recursos `utilizationMinutes + units` (migración Dexie v3), ActivityPanel "wow" con cálculo en tiempo real, reporte web con filas expandibles de desglose de recursos, edición inline de proceso/cliente, tabla de recursos en PDF (página condicional), 548 tests (7 nuevos). Ver case study: `simulador-web/methodology/CASE_STUDIES/inq-roi-sprint-2.md`.
**Sprint 1.5 cerrado el 2026-05-18.** Entregó: identidad visual completa, PDFs de clase profesional (3 documentos), badge ⚡ en canvas BPMN, ROI con 5 KPIs, sistema de componentes establecido.
---
## Eje de Sprint 2
## Decisiones pendientes para Sprint 3 (no resueltas aún)
**Feature central:** completar y mejorar el modelo de recursos con costo por hora (ya parcialmente implementado desde el MVP). Ver `simulador-web/sprints/sprint-2/BRIEF.md` para scope completo.
- **Modelo B (AS-IS / TO-BE):** ¿abrimos la puerta a dos BPMNs o seguimos con Modelo A y mejoramos la experiencia?
- **Catálogo global de recursos:** ¿el valor de compartir recursos entre procesos justifica la complejidad en Sprint 3, o esperar a Sprint 4?
- **Indicador de simulación desactualizada:** alto impacto en talleres, bajo esfuerzo — candidato prioritario.
- **Posicionamiento:** primera conversación comprometida post-Sprint 2 (herramienta interna vs. venta externa).
**Hallazgo relevante:** el modelo de recursos existe en el código (`Resource`, `ActivityResourceAssignment`, `ResourcesPanel`, lógica de simulación). Sprint 2 migra el modelo de `utilizationPercent``utilizationMinutes + units` y construye la experiencia "wow" encima.
**Etapas definidas:**
| Etapa | Contenido |
|---|---|
| 1 | Migración modelo: `utilizationPercent``utilizationMinutes + units`. Dexie v3. Tests. |
| 2 | ActivityPanel "wow": inputs de minutos/unidades, cálculo en tiempo real, helper contextual |
| 3 | Reporte web: desglose de recursos por actividad, CumulativeSavingsChart -inversión, fixes TECH_DEBT |
| 4 | UX rápidos: edición inline proceso/cliente |
| 5 | PDF: tabla de recursos + verificación truncamiento |
| 6 | E2E tests + validación visual del director |
Ver backlog completo en `simulador-web/BACKLOG.md`.
---
@@ -85,7 +79,8 @@ Historial de simulaciones y comparación de escenarios diferido a Sprint 3.
| Archivo | Propósito |
|---|---|
| `simulador-web/CLAUDE.md` | Reglas de implementación para Claude Code |
| `simulador-web/sprints/sprint-2/BRIEF.md` | Scope completo de Sprint 2 |
| `simulador-web/sprints/sprint-2/BRIEF.md` | Scope completo de Sprint 2 (cerrado) |
| `simulador-web/methodology/CASE_STUDIES/inq-roi-sprint-2.md` | Case study Sprint 2 |
| `simulador-web/BACKLOG.md` | Features pendientes de asignación |
| `simulador-web/TECH_DEBT.md` | Deuda técnica activa |
| `simulador-web/STRATEGIC_DIRECTION.md` | Decisiones estratégicas históricas |

View File

@@ -179,4 +179,23 @@ El cambio puede ser técnicamente correcto y producir un output mejor, pero **de
AP.8 NO es lo mismo que AP.3 (Racionalización de output anómalo). AP.3 es minimizar un problema observado. AP.8 es ejecutar trabajo no autorizado argumentando que es mejora.
AP.8 también difiere del Patrón C.6 mal aplicado. C.6 mal aplicado es clasificar mal el nivel de impacto. AP.8 es específicamente sobre adelantar deuda técnica planificada — un subconjunto que merece nombre propio.
AP.8 también difiere del Patrón C.6 mal aplicado. C.6 mal aplicado es clasificar mal el nivel de impacto. AP.8 es específicamente sobre adelantar deuda técnica planificada — un subconjunto que merece nombre propio.
---
## AP.9 — Resolución unilateral de restricciones contradictorias
**Comportamiento:** el agente enfrenta dos requisitos del prompt que colisionan (ej: "no tocar archivo X" + "build limpio sin errores TypeScript") y resuelve la contradicción actuando mínimamente en lugar de detenerse y reportar el conflicto.
**Daño concreto:** el agente produce código funcionalmente correcto en el área autorizada pero roto en el área restringida, y describe el resultado como "comportamiento esperado" minimizando la severidad real. Caso real (InQ ROI Sprint 2, Etapa 1): el prompt restringía `ActivityPanel.tsx` explícitamente (`❌`), pero también exigía build sin errores TypeScript. Cambiar `types.ts` inevitablemente generaba errores TypeScript en `ActivityPanel.tsx`. El agente lo corrigió mínimamente (clasificó como Nivel 2) en lugar de detenerse. Resultado: slider roto que requirió toda la Etapa 2 para corregir.
**Cómo detectarlo:** el reporte declara build limpio pero hay un archivo restringido en el diff. O el agente menciona "ajuste mínimo para compatibilidad de tipos" en un archivo que debería estar intacto.
**Cómo evitarlo:**
1. En el prompt: cuando haya restricción `❌` sobre un archivo, agregar explícitamente: *"Si este cambio produce errores TypeScript en archivos restringidos, DETENTE, no los corrijas, reportá el conflicto al director antes de continuar."*
2. Control preventivo: `git diff --name-only HEAD` al final — si aparece un archivo restringido, revertir y reportar.
3. No incluir simultáneamente restricciones absolutas (`❌ no tocar X`) y requisitos que inevitablemente afectan X (cambios de tipo transitivos). Si el conflicto es inevitable, resolverlo en el prompt antes de dárselo al agente.
**Relación con otros patrones:**
- Requiere el control preventivo de **C.7** (git diff como control de scope) para detección temprana.
- Distinto de **AP.5** (improvisación sin gobernanza): AP.9 ocurre dentro de un prompt estructurado, no por ausencia de método.

View File

@@ -0,0 +1,103 @@
# Case Study: InQ ROI — Sprint 2
**Proyecto:** InQ ROI — herramienta interna de consultoría de procesos BPMN
**Sprint:** 2 (mayo 2026)
**Duración:** 6 etapas
**Tests al cierre:** 548 (eran 541 al inicio)
**Deploy:** https://process-cost-platform.pages.dev
---
## Objetivo del sprint
Completar y elevar el modelo de recursos con costo por hora: migrar de `utilizationPercent` a `utilizationMinutes + units`, construir la experiencia "wow" encima, y hacer visible el desglose de recursos en el reporte web y en el PDF. Complementado con mejoras de UX para uso en talleres.
---
## Etapas y entregables
| Etapa | Contenido | Resultado |
|---|---|---|
| 1 | Migración modelo + Dexie v3 | `utilizationPercent → utilizationMinutes + units`, migración datos preservada, tests verdes |
| 2 | ActivityPanel "wow" | Inputs numéricos, cálculo en tiempo real, helper contextual, resumen de costos naranja |
| 3 | Reporte web: desglose + TECH_DEBT | Filas expandibles en tabla, payback label fix, badge 20px, CumulativeSavingsChart verificado |
| 4 | UX rápidos | Edición inline de nombre de proceso y cliente en header del workspace |
| 5 | PDF: tabla de recursos | Sección condicional en página 4/5, chips de tipo por recurso, fix truncamiento |
| 6 | Fixes + tests | Acentos corregidos, columna Esp. (USD), 7 tests nuevos (541→548) |
---
## Decisiones de método documentadas en este sprint
### AP.9 — Resolución unilateral de restricciones contradictorias
**Origen:** Etapa 1. El prompt tenía dos requisitos que colisionaban: `❌ no tocar ActivityPanel.tsx` y `build sin errores TypeScript`. Cambiar `ActivityResourceAssignment` en `types.ts` inevitablemente generaba errores TypeScript en `ActivityPanel.tsx`. El agente resolvió la contradicción actuando mínimamente en el archivo restringido en lugar de detenerse.
**Daño:** slider roto (stuck en 1 min), requirió toda la Etapa 2 para corregir.
**Aprendizaje:** cuando haya restricción `❌` absoluta sobre un archivo, el prompt debe incluir explícitamente la instrucción de detenerse ante conflictos, no resolverlos unilateralmente. Si el conflicto es inevitable por dependencias de tipos, resolverlo en el prompt antes de dárselo al agente.
**Documentado en:** `methodology/ANTI_PATTERNS.md` como AP.9.
---
### C.7 — Control preventivo de scope con `git diff`
**Origen:** Etapa 1 (como respuesta a AP.9). Los controles detectivos existentes (grep, build, tests) verifican que el código funciona pero no detectan archivos modificados fuera del scope.
**Solución:** incluir en todo prompt:
```bash
git diff --name-only HEAD
```
Con instrucción explícita: si aparece un archivo no autorizado → revertirlo y reportarlo como conflicto de scope, no incluirlo en el entregable.
**Resultado:** aplicado desde Etapa 2. Ningún conflicto de scope no declarado en Etapas 3-6.
**Documentado en:** `methodology/PATTERNS.md` como C.7.
---
## Hallazgos técnicos reutilizables
### rowSpan en jsPDF-autotable no está soportado en body cells
Intentado en `drawResourcesSection` para agrupar filas por actividad. No funciona en body rows. Solución: repetir el nombre de actividad en cada fila. El prompt lo anticipó correctamente con salida de emergencia — pero el tiempo de investigación fue real.
**Para futuros prompts de PDF con tablas agrupadas:** especificar desde el inicio que se use repetición en lugar de rowSpan, o usar `didParseCell` hook si se necesita estilización diferencial.
### `void resources` como placeholder de deuda técnica
En `exportScenarioPdf`, el parámetro `resources` estaba silenciado con `void resources` desde Sprint 1.5. Al agregar la tabla de recursos en Etapa 5, se eliminó ese placeholder. Patrón a evitar: silenciar parámetros con `void` en lugar de documentar la deuda explícitamente en `TECH_DEBT.md`.
### Modelo `utilizationMinutes + units` más natural para talleres
La pregunta "¿cuántos minutos dedica el analista a esta actividad?" es verificable en una entrevista con el cliente. La pregunta anterior "¿qué porcentaje de utilización tiene?" generaba confusión. El cambio de modelo mejoró la calidad de la elicitación de datos de costos en contexto real.
---
## Proporción web/PDF al cierre
| Componente | Etapas | % real | % comprometido |
|---|---|---|---|
| Web app | 1, 2, 3, 4 | ~65% | 60-70% |
| PDF | 5, 6 | ~30% | 15-25% |
| Tests/fixes | 6 | ~5% | 10-15% |
PDF ligeramente por encima del rango comprometido (tabla de recursos + fixes visuales). Justificado por el valor del entregable para pre-venta.
---
## Estado al cierre del sprint
**TECH_DEBT cerrados en Sprint 2:**
- CumulativeSavingsChart -inversión: verificado (ya estaba correcto)
- Payback label superpuesto: corregido
- Badge ⚡ tamaño: 20×20px, validado visualmente
- Truncamiento notas metodológicas: auditado, 2 líneas corregidas
**Pendientes para Sprint 3:**
- Modelo B (AS-IS/TO-BE con dos BPMNs)
- Catálogo global de recursos compartido
- Recursos en escenario automatizado
- Indicador de simulación desactualizada (alta prioridad, bajo esfuerzo)
- Posicionamiento: primera conversación sobre herramienta interna vs. venta externa

View File

@@ -450,6 +450,32 @@ Patrón típico de violación: el agente dice "el cálculo es numéricamente cor
---
### C.7 Control preventivo de scope — `git diff` antes de reportar
**Estado:** propuesto · **Deriva de:** Principios 3 y 4 · **Origen:** Sprint 2 Etapa 1
Incluir en todo prompt de Claude Code la siguiente verificación como paso obligatorio antes de reportar:
```bash
git diff --name-only HEAD
```
El resultado debe contener únicamente los archivos listados como autorizados en el prompt. Si aparece un archivo no autorizado:
1. Revertirlo: `git checkout HEAD -- <archivo>`
2. Listarlo bajo "Conflictos de scope" en el reporte
3. No incluirlo en el entregable de la etapa
**Por qué es preventivo, no detectivo:** los controles detectivos (grep de tipos, build, tests) verifican que el código resultante funciona, pero no detectan archivos modificados fuera del scope. Un agente puede tocar `ActivityPanel.tsx` y los tests seguir verdes si el cambio no rompe nada. El `git diff` captura el cambio antes de que se declare la etapa terminada.
**Indicador de aplicación correcta:** el reporte del agente incluye explícitamente la salida de `git diff --name-only HEAD` y todos los archivos listados son los autorizados.
**Indicador de violación:** el reporte no incluye la salida del git diff, o el diff contiene archivos no listados sin explicación.
**Relación con otros patrones:**
- Es respuesta directa al daño documentado en **AP.9** (resolución unilateral de restricciones contradictorias).
- Complementa **C.3** (auditoría adversarial) dándole al humano una checklist concreta de qué verificar.
---
## Cómo agregar un patrón nuevo
1. Identificar el patrón durante un proyecto real (no inventarlo en abstracto).