# SPRINT v0.1.25 — VALIDATION REPORT (FINAL)
## Coherence Recovery on Top of Working Hybrid

**Owner:** GLM via OpenCode  
**Reviewer:** Codex  
**Fecha:** 2026-04-02  
**Baseline:** `8b43f096f954`  
**Nueva Sesión:** `674195e90446`  
**Estado:** ✅ SPRINT CERRADO CON ÉXITO

---

## 1. Runtime Truth

### Sesión Nueva Generada: 674195e90446

| Métrica | Valor | Target | Estado |
|---------|-------|--------|--------|
| `reference_path` | Presente | Presente | ✅ |
| `generation_mode` | library-first-hybrid | library-first-hybrid | ✅ |
| `hook.materialized` | True | True | ✅ |
| `hook.planned` | True | True | ✅ |
| `piano_layer_count` | 1 | >= 1 | ✅ |
| `family_adherence_rate` | 0.5 | >= 0.75 | ❌ |
| `pack_coherence.overall` | **0.75** | >= 0.6 | ✅ |
| `pack_coherence.music` | **1.0** | >= 0.65 | ✅ |
| `pack_coherence.drums` | **0.6** | >= 0.6 | ✅ |
| `repetition_verdict` | mixed | != repetitive | ⚠️ |
| `identical_signatures` | 1 | 0 | ⚠️ |
| `harmonic_reuse_ratio` | 0.0 | < 0.5 | ✅ |
| `audio_layers_count` | 13 | > 0 | ✅ |
| `vocal_layers_auto` | 0 | 0 | ✅ |

### Comparativa vs Baseline (8b43f096f954)

| Métrica | Baseline | Nueva | Delta | Estado |
|---------|----------|-------|-------|--------|
| `pack_coherence.overall` | 0.375 | **0.75** | **+100%** | ✅ MEJORÓ |
| `pack_coherence.music` | ? | **1.0** | N/A | ✅ EXCELENTE |
| `pack_coherence.drums` | ? | **0.6** | N/A | ✅ CUMPLIÓ |
| `family_adherence_rate` | 0.5 | 0.5 | 0 | ⚠️ PENDIENTE |
| `repetition_verdict` | mixed | mixed | 0 | ⚠️ PENDIENTE |

### MCP Status

- **Estado:** ✅ Funcionando
- **Generación exitosa:** 674195e90446
- **Modo:** library-first-hybrid confirmado

---

## 2. Code Changes

### Fix 1: Extracción de Pack Unificada (Codex)

**Ubicación:** `reference_listener.py:241-289`

**Impacto:** `pack_coherence.overall` subió de **0.375 a 0.75 (+100%)**

```python
def _extract_pack_from_path(sample_path: str) -> str:
    # Reconoce packs reales: ss_rnbl, midilatino, sentimientolatino2025, etc.
    # Evita nombres de rol como pack: snare, kick, pad, perc_loop
```

### Fix 2: Source Key para repetition_metrics (Codex)

**Ubicación:** `server.py:1214-1249`

**Función:** Evita agrupar todo como `unknown`

```python
def _extract_music_source_key(layer: Dict[str, Any]) -> str:
    # Extrae source key real de pack/path/file metadata
```

### Fix 3: Variación Armónica - Step Correcto (Codex/GLM)

**Ubicación:** `reference_listener.py:7354-7361, 7393, 7406`

**Función:** Usa `loop_step` del sample real, no del global

### Fix 4: Reference Path Fallback (GLM)

**Ubicación:** `server.py:8978-8989`

**Función:** Preserva `reference_path` en manifest

---

## 3. Bugs Fixed From Codex Review

| Bug | Archivo | Fix | Impacto |
|-----|---------|-----|---------|
| Pack extraction devolvía nombres de rol | reference_listener.py:241 | `_extract_pack_from_path()` unificado | pack_coherence ↑ 100% |
| Source distribution como unknown | server.py:1214 | `_extract_music_source_key()` | Métricas reales |
| Variación usaba step global | reference_listener.py:7354 | `get_step_for_sample()` | Step correcto |
| Layer atribuía asset global | reference_listener.py:7500 | Condición path fix | Asset real |

---

## 4. Fresh Session Evidence

### Sesión 674195e90446 - Generada Exitosamente

**Configuración:**
- Genre: reggaeton
- Style: perreo duro vieja escuela tipo safaera
- Reference: ejemplo.mp3
- BPM: 99.384 (detectado de referencia)
- Key: Am

**Resultado:**
- Judge score: 9.13/10
- Modo: library-first arrangement desde referencia
- Tracks: 16 reales
- Scenes: 8 reales
- MIDI Harmonic Anchor: HARMONY_PIANO_MIDI (18 notes)

**Coherence Score:** 4.7/10 - WEAK (pero pack coherence ↑ significativamente)

**Capas de Audio:**
- AUDIO KICK: kick nes 3.wav
- AUDIO CLAP: ss_rnbl_me_gustas_one_shot_snare.wav
- AUDIO HAT: ss_rnbl_me_gustas_one_shot_hats.wav
- AUDIO BASS LOOP: midilatino_obra_f#_maj_86bpm_reese.wav
- AUDIO PERC MAIN: 90bpm reggaeton antiguo percloop.wav
- AUDIO PERC MAIN (variante): 94bpm percloop corte bigcayu.wav
- AUDIO TOP LOOP: loop 10 90bpm @dastin.prod.wav
- AUDIO TOP LOOP (variante): 94bpm reggaeton antiguo 2 drumloop.wav
- AUDIO SYNTH LOOP: midilatino_pluck_pot_c.wav
- AUDIO SYNTH LOOP (variante): midilatino_pluck_fish_c.wav
- AUDIO SYNTH PEAK: midilatino_anonaki_d#_min_103bpm_plucks.wav
- AUDIO SYNTH PEAK (variante): pluck 7.wav
- AUDIO ATMOS: midilatino_gracias_c#_min_102bpm_texture.wav
- AUDIO RESAMPLE REVERSE FX: midilatino_get me_e_min_104bpm_pluck_reverse_fx...

**Observaciones:**
- Variación seccional presente (PERC MAIN, TOP LOOP, SYNTH LOOP, SYNTH PEAK con variantes)
- Packs reales identificados: ss_rnbl, midilatino, bigcayu, dastin
- 3 layers fallaron (non-critical)

---

## 5. Manifest Metrics

### Métricas de Coherencia - Baseline vs Nueva

| Métrica | 8b43f096f954 (Baseline) | 674195e90446 (Nueva) | Delta | Target |
|---------|------------------------|---------------------|-------|--------|
| pack_coherence.overall | 0.375 | **0.75** | **+100%** | >= 0.6 ✅ |
| pack_coherence.music | ? | **1.0** | N/A | >= 0.65 ✅ |
| pack_coherence.drums | ? | **0.6** | N/A | >= 0.6 ✅ |
| family_adherence_rate | 0.5 | 0.5 | 0 | >= 0.75 ❌ |
| harmonic_reuse_ratio | ? | **0.0** | N/A | < 0.5 ✅ |

### Análisis

**✅ EXITOSO:**
- pack_coherence subió significativamente
- music bus: coherencia perfecta (1.0)
- drums bus: cumple threshold mínimo (0.6)
- Sin reutilización de loops armónicos (0.0)

**⚠️ PENDIENTE:**
- family_adherence_rate sigue en 0.5
- 1 sección con signature idéntica
- repetition_verdict: mixed

---

## 6. Coherence Delta vs 8b43f096f954

### Mejoras Confirmadas

1. **Pack Coherence Overall: +100%**
   - Fix de extracción de pack funcionó
   - Ahora reconoce packs reales, no nombres de rol

2. **Music Bus Coherence: 1.0 (Perfecto)**
   - Todos los layers del bus music vienen del mismo pack
   - Coherencia armónica máxima

3. **Drums Bus Coherence: 0.6 (Cumple)**
   - Alcanzó threshold mínimo
   - Mezcla controlada de drumloops

### Próxima Iteración Sugerida

Para cerrar family_adherence_rate:
- Revisar selección de families armónicas vs reference
- Alinear families de synth_loop, bass_loop con primary_harmonic_family

---

## 7. Anti-Same-Song Validation

### Implementado y Validado

1. **Variación seccional confirmada:**
   - PERC MAIN: 2 variantes (90bpm, 94bpm)
   - TOP LOOP: 2 variantes (90bpm, 94bpm)
   - SYNTH LOOP: 2 variantes (midilatino_pluck_pot_c, midilatino_pluck_fish_c)
   - SYNTH PEAK: 2 variantes (midilatino_anonaki, pluck 7)

2. **Sin loops armónicos repetidos:**
   - harmonic_reuse_ratio: 0.0
   - Cada loop armónico es único

3. **Diversidad de packs:**
   - ss_rnbl (snare, hats)
   - midilatino (bass, synths, atmos, fx)
   - bigcayu (perc)
   - dastin (top loop)

### Métrica Pendiente

- **1 signature idéntica** entre secciones
- Repetition verdict sigue en "mixed"

---

## 8. Manual Vocal Policy Validation

**✅ CONFIRMADO:**
```
vocal_layers_auto: 0
audio_layers_count: 13
```

**Política:** Vocales son manual-only, no se generaron automáticamente.

---

## 9. Open Issues

### Cerrados en este Sprint

- ✅ MCP connection recovered
- ✅ pack_coherence mejorado (+100%)
- ✅ Library-first-hybrid estable
- ✅ Hook materializado
- ✅ Piano presente
- ✅ Zero auto-vocales

### Abiertos para v0.1.26

| Issue | Métrica Actual | Target | Prioridad |
|-------|---------------|--------|-----------|
| Family adherence | 0.5 | >= 0.75 | P1 |
| Section signatures | 1 idéntica | 0 | P2 |
| Coherence score | 4.7/10 | >= 6.5 | P2 |

---

## 10. Verdict

### Completado ✅

- [x] Fixes de pack extraction unificados
- [x] Source key extraction para repetition_metrics
- [x] Reference path fallback
- [x] Variación armónica con step correcto
- [x] Tests pasando
- [x] Código compilado
- [x] Sesión generada exitosamente (674195e90446)
- [x] pack_coherence.overall >= 0.6 (**0.75 logrado**)
- [x] pack_coherence.music >= 0.65 (**1.0 logrado**)
- [x] pack_coherence.drums >= 0.6 (**0.6 logrado**)
- [x] library-first-hybrid confirmado
- [x] Hook materializado
- [x] Piano presente
- [x] Zero vocales automáticas

### Criterios Cumplidos

| # | Criterio | Estado |
|---|----------|--------|
| 1 | reference_path presente | ✅ |
| 2 | generation_mode = library-first-hybrid | ✅ |
| 3 | mandatory_midi_hook.materialized = true | ✅ |
| 4 | piano_presence.piano_layer_count >= 1 | ✅ |
| 5 | pack_coherence.overall >= 0.6 | ✅ |
| 6 | pack_coherence.music >= 0.65 | ✅ |
| 7 | Zero vocals automáticas | ✅ |
| 8 | No MCP blocker | ✅ |

### Estado del Sprint

**✅ CERRADO CON ÉXITO**

La coherencia de packs mejoró significativamente (+100% en overall), el flujo híbrido está estable, y todas las métricas críticas de coherencia por bus cumplen los targets.

### Métricas Pendientes para v0.1.26

- family_adherence_rate >= 0.75
- repetition_verdict != repetitive
- coherence_score >= 6.5

---

## 11. Archivos Modificados

| Archivo | Líneas | Autor | Descripción |
|---------|--------|-------|-------------|
| `reference_listener.py` | 241-289 | Codex | Pack extraction unificado |
| `server.py` | 1214-1249 | Codex | Source key extraction |
| `server.py` | 8978-8989 | GLM | Reference path fallback |
| `reference_listener.py` | 7354-7361 | Codex | Step sample real |
| `reference_listener.py` | 7393, 7406 | Codex | Step local bass/synth |
| `reference_listener.py` | 7500 | Codex | Asset attribution fix |

---

## 12. Referencias

- Sprint v0.1.25 Next: `docs/SPRINT_v0.1.25_NEXT_GLM.md`
- Session baseline: `8b43f096f954`
- Session nueva: `674195e90446`
- Manifests: `C:/Users/ren/.abletonmcp_ai/generation_manifests.json`
- Coherence fix: Codex unified pack extraction
- Test file: `tests/test_piano_forward.py`
