feat: SDD workflow — test sync, song generation + validation, ReaScript hybrid pipeline

- compose-test-sync: fix 3 failing tests (NOTE_TO_MIDI, DrumLoopAnalyzer mock, section name)
- generate-song: CLI wrapper + RPP validator (6 structural checks) + 4 e2e tests
- reascript-hybrid: ReaScriptGenerator + command protocol + CLI + 16 unit tests
- 110/110 tests passing
- Full SDD cycle (propose→spec→design→tasks→apply→verify) for all 3 changes
This commit is contained in:
renato97
2026-05-03 22:00:26 -03:00
parent 7729d5f12f
commit 48bc271afc
25 changed files with 2842 additions and 343 deletions

View File

@@ -0,0 +1,59 @@
# Proposal: compose-test-sync
## Intent
Sync 3 failing tests to the new compose.py API. The compose.py rewrite removed `root_to_midi` and `DrumLoopAnalyzer`, and changed `build_melody_track` signature. Tests are calling old APIs that no longer exist.
## Scope
### In Scope
- Fix `test_melody_uses_pentatonic` — remove stale `analysis` arg and ensure single-section test works
- Fix `test_main_without_render_produces_rpp` — remove obsolete `DrumLoopAnalyzer` mock
- Fix `test_root_to_midi` — replace removed `root_to_midi` with `NOTE_TO_MIDI` dict lookup
- Run full suite to confirm all 90 pass
### Out of Scope
- No new features
- No compose.py changes — only test fixes
## Capabilities
> No spec-level capabilities change. Tests are sync fixes only.
- None — test-only change, no capability modification
## Approach
1. **`test_root_to_midi`**: Replace `from scripts.compose import root_to_midi` with direct `NOTE_TO_MIDI` dict access. `root_to_midi` was removed; the constant `NOTE_TO_MIDI` ({"A": 69, "C": 60, ...}) is the correct replacement.
2. **`test_main_without_render_produces_rpp`**: Remove both `patch("scripts.compose.SampleSelector")` and `patch("scripts.compose.DrumLoopAnalyzer")`. The rewrite moved drumloop logic to `build_drumloop_track` which uses `Path(ABLETON_DRUMLOOP_DIR)` directly — no class-based analyzer. Keep only `SampleSelector` patch if still needed for other path.
3. **`test_melody_uses_pentatonic`**: The call signature is now `build_melody_track(sections, offsets, "A", True, seed=42)``analysis` arg removed. However `build_lead_track` (called by `build_melody_track`) only generates clips for sections named `chorus`, `chorus2`, or `final`. The test uses `"verse"` which produces zero clips. Fix: change section name to `"chorus"` OR add a second section named `"final"`.
## Affected Areas
| Area | Impact | Description |
|------|--------|-------------|
| `tests/test_section_builder.py` | Modified | Replace `root_to_midi` with `NOTE_TO_MIDI` |
| `tests/test_render_cli.py` | Modified | Remove `DrumLoopAnalyzer` mock, adjust patches |
| `tests/test_compose_integration.py` | Modified | Fix call signature, use chorus section |
## Risks
| Risk | Likelihood | Mitigation |
|------|------------|------------|
| Test fix breaks another test | Low | Run full suite after each change |
| compose.py behavior changed unexpectedly | Low | 87/90 tests already pass |
## Rollback Plan
Revert test files to prior commit. `git checkout HEAD~1 -- tests/` restores all three to original state.
## Dependencies
- None — test-only fix, no external deps
## Success Criteria
- [ ] All 90 tests pass (`pytest tests/ -q`)
- [ ] No compose.py files modified (only test files changed)