# SPRINT v0.1.22 — CHANGES REPORT ## AbletonMCP-AI | Para Codex: Revisar y Corregir **Fecha:** 2026-04-01 **Session Baseline:** `a6a4cc87e493` **Test Parameters:** genre=reggaeton, style=perreo duro vieja escuela tipo safaera, reference=libreria\reggaeton\ejemplo.mp3 --- ## 1. VOCABULARIO / DEFINICIONES - **Vocal manual-only:** Los roles `vocal_loop`, `vocal_build`, `vocal_peak`, `vocal_shot` son PARA USUARIO HUMANO SOLAMENTE. No deben ser seleccionados, materializados, ni persistidos automaticamente. - **Anti-flattening:** Logica que evita consolidar/clips整齐 demasiado para mantener variacion por seccion. - **Hybrid truth:** Generacion que incluye MIDI + Piano + Library samples. - **Hook materialization:** El MIDI hook obligatorio debe materializarse en el set. --- ## 2. PROBLEMAS IDENTIFICADOS ### P1: Vocal Leak — CLEANED **Problema:** Sistema estaba seleccionando y materializando capas de vocal automaticamente. **Fuentes corregidas:** | Archivo | Linea | Problema | Fix | |---------|-------|----------|-----| | `song_generator.py` | 5880 | `'vocal'` estaba en OPTIONAL budget | Comentado: `# Only if budget allows (vocal removed - manual only)` | | `song_generator.py` | 11740 | VOCAL CHOP track spec presente | Eliminado completamente | | `song_generator.py` | 5672 | `VARIATION_ROLES` incluía `vocal_shot, vocal_loop` | Eliminados de la lista | | `reference_listener.py` | 5629-5632 | CORE_ROLES seleccionaba vocal roles | Agregado check `_is_manual_recording_role(role)` | | `reference_listener.py` | 5877-5879 | OPTIONAL_ROLES seleccionaba vocal roles | Agregado check `_is_manual_recording_role(role)` | | `reference_listener.py` | 7127-7144 | `vocal_alt` selection no estaba filtrado | Envuelto en `if not _is_manual_recording_role('vocal_loop')` | ### P2: Anti-Loop en Path Equivocado — FIXED **Problema:** Mi fix original a `_apply_clip_consolidation()` (lines 3941-4049) NO estaba en el path activo de runtime. **Solucion:** El path activo de consolidacion es: - `_materialize_reference_audio_layers()` lines 4599-4647 - `_build_audio_pattern_positions()` lines 3784-3833 **Fix aplicado en server.py:4618-4667:** ```python # P2: ANTI-FLATTEN - Check section_variants BEFORE consolidation # Si layer tiene section_variants, preservar posiciones para diferenciacion por seccion section_variants = layer.get('section_variants', {}) has_variants = bool(section_variants) should_preserve_positions = has_variants and ( role_lower in MUSIC_HARMONIC_ROLES or role_lower in SECTION_VARIATION_ROLES ) # Consolidate SOLO si NO tiene section_variants if not should_preserve_positions and positions and len(positions) > MAX_ARRANGEMENT_CLIPS_PER_TRACK: # ... apply consolidation ``` ### P3: Hook Materialization Inestable — REQUIERE INVESTIGACION **Problema:** No es consistentemente `materialized = true`: - `4c697638bd3d`: hook materialized = true ✓ - `ba306bd7575b`: hook materialized = true ✓ - `a6a4cc87e493`: hook materialized = false ✗ **Status:** REQUIERE DEBUG - No hay nuevo fix aplicado aun. ### P4: MCP Connection Timeout — BLOCKER ACTUAL **Problema:** `get_session_info` y `get_tracks` timeout. `generate_song` no completa. **Status:** REQUIERE DIAGNOSTICO --- ## 3. TESTS AGREGADOS / MODIFICADOS ### test_piano_forward.py **Test: `TestManualVocalLayerSanitization` (line 331)** ```python def test_sanitize_audio_layer_records_removes_manual_vocal_layers(self): # Verifica que _sanitize_audio_layer_records() elimina vocal layers automaticamente ``` **Test: `TestRepetitionMetrics.test_repetition_metrics_detect_repetitive_harmonic_sections` (line 354)** ```python def test_repetition_metrics_detect_repetitive_harmonic_sections(self): # Verifica que secciones repetitivas se detectan ``` **Test: `TestRepetitionMetrics.test_repetition_metrics_handle_sections_with_missing_end_values` (line 382)** ```python def test_repetition_metrics_handle_sections_with_missing_end_values(self): # Verifica handling de end = None en sections ``` ### test_selection_coherence.py 11 tests existentes verificando coherencia de seleccion. --- ## 4. VALIDATION THRESHOLDS ESPERADOS Para que una generacion sea considerada valida: | Threshold | Valor Minimo | Status | |-----------|-------------|--------| | `coherence_score` | >= 6.5 | ✗ Sin validar | | `mandatory_midi_hook.materialized` | true | ✗ Inconsistente | | `piano_presence.piano_layer_count` | >= 1 | ✗ Sin validar | | `repetition_metrics.verdict` | != repetitive | ✗ Sin validar | | `generation_mode` | library-first-hybrid | ✗ Sin validar | | Vocal layers auto-generados | 0 | ✓ Fix aplicado | --- ## 5. ARCHIVOS MODIFICADOS ### song_generator.py (6 edits) - Line 5880: Vocal removido de OPTIONAL budget - Line 11740: VOCAL CHOP spec eliminado - Line 5672: Vocal roles eliminados de VARIATION_ROLES ### reference_listener.py (3 edits) - Lines 5629-5632: CORE_ROLES filtering para manual-only - Lines 5877-5879: OPTIONAL_ROLES filtering para manual-only - Lines 7127-7144: vocal_alt selection wrapped en check ### server.py (1 CRITICAL edit) - Lines 4618-4667: Anti-flattening en ACTIVE path --- ## 6. BLOCKERS ACTUALES 1. **MCP Connection Timeout** — No se puede validar runtime 2. **Hook Materialization** — Inconsistente entre sesiones 3. **Sin nueva generacion** — No hay session_id nuevo en manifests --- ## 7. PARA CODEX: PREGUNTAS Y CORRECCIONES 1. **MCP Timeout:** ¿Cual es la causa raiz? ¿Socket? ¿Threading? ¿Live API blocking? 2. **Hook Materialization:** ¿Por qué `a6a4cc87e493` tuvo `materialized = false`? 3. **Anti-flattening:** ¿El fix en server.py:4618-4667 es suficiente o falta algo en `_build_audio_pattern_positions()`? 4. **¿Hay otros vocal leak sources que no vi?** --- ## 8. PROXIMO STEP 1. Fix MCP connection 2. Generar nueva sesion con test parameters 3. Verificar manifest pasa todos los thresholds 4. Crear SPRINT_v0.1.22_VALIDATION_REPORT.md