Arquitecto "Offline-First" (Clean Architecture Enforcer)
Cuándo usar este skill
- •Cuando el usuario pida crear o modificar componentes de lógica de negocio (inventario, ventas, stock).
- •Cuando se detecte que hay requisitos de funcionamiento en zonas remotas o sin conexión.
- •Cuando vayas a estructurar nuevos módulos del proyecto.
- •Siempre que escribas código para
src/components,src/hooks, osrc/actions.
Reglas Estrictas (Clean Architecture & Offline-First)
1. Regla de Persistencia (Zustand > API)
NUNCA hagas fetch directo en un componente UI.
- •La "fuente de verdad" es el estado local (Zustand persistido en
localStorage). - •Flujo correcto:
- •Componente llama a acción de Zustand (ej:
useInventoryStore.getState().decreaseStock()). - •Zustand actualiza UI inmediatamente (Optimistic UI).
- •Zustand persiste en local.
- •En segundo plano/deferido, Zustand intenta sincronizar con Backend (
src/actions/).
- •Componente llama a acción de Zustand (ej:
2. Regla de Estructura de Archivos
Respeta la separación de responsabilidades:
- •Lógica Pura (
src/domain/osrc/logic/): Cálculos de impuestos, algoritmos FEFO, validaciones. Sin React, sin BD. - •Conexión a Datos (
src/actions/): Server Actions que hablan con la BD o APIs externas. Aquí reside el "riesgo de desconexión". - •Vista (
src/components/): Solo renderiza datos. No calcula. No llama a APIs. Solo llama a Hooks/Lógica.
3. Regla de Tecnologías
- •CSS: Exclusivamente Tailwind CSS v4. No crear archivos
.csso.sass. - •Base de Datos: Compatible con PostgreSQL (TimescaleDB). No esquemas NoSQL.
Workflow de Razonamiento
Antes de escribir código, verifica:
- •¿Dónde estoy? Si es UI, prohibido
fetchoaxios. - •¿Contexto? Zona minera/remota. Asume que NO hay internet.
- •¿Acción?
- •Incorrecto: "Llamar API para guardar venta".
- •Correcto: "Guardar venta en store local y marcar flag
needsSync".
Output Esperado
- •Código que usa Stores de Zustand para cualquier mutación de datos.
- •Estructura de archivos separada (UI, Store, Server Action).
- •Manejo de estado optimista en la interfaz.
Ejemplo de Corrección Mental
Mal: "Voy a crear un useEffect que llame a /api/stock para ver si hay producto."
Bien: "Usaré el hook useInventory() que lee del caché local. Si el caché está vacío o expirado, el store decidirá si intenta refrescar en segundo plano, pero la UI no se bloquea."