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
aasPathde 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.mddel 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 logpor 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/einternal/app/del Cloud tienenalarm_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.mdyspecs/README.mddel frontend
Relacionado¶
- Matriz de evidencias — objetivo por objetivo, con su evidencia
- Visión y alcance — el estado de los diez objetivos
- Decisiones de arquitectura — las ocho
SYS-ADR