Files
ableton-mcp-ai/docs/SPRINT_v0.1.9_IMPLEMENTATION_REPORT.md

232 lines
6.3 KiB
Markdown

# Sprint v0.1.9 - Implementation Report (Audited)
Fecha: 2026-03-30
Sprint: v0.1.9
Estado: parcialmente implementado, con fixes post-auditoria aplicados por Codex
## Resumen corto
Kimi implemento piezas utiles de v0.1.9, pero el reporte original mezclaba tres cosas:
1. codigo que compila
2. wiring parcial
3. comportamiento runtime demostrado
Eso inflo el estado real del sprint.
La auditoria de Codex encontro y corrigio tres fallos concretos:
- serializacion incompleta de `PhrasePlan` y `Phrase`
- materializacion del hook MIDI usando un `dict` donde el runtime esperaba un objeto `PhrasePlan`
- smoke test async sin `--reference` y reportando el total de tracks de la sesion como si fueran tracks nuevos
## Lo que si dejo Kimi
Codigo real presente:
- `song_generator.py`
- tracking de budget
- hook MIDI obligatorio
- contexto hibrido de referencia
- `server.py`
- wiring de `reference_context`
- materializacion del hook MIDI
- jobs async
- `reference_listener.py`
- `micro_stem_summary`
- `harmonic_instrument_hints`
- `musical_theme`
- `phrase_plan`
Esto existe en codigo y compila.
## Lo que el reporte original exageraba o describia mal
### 1. Reference lock
El reporte decia que la validacion habia usado `95 BPM / Dm` contra una referencia `Am`.
La evidencia real en `temp/v019_reference_locked_generation.json` dice:
- `key_used = "Am"`
- `key_match = true`
Conclusion:
- el reporte original describia mal el artefacto guardado
- reference lock no estaba cerrado, pero tampoco estaba probado de la forma en que el MD lo contaba
### 2. "100 tracks creados"
El reporte trataba `100` como tracks nuevos creados por la generacion.
La evidencia real del smoke muestra otra cosa:
- baseline en `connection_check`: `tracks=72`
- verificacion posterior: `total=100`
Conclusion:
- hubo leak de budget
- pero el dato correcto era `delta=28`, no `100 nuevos`
### 3. Hook MIDI "implementado"
El hook estaba incompleto a nivel runtime por dos bugs:
- `server.py` pasaba `config["phrase_plan"]` serializado como `dict`
- `_create_midi_hook_track()` esperaba un objeto con `get_phrases_for_section()`
Ademas, `Phrase.to_dict()` no guardaba `notes`, y `PhrasePlan.to_dict()` no guardaba `base_motif` ni `sections`.
Conclusion:
- la ruta existia
- la informacion musical quedaba truncada
- el runtime no podia reconstruir bien el hook
## Correcciones aplicadas por Codex
### 1. Restauracion correcta de PhrasePlan
Archivo:
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/song_generator.py`
Cambio:
- `Phrase.to_dict()` ahora guarda `notes`
- `Phrase` ahora tiene `from_dict()`
- `PhrasePlan.to_dict()` ahora guarda `seed`, `base_motif` y `sections`
- `PhrasePlan` ahora tiene `from_dict()`
- la restauracion del contexto externo usa `PhrasePlan.from_dict(...)`
Resultado:
- el contexto melodico serializado ya no pierde la informacion principal
### 2. Hook MIDI robusto al formato serializado
Archivos:
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/server.py`
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/song_generator.py`
Cambio:
- `server.py` restaura `phrase_plan` antes de llamar `_create_midi_hook_track()`
- `_create_midi_hook_track()` ahora tolera recibir un `dict` y lo reconstruye si hace falta
Resultado:
- se elimina el mismatch `dict` vs objeto en el camino del hook
### 3. Reference path explicito en el flujo async
Archivo:
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/server.py`
Cambio:
- `generate_track`, `generate_song`, `generate_track_async` y `generate_song_async` ahora aceptan:
- `reference_path`
- `reference_name`
- si se pasa una referencia, el server la inyecta en `pack_plan["reference_track"]`
- cuando `build_arrangement_plan()` devuelve `locked_properties`, el server puede sobreescribir `key` y `bpm`
Resultado:
- el smoke test ya puede validar contra `ejemplo.mp3` sin depender de wiring implicito
### 4. Smoke test corregido
Archivo:
- `temp/smoke_test_async.py`
Cambio:
- agrega flag `--reference`
- pasa `reference_path` a las tools async
- toma baseline desde `get_session_info`
- reporta `delta` de tracks en vez de tratar el total de la sesion como si fueran tracks nuevos
Resultado:
- la validacion futura ya no va a inflar ni bloquear el estado del sprint por falta de parametro
## Estado real del sprint despues de la auditoria
### Implementado de verdad
- hook MIDI: wiring presente, ahora sin el bug principal de serializacion/restauracion
- contexto hibrido: presente
- jobs async: presentes
- smoke test: util para referencia y conteo delta
### No demostrado todavia
- que el hook MIDI quede materializado end-to-end en Live en una corrida nueva
- que el budget duro limite toda la sesion a 16 tracks o menos
- que el job async complete antes del timeout
- que la cancion resultante tenga coherencia musical buena
## Root causes que siguen abiertos
### 1. Budget leak estructural
El budget de `SongGenerator` existe, pero no todos los caminos de creacion pasan por esa compuerta.
Sospecha principal:
- hay creacion de tracks fuera de `_generate_tracks_for_genre()`
- hay materializacion posterior que agrega tracks directos en `server.py`
### 2. Timeout async
El smoke ya demostro que el job puede seguir trabajando mientras el estado queda en `running`.
Falta decidir si el problema es:
- lentitud real
- falta de cierre del job
- o ambos
### 3. Coherencia musical
El sprint v0.1.9 apunto a hook, budget y referencia, pero el problema perceptual principal sigue siendo:
- demasiadas capas
- tema debil
- identidad melodica poco clara
## Evidencia usada en esta auditoria
- `temp/v019_reference_locked_generation.json`
- `temp/v019_runtime_summary.json`
- `temp/smoke_report_reggaeton.json`
- `temp/smoke_test_async.py`
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/song_generator.py`
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/server.py`
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/reference_listener.py`
## Veredicto
Sprint v0.1.9 no estaba "cerrado".
Veredicto correcto:
- infraestructura: parcial pero util
- runtime: arreglado en su bug principal de phrase plan
- validacion: ahora mas confiable
- coherencia musical: sigue siendo la prioridad real
## Siguiente foco recomendado
1. rerun real con `--reference`
2. confirmar hook MIDI materializado
3. medir delta real de tracks
4. cerrar leak de budget en los caminos fuera del generador
5. volver a priorizar coherencia por encima de cantidad