# 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.
