Sync: Complete project state with all MEGA SPRINT V1-V3 features and Codex stubs

This commit is contained in:
renato97
2026-04-08 17:58:47 -03:00
parent c9d3528900
commit 6d080d43b3
372 changed files with 189715 additions and 8590 deletions

View File

@@ -0,0 +1,317 @@
# 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.json` latest persisted session is:
- `689f4f6b2361`
- `generation_jobs.json` shows:
- report job `f7bd2d0a95e8` was still `running`
- stage was only `generating_config`
- it had not completed when OpenCode validated
Codex also verified this:
- `ba1111cd6a59` stored `session_id = 689f4f6b2361`
- that job was marked `completed`
- but its `result_text` contains 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:
1. live/validation state from the still-running async job `f7bd2d0a95e8`
2. 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 = f7bd2d0a95e8`
- `session_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.py`
- `C:\ProgramData\Ableton\Live 12 Suite\Resources\MIDI Remote Scripts\abletonmcp_init.py`
- `C:\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_compile` passed for:
- `server.py`
- `sample_selector.py`
- `tests\test_sample_selector.py`
- `tests\test_piano_forward.py`
- tests passed:
- `tests\test_sample_selector.py`
- `tests\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:
- `queued`
- `running`
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_id`
- `session_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_id` only 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:
1. call `get_generation_job_status(job_id)`
2. extract its final `session_id`
3. 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:
1. exact `job_id`
2. exact final job `status`
3. exact final `session_id`
4. explicit proof that validation ran after completion
5. manifest fetched with explicit `session_id`
6. clear statement whether the run is:
- usable
- partial
- failed
7. 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.