# Sprint v0.1.11 - Runtime Coherence Closure Fecha: 2026-04-01 Estado: pendiente Objetivo: cerrar la coherencia sonora end-to-end en runtime, no solo en blueprint/tests ## Contexto En v0.1.10 quedaron avances reales en: - `PhrasePlan` con family lock soportado en constructor y serialización. - `reference_listener.py` devolviendo `primary_harmonic_family` y evitando hardcodear `reggaeton` en la selección con budget. - wiring documental y skill actualizados al layout real del repo. Pero todavía hay huecos de runtime que impiden dar por cerrado el problema de coherencia: - `server.py` sigue siendo el punto crítico del flujo real. - el budget real todavía puede divergir del estado físico si no reserva lugar para el hook obligatorio antes de crear tracks opcionales. - el reintegro de datos de referencia en `server.py` mezcla variables no definidas con estado derivado del plan. - `sample_selector.py` sigue teniendo `JOINT_SCORE`, pero el flujo principal de remake por referencia todavía no está gobernado por ese score de forma contractual. ## Regla de trabajo Este sprint no se considera completo con logs verdes ni con tests unitarios aislados. Tiene que cerrar el camino: `reference_listener.py` -> `server.py` reference context -> `song_generator.py` -> materialización real en Ableton -> manifest final ## Tareas ### 1. Cerrar `server.py` como fuente de verdad del contexto híbrido Arreglar el bloque de reintegración de `reference_audio_plan` para que use variables definidas explícitamente: - `ref_phrase_plan` - `ref_musical_theme` - `ref_harmonic_hints` - `ref_micro_stem` - `ref_synth_hint` - `ref_primary_family` Además: - propagar `primary_harmonic_family` al `config` - evitar reescrituras redundantes o inconsistentes entre `reference_context`, `reference_audio_plan` y `config` ### 2. Convertir el budget real en contrato físico, no contable Eliminar cualquier intento de “hacer lugar” solo bajando contadores o removiendo entradas de memoria. El comportamiento correcto: - reservar slot para `HOOK_MIDI` antes de que los opcionales consuman el budget - liberar la reserva cuando el hook se materializa - si el slot reservado se pierde, fallar explícitamente en manifest y logs No aceptar: - `replaced_by_mandatory` sin remover track físico real en Ableton - mismatch silencioso entre `budget_real` y runtime real ### 3. Materializar el hook obligatorio bajo presupuesto correcto El hook MIDI debe seguir siendo obligatorio, pero con reglas consistentes: - si existe `hook_plan`, reservar su slot antes de crear capas opcionales/derivadas - si no existe `hook_plan`, crear fallback explícito y marcarlo como tal - `mandatory_midi_hook.planned`, `materialized` y `track_exists_in_ableton` deben concordar ### 4. Integrar `JOINT_SCORE` en el flujo principal de referencia Hoy `sample_selector.py` tiene scoring más rico que el flujo principal de `reference_listener.py`. El sprint debe: - decidir una sola fuente de verdad para scoring de selección - hacer que la selección principal de capas harmónicas y variantes use ese score - dejar evidencia en logs/manifest de por qué una capa ganó Si no se integra completo, al menos debe quedar el adapter listo y el flujo antiguo marcado como transitorio. ### 5. Endurecer validación y tests Agregar validación que falle si ocurre cualquiera de estos casos: - `phrase_plan` restaurado pierde `primary_harmonic_family` - `mandatory_midi_hook.planned = true` y `materialized = false` - `budget_real.created > 16` - `budget_real.created != runtime_track_delta` cuando el cálculo aplique - `primary_harmonic_family` no aparece en manifest de generaciones con referencia Actualizar `test_phrase_plan.py` para que no imprima “FAIL” y siga como si nada. Ese test debe usar `assert` real y tokens normalizados en minúscula. ## Archivos foco - `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\reference_listener.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\sample_selector.py` - `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\test_phrase_plan.py` - `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\abletonmcp_init.py` ## Criterio de salida El sprint cierra solo si: 1. compilan los archivos tocados 2. `test_phrase_plan.py` falla de verdad si se rompe el family lock 3. el hook obligatorio queda materializado o el manifest falla explícitamente 4. no hay hardcodes de género en la selección con budget 5. el manifest final expone `primary_harmonic_family`, estado real del hook y resumen confiable de budget ## Nota operativa Antes de editar `server.py` o `abletonmcp_init.py`, cerrar `Ableton Live 12 Suite` si está corriendo. En este entorno Windows esos archivos pueden quedar bloqueados por el proceso y dejar el sprint a mitad de camino.