Spaces:
Sleeping
Interactive UX progress
Last updated
2026-05-12
Current phase
Implementation is now in Phase 1–3 foundation: persistent state, constraints, events, confidence/review queue, and supervised cluster interactions are implemented at the semantic-state layer.
Completed in this pass
| Item | Status | Notes |
|---|---|---|
Add supplied docs to docs/interactive-ux/ |
done | All supplied Markdown docs were copied into this directory and aligned with the implemented project. |
| Persistent job state | done | supervision_state.json is created beside manifest.json for each completed run. |
| Hit/cluster state schema | done | Implemented in supervised_state.py using JSON-serializable dictionaries. |
| Event log | done | State mutations append job.state.created, constraint.created, hit.moved, hit.pulled_out, cluster.locked, hit.suppressed, suggestion.created, etc. |
| Constraint store | done | Supports force-cluster, must-link, cannot-link, lock-cluster, suppress-pattern, and pin-representative. |
| Confidence scoring | partial | Heuristic scores based on cluster size, label agreement, energy rank, representative/favorite/explicit state, suppression, and lock state. Feature-vector margin scoring is not implemented yet. |
| Outlier-first review queue | done | Backend computes review_queue; UI renders it and lets the user jump to the selected hit. |
| Move hit to cluster | done | Endpoint creates constraints and updates state; it also proposes similar move suggestions. |
| Pull hit into new cluster | done | Endpoint creates cannot-link and force-cluster constraints and a user cluster. |
| Lock cluster | done | Endpoint toggles lock state and records a lock constraint. |
| Suppress hit as bleed/noise | done | Endpoint creates suppress-pattern, marks the hit suppressed, and proposes similar suppressions. |
| Favorite sample / pin representative | partial | Endpoint supports review status favorite, records pin-representative, and updates the representative hit in semantic state. Audio artifact selection is not re-exported yet. |
| Suggestion inbox | partial | Open suggestions render in the UI and can be accepted/rejected. Suggestion generation is heuristic and limited to move/split/suppress patterns. |
| Cluster explanation drawer | done | Endpoint and UI show representative, confidence reasons, outliers, relevant constraints, and label distribution. |
| Undo | done | Last semantic edit can be restored using an undo snapshot stack. |
| Validation script | done | Added scripts/test_interactive_supervision.py. |
Not yet implemented
- Real cached feature-vector store for local reclustering.
- Artifact re-export after semantic edits.
- Waveform click-to-add missed onset.
- Restore suppressed hit/batch restore.
- Real local neighborhood reclustering that changes assignments beyond explicit move/suggestion acceptance.
- Constraint violation detection and reporting.
- Predictive diff preview before accepting suggestions.
- Reconstruction-error-driven correction.
- Multi-resolution/hierarchical clusters.
- User correction profiles / teach mode across songs.
- Frontend TypeScript migration and browser automation tests.
Current risks
| Risk | Impact | Mitigation |
|---|---|---|
| Semantic edits do not rewrite exports yet | User may expect moved/suppressed hits to affect ZIP/MIDI immediately | Next task should be edited-state export. |
| Confidence scores are heuristic | Review queue may sometimes prioritize the wrong hits | Add cached mel/transient features and margin-to-next-cluster scoring. |
| Suggestions are simple | May over-suggest or under-suggest | Keep them previewable, explicit, and undoable; never silently apply. |
| Locks are semantic only | Batch reruns do not yet replay constraints | Add deterministic replay/local recluster using constraints. |
| No browser tests | UI regressions are easy | Add Playwright or lightweight DOM tests. |
Next implementation milestone
Milestone: edited-state export and force-onset correction.
Minimum deliverables:
- Add
POST /api/jobs/{job_id}/export/supervisedthat creates a ZIP/MIDI/manifest fromsupervision_state.json. - Exclude suppressed hits/clusters from the supervised export.
- Honor favorite/pinned representatives in exported samples.
- Add force-onset endpoint that slices a new hit from cached
stem.wav. - Add waveform shift-click or add-onset mode in the UI.
- Add tests proving semantic edits change the supervised export without rerunning stem extraction.
Definition of done for the current foundation
This loop now works:
analyze audio
→ inspect clusters
→ load semantic state
→ move one wrong hit
→ store constraints/events
→ see confidence/review queue update
→ lock corrected cluster
→ suppress bleed
→ inspect explanations and suggestions
→ undo semantic edits
→ reload the job and preserve explicit decisions
The remaining missing piece is that edited semantic state is not yet reflected in a regenerated sample pack.
Pass 5 alignment
The interactive UX docs are now aligned with the implemented semantic edit/export loop. The project supports move, pull-out, suppress, restore, favorite, lock, force-onset, suggestion diff preview, undo, and edited artifact export. The current boundary is no longer “semantic only”; edits can now produce separate supervised WAV/MIDI/reconstruction/ZIP artifacts while original batch outputs remain immutable.
Remaining UX work is concentrated around cluster-level editing and comparison: merge/relabel/split, feature-vector local reclustering, edited-vs-original diff views, and browser tests.
2026-05-12 automatic card-flow update
The default UX now follows the interactive-doc direction more closely by hiding most expert controls and making the user action model concrete:
- drop/upload starts processing automatically;
- waveform appears before backend processing finishes;
- real backend progress tints the waveform;
- sample candidates appear as cards grouped by type;
- dismissing a card becomes a supervised suppression when state is available;
- drawing another candidate models the "draw a card" interaction for missing samples;
- trim/extend controls can save adjusted timing as a forced hit;
- waveform zoom/pan supports close inspection without leaving the main flow.
The remaining mismatch is that drawn candidate cards are still frontend candidate previews, not persisted representative-selection constraints. That should be promoted into the semantic state model next.
Pass 14: selected cards and Spleeter backend
Completed in this pass:
- Added
spleeteras the default separation backend, with selectablespleeter:2stems,spleeter:4stems, andspleeter:5stemsprofiles. - Kept
demucsas a quality/fallback backend andnoneas the full-mix preview backend. - Added optional
requirements-spleeter.txtinstead of forcing TensorFlow/Spleeter into the base install. - Added per-card checkbox state with manual select-all/clear behavior.
- Added selected-only backend export via
POST /api/jobs/{job_id}/export-selected. - Made
draw anotherpersist the chosen representative in semantic state. - Made trim/extend rewrite playable preview audio immediately under
overrides/hits/. - Added
scripts/test_selected_export_card_actions.py.
Outcome:
The default app now behaves more like a card review tool: drop audio, let Spleeter/fallback separation run, review grouped cards, select/dismiss/draw/trim, and export only the selected pack.