8.8 KiB
SPRINT v0.1.34 - NEXT FOR OPENCODE
Stop Mixing Sessions, Stop Validating Running Jobs, Recover Runtime Truth Before Musical Iteration
Owner: OpenCode
Reviewer: Codex
Fecha: 2026-04-03
Report reviewed: C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\docs\SPRINT_v0.1.33_VALIDATION_REPORT.md
1. Executive Review
The main problem was not only that the set looked bad.
The main problem was that OpenCode validated and reported mixed runtime truths:
- one job was still running
- the manifest came from an older completed run
- the older completed run had actually ended with an internal error
That means the report was not a reliable description of one single generation.
This sprint is about restoring truth discipline before more musical iteration.
2. Runtime Truth Verified By Codex
Codex verified these facts from disk:
generation_manifests.jsonlatest persisted session is:689f4f6b2361
generation_jobs.jsonshows:- report job
f7bd2d0a95e8was stillrunning - stage was only
generating_config - it had not completed when OpenCode validated
- report job
Codex also verified this:
ba1111cd6a59storedsession_id = 689f4f6b2361- that job was marked
completed - but its
result_textcontains a real traceback:KeyError: 'C:\\ProgramData\\Ableton\\Live 12 Suite\\Resources\\MIDI Remote Scripts\\libreria\\reggaeton\\kick\\kick nes 2.wav'
- so that completed state was false-positive job bookkeeping
Therefore the v0.1.33 report mixed at least two incompatible truths:
- live/validation state from the still-running async job
f7bd2d0a95e8 - manifest state from previous stored session
689f4f6b2361
That invalidates the report as senior evidence.
3. Code Review Findings
P0. Async jobs could be marked completed even when generation returned an error string
In:
C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\server.py
_run_generation_job(...) treated any returned text from generate_track(...) or generate_song(...) as success.
That allowed this broken state:
- job status =
completed - result text =
Error generando track: ...
This was a real reporting bug, not user confusion.
P0. get_generation_manifest() returned stale latest manifest while a newer async job was still running
In:
C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\server.py
OpenCode called get_generation_manifest() without explicit session_id.
While a newer job was still running, that returned the previous stored manifest instead of the current job truth.
This is exactly how the report ended up mixing:
job_id = f7bd2d0a95e8session_id = 689f4f6b2361
P0. Cross-generation memory could crash at generation end
In:
C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\sample_selector.py
_update_cross_generation_memory(...) compacted defaultdict state into plain dicts, then later did += on unseen keys.
That is the real cause of the stored traceback in the completed job.
P1. QA bus counting depended on list_buses, but the active runtime does not expose that command
In:
C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\server.pyC:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\abletonmcp_init.pyC:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\abletonmcp_runtime.py
The runtime path used by validation did not implement list_buses.
So diagnose_generated_set() and parts of validate_set() could claim:
bus_count = 0
even when the generation manifest had real buses.
P1. QA over-penalized source MIDI tracks that were already replaced by audio
In:
C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\server.py
_validate_empty_clips(...) treated empty source tracks as failures even when matching AUDIO ... replacement tracks existed.
That was inflating false negatives in audio-first or recovery-fallback runs.
4. Fixes Already Applied By Codex
These fixes are already on disk. Do not revert them.
4.1 Async job error detection
Codex added result-text failure detection in:
C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\server.py
Now a job that returns:
Error generando track: ...
is marked failed, not completed.
4.2 Stale manifest guard
Codex hardened:
get_generation_manifest(...)
Now if there is an active queued or running generation and no explicit session_id was given, the tool returns an error instead of silently handing back a stale old manifest.
4.3 Cross-generation memory fix
Codex fixed:
C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\AbletonMCP_AI\AbletonMCP_AI\MCP_Server\sample_selector.py
So cross-generation memory stays safe when new sample families or new paths appear after compaction.
4.4 Bus fallback for QA
Codex added server-side fallback bus inference from live track names.
This means validation/diagnosis no longer depends entirely on list_buses.
4.5 Audio replacement awareness in empty-clip QA
Codex changed QA so empty source MIDI tracks are not treated as hard failures when matching audio replacement tracks are already present.
5. Validation Performed By Codex
Codex verified:
python -m py_compilepassed for:server.pysample_selector.pytests\test_sample_selector.pytests\test_piano_forward.py
- tests passed:
tests\test_sample_selector.pytests\test_piano_forward.py
Codex also added regression coverage for:
- cross-generation memory after compaction
- bus inference fallback when runtime has no
list_buses - async manifest guard while a job is still running
- result-text error detection for generation jobs
No new song was generated in this review turn.
6. What OpenCode Must Do Next
P0. Never validate a running async job
If get_generation_job_status(...) returns:
queuedrunning
then:
- do not call
validate_set - do not call
diagnose_generated_set - do not call
get_generation_manifest("") - do not write a validation report yet
Wait until the job is:
completed- or
failed
P0. A report must describe one single run, not mixed state
The next report is invalid unless all of these match:
job_idsession_id- validation target
- manifest target
If OpenCode uses:
job_id = X
then the report must validate the completed session that belongs to X.
No mixing:
- running live state from one job
- manifest from another older job
P0. If async generation fails, report failure honestly
If job status is failed, OpenCode must:
- stop claiming generation success
- include the actual
error - include
result_text - include
session_idonly if one was partially stored - explain whether the set in Live is partial, stale, or broken
P0. Use explicit session_id for manifest retrieval after async work
After a job completes:
- call
get_generation_job_status(job_id) - extract its final
session_id - call
get_generation_manifest(session_id)
Do not call:
get_generation_manifest("")
after async generation unless there are no active jobs and you intentionally want the latest stored manifest.
P1. Keep no-piano policy active
Still required:
- no piano audio loops
- no
HARMONY_PIANO_MIDI - no piano timbre as harmonic spine
Harmonic support must use non-piano families.
P1. Only iterate musically after truth is clean
The user complaint about “porqueria” is valid.
But OpenCode must not jump back into musical tweaking until the next report proves:
- one job
- one session
- one manifest
- one validation target
Otherwise musical conclusions are unreliable.
7. Required Evidence For The Next Report
The next report is invalid unless it includes:
- exact
job_id - exact final job
status - exact final
session_id - explicit proof that validation ran after completion
- manifest fetched with explicit
session_id - clear statement whether the run is:
- usable
- partial
- failed
- if failed, the real error text
If the job is still running, the correct report is not a validation report.
It is only a progress note.
8. Immediate Product Direction After Truth Recovery
Once the job/session/report mismatch is closed, the next real musical targets remain:
- stop 4-second loop feeling
- stop empty holes after one good block
- improve continuity in Arrangement
- improve real section-to-section development
- keep user library central
- keep vocals manual-only
But do not tackle those while the reporting layer is still lying.
Runtime truth first.