Synaplan
기업을 위한 오픈소스 AI 플랫폼
Proyecto portfolio: MES para plantas que transforman bobinas de acero. Sabe qué bobina se gasta en cada orden, calcula los kilos que quedan a partir del radio y bloquea el material equivocado. Hecho p
비즈니스Python · TypeScriptGitHub @kavanasystemsinfo-ui온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기MES especializado en metalurgia: gestión de la producción en perfiladoras y transformación de bobina de acero, de la recepción de la bobina a la orden terminada. Demo con una planta de ejemplo.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗MES/MOM para el sector metalúrgico: control de bobinas de acero, consumo FIFO, reconciliación industrial, OEE, calidad y trazabilidad ISO 9001. Desplegado en producción como demo (Fly.io + Vercel) y construido con desarrollo guiado por tests en las partes críticas (dominio, seguridad y concurrencia).
Este repo es la reconstrucción moderna (v4) de un sistema legacy. La lógica de dominio única (bobinas, FIFO, reconciliación) proviene de años de experiencia real en planta, y se portó a un stack moderno con TDD, ADRs y despliegue profesional.
Este sistema nació en el suelo de la fábrica, de 8 años trabajando como operario en fábricas metalúrgicas (CNC, turnos, empresas medianas y grandes). Nadie lo diseñó en un despacho: lo diseñó alguien que vivió la pérdida de tiempo del papel, los Excel que no cuadraban y los sistemas que se enteraban de lo que pasaba en planta horas o días después.
Es un MES (Manufacturing Execution System) con alcance MOM, especializado en la transformación de bobinas de acero. Cubre las 4 actividades de operaciones del estándar ISA-95: producción, calidad, mantenimiento e inventario. No es un ERP: no gestiona finanzas ni recursos de la empresa, su frontera es la planta.
ADR-001: clasificación del sistema
| Capa | Tecnología |
|---|---|
| Backend | Python + FastAPI + WebSockets |
| Base de datos | PostgreSQL (Alembic) |
| Frontend | React + TypeScript (Vite) |
| Tests | pytest + Vitest |
| Despliegue | Fly.io (backend) + Vercel (frontend) + GitHub Actions |
✅ Reconstrucción completa por fases (0-7). Backend en
steelworks-api.fly.dev con PostgreSQL
gestionado (migraciones + seed demo en el entrypoint) y frontend en Vercel
(steelworks.kavanasystems.com) con
rewrites /api/*. CI verde en cada push: ruff + pytest + migraciones + build
TS + vitest.
Motor FIFO de bobinas: cascada por fecha de entrada con burbuja de
vinculación, herencia entre bobinas, JIT Move y tolerancia de superávit
max(15%, 150kg).
Reconciliación industrial: retales medidos en milímetros de radio, merma oculta entre lo que el FIFO cree y lo que pesa la báscula, coste real por lote.
Fin de bobina: el operario mide el radio en mm y el sistema calcula kg con densidad calibrada (7.7807 kg/dm³). Botón Retirar devuelve picos como sugerencia, nunca imposición.
OEE y KPIs: disponibilidad, rendimiento y calidad con datos reales; sin datos muestra 0, nunca inventa.
Trazabilidad ISO 9001: ProductionLog inmutable (trigger de UPDATE/DELETE) y timeline en el panel Supervisor.
Autocontroles de calidad e incidencias de planta con evidencia fotográfica desde el móvil (sesión QR + validación magic bytes).
WebSockets de planta (ADR-014) con fallback a polling.
Auth JWT 8h con roles (operario, materiales, supervisor, admin) y administración multi-tenant (Fase 7): usuarios, secuencias, puestos, roles.
233+ tests backend (pytest, incluye E2E contra PostgreSQL real y tests de aislamiento cross-tenant) + 71 frontend (vitest), ejecutados en CI.
Asistentes IA con RAG sobre la documentación real (2 bots sobre el mismo
corpus): bot de usuario (POST /api/v1/assistant/ask) que explica el
producto desde el punto de vista de planta, y asistente técnico para
reclutadores (POST /api/v1/assistant/ask-tech) que responde arquitectura,
decisiones (ADRs), seguridad y limitaciones documentadas. TF-IDF en memoria +
OpenRouter; regla de honestidad: si no está en la documentación, lo dice.
Métricas verificables: los números reales se mantienen al día en el changelog
docs/audit/changelog.md.
Este repo es una pieza de portafolio con un solo usuario real: su autor, y está construido para costar ~0 €/mes. Esa restricción no es un detalle de infraestructura: ha decidido el transporte de eventos, dónde viven las fotos, el motor de búsqueda de los asistentes y el tamaño de la máquina. Aquí está cada partida con lo que hay hoy, el porqué y qué cambiaría con usuarios reales y presupuesto. El detalle completo, con alternativas descartadas, está en ADR-017.
cpu_kind = "shared" de 1
CPU y 256 MB con min_machines_running = 0 y auto_stop_machines = "stop",
es decir, se apaga cuando nadie la usa (fly.toml). Con usuarios reales:
réplicas mínimas fijas para eliminar el arranque en frío, más memoria y un
entorno de staging separado de la demo.EventBroker vive en memoria del proceso, así que
el push de WebSockets funciona dentro de una única instancia (ADR-014,
ADR-016). Con usuarios reales: Redis Pub/Sub o PostgreSQL LISTEN/NOTIFY detrás
de la misma interfaz publish/subscribe/consume, sin tocar el dominio ni los
clientes.alembic upgrade head y el seed demo idempotente se
ejecutan en el entrypoint del contenedor (backend/docker-entrypoint.sh), que
es suficiente con una instancia. Con usuarios reales: mover las migraciones a
un flyctl release_command y dejar el seed solo para la demo.incidencias.foto_data), sin Cloudinary ni almacenamiento de objetos: el
legacy usaba Cloudinary y no se portó. Con usuarios reales: object storage +
CDN y liberar esos bytes de la base de datos, conservando el flujo de sesión
de un solo uso por QR.:free; los contadores anti-abuso (15 preguntas/día por IP y 500
caracteres por pregunta) también viven en el proceso. Con usuarios reales:
embeddings con pgvector o un índice gestionado, y rate limit en un almacén
compartido para que valga con varias instancias.<rol>@demo.local, password kavana)
sobre datos ficticios; SECURITY.md dice explícitamente que no debe
desplegarse con datos reales. Con usuarios reales: identidad corporativa
(SSO/IdP), MFA, secretos por entorno y retirada de las cuentas de demo.Lo que no cambia entre los dos escenarios es el dominio y su verificación:
la cascada FIFO con burbuja de vinculación, la conversión radio→kg con densidad
calibrada (7.7807 kg/dm³), la guardia de seguridad max(15%, 150kg) antes de
descontar stock, el ProductionLog inmutable por trigger de PostgreSQL, la
validación de material por características (±2 mm de ancho, ±10 % de espesor) o
el aislamiento por tenant resuelto desde el JWT son decisiones de ingeniería,
no de factura; con un usuario o con cincuenta se implementan igual. Tampoco
cambian las specs extraídas del legacy, los ADRs, el changelog por fases ni la
suite de tests que los respalda: eso es lo que se puede verificar leyendo el
repositorio. Lo que sí cambiaría con presupuesto está escrito arriba y en
ADR-017, no escondido.
docs/audit/changelog.md para el detalle por
fase y docs/decisions-log.md para decisiones.backend/e2e_*.py/health/live/health/ready