Sprint v0.1.14 - Persisted Truth and Section-Aware Piano

Fecha: 2026-04-01  
Estado: pendiente  
Objetivo: convertir el piano-forward en una mejora real y verificable end-to-end, con manifest persistido confiable, hook materializado y coherencia musical por sección

## Contexto

Se revisó `docs/SPRINT_v0.1.13_VALIDATION_REPORT.md` contra:

- el código actual
- `temp/v013_end_to_end_validation.json`
- el manifest persistido en `C:\Users\ren\.abletonmcp_ai\generation_manifests.json`

Resultado de esa verificación:

- el report acierta en que existe trabajo real sobre `preferred_secondary_families`, `piano_presence` y `test_piano_forward.py`
- el report exagera el estado final de la validación
- la sesión `a1ad924f1970` persistida muestra problemas reales que el report no refleja:
  - `layer_selections` quedó con error
  - `piano_presence` quedó con error en ese manifest
  - `mandatory_midi_hook` quedó `planned=true` y `materialized=false`

En esta revisión ya se corrigió código para:

- evitar que el bonus piano-forward premie por error a `pad` genérico
- hacer que `piano_presence` lea el shape real de `layer_selections`
- endurecer `test_piano_forward.py` para validar implementación real y no solo constantes

Pero todavía falta la prueba definitiva:

- rerun real
- manifest persistido correcto
- hook materializado
- mejora audible y verificable por sección

## Regla de trabajo

Este sprint no se puede cerrar con un json que solo diga “PASS”.

Tiene que cumplirse todo esto a la vez:

- el manifest persistido debe quedar bien
- `get_generation_manifest(session_id)` debe devolver el manifest correcto
- `layer_selections` no puede quedar como error
- `piano_presence` no puede quedar como error
- el hook obligatorio debe quedar realmente materializado

## Tareas

### 1. Cerrar la brecha entre “validation json” y manifest persistido

Hoy existe una diferencia entre:

- el artifact `temp/v013_end_to_end_validation.json`
- el manifest persistido real
- la consulta MCP de `get_generation_manifest`

El sprint debe:

- verificar por qué una validación puede marcar PASS aunque el manifest persistido tenga errores
- dejar un único criterio de verdad
- agregar un check explícito que falle si `layer_selections.error` o `piano_presence.error` existen

### 2. Resolver definitivamente `mandatory_midi_hook`

El manifest real de `a1ad924f1970` dejó:

- `planned = true`
- `materialized = false`
- `error = "Hook planned but not materialized - state confusion bug"`

Eso sigue siendo una falla de coherencia crítica.

El sprint debe cerrar:

- reserva de slot
- creación real del hook
- verificación en Ableton
- persistencia correcta en manifest

### 3. Hacer el piano-forward realmente section-aware

Hoy el bonus existe, pero sigue siendo esencialmente por rol.

Agregar una política por sección:

- intro/break/build: más probabilidad de `piano/keys/rhodes`
- drop/lead/hook: preservar prioridad de familia primaria
- evitar que el mismo piano invada todo el track si no corresponde

### 4. Mejorar la auditabilidad del piano-forward

El manifest debe permitir responder estas preguntas sin releer logs:

- qué capas ganaron por bonus piano-forward
- qué roles usaron `piano/keys/rhodes`
- qué familias secundarias preferidas estaban activas
- qué capas no recibieron bonus y por qué

Mínimo esperado:

- `layer_selections.layers[].winner.scores.piano_bonus`
- `layer_selections.layers[].selection_context.preferred_secondary_families`
- `piano_presence` sin errores y con datos consistentes

### 5. Subir coherencia global sin perder piano

El piano-forward no debe empeorar:

- pack coherence
- motif coverage
- key coherence

Agregar al menos una validación que controle:

- piano-forward activo
- hook materializado
- `coherence_score` no peor que el baseline comparable

### 6. End-to-end real y persistido

Correr una generación nueva con referencia y verificar:

1. `temp/...validation.json` marca PASS
2. `get_generation_manifest(session_id)` devuelve manifest válido
3. el archivo persistido contiene el mismo `session_id`
4. `layer_selections` está poblado
5. `piano_presence` tiene datos reales, no error
6. `mandatory_midi_hook.materialized == true`

## Archivos foco

- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\reference_listener.py`
- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\server.py`
- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\song_generator.py`
- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\tests\test_piano_forward.py`
- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\docs`
- `C:\Users\ren\.abletonmcp_ai\generation_manifests.json`

## Criterio de salida

El sprint cierra solo si:

1. el piano-forward sigue favoreciendo `piano/keys` en roles y secciones de soporte
2. `pad` genérico no recibe por error el bonus de piano
3. `layer_selections` y `piano_presence` quedan correctos en el manifest persistido
4. el hook MIDI obligatorio queda materializado de verdad
5. el manifest es recuperable tanto por MCP como por historial persistido
6. la validación end-to-end confirma mejora audible sin ocultar errores estructurales
