You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/docs/implementacion-2026-09-11.md

123 lines
13 KiB

# Implementación de la revisión de Senza Paura
Fecha: 11 de septiembre de 2026. Rama: `codex/redisenio-dominio-musical`.
Este documento registra los cambios realizados a partir del
[informe de auditoría](analisis-aplicacion-2026-09-11.md). El informe original
se conserva para poder contrastar los hallazgos con la implementación.
## Resultado
Se han corregido los problemas de autorización, conservación de compras y
créditos, entrega MP3, publicación de versiones, caché entre procesos, apertura
de pagos, mantenimiento, límites de subida, modal y textos. El despliegue
prepara ahora las dos aplicaciones y conserva una release anterior recuperable.
El panel añade créditos completos, portadas y fotografías con previsualización
y recorte central, audio propio por versión, revisión del catálogo, conciliación
de pagos y concesiones manuales de suscripción. Las listas se pueden renombrar,
reordenar y eliminar con confirmación.
La implementación está en el repositorio. No se ha desplegado en el servidor ni
se han aplicado las nuevas migraciones a la base compartida. Las pruebas de
PostgreSQL utilizan tablas y funciones temporales de sesión, con Stripe simulado.
No se han realizado cobros, reembolsos ni envíos de correo.
## Correcciones por hallazgo
| Hallazgo | Cambio implementado | Límite o puesta en marcha |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| H01 Autorización | El hook exige administrador antes de resolver rutas protegidas; las acciones repiten la guarda. | Pruebas unitarias de roles y peticiones HTTP anónimas, tanto HTML como JSON. |
| H02 Escucha interceptada | El ejemplo Nginx envía `/escucha` a Node, que autoriza y sirve Range. | Sustituir la configuración efectiva al desplegar. |
| H03 Despliegue incompleto | Builds de sitio y panel, releases separadas, rutas persistentes, entorno comprobado, migración en destino y restauración del enlace anterior ante fallo. | Requiere instalar las dos unidades y ensayar la recuperación en el servidor. |
| H04 Créditos ausentes | El auditor denuncia publicaciones sin intérprete; el panel permite asignar créditos y muestra las incidencias. | No se han inventado intérpretes: faltan los nombres reales de las 11 canciones existentes. |
| H05 Pérdida de créditos | El guardado conserva instrumento y acreditación de los intérpretes principales que permanecen seleccionados. | Quitar explícitamente un intérprete elimina ese crédito. |
| H06 Biblioteca incompleta | La biblioteca consulta compras, títulos históricos y representaciones, independientemente de la visibilidad del catálogo. | Incluye versiones publicadas o retiradas; las versiones en borrador no se entregan. |
| H07 Entrega incorrecta | Cada nuevo ingreso genera una descarga MP3 separada. Un MP3 real se conserva; otros códecs se convierten a MP3 a 320 kbps. | El catálogo existente ya tenía másteres MP3; se aceptan como entrega mientras no haya una representación explícita. |
| H08 Publicación desigual | Se validan las versiones en transacción. Nuevas guardas diferidas de PostgreSQL exigen intérprete principal, escucha, letra cuando corresponde y MP3 comercial. | Aplicar `0025_guardas_publicacion.sql`. Las importaciones deben completar las relaciones en la misma transacción. |
| H09 Caché desincronizada | La memoria se comparte dentro de una petición, sin caché global de 60 segundos. | Los datos ya mostrados en una pestaña cambian al refrescar o navegar; no se ha añadido actualización en directo. |
| H10 Pagos duplicados | Intención persistida antes de Stripe, clave idempotente estable, sesión reutilizable, datos de precio congelados y creación idempotente de pedido. | Aplicar `0024_intenciones_pago.sql`. Una intención incierta caducada exige conciliación; no se sustituye silenciosamente. |
| H11 Webhooks bloqueados | El webhook atraviesa el modo de espera y mantiene la verificación de firma. | No abre otras rutas API. |
| H12 Límite multipart | Archivo máximo de 256 MiB y cuerpo del panel de 260 MiB; configuración Nginx y documentación alineadas. | Procesado síncrono limitado a uno por proceso; el proxy administrativo permite 900 segundos. |
| H13 Modal horizontal | Al ocultar la ilustración, el marco pasa a una sola columna. | Verificado a 812 × 375. |
| H14 Tamaño del pack | La biblioteca usa `CANCIONES_POR_PACK`. | La tienda mantiene packs de diez canciones. |
| H15 Señal de calidad | Vitest conserva módulos virtuales de Kit sin arrancar su servidor SSR; formato corregido y nuevas regresiones. | Las pruebas PostgreSQL se ejecutan explícitamente con `TEST_DATABASE_URL`; no dependen del catálogo de producción. |
| H16 Documentación | README corregido a PostgreSQL, panel independiente, rutas legales y procedimiento nuevo. | La configuración fiscal y los textos comerciales siguen siendo decisiones del proyecto. |
Se corrigió además una comprobación de favoritos que no esperaba la promesa de
`obtenerCancion`, y se reforzó la compensación de archivos: una respuesta incierta
de COMMIT no provoca la eliminación de medios que pueden haber quedado registrados.
## Refactorizaciones
- **R01:** las rutas editoriales y de cuenta dejan de recibir el catálogo completo.
La biblioteca comprada tiene su propio modelo. El pago obtiene las compras en
lote y reutiliza la consulta de catálogo de la petición. En las pantallas
musicales se conserva el contrato compartido para tarjetas, discos y reproductor;
no se ha sustituido todo el catálogo por un sistema de consultas paginadas.
- **R02:** se separan validadores de canciones, registro y compensación de audio,
detalle del título de una fila, biblioteca comprada y editor de listas. Los
componentes grandes de capítulos y géneros mantienen su estructura; no se han
dividido por tamaño sin una responsabilidad clara que extraer.
- **R03:** publicación protegida también en PostgreSQL, validación compartida de
canciones y créditos, servicio de Checkout e ingreso común de las representaciones.
- **R04:** manifiestos de procesado con estados, límite de concurrencia por proceso,
publicación sin sobrescritura y herramienta de reconciliación. Conserva archivos
registrados incluso si se pierde la respuesta de la transacción. No es todavía
una cola distribuida con trabajadores independientes; esa ampliación corresponde
a un uso frecuente o a regeneraciones masivas, como indicaba la auditoría.
## Funciones añadidas
| Propuesta | Disponible |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A01 Alta musical | Artistas seleccionables en el alta; créditos con papel, instrumento, acreditación y orden; audio de versiones; imágenes de canción, álbum o artista con previsualización y recorte central. La imagen se asigna desde su pantalla del panel. |
| A02 Compras y pedidos | Biblioteca con formato, tamaño y disponibilidad; pedidos pendientes, pagados y cancelados en la cuenta; conciliación en el panel y consulta del importe reembolsado en Stripe. Los reembolsos se tramitan en Stripe; no se ha automatizado la retirada de derechos ni una descarga ZIP. |
| A03 Listas | Renombrado, borrado confirmado y orden mediante botones accesibles. La propiedad se comprueba en servidor. |
| A04 Suscripción | Concesión manual por cuenta y días, vencimiento, revocación y consulta del último periodo. La cuenta explica cómo solicitar o gestionar el acceso. No hay contratación ni renovación con cobro recurrente. |
| A05 Descubrimiento | Llamada de primera escucha antes del tocadiscos en móvil y enlace a intérpretes desde Música. |
| A06 Operación | Estado del catálogo con créditos, archivos de escucha y descarga, ondas, portadas y trabajos de procesado pendientes. Detecta existencia física; no certifica la calidad artística ni decodifica todo el almacén en cada visita. |
## Validación
- Tipos: sitio y panel sin errores ni advertencias de Svelte.
- Formato y ESLint: comprobados sobre el repositorio.
- Pruebas unitarias y de componentes: 402 aprobadas.
- PostgreSQL: 11 pruebas aprobadas en tablas y funciones TEMP. Incluyen reintento
de pago incierto, conservación de compras retiradas, créditos, publicación,
propiedad de listas, suscripción manual e imágenes reales procesadas con ffmpeg.
- Builds de producción: sitio y panel terminan con salida 0.
- Navegador: 61 pruebas aprobadas. Navegación y responsive existentes, nueva portada móvil, modal
horizontal, carga del taller y protección HTTP del panel. Se excluye la prueba
que solicita un código por correo.
- Shell: los scripts de despliegue pasan la comprobación de sintaxis de Bash.
Las comprobaciones de navegador necesitaron acceso a la base desde el proceso
local de preview. Los primeros intentos con acceso de red restringido devolvían
500 por falta de conexión; no se usaron como evidencia de corrección funcional.
El proveedor de pagos y el servidor Linux de producción no se han ensayado en vivo.
## Puesta en marcha y datos pendientes
1. Confirmar el intérprete de Dorina y los de Cupido sin flechas. Con esos datos,
asignar los créditos reales desde el panel. El auditor debe dejar de indicar
publicaciones sin intérprete.
2. Aplicar las migraciones 0024 y 0025 junto al despliegue. Son aditivas: no rellenan
datos ni eliminan tablas. La 0025 añade guardas que rechazan nuevas escrituras
incompatibles con una publicación completa.
3. Preparar `.env` y `.env.panel`, la misma base y rutas absolutas compartidas de
medios. Seguir [el procedimiento de despliegue](../despliegue/LEEME.md).
4. Comprobar con las cuentas reales de prueba la pasarela, la firma del webhook,
las unidades de servicio, TLS y la recuperación. Las pruebas del repositorio
no sustituyen este ensayo operativo.
## Capturas verificadas
Primera escucha en móvil, 375 × 667:
![Portada móvil con la primera escucha visible](assets/implementacion-portada-movil.png)
Modal horizontal, 812 × 375:
![Modal de acceso en una sola columna](assets/implementacion-modal-horizontal.png)

Powered by TurnKey Linux.