# 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)