Saltar a contenido

Bitácora de alcance

Responde: ¿en qué se diferencia lo construido de lo que el anteproyecto comprometió, y por qué?

No es una lista de incumplimientos. Un proyecto de un año que no se desvía de su anteproyecto o no aprendió nada o no lo registró. Lo que importa en una defensa es poder decir qué cambió, cuándo y con qué fundamento — y distinguir un desvío fundamentado de una omisión.

Cada afirmación se contrasta contra el texto del anteproyecto y contra el código.

Esta página es la bitácora del sistema, no la de cada componente

Cada repositorio de componente lleva su propia bitácora, con el detalle de sus especificaciones que divergieron. Acá va lo que ningún componente puede ver: el desvío respecto de los objetivos y el alcance comprometidos.

Componente Su bitácora
embolsadora-frontend docs/_process/bitacora-de-alcance.md — ya existe: 19 especificaciones auditadas, 15 correctas y 4 divergentes
embolsadora4.0-cloud Pendiente
embolsadora-edge, proyecto-embolsadora Pendientes

1 · El desvío de cronograma

Es el más grande y el más fácil de medir.

Planificado Real
Ventana de ejecución mayo a noviembre de 2025 septiembre de 2025 a hoy
Entrega final noviembre de 2025 no ocurrió
Informes de avance 2025-08-20 · 2025-09-17 · 2025-10-22 —

El proyecto lleva unos once meses más que su ventana completa, y sigue en curso.

La distribución de commits muestra que el desvío no fue parejo: no es que todo se corrió, es que los componentes arrancaron en momentos muy distintos.

Componente Primer commit Observación
embolsadora-frontend 2025-09 Arrancó el mes del segundo informe de avance
embolsadora4.0-cloud 2025-10 Un mes antes de la entrega final planificada
proyecto-embolsadora 2026-02 Componente externo, con su propio calendario
embolsadora-edge 2026-05 Seis meses después de la entrega final planificada
embolsadora-bundle 2026-09 La integración del stack de planta

El orden de construcción invirtió el del cronograma

El cronograma planificaba investigación y POC en Raspberry Pi y backend de la Raspberry Pi antes que el frontend. Ocurrió al revés: el frontend se construyó primero y el servicio de la Pi último.

Eso explica, mejor que cualquier otra cosa, varios desvíos de esta página. El dashboard se diseñó y construyó sin un backend que le diera datos, así que se alimentó de datos simulados; y la decisión de conservar esos simulados hasta que el backend existiera quedó registrada como decisión explícita del frontend, no como deuda accidental.

También explica que el objetivo 4 esté parcialmente cumplido: 14 de 32 widgets consumen métricas reales, y el resto sigue con datos simulados.

Factores verificables

No hay registro de las causas, así que esto es lo que se puede afirmar desde los repositorios:

  • Hay meses sin actividad: junio de 2026 no tiene commits en ningún repositorio, y diciembre de 2025 y enero de 2026 tienen muy poca.
  • El equipo son dos personas, como el anteproyecto preveía, en un proyecto que incorporó un subsistema no planificado (§4) y un componente externo (§3).
  • No hay informes de avance en el repositorio. Los tres estaban planificados y su página sigue pendiente.

2 · Tecnologías: lo previsto y lo usado

El anteproyecto listó tecnologías previstas. El contraste es favorable en lo esencial y tiene tres adiciones no previstas.

Previsto Usado Veredicto
Raspberry Pi como gateway industrial Raspberry Pi ✅ como se planificó
HTTP / HTTPS HTTP(S) en las tres fronteras de red ✅ como se planificó
Backend en Golang o Python Go en el Cloud y el Edge; Python en el historian ✅ como se planificó
Dashboard con React Next.js sobre React 19 ✅ como se planificó
Almacenamiento local SQLite/PostgreSQL SQLite en el outbox del Edge ✅ como se planificó
Almacenamiento remoto Supabase, Firebase o AWS RDS Supabase ✅ una de las tres opciones
— InfluxDB en la Pi ⚠️ no previsto
— MongoDB en la nube ⚠️ no previsto
— Redis ⚠️ no previsto

Las tres adiciones tienen fundamento registrado, y conviene decir que ninguna reemplazó a una tecnología prevista: las previstas se usaron todas.

Adición Por qué entró
InfluxDB Llegó con el componente externo, que ya la usaba. Quedó como la junta de desacople dentro de la Pi: ver SYS-ADR-001
MongoDB Entró especificada para persistir el gemelo digital y terminó usándose para las mediciones: ver SYS-ADR-003
Redis Límites de tasa e idempotencia. Es una dependencia opcional: falla abierta

3 · La adición conceptual más grande: el modelo AAS

El Asset Administration Shell no aparece en el anteproyecto

Verificado por búsqueda sobre el texto completo: no hay ninguna mención al Asset Administration Shell, al gemelo digital ni a FA³ST.

Y sin embargo el modelo AAS es la columna vertebral semántica del sistema: el aasPath identifica cada variable en los cuatro repositorios, entra en el cálculo del identificador de cada evento y es lo que el dashboard consulta. Ver SYS-ADR-004.

Es una adición no planificada y no trivial, y entró por una vía que el anteproyecto tampoco contemplaba: la integración de proyecto-embolsadora, una tesis de maestría de un autor externo al Proyecto Final.

Por qué es un desvío favorable, y cómo defenderlo. El objetivo específico 6 compromete "estructurar los datos recolectados para habilitar futuras tareas de análisis e inteligencia de negocio". El anteproyecto no dice cómo. Adoptar un estándar de la industria para la semántica de las variables es una forma considerablemente más fuerte de cumplir ese objetivo que un esquema propio, y conecta el trabajo con el marco de Industria 4.0 que el objetivo general invoca.

El costo, que también hay que decir. La dependencia de un repositorio externo introdujo:

  • un contrato transversal sin dueño declarado ni versión, que es el origen de la divergencia de los aasPath de alarma;
  • un componente que el equipo no controla y cuyo calendario no gobierna;
  • un servidor AAS que no tiene consumidores dentro del sistema: SYS-ADR-008.

4 · Alcance agregado: multi-tenancy y RBAC

El objetivo específico 7 pide "interfaces para el monitoreo adaptadas a los perfiles de usuario (fabricante y cliente)". Lo construido es considerablemente más grande que eso:

Lo pedido Lo construido
Interfaces por perfil Un subsistema multi-tenant completo: 7 roles, catálogo de permisos en base de datos, invitaciones por correo, operadores de plataforma con acceso cruzado entre clientes, y aislamiento por cliente en los dos almacenes

El anteproyecto limita el alcance a una máquina prototipo

Dice, textualmente: "El alcance se restringe al desarrollo de la solución para una máquina prototipo; la escalabilidad a otras máquinas será evaluada en futuras etapas."

Se construyó la multi-tenancy igual. Es un desvío de alcance hacia arriba, y por lejos el que más esfuerzo consumió: buena parte de las migraciones de base, de los ADR del Cloud y de las especificaciones del frontend son de este subsistema, no del monitoreo.

Cómo defenderlo. El sistema se entrega a un fabricante que vende máquinas a varios clientes: sin separación por cliente, el producto no es instalable más de una vez. La decisión es razonable. Lo que no ocurrió es registrarla como cambio de alcance en su momento, y eso es lo que esta bitácora corrige retroactivamente.

El costo verificable. El subsistema trajo consigo la mayor parte de la complejidad de seguridad del sistema, y su aislamiento lo impone el código y no la base, sin ninguna prueba automatizada que lo verifique: ver seguridad.


5 · Comprometido y no construido

Lo que el anteproyecto lista como entregable o componente del alcance y hoy no existe.

Comprometido Estado Consecuencia académica
Sistema de alertas automáticas (objetivo 5, entregable, componente del alcance) ✗ No existe el motor. Hay tablas, API y pantallas para definir reglas; no hay código que las evalúe Es el único objetivo específico sin cumplir. Ver abajo
Generación de métricas clave e informes (componente del alcance) ✗ No existe. No hay endpoint de reportes en la API, aunque el frontend tiene un contrato que lo describe El objetivo 10 se cumple por el dashboard; los informes como entregable, no
Observabilidad activa, incluido monitoreo del estado de sensores ◑ Parcial. Hay logs y métricas expuestas, pero nadie las recolecta, y la calidad del dato no sale del log del historian Ver monitoreo
Base de datos local y remota con registros históricos (entregable) ✅ Cumplido, con una salvedad: ninguna tiene política de retención ni respaldos propios —

El objetivo 5 es el único no cumplido. Decidido el 2026-10-04: se declara así

El anteproyecto compromete "configurar un sistema de alertas automáticas ante condiciones anómalas o fallas operativas", y lo repite como entregable principal y como componente del alcance. Es el único de los diez objetivos específicos que no tiene implementación.

Lo que sí existe: el modelo de datos de reglas de alarma y de notificaciones, su API, su interfaz, y hasta un índice en el almacén de mediciones preparado para que un motor futuro lea lo reciente. Lo que falta es exactamente la pieza que evalúa.

La decisión está tomada, y es la segunda de las dos que esta página planteaba: FE-ADR-014 del repositorio del frontend, 2026-10-04, decidida por la cátedra y el equipo. El objetivo se documenta como no alcanzado, y el motivo registrado es que sin datos reales del PLC la evaluación automática se despriorizó para cerrar la entrega.

Lo que la ADR agrega, y que esta página no había considerado, es qué pasa con la interfaz mientras tanto: el módulo se apaga en el MVP (ALERTS_MODULE_ENABLED=false), el ítem del menú queda deshabilitado y marcado como pendiente —no oculto— y la campana de notificaciones se oculta. El razonamiento es exactamente el de esta sección llevado a la UI: un badge clavado en cero y un formulario que guarda reglas que nunca disparan le enseñan al usuario algo falso, pero esconder el ítem diría que la funcionalidad no existe, cuando lo que falta es la evaluación en el backend.

El código no se borra y las rutas siguen existiendo: el CRUD es trabajo real y demostrable. Reactivarlo es cambiar un indicador de configuración.

Lo que no es defendible sigue siéndolo: presentar el CRUD de reglas como si fuera el sistema de alertas.

Queda una grieta que conviene nombrar antes de la defensa: **el registro de widgets no lee
ese indicador**, así que los tres widgets de alarma dependen de su propia marca. Ver
[widgets](../usuarios/widgets.md).

6 · Desvíos de diseño dentro de lo construido

Decisiones que cambiaron respecto de lo especificado, ya con ADR que las respalda.

Desvío Dónde quedó registrado
Las mediciones se guardan en MongoDB, no en Postgres con JSONB y particionado como decidía CLOUD-ADR-003 SYS-ADR-003
La idempotencia se acota por cliente; CLOUD-ADR-004 la había definido global, lo que perdía datos entre clientes SYS-ADR-002
El servidor AAS quedó en la Pi; la capa AAS de la nube se especificó y nunca se construyó SYS-ADR-008
La plataforma de ejecución del backend cambió de Koyeb a Cloud Run SYS-ADR-006
El tenant se resuelve por cabecera validada contra la membresía; CLOUD-ADR-002 decía que salía exclusivamente del token índice de decisiones
El buffer offline real es de ~1,5 h; EDGE-ADR-002 planteaba ≥24 h contenedores C4

Lo que esta página no puede afirmar

  • Por qué se produjo el desvío de cronograma. No hay actas, informes de avance ni registro de impedimentos en los repositorios. Lo de §1 es lo que se deduce de las fechas de commit, que muestran qué pasó y no por qué.
  • Si hubo cambios de alcance acordados con la dirección del proyecto. No hay registro en los repositorios. Si existieron por otra vía, incorporarlos acá cambia varias conclusiones: un desvío acordado no es un desvío no registrado.
  • El estado de las especificaciones del Cloud, el Edge y el historian, que todavía no tienen su bitácora de componente.

Fuentes

  • Objetivos, alcance, tecnologías previstas, entregables, cronograma e informes de avance: docs/_process/pendiente-hub/embolsadora-4.0.md del frontend, que es el anteproyecto a la espera de migrar a su página
  • Ausencia de toda mención al AAS en el anteproyecto: búsqueda sobre el texto completo, sin resultados
  • Distribución temporal: git log por mes sobre la rama de referencia de cada repositorio
  • Ausencia del motor de alarmas y de un servicio de reportes: los árboles internal/api/handler/ e internal/app/ del Cloud tienen alarm_rules —CRUD— y ningún módulo de reportes ni de evaluación de reglas
  • Bitácora del frontend y su auditoría de 19 especificaciones: docs/_process/bitacora-de-alcance.md y specs/README.md del frontend

Relacionado