Sync: Complete project state with all MEGA SPRINT V1-V3 features and Codex stubs
This commit is contained in:
305
docs/SPRINT_v0.1.17_NEXT.md
Normal file
305
docs/SPRINT_v0.1.17_NEXT.md
Normal file
@@ -0,0 +1,305 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user