280 lines
8.9 KiB
Markdown
280 lines
8.9 KiB
Markdown
# Sprint v0.1.16 - Bus-Aware Coherence and Piano Hybrid Truth
|
|
|
|
**Owner:** Kimi via OpenCode
|
|
**Reviewer:** Codex
|
|
**Fecha:** 2026-04-01
|
|
**Baseline real:** `e3c3691cc922`
|
|
**Estado de cierre v0.1.15:** runtime corregido parcialmente, no cerrado en coherencia
|
|
|
|
---
|
|
|
|
## 1. Verdad operativa hoy
|
|
|
|
Lo que quedó realmente validado por Codex:
|
|
|
|
- `library-first` ya materializa audio real de librería en Arrangement.
|
|
- El hook armónico híbrido ya se materializa de verdad antes de agotar budget.
|
|
- En la última validación real, el hook quedó como `HARMONY_PIANO_MIDI` y `mandatory_midi_hook.materialized = true`.
|
|
- El parser de familias ya no devuelve nombres de pack como familia armónica para `pluck/pad/piano`.
|
|
- La métrica de `piano_presence` ya fue corregida para poder contar un hook MIDI piano materializado.
|
|
|
|
Lo que sigue abierto:
|
|
|
|
- `coherence_score` sigue bajo. Última sesión real: `e3c3691cc922`, score `4.6`, verdict `WEAK`.
|
|
- `pack_coherence_ratio` sigue pobre porque el sistema sigue intentando resolver coherencia con un `dominant_pack` global.
|
|
- El selector sigue mezclando drums de un pack, armonía de otro y vocals/FX de terceros sin una política bus-aware explícita.
|
|
- La auditoría histórica de Kimi volvió a inflar claims: `SPRINT_v0.1.15_VALIDATION_REPORT.md` cita `a74bc42ec332`, pero ese session id no existe en `generation_manifests.json`.
|
|
|
|
Conclusión senior:
|
|
|
|
- No se puede seguir reportando `COMPLETE` mientras el manifest real quede `WEAK`.
|
|
- El bug principal ya no es “no genera nada”.
|
|
- El bug principal ahora es “genera, pero no decide con criterio de palette/coherence por bus”.
|
|
|
|
---
|
|
|
|
## 2. Objetivo del sprint
|
|
|
|
Cerrar la siguiente transición:
|
|
|
|
- De `library-first-hybrid que ya suena`
|
|
- A `library-first-hybrid coherente por buses, con armonía principal clara, soporte piano real cuando corresponde y menos mezcla arbitraria de packs`
|
|
|
|
Este sprint no es para agregar features nuevas. Es para corregir criterio de selección.
|
|
|
|
---
|
|
|
|
## 3. 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.
|
|
- `toolCount=77` en OpenCode debe seguir intacto.
|
|
|
|
3. No reportar session ids inexistentes.
|
|
- Toda validación debe cruzarse contra `C:\Users\ren\.abletonmcp_ai\generation_manifests.json`.
|
|
|
|
4. No cerrar el sprint con `PASS` si:
|
|
- `coherence_score < 6.5`
|
|
- o `mandatory_midi_hook.materialized != true` en `library-first-hybrid`
|
|
- o `pack_coherence_ratio` sigue siendo claramente pobre sin explicación bus-aware
|
|
|
|
5. No “resolver” coherencia matando la librería del usuario.
|
|
- La salida sigue siendo library-first.
|
|
- El MIDI hook es soporte armónico, no reemplazo del audio library-first.
|
|
|
|
6. No forzar piano audio si la librería/reference no lo soporta.
|
|
- Sí es obligatorio mantener un soporte armónico MIDI piano/keys cuando `preferred_secondary_families` lo prioriza y el hook híbrido existe.
|
|
|
|
---
|
|
|
|
## 4. Problemas concretos a resolver
|
|
|
|
### P0. Reemplazar coherencia global por coherencia por bus
|
|
|
|
Problema:
|
|
|
|
- `select_dominant_palette()` sigue intentando resolver un solo `dominant_pack` para todo.
|
|
- En reggaetón real eso es una abstracción pobre:
|
|
- drums pueden venir de `drumloops` / `16bloody` / `ss_rnbl`
|
|
- music/harmony de `midilatino_*`
|
|
- FX/vocals de un subconjunto distinto
|
|
|
|
Qué tenés que hacer:
|
|
|
|
- Diseñar y aplicar una política `bus-aware pack coherence`.
|
|
- Mínimo esperado:
|
|
- `drums` se evalúan contra un grupo dominante de drum packs
|
|
- `music/harmonic` se evalúan contra un grupo dominante musical
|
|
- `fx/vocals` no pueden destruir el score general por venir de un tercer pack si son pocos y justificables
|
|
|
|
No quiero:
|
|
|
|
- un solo `dominant_pack` global maquillado con bonuses
|
|
- ni un sistema que castigue kicks por no pertenecer al mismo pack que el synth loop
|
|
|
|
Entregable técnico:
|
|
|
|
- manifest con métricas por bus, no solo globales
|
|
- ejemplo:
|
|
- `pack_coherence.drums`
|
|
- `pack_coherence.music`
|
|
- `pack_coherence.fx`
|
|
- `pack_coherence.overall`
|
|
|
|
### P1. Hacer que la auditoría mida coherencia útil
|
|
|
|
Problema:
|
|
|
|
- Ya corregimos que no se mida familia armónica sobre `kick/snare/hat`, pero la auditoría sigue siendo pobre como instrumento de decisión final.
|
|
|
|
Qué hacer:
|
|
|
|
- endurecer `SelectionAuditor` para que diferencie:
|
|
- roles armónicos
|
|
- roles rítmicos
|
|
- roles de apoyo/FX
|
|
|
|
- `family_adherence_rate` debe seguir midiendo solo capas armónicas.
|
|
- `pack_coherence_ratio` debe tener lectura por bus y no castigar igual un `kick` y un `vocal build`.
|
|
|
|
### P2. Política explícita de “piano hybrid truth”
|
|
|
|
Problema:
|
|
|
|
- El sistema ya materializa `HARMONY_PIANO_MIDI`, pero todavía puede quedar `piano_presence` bajo si no hay audio piano.
|
|
- Eso es aceptable solo si el manifest lo explica bien.
|
|
|
|
Qué hacer:
|
|
|
|
- Formalizar que en `library-first-hybrid` hay dos maneras válidas de cumplir “piano support”:
|
|
- `midi_support_family in {piano, keys}`
|
|
- o una capa armónica de audio piano/keys real
|
|
|
|
- Manifest esperado:
|
|
- distinguir `audio_piano_presence` de `hybrid_piano_presence`
|
|
- si el soporte piano viene del hook MIDI, tiene que verse explícito
|
|
|
|
No quiero:
|
|
|
|
- un `piano_presence = 0` cuando el set sí tiene `HARMONY_PIANO_MIDI`
|
|
|
|
### P3. Añadir una única capa armónica secundaria cuando tenga sentido
|
|
|
|
Problema:
|
|
|
|
- Hoy el híbrido puede quedar con pluck/lead audio + piano MIDI, pero sin una capa secundaria clara de apoyo.
|
|
|
|
Qué hacer:
|
|
|
|
- Si `preferred_secondary_families` incluye `piano` o `keys` y hay material usable en librería, permitir como máximo 1 capa secundaria armónica adicional.
|
|
- Debe ser una capa con justificación musical, no un relleno KPI.
|
|
|
|
Restricciones:
|
|
|
|
- máximo 1 capa secundaria nueva
|
|
- no duplicar familias sin función
|
|
- no degradar el hook principal ni la claridad del pluck anchor
|
|
|
|
### P4. Bajar redundancia y fragmentación sin perder intención
|
|
|
|
Problema:
|
|
|
|
- En `e3c3691cc922` la sesión sonó, pero apareció redundancia:
|
|
- dos `PERC MAIN`
|
|
- dos `TOP LOOP`
|
|
- dos `SYNTH PEAK`
|
|
- vocals duplicadas
|
|
|
|
Qué hacer:
|
|
|
|
- revisar si esas duplicaciones agregan contraste real o solo suman clutter
|
|
- si no agregan contraste claro, consolidar o eliminar
|
|
|
|
Salida esperada:
|
|
|
|
- menos layers repetidas con distinto nombre
|
|
- más intención estructural
|
|
|
|
### P5. Verificación senior real
|
|
|
|
No alcanza con “generate_track devolvió success”.
|
|
|
|
Tenés que validar:
|
|
|
|
- manifest persistido existe
|
|
- session id existe en `generation_manifests.json`
|
|
- `mandatory_midi_hook.materialized == true`
|
|
- `generation_mode == library-first-hybrid`
|
|
- `coherence_score >= 6.5`
|
|
- `pack_coherence.overall >= 0.50`
|
|
- `pack_coherence.music >= 0.65`
|
|
- `harmonic_layers_evaluated >= 2`
|
|
- `family_adherence_rate >= 0.60` en capas armónicas
|
|
|
|
Si no llegás a esos umbrales:
|
|
|
|
- no pongas `COMPLETE`
|
|
- documentá exactamente por qué
|
|
|
|
---
|
|
|
|
## 5. Archivos probables a tocar
|
|
|
|
- `AbletonMCP_AI\AbletonMCP_AI\MCP_Server\reference_listener.py`
|
|
- `AbletonMCP_AI\AbletonMCP_AI\MCP_Server\server.py`
|
|
- tests nuevos o extendidos en:
|
|
- `AbletonMCP_AI\AbletonMCP_AI\MCP_Server\tests\test_selection_coherence.py`
|
|
- `AbletonMCP_AI\AbletonMCP_AI\MCP_Server\tests\test_piano_forward.py`
|
|
|
|
---
|
|
|
|
## 6. Casos de test obligatorios
|
|
|
|
1. Un test donde drums y music usen packs distintos pero coherentes por bus, y el sistema no los castigue como si fuera incoherencia total.
|
|
2. Un test donde `HARMONY_PIANO_MIDI` materializado cuente como soporte piano híbrido válido.
|
|
3. Un test donde `pack_coherence.music` suba aunque `pack_coherence.drums` venga de otro pack dominante.
|
|
4. Un test donde el manifest no permita cerrar con session id inexistente.
|
|
|
|
---
|
|
|
|
## 7. Validación final obligatoria
|
|
|
|
Generar una canción real usando:
|
|
|
|
- género: `reggaeton`
|
|
- style: `perreo duro vieja escuela tipo safaera`
|
|
- referencia: `libreria\reggaeton\ejemplo.mp3`
|
|
|
|
Tenés que reportar:
|
|
|
|
- `session_id`
|
|
- `coherence_score`
|
|
- `pack_coherence.overall`
|
|
- `pack_coherence.drums`
|
|
- `pack_coherence.music`
|
|
- `mandatory_midi_hook`
|
|
- `primary_harmonic_anchor`
|
|
- `piano_presence`
|
|
- lista real de audio layers y fuente
|
|
|
|
Y además:
|
|
|
|
- confirmar que el `session_id` existe realmente en `generation_manifests.json`
|
|
|
|
---
|
|
|
|
## 8. Formato de entrega
|
|
|
|
Archivo obligatorio:
|
|
|
|
- `docs/SPRINT_v0.1.16_VALIDATION_REPORT.md`
|
|
|
|
Ese md debe incluir:
|
|
|
|
- qué arreglaste realmente
|
|
- qué no cerró
|
|
- session id real
|
|
- métricas reales
|
|
- citas literales de logs solo si son relevantes
|
|
|
|
No acepto:
|
|
|
|
- reportes con “todo ok” y sin session persistida
|
|
- reportes con claims auditivos sin manifest real
|
|
- reportes donde `WEAK` queda escondido en una nota menor
|
|
|
|
---
|
|
|
|
## 9. Criterio de cierre
|
|
|
|
Solo podés cerrar el sprint si:
|
|
|
|
- la generación real queda persistida
|
|
- el híbrido library-first mantiene librería + soporte MIDI piano/keys
|
|
- la coherencia deja de depender de un único pack global
|
|
- el manifest cuenta la verdad de lo que pasó
|
|
|
|
Si no llegás a eso, dejá el sistema mejor que hoy, pero no lo declares terminado.
|