@ -36,7 +36,7 @@ A eso se suma que nada se valida —`estilo: bolreo` no falla, la canción
desaparece de su sección—, nada se consulta sin cargar el catálogo entero en
memoria, y cambiar una coma exige reconstruir y desplegar.
Alcance: ** 58 tablas** (13 ya existen), **48 archivos** que migrar, **22 rutas**
Alcance: ** 60 tablas** (13 ya existen), **48 archivos** que migrar, **22 rutas**
que hoy leen `$lib/content` .
## Decisiones transversales
@ -295,14 +295,27 @@ Biblioteca de prompts por género para Suno y equivalentes.
el idioma importa: en inglés suelen funcionar mejor, incluso para música en
español.
- ** `termino` ** _(nueva)_ — el glosario. termino único, categoria, `definicion`
de una o dos frases (lo que cabe en un globo sin taparle el texto a nadie),
- ** `termino` ** _(nueva)_ — la palabra: slug, termino único.
- ** `acepcion` ** _(nueva)_ — termino_id, **numero** , categoria, `definicion` de
una o dos frases (lo que cabe en un globo sin taparle el texto a nadie),
ampliacion, ejemplo.
- ** `termino_variante` ** _(nueva)_ — «sinalefas», «heptasílabos». Sin esto el
marcado solo acierta en singular, que es casi nunca.
- ** `capitulo_termino` ** _(nueva)_ — se calcula **al guardar el capítulo, no al
pintarlo**; y siendo tabla, se puede desmarcar una aparición cuando la palabra
esté usada en otro sentido.
**Un término tiene varias acepciones numeradas** , y la categoría baja aquí:
«clave» es instrumento de percusión en la primera, patrón rítmico en la
segunda y armadura de tonalidad en la tercera. Con una sola definición por
palabra, dos de las tres serían falsas.
- ** `termino_variante` ** _(nueva)_ — «sinalefas», «heptasílabos». Al nivel del
término, no de la acepción: el plural no cambia de sentido. Sin esto el marcado
solo acierta en singular, que es casi nunca.
- ** `capitulo_acepcion` ** _(nueva)_ — se calcula **al guardar el capítulo, no al
pintarlo**, y **apunta a una acepción, no a un término** .
Eso resuelve la duda que quedaba sobre el marcado automático: en un texto sobre
el bolero, «clave» es el patrón rítmico y no la armadura. Lo automático sabe
encontrar la palabra pero no elegir el sentido, así que **propone y una persona
confirma cuál**. Es lo único que no se equivoca, y siendo tabla se puede además
desmarcar una aparición suelta.
Regla editorial: **solo la primera aparición de cada término por página.** Marcar
las veintidós veces que sale «estribillo» convierte el texto en un campo de minas
@ -324,7 +337,15 @@ subrayado.
pasa a `cancion_id fk` . En `pedido_item` se congelan título y precio: una
factura tiene que seguir diciendo lo que decía.
- ** `datos_facturacion` ** _(nueva)_ — tipo, nombre, nif, dirección,
pais_codigo (decide el IVA), predeterminada.
pais_codigo, predeterminada.
**El país decide el IVA, y no es el nuestro.** Una venta digital a un
consumidor de otro país de la UE lleva el IVA de _su_ país; fuera de la UE,
normalmente ninguno. Por eso el tipo se guarda por línea de factura y no como
una constante. Detrás de eso hay una obligación que no es una tabla sino un
trámite —el régimen de ventanilla única— y Stripe Tax puede calcularlo si se
activa.
- ** `factura` ** _(nueva)_ — serie y numero **correlativos y sin huecos** , base,
iva_tipo, iva_cuota, total, y `datos_congelados jsonb` : si el cliente cambia su
dirección, la factura vieja no puede cambiar con él.
@ -334,10 +355,17 @@ subrayado.
- ** `favorito` , `valoracion` ** _(cambia)_ — clave foránea, y `CHECK` de 1 a 5 en
la base y no solo al validar.
- ** `reproduccion` ** _(nueva)_ — con `segundos` : una reproducción de tres
segundos no es una escucha, y contarla igual falsea la cifra. Agregación por
día y borrado del detalle a los noventa días **son parte del diseño** , no un
apaño para después.
- ** `reproduccion` ** _(nueva)_ — **decidido: se conservan por persona.** Con
`segundos` , porque una reproducción de tres segundos no es una escucha y
contarla igual falsea la cifra. Agregación por día y borrado del detalle a los
noventa días **son parte del diseño** , no un apaño para después.
⚠️ **Obliga a cambiar la política de privacidad antes de publicar esto.** Hoy
dice que no hay seguimiento, y con esta decisión deja de ser cierto. Hace
falta: la fila en la tabla de datos —qué se guarda, para qué, base legal y
plazo—, y que la persona pueda **ver y descargar su historial** desde su
cuenta. La base razonable es ejecución del contrato mientras alimente «lo
tuyo»; si además se usa para recomendar, ya es otra cosa y hay que decirlo.
### 6 · Medios
@ -346,7 +374,44 @@ subrayado.
duracion_s, ancho, alto, sha256, alt. Para que la administración pueda subir
audio, un archivo tiene que ser una fila.
### 7 · Bocetos, no se construyen ahora
**Decidido: los archivos viven en el servidor pero bajo dominio propio**,
`m.senzapaura.es/archives` . Gana más de lo que parece: un dominio sin cookies no
manda la de sesión en cada imagen y cada audio, y el día que haya un CDN delante
no hay que tocar ninguna URL —la base del dominio es configuración, y
`medio.clave` sigue siendo la ruta—.
⚠️ **Esto cambia una decisión anterior.** En el proyecto está escrito que las
descargas no usan URLs firmadas «porque el servidor ya tiene la sesión delante».
En otro dominio la sesión **ya no va delante** : esa es justo la gracia. Así que:
- **Lo público** —portadas, muestras— se sirve directo y cacheado.
- **El audio completo** pasa a necesitar **URL firmada con caducidad corta** : la
firma la pone la aplicación después de comprobar la compra, y Nginx la valida
con `secure_link` . Sin eso, el dominio de medios sería una puerta abierta al
catálogo entero.
Y hace falta su propio registro A, su Proxy Host y su certificado.
### 7 · Importación de fichas de género
**Decidido: las fichas se generan fuera, con un modelo más potente, y entran en
JSON.** Eso convierte el contrato de importación en parte del modelo.
- **Un JSON Schema de ficha de género** , que se le da a esa IA como destino y
que valida el importador. Sin él, cada tanda llega con las claves un poco
distintas y la importación se vuelve artesanía.
- **Procedencia, en `genero` y en las auxiliares** : `origen` (manual ·
importado), `modelo_origen` , `importado_en` , `revisado_por` , `revisado_en` .
Es musicología publicada con tu nombre: la diferencia entre «importado» y
«revisado» tiene que estar en la base, no en la memoria de nadie.
- **Idempotente** , por slug: reimportar una ficha corregida actualiza, no
duplica.
- Las relaciones se resuelven por código —país, instrumento, metro, compás,
persona— y **lo que no exista se crea marcado como importado y sin revisar** ,
en vez de fallar o de colarse en silencio. Así se ve qué se ha inventado el
modelo.
### 8 · Bocetos, no se construyen ahora
`lista` + `lista_cancion` (la playlist que sigue sin definirse), `encargo` ,
`inscripcion_taller` . Se dejan sitio porque aparecer después obliga a migrar lo
@ -377,23 +442,28 @@ ya cargado.
## Pendiente de respuesta
Seis decisiones de negocio. Cambiarlas después de cargar el contenido cuesta
mucho más que ahora.
1. ~~¿Los géneros del taller aspiran a ser un catálogo completo?~~ **Respondido:
sí, y se irá llenando poco a poco.** De ahí la jerarquía, las secciones y la
ficha ampliada.
2. ¿Quién escribe las fichas que faltan? Es musicología: un compás equivocado
sale publicado con su nombre.
3. ¿El glosario se marca solo o a mano? «Clave» es un término del son y también
una palabra normal.
4. ¿Facturas con numeración correlativa? Si se vende, sí, y la serie no puede
tener huecos ni empezar tarde.
5. ¿Se conservan las escuchas por persona? Cambia la política de privacidad, que
hoy dice que no se hace seguimiento.
6. ¿Dónde viven los archivos: disco del servidor o almacenamiento aparte?
7. ¿La biblioteca de prompts es una herramienta interna o contenido del sitio?
Casi todo está decidido. Quedan dos, y las dos son de la ficha de canción:
1. ** ¿Las versiones de un tema se pueden valorar y marcar como favoritas por
separado?** Yo lo pondría en la principal —se valora la canción, no el
máster—, pero marcar como favorita una maqueta concreta también tiene
sentido.
2. ** ¿La biblioteca de prompts es herramienta interna o contenido del sitio?**
Publicar cómo se fabrica un bolero con IA en una web que vende canciones
escritas por una persona dice algo distinto de lo que dice el resto del
sitio. De la respuesta depende si necesita página, si entra en el mapa y si
la ve el buscador.
### Ya decididas
- **Catálogo de géneros completo** , que se llena poco a poco.
- **Las fichas se generan fuera en JSON** , con un modelo más potente, y se
importan con esquema y procedencia.
- **El glosario lleva acepciones numeradas** , y el marcado apunta a una acepción:
lo automático propone, una persona confirma el sentido.
- **Facturas de verdad** , con correlativo por contador, rectificativas e IVA por
país del comprador.
- **Se conservan las escuchas por persona** — obliga a reescribir la política de
privacidad antes de publicarlo.
- **Los archivos, en `m.senzapaura.es/archives`** — y con ello, URLs firmadas
para el audio completo.