8.1 KiB
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 2MARCA 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 destore/, ni defeatures/. Es puro.features/puede importar dedomain/,store/,persistence/,lib/,components/.store/puede importar dedomain/ypersistence/. Nada más.
Estado del modelo de recursos (pre-Sprint 2)
El modelo de recursos está parcialmente implementado desde el MVP. Lo que existe:
Resourceentypes.ts:{ id, processId, name, type, costPerHour }ActivityResourceAssignmentembebido enActivity:{ resourceId, utilizationPercent: number (0-1) }- Tabla
resourcesen Dexie desde v1 ResourcesPanel.tsx: CRUD de recursos por procesoActivityPanel.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
- TypeScript strict activado. Nada de
anysalvo en bordes con librerías sin tipos. - Dominio puro: funciones en
domain/son puras, testeables sin DOM. - Componentes tontos, hooks inteligentes: lógica en custom hooks, JSX limpio.
- Sin lógica de negocio en componentes.
- Convenciones de naming:
- Componentes:
PascalCase.tsx - Hooks:
useCamelCase.ts - Utilidades:
kebab-case.ts - Tipos:
PascalCase, interfaces con prefijoIPROHIBIDO
- Componentes:
- Comentarios en español, código (variables, funciones) en inglés.
- Errores con mensajes accionables para el usuario, nunca traces crudos en UI.
- 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
- Ahorro positivo: verde
- 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
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:
- El header/footer dice "InQ ROI" (no "Process Cost Platform" ni otro)
- El footer incluye "Powered by InQuality"
- No hay caracteres rotos
- 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:
- ¿Resuelve un ítem listado en
TECH_DEBT.md,BACKLOG.mdo archivos de planificación? → Nivel 3 (consultar antes) - ¿Choca con restricción explícita del prompt ("NO entra", "NO tocar")? → Nivel 3
- ¿Modifica paginación, layout, estructura de salida, o contenido visible? → Nivel 2 mínimo (ejecutar y reportar)
- ¿Afecta marca, identidad, dependencias o configuración? → Nivel 3
- 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.