# Sprint v0.1.5 - Revision de Codex

Fecha: 2026-03-30

Este documento reemplaza la version anterior de `SPRINT_v0.1.5_CHANGES.md`, que mezclaba avances reales con conclusiones demasiado fuertes.

## Resumen honesto

Kimi si dejo trabajo util en este sprint, pero no quedo cerrado como el documento original sugeria.

Lo que si existe en codigo:

- `server.py` ahora guarda mas estado en `_generation_jobs`
- `server.py` tiene cache de routing y se usa en al menos 3 callsites reales
- `zai_judges.py` redujo backoff y aumento TTL de cache
- `reference_listener.py` sigue mostrando que el `section-aware` esta solo parcialmente integrado

Lo que no quedo demostrado:

- que el timeout async ya este resuelto
- que el timeout sea definitivamente `O(n^2)` por routing y nada mas
- que `JOINT_SCORE` participe de la generacion real end-to-end
- que las ultimas generaciones sean musicalmente coherentes

## Lo que Codex verifico

### Codigo

- `server.py` compila
- `reference_listener.py` compila
- `zai_judges.py` compila
- `temp\smoke_test_async.py` compila
- `test_sample_selector.py` sigue pasando `25/25`

### Evidencia runtime disponible

Archivo revisado:

- `temp\smoke_test_async_report.json`

Estado real del ultimo reporte disponible:

- `connection_check`: PASS
- `launch_async_job`: PASS
- `verify_tracks_created`: PASS
- `poll_job_status`: FAIL por timeout a `300s`

Dato importante:

- durante ese timeout la cuenta de tracks subio de `122` a `165`

Eso demuestra que el job estaba haciendo trabajo real. No demuestra por si solo cual es el root cause exacto del timeout.

## Correccion del diagnostico async

La version anterior del documento afirmaba demasiado:

- que el timeout ya estaba diagnosticado con precision completa
- que el problema era definitivamente `O(n^2)` por routing
- que las optimizaciones aplicadas deberian dejar el job por debajo de `300s`

Eso hoy no esta probado.

Lo correcto es:

- el routing repetido es un candidato fuerte a cuello de botella
- los retries de `ZAIJudges` tambien pueden estar inflando la duracion
- el sistema async sigue necesitando mejor instrumentacion para mostrar progreso real mientras corre

## Correccion del diagnostico section-aware

La observacion importante de Kimi fue buena:

- `reference_listener.py` selecciona roles principales antes del loop de secciones
- en esa seleccion global no se pasa contexto por seccion
- `_select_candidate()` sigue usando logica local hardcoded

Pero el fix sugerido en el documento original no es correcto tal como estaba escrito.

No sirve simplemente pasar `current_kind` o `current_energy` en la linea donde se seleccionan roles principales, porque esa seleccion ocurre antes del loop de secciones y no existe una seccion actual unica en ese punto.

La conclusion correcta es:

- el flujo necesita rediseño, no solo un parametro extra
- si queremos section-aware real, hay que:
  - mover mas seleccion dentro del loop de secciones
  - o derivar las variantes de seccion desde un palette global coherente
  - o ambas

## Problema de producto mas importante

El problema principal ya no es solo tecnico.

Segun las ultimas pruebas del usuario:

- el sistema genera pistas
- pero el resultado suena como sonidos tirados al azar
- falta coherencia melodica, armonica y de arreglo

Eso cambia la prioridad del proyecto.

La siguiente etapa no debe enfocarse solo en "que termine" o "que cree tracks".
Debe enfocarse en:

- coherencia por pack
- coherencia tonal
- coherencia de hook/motivo
- presupuesto de tracks
- mutacion por seccion a partir de un mismo tema

## Estado real al cerrar esta revision

- avances utiles: SI
- sprint 0.1.5 totalmente cerrado: NO
- siguiente prioridad: coherencia musical real

## Archivos relevantes

- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/server.py`
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/reference_listener.py`
- `AbletonMCP_AI/AbletonMCP_AI/MCP_Server/zai_judges.py`
- `temp\smoke_test_async.py`
- `temp\smoke_test_async_report.json`

## Siguiente sprint

El sprint activo a partir de ahora es:

- `docs/SPRINT_v0.1.6_NEXT.md`
