# SPRINT v0.1.27 - NEXT (GLM)
## Continuity First, Piano Melodies, Smarter Drum Coherence

**Owner:** GLM via OpenCode  
**Reviewer:** Codex  
**Fecha:** 2026-04-02  
**Baseline report:** `74bf4cbec05e`  
**Baseline real vigente:** `0345711a8749`  
**Estado actual:** estructura menos clonada, pero sigue `WEAK` y demasiado cortada

---

## 1. Runtime Truth

No cierres este sprint con el md de validacion solamente.

La verdad persistida actual es la sesion `0345711a8749` en `C:\Users\ren\.abletonmcp_ai\generation_manifests.json`.

Hechos reales hoy:

- `generation_mode = library-first-hybrid`
- `mandatory_midi_hook.materialized = true`
- `coherence_score = 4.6`
- `coherence_verdict = WEAK`
- `family_adherence_rate = 0.5`
- `piano_presence.has_audio_piano = true`
- el audio piano sigue entrando como `chords`, no como melodia real dominante
- el sistema ya no cae siempre en la misma estructura exacta
- pero sigue sonando demasiado picado, con huecos y entradas tardias innecesarias

Importante:

- el report `docs/SPRINT_v0.1.26_VALIDATION_REPORT.md` quedo desfasado
- habla de `74bf4cbec05e`, pero el `last_generation_id` real ya es `0345711a8749`
- no uses el report como source of truth si no coincide con el manifest real

---

## 2. Code Review

### 2.1 Que estaba mal en v0.1.26

1. `reference_listener.py`
   La variacion de Drop B se logro quitando material:
   - perc mas espaciada
   - top loop entrando tarde
   - synth entrando tarde y con step alterado

   Eso daba "diferencia", pero por subtraction. Auditivamente suena mas cortado, no mas creativo.

2. `reference_listener.py`
   El filtro `MIN_PLACEMENTS_FOR_MUSICAL_LAYERS` estaba aplicado por sample-path, no por presencia total del layer.

   Eso es un bug serio:
   - las variantes seccionales de synth/bass/top_loop podian tener 1-2 placements cada una
   - el filtro las borraba individualmente
   - el resultado final quedaba con huecos o con un solo fragmento sobreviviente

3. `reference_listener.py`
   El piano habia mejorado, pero seguia casi siempre como `AUDIO KEYS SUPPORT` con rol `chords`.

   Eso sirve para soporte armonico.
   No sirve para responder al pedido actual del usuario:
   "quiero que el piano haga melodias"

4. `server.py`
   `music_source_reuse_ratio` seguia midiendo casi al nivel de pack, no al nivel de sample real.

   Eso podia dar `1.0` aunque el sistema estuviera usando varios archivos distintos del mismo pack.
   Ese numero no era confiable para juzgar monotonia real.

5. `reference_listener.py`
   El `section_character_bonus` estaba siendo llamado con argumentos invertidos en el path de matching.

   Eso contamina la selectividad de caracter, incluyendo drums.
   Era un bug real de runtime, no de logs.

### 2.2 Que ya corrigio Codex en este turno

- se elimino la diferenciacion por vaciado artificial en Drop B
- se preservan variantes seccionales sin borrarlas por tener pocos placements por sample-path
- se agrego `AUDIO PIANO MELODY` cuando hay material piano/keys melodico disponible
- `music_source_reuse_ratio` ahora usa keys de source a nivel sample, no solo pack
- se corrigio el call-order roto de `section_character_bonus`
- se agrego selectividad contextual para `snare/clap` en secciones mas suaves

Eso ya esta en codigo.
No lo reviertas.

---

## 3. Nuevo Criterio Del Usuario

Hay una observacion especifica que a partir de ahora es obligatoria:

`SS_RNBL_Me_Gustas_One_Shot_Snare.wav`

No hard-banear este sample.
No hacer un if bruto para excluirlo.

Lo correcto es:

- entender por que el scorer lo deja entrar
- volver mas selectiva la coherencia de drums
- permitirlo solo cuando el contexto del tema realmente pida ese snare agresivo

Interpretacion senior:

- si una seccion tiene energia media, brillo moderado y no esta pidiendo un clap/snare tan duro, ese sample debe perder ranking
- si la seccion es realmente agresiva y el contexto percutivo lo soporta, puede seguir siendo elegible

No conviertas este punto en una blacklist. Convertilo en selectividad contextual real.

---

## 4. Objetivo Real de v0.1.27

Recuperar continuidad musical sin volver a la cancion clonada.

La salida buscada es:

- estructura clara
- identidad coherente
- menos huecos absurdos
- menos entradas tardias solo para "simular variacion"
- piano melodico audible
- drums mas selectivos y contextuales

La salida NO buscada es:

- volver a la misma cancion siempre
- volver a un tema vaciado por silencios
- meter piano solo como relleno de acordes
- hardcodear excludes por sample

---

## 5. Trabajo Obligatorio

### P0. Validar el nuevo path de continuidad real

Hay que probar con generacion nueva y confirmar que los fixes de continuidad realmente se vean en el manifest y en el audio:

- Drop B no debe diferenciarse solo por silencio o ausencia
- `synth_loop`, `top_loop`, `bass_loop` no deben desaparecer por filtros internos
- si hay variacion entre secciones, que sea por material, densidad util o articulacion; no por vaciar media barra

Que revisar:

- `audio_layers[*].positions`
- secciones `build/drop/break`
- si el mismo rol aparece con variantes seccionales, que no se pierdan por filtrado

### P0. Piano melodico real

No alcanza con `AUDIO KEYS SUPPORT`.

Objetivo:

- validar que `AUDIO PIANO MELODY` aparezca cuando haya material apto
- que el piano melodico no quede solo en el break o como detalle marginal
- que aporte fraseo/motivo, no solo cama armonica

Reglas:

- no reemplazar toda la identidad pluck del tema
- el piano melodico debe convivir con la familia primaria, no romperla
- usar piano/keys/rhodes melodico solo cuando el sample realmente sea melodico

### P0. Repeticion real medida por sample, no por pack

Con el fix nuevo, `music_source_reuse_ratio` debe reevaluarse con una sesion nueva.

Objetivo:

- medir monotonia real
- no castigar injustamente el uso coherente de un mismo pack

Que revisar:

- `repetition_metrics.source_distribution`
- `music_source_reuse_ratio`
- cuantas fuentes musicales distintas hay realmente

### P1. Selectividad de snare/clap por contexto

No hacer blacklist de `SS_RNBL_Me_Gustas_One_Shot_Snare.wav`.

Trabajo esperado:

- validar que el call-order corregido de `section_character_bonus` ya cambie el ranking
- revisar si hace falta endurecer la selectividad tambien en `sample_selector.py`
- demostrar con evidencia de ranking o manifest que snares muy agresivos no ganan por default en secciones que no lo piden

Si tocas scoring:

- hacelo generico y explicable
- basado en brillo/transient/contexto
- no basado en un nombre de archivo puntual

---

## 6. Exit Criteria

No cierres el sprint si no se cumple todo esto con una sesion nueva persistida:

- `generation_mode = library-first-hybrid`
- `mandatory_midi_hook.materialized = true`
- `coherence_score >= 6.0`
- `family_adherence_rate >= 0.65`
- `pack_coherence.overall >= 0.6`
- `piano_presence.has_audio_piano = true`
- `AUDIO PIANO MELODY` presente o evidencia clara de piano melodico equivalente
- `repetition_metrics.verdict != repetitive`
- `music_source_reuse_ratio < 0.8` con la nueva metrica por sample real
- `vocal_layers_auto = 0`

Criterio auditivo obligatorio:

- menos cortes y huecos que `0345711a8749`
- el piano debe escucharse como recurso melodico, no solo armonico
- Drop A y Drop B deben diferenciarse sin vaciar artificialmente el groove

---

## 7. Validation Report Obligatorio

GLM tiene que dejar:

`docs/SPRINT_v0.1.27_VALIDATION_REPORT.md`

Y ese md debe incluir:

1. `session_id` real nuevo
2. comparativa contra `0345711a8749`
3. manifest evidence real, no logs sueltos
4. `audio_layers` relevantes con positions de:
   - `AUDIO SYNTH LOOP`
   - `AUDIO BASS LOOP`
   - `AUDIO TOP LOOP`
   - `AUDIO KEYS SUPPORT`
   - `AUDIO PIANO MELODY`
5. `repetition_metrics.source_distribution`
6. evidencia de que el snare agresivo no esta entrando por default si no corresponde

Si el md no compara contra el manifest real mas nuevo, el sprint no cuenta.
