# Sprint v0.1.17 - Persisted Validation and Hybrid Coherence Closure **Owner:** Kimi via OpenCode **Reviewer:** Codex **Fecha:** 2026-04-01 **Baseline real vigente:** `e3c3691cc922` **Estado de cierre v0.1.16:** no aceptado como validación real --- ## 1. Resultado del review de v0.1.16 El archivo [SPRINT_v0.1.16_VALIDATION_REPORT.md](C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\docs\SPRINT_v0.1.16_VALIDATION_REPORT.md) no cierra el sprint. Es un informe de implementación, no una validación real. Verdades confirmadas por Codex: - Kimi sí implementó piezas bus-aware en `reference_listener.py`. - Kimi sí agregó verdad híbrida en `_calculate_piano_presence()` y consolidación de duplicados en `server.py`. - El reporte no aporta una generación persistida nueva con métricas reales. - La última verdad persistida sigue siendo `e3c3691cc922`. Regresiones reales encontradas y corregidas por Codex en `reference_listener.py`: 1. `build_arrangement_plan()` rompía si `select_dominant_palette()` devolvía `str` legacy en vez de `dict`. 2. `verify_pack_coherence(...)` se llamaba con `primary_harmonic_family`, variable inexistente en ese scope. 3. `palette_info["dominant_pack"]` escribía una variable `dominant_pack` inexistente. Además se endureció `test_piano_forward.py` para fijar: - normalización legacy -> bus-aware de `dominant_packs` - persistencia de `palette_info.dominant_pack` - persistencia de `palette_info.dominant_packs.music` Estado real después del review: - `py_compile` pasa - `test_piano_forward.py` pasa - `test_selection_coherence.py` pasa - no existe todavía una nueva sesión validada que reemplace `e3c3691cc922` --- ## 2. Verdad operativa hoy Lo último realmente persistido y verificable sigue siendo `e3c3691cc922`: - `generation_mode = library-first-hybrid` - `mandatory_midi_hook.materialized = true` - hook materializado como `HARMONY_PIANO_MIDI` - `primary_harmonic_anchor = pluck` - `coherence_score = 4.6` - `pack_coherence_ratio = 0.25` - `piano_presence` quedó desfasado respecto del hook híbrido en esa sesión vieja Hallazgo adicional importante: - durante este review se intentó una nueva generación real - Live siguió ejecutando comandos - el wrapper/MCP terminó en timeout - no quedó una nueva sesión persistida en `C:\Users\ren\.abletonmcp_ai\generation_manifests.json` Conclusión senior: - v0.1.16 mejoró wiring y tests - v0.1.16 no cerró la validación end-to-end - el sistema todavía no prueba de forma confiable que la nueva coherencia por bus mejore una generación real persistida --- ## 3. Objetivo del sprint Cerrar la transición de: - `bus-aware implementation present` a: - `bus-aware generation realmente persistida` - `library-first hybrid con hook MIDI + piano truth + librería del usuario` - `coherence_score >= 6.5` con manifest real Este sprint no es para inventar features laterales. Es para cerrar verdad de runtime y coherencia útil. --- ## 4. Reglas no negociables 1. Trabajar solo sobre el árbol canónico: - `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts` 2. No tocar wrappers/config MCP salvo que rompas algo concreto. - OpenCode y Codex deben seguir usando el wrapper canónico. 3. No reportar `COMPLETE` sin una sesión nueva persistida en: - `C:\Users\ren\.abletonmcp_ai\generation_manifests.json` 4. No cerrar con `PASS` si cualquiera de estas falla: - `coherence_score < 6.5` - `mandatory_midi_hook.materialized != true` - `generation_mode != library-first-hybrid` - `pack_coherence.music < 0.65` - `pack_coherence.overall < 0.50` 5. No “mejorar coherencia” eliminando el híbrido. - La salida debe seguir siendo `library-first`. - El hook MIDI debe seguir existiendo como soporte armónico cuando haya hints/phrase plan. 6. No “mejorar piano” mintiendo con audio inexistente. - Si el soporte piano viene del hook MIDI, el manifest debe decirlo. - Si aparece audio piano adicional, debe venir de la librería y tener función musical clara. 7. Si `generate_track` o el tool MCP hacen timeout: - no declarar ni éxito ni fracaso por el timeout solo - revisar log de Live - revisar persistencia en `generation_manifests.json` - revisar estado real del set antes de escribir el reporte --- ## 5. Trabajo obligatorio ### P0. Cerrar el gap entre generación real y manifest persistido Problema: - Hoy el runtime puede dejar Live ocupado y el tool puede vencer por timeout sin dejar una sesión persistida nueva. - Eso bloquea una validación senior real. Qué tenés que hacer: - revisar el camino: - `generate_track_async` - `get_generation_job_status` - persistencia final en `generation_manifests.json` - asegurar que una generación completada deje una sesión nueva persistida - si la generación sigue en progreso al superar el timeout del cliente, el sistema debe dejar trazabilidad suficiente para recuperarla No quiero: - otro reporte “todo implementado” sin `session_id` nuevo - ni un sistema que haga música en Live pero no la persista ### P1. Validar el híbrido real en una sesión nueva Tenés que producir una sesión nueva y demostrar en manifest: - `mandatory_midi_hook.materialized = true` - `track_name` o `embedded_track_name` del hook - familia del hook - `piano_presence.has_piano = true` - `piano_presence.has_hybrid_piano = true` cuando el soporte venga del hook - si hay audio piano adicional: - `piano_presence.has_audio_piano = true` - listar las capas reales de audio No acepto: - volver a `piano_presence = 0` con hook piano materializado - ni reportes sin citar el manifest persistido ### P2. Subir la coherencia musical sin romper library-first Problema real hoy: - `drums` pueden mezclar razonablemente - `music/harmonic` sigue dispersándose demasiado - la verdad persistida sigue siendo `4.6/10` Qué tenés que hacer: - endurecer la selección del bus `music` - permitir como máximo: - 1 pack dominante principal en `music` - 1 pack secundario justificable para soporte - reducir dispersión en `vocal/fx` si destruye el score general - mantener libertad relativa en `drums`, pero no meter clutter innecesario Objetivo de salida: - `pack_coherence.music >= 0.65` - `pack_coherence.overall >= 0.50` - `family_adherence_rate >= 0.60` sobre capas armónicas ### P3. No olvidar armonía MIDI + piano + librería Esto es central porque el usuario lo marcó explícitamente. La sesión final debe conservar los tres elementos: - ancla armónica principal - soporte MIDI híbrido real - audio real de la librería del usuario Política esperada: - anchor principal claro, probablemente `pluck` o equivalente según referencia - 1 hook MIDI de soporte armónico - 0 o 1 capa secundaria `piano/keys/rhodes` si mejora musicalidad real - no llenar el arreglo de capas armónicas redundantes No quiero: - sesiones donde el sistema “olvide” el hook MIDI - sesiones donde el sistema “olvide” el piano support - sesiones donde el sistema vuelva a puro loop genérico sin identidad de librería ### P4. Reducir fragmentación útil vs ruido Revisar si los duplicados consolidados en `server.py` realmente ayudan. Debés validar: - no más duplicados arbitrarios por rol - no más capas repetidas solo por nombre distinto - no más cientos de clips cortos sin justificación Si una duplicación queda: - justificar qué contraste musical aporta ### P5. Validación final senior real Generar con: - `genre = reggaeton` - `style = perreo duro vieja escuela tipo safaera` - `bpm = 95` - `key = Am` - referencia: - `libreria\reggaeton\ejemplo.mp3` Validar obligatoriamente: - `session_id` nuevo - presencia del `session_id` en `generation_manifests.json` - `coherence_score` - `pack_coherence.overall` - `pack_coherence.music` - `mandatory_midi_hook` - `piano_presence` - `primary_harmonic_family` - `audio_layers` reales con source path - track count real del set Además: - correr `validate_set` - correr `diagnose_generated_set` - si algún tool timeoutea, recuperar la verdad por log/manifest antes de concluir --- ## 6. Archivos probables a tocar - `AbletonMCP_AI\AbletonMCP_AI\MCP_Server\reference_listener.py` - `AbletonMCP_AI\AbletonMCP_AI\MCP_Server\server.py` - `AbletonMCP_AI\AbletonMCP_AI\MCP_Server\tests\test_piano_forward.py` - `AbletonMCP_AI\AbletonMCP_AI\MCP_Server\tests\test_selection_coherence.py` - opcionalmente tooling de smoke/validación en `temp\` si sirve para recuperar session ids reales --- ## 7. Casos de test obligatorios 1. Un test donde `select_dominant_palette()` devuelva string legacy y `build_arrangement_plan()` siga construyendo `palette_info` bus-aware correcto. 2. Un test donde `verify_pack_coherence()` no rompa por variables mal cableadas y use la familia primaria real. 3. Un test donde un hook `piano` materializado deje `has_hybrid_piano = true`. 4. Un test donde `music` use un pack dominante y `drums` otro, sin castigo global inválido. --- ## 8. Formato de entrega Archivo obligatorio: - `docs/SPRINT_v0.1.17_VALIDATION_REPORT.md` Ese md debe incluir: - cambios reales - bugs encontrados durante la validación - `session_id` real nuevo - extracto de métricas del manifest persistido - qué quedó abierto si no llegás a umbral No acepto: - “status: implementado” como sustituto de validación - `session_id` inexistentes - claims auditivos sin respaldo del manifest - ocultar un `WEAK` o un timeout en una nota menor --- ## 9. Criterio de cierre Solo podés cerrar v0.1.17 si: - existe una sesión nueva persistida - el sistema mantiene `library-first hybrid` - el manifest cuenta la verdad del hook MIDI y del piano support - la coherencia sube de forma real, no cosmética - la validación no depende de adivinar qué pasó después de un timeout Si no llegás, dejá el sistema mejor, pero no lo declares terminado.