workspace "Agatha" "Transporte de datos binarios a través de YouTube con corrección de errores BCH" { model { usuario = person "Usuario" "Sube un archivo y recibe una URL de descarga" correo = softwareSystem "Correo" "Entrega el enlace de descarga" "Externo" youtube = softwareSystem "YouTube" "Almacena los datos como video 4K y los transcodifica a VP9" "Externo" agatha = softwareSystem "Agatha" "Codifica archivos como frames de video, los sube y los reconstruye bit-exacto" { api = container "API del demo" "Recibe archivos, encola trabajos y sirve la descarga" "Python · FastAPI" escaner = container "Escáner aislado" "Analiza el archivo sin red antes de tocarlo" "Docker · ClamAV" cli = container "CLI" "Operación manual del pipeline" "Python · Typer" almacen = container "Manifiestos" "Solo SHA256 y referencias remotas: mínima persistencia" "SQLite" { tags "Database" } core = container "Núcleo hexagonal" "Chunking, BCH, bitmap, códec y verificación" "Python" { servicio = component "Servicio de aplicación" "Caso de uso: recibir, transformar, entregar" "Python" chunker = component "Chunker" "Parte el TAR canónico en bloques de 10 MB" "Python" bch = component "Códec BCH" "t=16, m=15 · 30 bytes de paridad por bloque de 2048" "bchlib" bitmap = component "Bitmap 4K" "Empaqueta los bits en 3840x2160 · 1 pixel = 1 bit" "NumPy" codec = component "Códec de video" "FFV1 sin pérdida y H.264 CRF 18 para la subida" "FFmpeg" canal = component "Puerto de canal" "Abstrae dónde vive el video" "Interfaz" verificador = component "Verificador" "Compara el SHA256 del TAR reconstruido" "hashlib" servicio -> chunker "Parte el archivo" chunker -> bch "Protege cada bloque" bch -> bitmap "Bits protegidos" bitmap -> codec "Frames" codec -> canal "Bundle listo" servicio -> verificador "Valida la reconstrucción" } usuario -> api "Sube un archivo y su correo" "HTTPS" api -> escaner "Delega el análisis" "docker run --network none" api -> servicio "Codifica y reconstruye" cli -> servicio "Invoca las mismas etapas" servicio -> almacen "Guarda el manifiesto y el SHA" "SQL" canal -> youtube "Sube el video (unlisted) y lo recupera" "OAuth · yt-dlp" api -> correo "Envía la URL de descarga" "SMTP" } } views { systemContext agatha "Contexto" "Quién usa el sistema y con qué habla" { include * autolayout lr } container agatha "Contenedores" "Las piezas desplegables" { include * autolayout lr } component core "Componentes" "El interior del núcleo: de archivo a video" { include * autolayout lr } styles { element "Database" { shape cylinder } element "Externo" { background #6b7a90 } } theme default } }