232 lines
6.3 KiB
Markdown
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
|