Skip to content

Commit dce60a2

Browse files
committed
Complete MIDI Studio V2 UAT sprint with SSoT cleanup workflow hardening persistence playback export manifest readiness and final reports - PR_26146_141-160-midi-studio-v2-uat-completion-sprint
1 parent a8f37cd commit dce60a2

15 files changed

Lines changed: 1050 additions & 9 deletions
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# PR_26146_141-160 MIDI Studio V2 UAT Completion Sprint Validation
2+
3+
## Scope
4+
5+
Recovery/UAT lane for MIDI Studio V2, using PR_26146_133-140 as baseline.
6+
7+
No new tabs, no new architecture, no sample JSON changes, and no full samples smoke test were performed.
8+
9+
## Files changed
10+
11+
- `tools/midi-studio-v2/js/MidiStudioV2App.js`
12+
- `tests/playwright/tools/MidiStudioV2.spec.mjs`
13+
14+
## Runtime fix
15+
16+
PASS: Fixed a UAT blocker where JSON Details could stay on the local MIDI import song after selecting another song. `selectSong()` now refreshes JSON Details after applying the selected canonical song arrangement.
17+
18+
## Validation
19+
20+
PASS: `node --check tests/playwright/tools/MidiStudioV2.spec.mjs`
21+
22+
PASS: `node --check tools/midi-studio-v2/js/MidiStudioV2App.js`
23+
24+
PASS: `npx playwright test tests/playwright/tools/MidiStudioV2.spec.mjs --grep "PR141-160" --reporter=line`
25+
26+
Result: 2 passed in 54.4s.
27+
28+
WARN: `npm run test:workspace-v2`
29+
30+
Result: timed out after 608047 ms in the long workspace suite. Timed-out Node and Playwright child processes were stopped. The targeted MIDI Studio UAT lane was rerun after cleanup and passed.
31+
32+
PASS: `git diff --check`
33+
34+
Result: no whitespace errors. Git printed the expected CRLF working-copy warning for the Playwright spec only.
35+
36+
## Samples decision
37+
38+
SKIP: full samples smoke test was intentionally not run. This sprint is tool UAT only and sample JSON is explicitly out of scope.
39+
40+
## Playwright coverage
41+
42+
The PR141-160 Playwright grep validates:
43+
44+
- full import, edit, sequence, generate, timeline edit, instrument, playback, loop, stop, export, and persistence workflow
45+
- visible control inventory and SSoT duplicate editable ownership guard
46+
- red/unwired future controls with tooltip/status
47+
- JSON import/export round trip
48+
- diagnostics read-only ownership and JSON Details correctness
49+
- Workspace launch handoff and tool-only Import/Export JSON split
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# PR_26146_141-160 Duplicate Cleanup Report
2+
3+
## Result
4+
5+
PASS: No duplicate editable ownership was introduced.
6+
7+
PASS: The Playwright visible-control audit asserts no canonical editable value has more than one visible owner across MIDI Studio V2 tabs.
8+
9+
PASS: Diagnostics remains read-only except explicit actions such as Copy JSON and Clear Status.
10+
11+
## Cleanup Performed
12+
13+
Fixed stale derived display ownership:
14+
15+
- `selectSong()` now refreshes JSON Details after applying the selected song arrangement.
16+
- This keeps Diagnostics JSON Details derived from the active canonical song instead of retaining the previous local MIDI import display.
17+
18+
## Remaining Duplicate Risks
19+
20+
WARN: Instrument rows share collection-level canonical groups such as `previewLaneSettings.volumes`, but each visible control edits a different instrument lane. This is expected collection ownership, not duplicate ownership.
21+
22+
WARN: Timeline quick controls and Instruments tab both reflect selected instrument state. Timeline owns quick select/mute/solo/hide; Instruments owns editable instrument settings.
23+
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# PR_26146_141-160 Export and Manifest Audit
2+
3+
## Export Tab
4+
5+
PASS: Export tab owns rendered Save WAV, Save MP3, and Save OGG controls.
6+
7+
PASS: Output type selection updates Save button wording.
8+
9+
PASS: Export readiness summarizes selected song, classification, generated ID, sequence, sections, instruments, notes, and output status.
10+
11+
PASS: Export JSON is separate from rendered audio Save actions.
12+
13+
PASS: Export JSON writes a toolState preview to JSON Details and status.
14+
15+
WARN: Rendered audio Save WAV/MP3/OGG remains red/unwired because no real renderer exists.
16+
17+
PASS: Rendered audio save action does not falsely claim file creation.
18+
19+
## Manifest Readiness
20+
21+
PASS: Manifest readiness reports Game Usage assignments by usage label.
22+
23+
PASS: Missing/partial assignment state remains readiness WARN rather than hard FAIL unless required data is missing.
24+
25+
PASS: Diagnostics mirrors Manifest Readiness read-only.
26+
27+
## Future Rendering Controls
28+
29+
UNWIRED: SoundFont, render quality, sample rate, Normalize Volume, Export Stems, and Loop Export remain red/unwired with tooltips.
30+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# PR_26146_141-160 Final Completion Report
2+
3+
## PASS Workflows
4+
5+
- Import JSON
6+
- Select song
7+
- Edit Name, Classification, Tempo, Key, Style, Notes
8+
- Generated ID as `camelCase(Name) + "-" + Classification`
9+
- Populate named and custom Song Sheet sections
10+
- Available Sections populated-only rule
11+
- Section templates, Section Library, Song Library, Instrument Presets, Arrangement Templates
12+
- Song Sequence Add, Duplicate, Move Up, Move Down, Remove
13+
- Parse and Regenerate arrangement with manual note overwrite warning
14+
- Octave Timeline section labels, colors, hover, drag-paint, drag-erase, click edit, keyboard audition
15+
- Instrument selected state sync, settings ownership, lifecycle, presets, audition
16+
- Play, Play Section, Play Sequence, Loop, Stop, natural completion
17+
- Game Usage assignment metadata
18+
- Export JSON and JSON round trip
19+
- Export/Manifest readiness honesty
20+
- Diagnostics read-only ownership
21+
- Workspace/tool launch split
22+
- Accordion open/close behavior
23+
24+
## WARN Partial Workflows
25+
26+
- Full `npm run test:workspace-v2` timed out after 608047 ms in the long workspace suite.
27+
- Rendered audio export is intentionally not implemented.
28+
- Advanced MIDI conversion is intentionally not implemented.
29+
- Game trigger runtime sync is intentionally not implemented.
30+
31+
## FAIL Blockers
32+
33+
None remaining in the targeted MIDI Studio V2 UAT lane.
34+
35+
## Red/Unwired Future Controls
36+
37+
Future controls remain red/unwired and are listed in `PR_26146_141_160_unwired_audit.md`.
38+
39+
## Duplicate Cleanup Findings
40+
41+
PASS: No duplicate editable ownership remains in the visible control audit.
42+
43+
Fixed derived display stale state in JSON Details after selected song changes.
44+
45+
## Recommended Next Tweaks
46+
47+
- Keep rendered audio export red/unwired until a real renderer exists.
48+
- Keep advanced MIDI event conversion red/unwired until controller/velocity fidelity is complete.
49+
- Consider splitting the long workspace suite if timeouts continue outside the MIDI Studio lane.
50+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# PR_26146_141-160 Instrument Audit
2+
3+
## Ownership
4+
5+
PASS: Instruments tab owns editable GM Type/Patch, volume, pan, octave range, transpose, lifecycle controls, and audition keyboard.
6+
7+
PASS: Octave Timeline owns only quick select/mute/solo/hide workflow for instruments.
8+
9+
PASS: `selectedInstrumentId` stays synchronized between Timeline quick rows and Instruments tab.
10+
11+
## Lifecycle
12+
13+
PASS: Duplicate instrument row is wired and updates canonical playback data.
14+
15+
PASS: Move Up and Move Down are wired and keep selected instrument state synchronized.
16+
17+
PASS: Delete uses confirmation before removing an instrument row.
18+
19+
PASS: Instrument preset Save, Duplicate, and Load are wired and report status.
20+
21+
## Audition and Range
22+
23+
PASS: Audition keyboard uses selected instrument context.
24+
25+
PASS: Active playable range is displayed with octave range metadata.
26+
27+
PASS: Piano audition and instrument audition both report status.
28+
29+
## Future Controls
30+
31+
PASS: Future effects and advanced controls remain red/unwired when incomplete.
32+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# PR_26146_141-160 Persistence Audit
2+
3+
## JSON Import
4+
5+
PASS: Tool-only Import JSON loads the canonical MIDI Studio payload.
6+
7+
PASS: Wrapped `midi-studio-v2` toolState payloads remain accepted from prior baseline.
8+
9+
PASS: Invalid and missing data handling remains visible through status/diagnostics surfaces.
10+
11+
## Canonical Edits Persisted
12+
13+
PASS: Export JSON preserves:
14+
15+
- songs
16+
- Name and Classification
17+
- generated ID
18+
- Song Sheet sections
19+
- Song Sequence
20+
- instruments and settings
21+
- generated/manual notes
22+
- Game Usage assignments
23+
- export metadata
24+
25+
## Round Trip
26+
27+
PASS: Exported toolState JSON can be reimported and restores the selected song, Classification, generated ID, Song Sequence, usage assignments, and instrument settings.
28+
29+
PASS: No correctness dependency on `localStorage` was required by the targeted UAT flow.
30+
31+
## Workspace Handoff
32+
33+
PASS: Workspace launch writes edited canonical payload into the workspace tool state and host context.
34+
35+
PASS: Workspace launch shows Return to Workspace and hides tool-only Import/Export JSON controls.
36+
37+
PASS: Tool-only launch shows Import JSON and Export JSON workflows.
38+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# PR_26146_141-160 Playback Audit
2+
3+
## Global Playback
4+
5+
PASS: Play starts audible Preview Synth playback from the selected canonical song.
6+
7+
PASS: Stop stops audible playback and re-enables Play.
8+
9+
PASS: Natural completion reports completed state and leaves Play enabled and Stop disabled.
10+
11+
PASS: Loop playback reports looping state and advances the playhead.
12+
13+
PASS: Stop after loop reports stopped state and leaves Play enabled.
14+
15+
## Timeline Preview Playback
16+
17+
PASS: Play Section reports selected section playback and sets active playback section on the canvas.
18+
19+
PASS: Play Sequence reports Song Sequence playback and sets preview mode to sequence.
20+
21+
PASS: Timeline preview Stop clears section/sequence preview state.
22+
23+
## Residual Risk
24+
25+
WARN: Full workspace test suite timed out before completing. Targeted MIDI Studio playback validation passed after cleanup.
26+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# PR_26146_141-160 Song Setup Audit
2+
3+
## Song Details
4+
5+
PASS: Import JSON loads canonical MIDI Studio payload.
6+
7+
PASS: Name, Classification, Tempo, Key, Style, and Notes remain Song Details owned.
8+
9+
PASS: Generated ID updates as `camelCase(Name) + "-" + Classification`.
10+
11+
Verified example:
12+
13+
- Name: `Sky Battle`
14+
- Classification: `Flying`
15+
- Generated ID: `skyBattle-Flying`
16+
17+
PASS: Classification help remains visible with the common examples list.
18+
19+
PASS: Game Usage assignment is separate from Classification metadata.
20+
21+
## Song Sheet
22+
23+
PASS: Intro, Verse, Chorus, Bridge, Outro, and custom section editors remain first-class.
24+
25+
PASS: Empty Bridge is excluded from Available Sections until populated.
26+
27+
PASS: Available Sections shows populated sections with bar/chord metadata.
28+
29+
PASS: Section template insertion works on a populated section.
30+
31+
PASS: Section Library Save, Load, and Duplicate change canonical section data and status honestly.
32+
33+
PASS: Arrangement Templates populate Song Sequence while preserving manual editing after application.
34+
35+
PASS: Add, Duplicate, Move Up, Move Down, and Remove sequence actions are wired and verified.
36+
37+
PASS: Missing/unpopulated sequence items are rejected visibly with FAIL status.
38+
39+
PASS: Parse Guided Song Sheet updates canonical model, Octave Timeline, JSON Details, diagnostics, and status.
40+
41+
PASS: Regenerate Arrangement shows manual note overwrite warning and requires confirmation.
42+
43+
## Empty State Guidance
44+
45+
PASS: Empty/unpopulated sections remain actionable because Available Sections only exposes populated choices and Save Section is disabled for empty selections.
46+
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# PR_26146_141-160 SSoT Ownership Matrix
2+
3+
## Song Setup
4+
5+
| Canonical value | Editable owner | Non-owning displays |
6+
| --- | --- | --- |
7+
| `music.songs[].name` | Song Details | Export readiness, Diagnostics JSON |
8+
| `music.songs[].classification` | Song Details | Classification guide, Export readiness, Manifest readiness |
9+
| `music.songs[].id` | Generated read-only from Name and Classification | Generated ID preview, Export readiness |
10+
| `music.songs[].director.notes` | Song Details | Diagnostics JSON |
11+
| `music.songs[].director.usage` | Game Usage assignment in Song Details | Manifest readiness |
12+
| `studioArrangement.tempo` | Song Details tempo field | Timeline, Diagnostics, Export readiness |
13+
| `studioArrangement.key` | Song Details key field | Timeline, Diagnostics |
14+
| `studioArrangement.style` | Song Details style field | Diagnostics |
15+
16+
## Song Sheet
17+
18+
| Canonical value | Editable owner | Non-owning displays |
19+
| --- | --- | --- |
20+
| musical sections | Song Sheet section editors | Available Sections, Timeline labels |
21+
| custom sections | Song Sheet custom section editor | Available Sections |
22+
| Song Sequence | Song Sheet sequence list | Timeline section headers |
23+
| Apply Song Sheet To | Song Sheet target checkboxes | generation summary |
24+
| generated/manual note counts | generated from canonical arrangement | Timeline badges, Export readiness |
25+
26+
## Instruments
27+
28+
| Canonical value | Editable owner | Non-owning displays |
29+
| --- | --- | --- |
30+
| GM type/patch | Instruments tab | Timeline quick row summaries |
31+
| volume, pan, transpose | Instruments tab | Exported canonical JSON |
32+
| octave range | Instruments tab | audition keyboard range display |
33+
| selectedInstrumentId | shared tool selection state | Timeline quick select and Instruments tab reflect the same selected lane |
34+
35+
## Timeline
36+
37+
| Canonical value | Editable owner | Non-owning displays |
38+
| --- | --- | --- |
39+
| note grid cells | Octave Timeline canvas | JSON Details, source counts |
40+
| quick mute/solo/hide | Octave Timeline quick controls | Instruments tab reflects state |
41+
| playback preview state | Play/Stop and timeline preview controls | status/log surfaces |
42+
43+
## Diagnostics and Export
44+
45+
| Canonical value | Editable owner | Non-owning displays |
46+
| --- | --- | --- |
47+
| JSON Details | none, derived read-only | Copy JSON action only |
48+
| Manifest readiness | none, derived read-only | Export and Diagnostics |
49+
| Export readiness | Export tab | Diagnostics read-only mirror |
50+
| rendered audio Save WAV/MP3/OGG | Export tab only | red/unwired until renderer exists |
51+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# PR_26146_141-160 Octave Timeline Audit
2+
3+
## Canvas
4+
5+
PASS: Octave Timeline remains canvas-backed.
6+
7+
PASS: Section labels render directly on the timeline header.
8+
9+
PASS: Section colors are present and synchronized from Song Sequence sections.
10+
11+
PASS: Clicking a timeline section header selects the matching Song Sequence item.
12+
13+
PASS: Canvas hover sets hover row/step state.
14+
15+
PASS: Canvas drag-paint and drag-erase update canonical lead lane notes.
16+
17+
PASS: Canvas click toggles a single note.
18+
19+
PASS: Piano-key audition from the canvas keyboard still reports status.
20+
21+
PASS: Frozen Bar/Beat header remains visible during scroll and records frozen header scroll state.
22+
23+
PASS: Play Section and Play Sequence set preview playback mode and active section metadata.
24+
25+
## Stale Render State
26+
27+
PASS: Timeline refresh after Parse, Regenerate, selected instrument changes, and JSON round trip is covered by the PR141-160 targeted Playwright workflow.
28+
29+
## Remaining UNWIRED
30+
31+
UNWIRED: Song Sequence drag/drop remains red/unwired with tooltip/status.
32+

0 commit comments

Comments
 (0)