Repository navigation
Primera publicación de Cullen. Distribuye código fuente; no se adjunta el MSI, porque se construye sin firmar.
Licencia Apache 2.0. El recorrido que enseñan las capturas del README se ejecutó entero sobre un clon limpio de este commit, siguiendo el guion de la demo.
Esto es un MVP de referencia no certificado. La fiscalidad opera con un driver simulado
rotuladoSIMULACION. No hay integración con impresoras fiscales reales, no ha corrido un
piloto en una tienda y el gate de piloto en tienda sigue abierto.
No lo despliegues sobre datos reales de un comercio.
Qué es
Cullen es una plataforma de punto de venta e inventario para supermercados, construida
offline-first para las condiciones del comercio minorista venezolano: varias monedas
simultáneas con tasas volátiles, conectividad intermitente, impresoras fiscales que fallan a mitad
de una operación y auditoría obligatoria. Monorepo TypeScript con DDD táctico y arquitectura
hexagonal: dominio puro, casos de uso con puertos y adaptadores intercambiables.
Capacidades entregadas
| Área | Qué opera |
|---|---|
| Caja | apertura de turno, venta multimoneda, cobro con IGTF y descuento por política versionada, devolución con reintegro, cierre con arqueo y esperado negativo autorizado |
| Inventario | kardex, costos y margen, ajustes, conteos físicos con diferencia congelada, proveedores y recepciones de compra |
| Fiscal | documento simulado con evidencia recuperable en cuatro ejes independientes; recuperación determinista y fail-closed |
| Identidad | administración de usuarios y permisos, PIN con cambio obligatorio, enrolamiento local de credencial, autorización auditable en la capa de aplicación |
| Sincronización LAN | outbox durable con orden por agregado, protocolo de eventos entre nodos, receptor con autenticación mutua, operación offline y reconexión |
| Reportes | ventas e inventario con exportación CSV, arqueos e historia de venta |
| Operación | instalación como servicio de Windows supervisado, respaldo cifrado, emisión y rotación de material TLS de la LAN |
La interfaz deriva navegación y controles de los permisos efectivos de la sesión: un perfil no
ve una acción que el servidor le rechazaría.
Lo arquitectónicamente destacable
- Dinero entero, nunca
float.Moneyguarda unidades menores enteras con su código de
moneda y opera conBigInt. Sumar dos monedas distintas es un error de dominio. - Ownership por nodo sin last-write-wins. Cada agregado tiene un
originNodeIdinmutable
respaldado por triggers; si el ownership no se resuelve, la mutación se rechaza en vez de
adivinar. - Entrega at-least-once sin efectos duplicados, verificada en once escenarios de corte de
red con un coordinador y dos terminales sobre tres archivos SQLite independientes y
listeners reales. - Idempotencia por intención, no por reintento: misma clave y mismo fingerprint devuelven la
misma respuesta; misma clave con otro contenido falla conIDEMPOTENCY_KEY_CONFLICT. - Invariantes defendidos en dos capas: las reglas viven en el dominio y las críticas tienen
además 125 triggers en SQLite. - Fronteras impuestas por el linter:
eslint.config.jsprohíbe por capa;core/domainno
puede importar Fastify, Drizzle, Electron ni React y el build falla si alguien lo intenta. - Datos en reposo con el límite escrito: PIN con scrypt y sal individual, token solo como
SHA-256, respaldos y secretos sellados con AES-256-GCM, ACL del directorio verificada al
arrancar. El archivo SQLite operativo no se cifra, por decisión explícita de
ADR-0029 D7.1.
Verificación
1.282 pruebas en 198 archivos, 31 ADR y 44 migraciones forward-only con checksum SHA-256.
TypeScript estricto con exactOptionalPropertyTypes. El pipeline —lint, typecheck, suite completa
y compilación de artefactos— corre en GitHub Actions sobre windows-latest en cada pull request y
cada cambio de main.
Limitaciones conocidas
- Referencia no certificada. Ningún artefacto, texto ni pantalla afirma cumplimiento fiscal.
FiscalPrinterFake. No hay soporte de modelos reales: la Fase 8 está suspendida por
dependencia externa —hardware, protocolo del fabricante y laboratorio de certificación—.- Sin piloto. No ha operado en una tienda; el gate de piloto conserva sus requisitos.
- Sin instalador publicado. El MSI de WiX se construye pero no se firma, así que no se adjunta.
- Windows. Es la plataforma objetivo del nodo y del escritorio; no hay otra probada.
- Sin promesa de uso comercial, soporte garantizado ni SLA.
- Fase 12 no está hecha. El rendimiento no se ha medido contra presupuestos declarados.
- Pago en una moneda distinta a la de la venta. La pantalla de venta no envía la tasa de
cambio, así que ese cobro no es alcanzable; ver defectos conocidos.
Qué sigue
- Fase 12 — optimización medida de comunicación HTTP local,
SQLite y mantenibilidad estructural, con evidencia BEFORE/AFTER. 12.04 sigue suspendida con la
Fase 8. - Fase 12B — manual de usuario no técnico de las doce
pantallas. Documental, independiente de la Fase 12. - Post-MVP — almacenes por sucursal (13), plataforma central
PostgreSQL (14), sincronización SQLite–PostgreSQL (15), web app interna (16), sistema de diseño
propio (16B) y validación con despliegue gradual (17). Ninguna está iniciada.
Los defectos de v0.1.x se corrigen sin adelantar fases futuras; una capacidad nueva sigue el
cronograma y sus fuentes normativas.