# CLAUDE.md — InQ ROI · Contexto de implementación

> Leído automáticamente por Claude Code al arrancar desde este directorio.
> Contiene reglas de código, arquitectura, marca y convenciones de implementación.
> Para contexto estratégico y de colaboración ver `cowork/InQ ROI - Simulador de procesos/CLAUDE.md`.

---

## ⚠️ Reglas de Marca — NO NEGOCIABLES

Estas reglas aplican a TODO string que aparezca en código, PDFs, CSVs, tests y documentación.

### Ortografía de "InQ" — SIEMPRE I-n-Q

```
✅ InQ          ← correcto
✅ InQuality    ← correcto (nombre completo)
✅ InQ ROI      ← nombre del producto

❌ INQ  ❌ Inq  ❌ inq  ❌ inQ   ← todos son bugs
```

### Paleta protagonista

```
Primario:  #F59845  (naranja InQ)
Gradiente: #F59845 → #ED3E8F  (naranja → magenta InQ)
```

El gradiente se usa SOLO en KPI Hero y banners principales.
**NO usar colores CONCILIA** (`#572FA2`, `#CB1889`) en este producto.

### Assets de logo

Logos disponibles en `assets/`:
- `MARCA FINAL 2023 AREA DE SEGURIDAD 1 COLOR.png` — logo horizontal color (uso principal)
- `MARCA FINAL 2023 AREA DE SEGURIDAD 1 BCO.png` — logo horizontal blanco (sobre fondos oscuros)
- `MARCA FINAL 2023 AREA DE SEGURIDAD 2 COLOR.png` — versión con área de seguridad 2
- `MARCA FINAL 2023 AREA DE SEGURIDAD 2 ISO COLOR LOGO BCO.png` — isotipo + logo blanco

Usar el logo PNG en lugar de texto "InQ" / "InQuality" en headers de PDF y en la UI cuando corresponda.

### Footer de PDFs

Tagline obligatorio: `"Powered by InQuality"` — en todos los footers de PDF, siempre.

---

## Identidad del Proyecto

**Nombre de trabajo:** InQ ROI
**Una frase:** Plataforma web para que consultores de procesos cuantifiquen costos operativos y calculen ROI de automatización a partir de archivos BPMN 2.0.
**Deploy:** Cloudflare Pages — https://process-cost-platform.pages.dev
**Estado:** Sprint 2 en curso (ver `sprints/sprint-2/BRIEF.md`)

---

## Stack Tecnológico (sin cambios hasta nuevo aviso)

| Capa | Tecnología |
|---|---|
| Lenguaje | TypeScript estricto |
| Framework | React 18 + Vite |
| Routing | TanStack Router |
| Estado | Zustand |
| Canvas BPMN | bpmn-js (Viewer, no Modeler) |
| UI | shadcn/ui sobre Tailwind CSS |
| Iconos | Lucide React |
| Gráficos | Apache ECharts (vía echarts-for-react) |
| Persistencia | IndexedDB vía Dexie (actualmente v2) |
| Validación | Zod |
| Export PDF | jsPDF + jsPDF-autotable + html2canvas |
| Export CSV | papaparse |
| Testing | Vitest + Playwright |
| Deploy | Cloudflare Pages |

**No introduzcas librerías fuera de esta lista sin justificación explícita y consulta al director.**

---

## Arquitectura de Carpetas

```
src/
├── main.tsx
├── App.tsx
├── router.tsx
├── domain/           ← lógica de negocio pura, sin React, testeable
│   ├── types.ts      ← tipos TypeScript del dominio
│   ├── simulation.ts ← motor de simulación (acepta scenario: 'actual' | 'automated')
│   ├── roi.ts        ← cálculos puros de ROI
│   ├── bpmn-parser.ts
│   └── schemas.ts    ← Zod schemas
├── store/            ← Zustand stores
├── persistence/      ← Dexie / IndexedDB
│   └── db.ts         ← schema + migraciones (versión actual: v2)
├── features/         ← organizado por feature, no por tipo
│   ├── import/
│   ├── workspace/    ← ActivityPanel, ResourcesPanel, BpmnCanvas, WorkspacePage
│   ├── simulation/
│   └── report/       ← ReportPage, ActivitiesTable, CostByResourceChart, etc.
├── components/ui/    ← shadcn copy-pastes
├── lib/              ← utilidades transversales (format, colors, pdf, csv)
│   └── export/       ← pdf-sections.ts, pdf-sections-roi.ts, csv.ts
└── styles/
```

### Reglas de dependencia (no negociables)

- `domain/` **NO** importa de React, ni de `store/`, ni de `features/`. Es puro.
- `features/` puede importar de `domain/`, `store/`, `persistence/`, `lib/`, `components/`.
- `store/` puede importar de `domain/` y `persistence/`. Nada más.

---

## Estado del modelo de recursos (pre-Sprint 2)

El modelo de recursos está **parcialmente implementado** desde el MVP. Lo que existe:

- `Resource` en `types.ts`: `{ id, processId, name, type, costPerHour }`
- `ActivityResourceAssignment` embebido en `Activity`: `{ resourceId, utilizationPercent: number (0-1) }`
- Tabla `resources` en Dexie desde v1
- `ResourcesPanel.tsx`: CRUD de recursos por proceso
- `ActivityPanel.tsx`: asignación con slider de porcentaje
- Motor de simulación: ya calcula `cost = costPerHour × (executionTimeMinutes/60) × utilizationPercent`
- `CostByResourceChart.tsx`: gráfico en reporte

**Sprint 2 mejora este modelo.** No construye desde cero. Ver `sprints/sprint-2/BRIEF.md` para scope exacto.

---

## Principios de Código

1. **TypeScript strict** activado. Nada de `any` salvo en bordes con librerías sin tipos.
2. **Dominio puro**: funciones en `domain/` son puras, testeables sin DOM.
3. **Componentes tontos, hooks inteligentes**: lógica en custom hooks, JSX limpio.
4. **Sin lógica de negocio en componentes**.
5. **Convenciones de naming**:
   - Componentes: `PascalCase.tsx`
   - Hooks: `useCamelCase.ts`
   - Utilidades: `kebab-case.ts`
   - Tipos: `PascalCase`, interfaces con prefijo `I` PROHIBIDO
6. **Comentarios en español**, código (variables, funciones) en inglés.
7. **Errores con mensajes accionables** para el usuario, nunca traces crudos en UI.
8. **Migraciones de schema**: SIEMPRE incrementar versión en Dexie, escribir función de upgrade y test que valide preservación de datos.

---

## Diferencial Visual

El reporte es el corazón del producto. Reglas:

- Tipografía: **Inter** para UI, **JetBrains Mono** para números/datos
- Paleta heatmap: verde `#10b981` → amarillo `#f59e0b` → rojo `#ef4444` (saturados, calibrados en E2E)
- Paleta ROI:
  - Ahorro positivo: verde `#10b981`
  - Ahorro marginal: gris `#64748b`
  - Ahorro negativo: rojo `#ef4444`
  - Advertencias de transparencia: amarillo `#f59e0b`
- Cifras de dinero: siempre con separadores y símbolo de moneda
- KPIs de ROI más grandes que KPIs de costos
- Export PDF igual o mejor que pantalla
- Densidad de información media-alta (audiencia: consultor profesional)

---

## Definition of Done — Cada Feature

- [ ] Funciona en happy path
- [ ] Maneja datos vacíos sin crashear
- [ ] Maneja edge cases (división por cero, valores negativos, cero)
- [ ] Persiste en IndexedDB cuando corresponde (con migración si cambió schema)
- [ ] Estilo consistente con el resto de la app
- [ ] Si toca dominio: al menos un test en Vitest
- [ ] Si toca flujo end-to-end: cobertura en Playwright

---

## Comandos del Proyecto

```bash
npm run dev              # desarrollo
npm run build            # producción
npm run test             # tests unitarios con Vitest
npm run lint             # eslint
npm run preview          # previsualizar build de producción
npx playwright test      # tests E2E (Playwright headless)
```

---

## Verificación final antes de entregar artefactos

Antes de presentar cualquier PDF o pantalla:
1. El header/footer dice "InQ ROI" (no "Process Cost Platform" ni otro)
2. El footer incluye "Powered by InQuality"
3. No hay caracteres rotos
4. La marca "InQ" se escribe siempre I-n-Q

---

## Política de iniciativa proactiva

Antes de aplicar un cambio fuera del scope del prompt actual, evaluar en orden:

1. ¿Resuelve un ítem listado en `TECH_DEBT.md`, `BACKLOG.md` o archivos de planificación? → **Nivel 3** (consultar antes)
2. ¿Choca con restricción explícita del prompt ("NO entra", "NO tocar")? → **Nivel 3**
3. ¿Modifica paginación, layout, estructura de salida, o contenido visible? → **Nivel 2** mínimo (ejecutar y reportar)
4. ¿Afecta marca, identidad, dependencias o configuración? → **Nivel 3**
5. Si nada aplica → **Nivel 1** (ejecutar libremente)

Argumentos **NO válidos** para evitar consulta:
- "Es mejora de legibilidad"
- "Es consistencia con etapa anterior"
- "Es trivial de revertir"
- "Resuelve un bug menor" (si está en TECH_DEBT.md, es Nivel 3)

Ver `methodology/PATTERNS.md` C.6 y `methodology/ANTI_PATTERNS.md` AP.8.
