203 lines
6.5 KiB
Markdown
203 lines
6.5 KiB
Markdown
# Sprint v0.1.2 - Continuacion Para Kimi
|
|
|
|
Fecha: 2026-03-30
|
|
Actualizado: 2026-03-30 (post-verificacion)
|
|
|
|
Este documento es el sprint activo despues de revisar `docs/SPRINT_v0.1.1_CHANGES.md` y los diffs reales.
|
|
|
|
**ADVERTENCIA**: Este documento ahora incluye estado REAL verificado, no aspiraciones.
|
|
|
|
Si eres Kimi K2:
|
|
|
|
- lee este archivo despues de `KIMI_K2_ACTIVE_HANDOFF.md`
|
|
- usa este documento como plan operativo actual
|
|
- valida todo con codigo y runtime, no con prose
|
|
|
|
## Estado de Tareas v0.1.2 (VERIFICADO)
|
|
|
|
### Tarea 1 - Validar `clear_all_tracks` con runtime real
|
|
|
|
**Estado: PARCIALMENTE COMPLETADO** ⚠️
|
|
|
|
Codigo existe y compila:
|
|
- Ubicacion: `abletonmcp_init.py:2664-2698`
|
|
- Implementacion: Loop while + delete_track + clear ultimo track
|
|
- Logica: Mantiene 1 track (requirement de Ableton), limpia clips y devices
|
|
|
|
**Problema conocido (sin resolver):**
|
|
- Al finalizar limpieza, puede devolver error blando "Couldn't delete track."
|
|
- Documentado en CLAUDE.md linea 35
|
|
- Aun asi deja la sesion limpia
|
|
|
|
**Validacion pendiente:**
|
|
- [ ] 3 limpiezas consecutivas sin error en Live real
|
|
- [ ] Verificar que quede exactamente 1 track limpio
|
|
- [ ] Confirmar no hay crash de Audio queue timeout
|
|
|
|
**Archivos si falla:**
|
|
- `abletonmcp_init.py`
|
|
- `AbletonMCP_AI/abletonmcp_runtime.py`
|
|
|
|
---
|
|
|
|
### Tarea 2 - Hacer end-to-end real del camino async
|
|
|
|
**Estado: INFRAESTRUCTURA COMPLETA, FALTA VALIDACION EN LIVE** ⚠️
|
|
|
|
**Implementado (verificado en codigo):**
|
|
- `generate_track_async()` - server.py:6503-6535
|
|
- `generate_song_async()` - server.py:6539-6575
|
|
- `get_generation_job_status()` - server.py:6579-6588
|
|
- `cancel_generation_job()` - server.py:6592-6614
|
|
- `_submit_generation_job()` - server.py:5084-5101
|
|
- `_generation_jobs` dict con threading.RLock() - server.py:4734-4735
|
|
- ThreadPoolExecutor para jobs en background
|
|
|
|
**Estructura de jobs:**
|
|
- Estados: queued -> running -> completed/failed
|
|
- Retorna: job_id, session_id, status, params
|
|
- Polling via get_generation_job_status(job_id)
|
|
|
|
**Smoke test disponible:**
|
|
- `temp\smoke_test_async.py` - importa server.py directamente
|
|
- Usa `MCPServerClient` para llamar tools async
|
|
- Soporta --use-track para probar generate_track_async
|
|
|
|
**Validacion pendiente:**
|
|
- [ ] Ejecutar temp\smoke_test_async.py con Live abierto
|
|
- [ ] Verificar job queued -> running -> completed
|
|
- [ ] Confirmar tracks creados en Live
|
|
- [ ] Validar manifest util retornado
|
|
|
|
**Si falla:**
|
|
- Corregir `server.py`
|
|
- No parchar smoke test para esconder fallo
|
|
|
|
---
|
|
|
|
### Tarea 3 - Expandir el corpus de groove real
|
|
|
|
**Estado: IMPLEMENTADO, FALTA CORNISA REAL** ⚠️
|
|
|
|
**Implementado (verificado):**
|
|
- `groove_extractor.py` - existe y compila
|
|
- `DembowGrooveExtractor` class - linea 65
|
|
- Soporte multiple directorios: drumloops, perc loop, oneshots
|
|
- Ignora: .sample_cache, .segment_rag, temp, docs, etc.
|
|
- Templates con: kick/snare/hat positions, velocities, timing_variance_ms
|
|
- Cache en: `~/.abletonmcp_ai/dembow_groove_templates.json`
|
|
|
|
**Problema actual:**
|
|
- Depende de `libreria/reggaeton/drumloops/*.wav`
|
|
- Si no hay loops reales, fallback a patron default
|
|
- Necesita mas templates para variedad real
|
|
|
|
**Validacion pendiente:**
|
|
- [ ] Escaneo real de libreria/reggaeton
|
|
- [ ] Contar templates extraidos
|
|
- [ ] Verificar no estan default/todos iguales
|
|
|
|
**Archivos:**
|
|
- `groove_extractor.py`
|
|
- `audio_analyzer.py` (usa beat_duration corregido)
|
|
|
|
---
|
|
|
|
### Tarea 4 - Subir el nivel del selector por seccion
|
|
|
|
**Estado: COMPLETADO** ✅
|
|
|
|
**Implementado (verificado en sample_selector.py):**
|
|
|
|
1. **Same-pack estricto para roles clave:**
|
|
- Lineas 1222-1243: atmos_fx, vocal_shot, fill_fx, snare_roll
|
|
- `_calculate_same_pack_strict_bonus()` - lineas 1578-1632
|
|
- Peso adicional: +0.25 para same-pack
|
|
- Tipos: "same_pack", "same_parent", "fallback"
|
|
|
|
2. **Scoring conjunto:**
|
|
- `same_parent: 1.3` (sibling folders)
|
|
- `exact folder match: 2.0`
|
|
- `subfolder of main pack: 1.8`
|
|
|
|
3. **Coherence scoring:**
|
|
- `vocal_fx_group`: vocal_loop, vocal_shot, atmos_fx, fill_fx
|
|
- Section-aware selection (intro, build, drop, break, outro)
|
|
|
|
**Resultado:**
|
|
- Menos mezcla de carpetas sin relacion
|
|
- Mas consistencia entre secciones
|
|
- atmos_fx y vocal_shot vienen del mismo pack que elementos principales
|
|
|
|
---
|
|
|
|
### Tarea 5 - Backoff, retry y cache para Z.ai
|
|
|
|
**Estado: COMPLETADO** ✅
|
|
|
|
**Implementado (verificado en zai_judges.py):**
|
|
|
|
1. **Exponential backoff:**
|
|
- `MAX_RETRIES = 3` - linea 33
|
|
- `BACKOFF_DELAYS = [1.0, 2.0, 4.0]` - linea 34
|
|
- Reintenta en 429 (Too Many Requests)
|
|
- Total max wait: ~7 segundos
|
|
|
|
2. **Local cache con TTL:**
|
|
- `CACHE_TTL_SECONDS = 300` (5 minutos) - linea 29
|
|
- `_cache: Dict[str, Tuple[result, timestamp]]`
|
|
- `_generate_cache_key()` con SHA256 - lineas 37-53
|
|
- Cache hit evita llamada API - lineas 126-129
|
|
|
|
3. **Fallback heuristico:**
|
|
- Si API no disponible: selecciona top candidate
|
|
- Modo: "heuristic_fallback"
|
|
- Directivas default para rhythm, bass, arrangement - lineas 225-242
|
|
|
|
**Retry loop:** lineas 155-205
|
|
- Maneja HTTPError 429, URLError, TimeoutError
|
|
- Loguea warnings en cada retry
|
|
- Retorna {} si todos fallan (trigger fallback)
|
|
|
|
---
|
|
|
|
## Validaciones ya hechas (Pre-sprint)
|
|
|
|
- `python test_same_pack_selection.py` pasa
|
|
- `temp\smoke_test_async.py --help` funciona
|
|
- Import directo de `server.py` con tools async funciona
|
|
- Chequeo de sintaxis local pasa para:
|
|
- `audio_analyzer.py`
|
|
- `song_generator.py`
|
|
- `temp\smoke_test_async.py`
|
|
- `groove_extractor.py`
|
|
- `zai_judges.py`
|
|
|
|
## Metricas del Server (Verificado)
|
|
|
|
- `server.py` tiene 89 tools registradas
|
|
- 89 nombres unicos (no duplicados)
|
|
- Async tools incluidas: generate_track_async, generate_song_async, get_generation_job_status, cancel_generation_job
|
|
|
|
## Reglas duras para Kimi (vigentes)
|
|
|
|
- no edites archivos legacy solo porque el nombre te suena correcto
|
|
- no confundas tool MCP con comando del socket runtime
|
|
- no uses segundos donde el codigo espera beats
|
|
- no des por valido un groove solo porque hay onsets detectados
|
|
- **no cierres el sprint sin una validacion real con Live**
|
|
- **no escribas "arreglado" sin prueba de runtime**
|
|
|
|
## Proximo trabajo (Recomendado)
|
|
|
|
1. **Alta prioridad:** Validar clear_all_tracks en Live real (3 repeticiones)
|
|
2. **Alta prioridad:** Ejecutar temp\smoke_test_async.py con Live abierto
|
|
3. **Media prioridad:** Verificar templates de groove extraidos de libreria/
|
|
4. **Documentar:** Resultados de validacion en este archivo
|
|
|
|
## Notas sobre documentacion
|
|
|
|
- CLAUDE.md linea 35: "clear_all_tracks still has a soft failure at the end of cleanup"
|
|
- Este sprint documenta REALIDAD, no aspiraciones
|
|
- Si una tarea no esta marcada con ✅, necesita prueba de runtime
|