Files
ableton-mcp-ai/docs/SPRINT_v0.1.17_NEXT.md

306 lines
9.7 KiB
Markdown

# 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.