# SPRINT v0.1.26 — NEXT (GLM)
## Coherence First, Less Choppy, Less Template Song

**Owner:** GLM via OpenCode  
**Reviewer:** Codex  
**Fecha:** 2026-04-02  
**Baseline real:** `674195e90446`  
**Estado actual:** `library-first-hybrid` funciona, pero auditivamente sigue `WEAK`

---

## 1. Runtime Truth

No cerrar este sprint con métricas cosméticas.

La sesión `674195e90446` confirma:

- `generation_mode = library-first-hybrid`
- `mandatory_midi_hook.materialized = true`
- `coherence_score = 4.7`
- `coherence_verdict = WEAK`
- `family_adherence_rate = 0.5`
- `piano_presence.has_piano = true` pero era casi todo por hook MIDI
- `repetition_metrics.verdict = mixed`
- `music_source_reuse_ratio = 0.8`

Conclusión:

- el sistema ya no está roto
- el problema ahora es musical y de planificación
- la canción sigue sonando demasiado segmentada, demasiado rígida y demasiado parecida a sí misma

---

## 2. Code Review

### 2.1 Qué estaba mal en v0.1.25

1. `reference_listener.py`
   Los roles loop armónicos todavía podían aceptar material desde carpetas `one shots`. Eso empuja plucks cortados y variantes choppy que rompen continuidad musical.

2. `reference_listener.py`
   El piano estaba siendo contado casi sólo por el hook MIDI. Eso permitía un falso positivo de `piano_presence` sin una capa audio real de keys/rhodes sosteniendo intro/build/break.

3. `reference_listener.py`
   El bajo podía quedar sin anclas suficientes en `build/drop`, dejando huecos grandes aunque el rol estuviera “seleccionado”.

4. `reference_listener.py`
   La extracción de packs seguía aceptando carpetas genéricas del workspace como si fueran packs reales. Eso inflaba o contaminaba la lectura de coherencia.

5. `song_generator.py` + `reference_listener.py`
   La macro-estructura sigue demasiado determinística. No está “rota”, pero sí demasiado rígida:
   `intro -> build -> drop -> break -> drop -> outro`
   con reglas de entrada/salida muy parecidas entre corridas.

### 2.2 Qué ya corrigió Codex antes de este sprint

- rechazo de `one shots` para roles loop (`synth_loop`, `bass_loop`, `perc_loop`, `top_loop`, `vocal_loop`)
- inyección de una capa audio real de piano/keys cuando el sistema sólo tenía hook MIDI
- anclas mínimas de bass en `build/drop`
- limpieza adicional de extracción de pack para no tomar carpetas genéricas del workspace

Eso ya está en código. No lo rehagas ni lo reviertas.

---

## 3. Objetivo Real de v0.1.26

Recuperar **coherencia + musicalidad + estructura usable** sin volver al caos.

La salida buscada no es:

- una pista vacía
- una pista hiper-cortada
- una pista que repite 3 sonidos todo el tema
- una pista “ordenada” pero muerta

La salida buscada sí es:

- estructura clara
- identidad coherente
- más continuidad musical entre secciones
- más vida interna dentro de esa estructura
- audio piano/keys real, no sólo hook MIDI

---

## 4. Trabajo Obligatorio

### P0. Romper el “same song syndrome” sin romper coherencia

Atacar el problema en el path activo, no con métricas inventadas.

Objetivo:

- que dos generaciones consecutivas con misma referencia no caigan en la misma silueta exacta de densidad y capas
- que `intro/build/drop/break/drop/outro` no suene siempre al mismo guion mecánico

Reglas:

- no agregues randomización ciega
- la variación tiene que ser controlada por sección y por rol
- no mezcles packs sin función clara sólo para “diversificar”

Implementación esperada:

- introducir variación real de densidad por sección en `music bus`
- desacoplar parcialmente el patrón de entrada de `synth_loop`, `top_loop` y `perc_loop`
- evitar que `drop A` y `drop B` sean casi el mismo bloque con mínimos cambios cosméticos

### P0. Menos cortes, menos huecos muertos

El reggaeton actual está demasiado “picado”.

Problema audible:

- cortes bruscos
- demasiados espacios donde debería seguir el groove
- layers que entran una vez y desaparecen

Objetivo:

- continuidad rítmica y armónica mejor sostenida
- sin convertir todo en una pared constante

Validar especialmente:

- `bass_loop`
- `perc_loop`
- `top_loop`
- `synth_loop`
- `AUDIO KEYS SUPPORT`

No aceptes:

- capas musicales con 1 o 2 placements en toda la canción salvo justificación muy clara
- drops donde el bajo no sostiene el cuerpo principal
- breaks vacíos por accidente

### P0. Piano audio real, no sólo “piano_presence” de manifest

Nuevo estándar:

- `piano_presence.has_audio_piano = true`
- al menos una capa audio `piano/keys/rhodes` real en `intro`, `build` o `break`
- el hook MIDI puede seguir existiendo, pero ya no alcanza por sí solo

Qué buscar:

- `rhodes`
- `keys`
- `piano`
- `epiano`

Qué no hacer:

- meter piano brillante arriba de todo el drop si rompe el ancla principal
- reemplazar el primary family del tema

La regla musical es:

- `pluck/lead` puede seguir siendo la identidad principal
- `piano/keys` tiene que funcionar como soporte coherente, no como parche decorativo

### P1. Más riqueza tímbrica sin perder identidad

El sistema se encierra en 3-4 sonidos.

Necesitamos:

- más contraste útil
- menos reciclado del mismo material
- sin abrir demasiados packs

Objetivo:

- 1 pack dominante por bus
- 1 secundario sólo si tiene función clara
- más de un color musical dentro del bus music

No aceptes:

- `music_source_reuse_ratio >= 0.8`
- `synth_loop` y `synth_peak` sonando como el mismo gesto todo el tema
- variantes que sólo cambian filename pero no función musical

### P1. Coherencia, no plantilla rígida

La crítica del usuario es correcta:

- quiere estructura
- no quiere escuchar siempre la misma canción

Eso significa:

- no eliminar la estructura
- sí hacer que cada sección tenga una función musical real

Ejemplos de función real:

- intro: presentación y espacio
- build: empuje y preparación
- drop A: statement principal
- break: respiro con soporte armónico útil
- drop B: regreso con diferencia perceptible
- outro: salida lógica

---

## 5. Restricciones

### No tocar sin necesidad

- no reviertas fixes de Codex
- no reabras vocals automáticas
- no metas samples vocales “porque quedan bien”
- no vuelvas a permitir `one shots` como `synth_loop` por accidente

### No maquillar métricas

No cierres el sprint si:

- `coherence_score` sigue `WEAK`
- el audio sigue sonando vacío o excesivamente cortado
- el piano sigue siendo sólo MIDI
- el report dice `SUCCESS` pero la canción sigue auditivamente pobre

### No usar el report como sustituto del manifest

Toda afirmación tiene que salir de:

- `generation_manifests.json`
- manifest nuevo persistido
- session id real
- validación audible del resultado

---

## 6. Criterios de Salida

Para considerar este sprint cerrado, el nuevo manifest debe cumplir:

- `generation_mode = library-first-hybrid`
- `mandatory_midi_hook.materialized = true`
- `piano_presence.has_audio_piano = true`
- `piano_presence.audio_piano_count >= 1`
- `coherence_score >= 6.0`
- `family_adherence_rate >= 0.65`
- `pack_coherence.overall >= 0.6`
- `repetition_metrics.verdict != repetitive`
- `music_source_reuse_ratio < 0.7`
- `vocal_layers_auto = 0`

Y además, auditivamente:

- no debe sonar “trozada”
- no debe sonar como 3 sonidos repitiéndose toda la pista
- `drop B` debe diferenciarse de `drop A`
- `break` debe tener función musical y no ser sólo vacío

---

## 7. Validación Obligatoria

### Código

- `python -m py_compile` sobre archivos tocados
- `tests/test_piano_forward.py`
- `tests/test_selection_coherence.py`

### Runtime

Generar una sesión nueva real con referencia:

- género: `reggaeton`
- estilo: `perreo duro vieja escuela tipo safaera`
- referencia: `libreria\\reggaeton\\ejemplo.mp3`
- bpm: `95`
- key: `Am`

### Revisión del manifest

Reportar explícitamente:

- `session_id`
- `coherence_score`
- `family_adherence_rate`
- `pack_coherence.overall`
- `pack_coherence.music`
- `piano_presence`
- `repetition_metrics`
- `audio_layers` por rol
- qué layer de audio hace el soporte piano/keys
- diferencia real entre `drop A` y `drop B`

---

## 8. Formato del Validation Report

Crear:

- `docs/SPRINT_v0.1.26_VALIDATION_REPORT.md`

Estructura obligatoria:

1. `Runtime Truth`
2. `Manifest Evidence`
3. `Audible Outcome`
4. `Code Changes`
5. `Open Bugs`
6. `Verdict`

Reglas:

- no uses `SPRINT CERRADO CON ÉXITO` si `coherence_score` sigue en `WEAK`
- no ocultes métricas malas
- no digas “piano presente” si sigue siendo sólo hook MIDI
- si el audio sigue muy cortado o muy parecido a la corrida anterior, escribirlo explícitamente

---

## 9. Resumen para GLM

Tu trabajo no es “hacer más variación”.

Tu trabajo es este:

- conservar coherencia
- reducir lo choppy
- recuperar musicalidad
- meter piano audio real
- evitar la sensación de “misma canción siempre”
- no reabrir vocals

Si la nueva corrida sigue sonando rígida, vacía o demasiado loopeada, el sprint no está cerrado.
