# Task ledger Last updated: 2026-05-12 ## Completed in current pass: API validation and visible errors - [x] Fix `/api/jobs` rejecting UI-submitted `subdivision` values such as `"16"`. - [x] Add defensive backend coercion for integer, float, and boolean pipeline parameters. - [x] Convert frontend control values according to `/api/config.defaults` before submitting jobs. - [x] Add a global visible error banner for failed API/network requests. - [x] Surface extraction-start failures in the summary and Pipeline log panels. - [x] Add regression coverage in `scripts/test_param_validation_and_api_errors.py`. ## User-requested tasks | Task | Status | Evidence | |---|---:|---| | Review the project | Done | `docs/PROJECT_REVIEW.md`. | | Determine length of significant subprocesses | Done | `pipeline_runner.py`, `scripts/benchmark_subprocesses.py`, `docs/benchmark-subprocesses.json`, `docs/PIPELINE_TIMING_AND_REALTIME.md`. | | Identify near-realtime subprocesses | Done | `docs/PIPELINE_TIMING_AND_REALTIME.md`. | | Add documentation to project | Done | `docs/*.md`, updated `README.md`. | | Replace Gradio UI | Done | Active app is FastAPI + custom web UI; Gradio moved to `legacy/`. | | Document features, tasks, and progress | Done | `docs/FEATURES.md`, this file, `docs/PROGRESS.md`. | | Continue development while keeping docs up-to-date | In progress | Latest pass adds SSE progress, per-hit review artifacts, hit/sample audition, hardened artifact serving, and docs updates. | ## Completed implementation tasks - [x] Preserve old Gradio apps in `legacy/`. - [x] Expose extraction as a FastAPI job API. - [x] Serve a custom browser UI from `web/`. - [x] Add per-stage timing to the pipeline. - [x] Write per-run `manifest.json`. - [x] Add synthetic benchmark script. - [x] Add API documentation. - [x] Add UI replacement documentation. - [x] Add project review and realtime analysis documentation. - [x] Add run-history listing endpoint: `GET /api/jobs`. - [x] Add run-history UI panel. - [x] Add disk cache for stem/full-mix loads. - [x] Extend cache clearing to disk cache. - [x] Add prototype-based `online_preview` clustering mode. - [x] Add UI controls for clustering mode and disk cache. - [x] Fix duplicate sample writes in `build_archive`. - [x] Add feature, task, and progress docs. - [x] Add `GET /api/jobs/{id}/events` SSE progress stream. - [x] Add per-hit review WAV export under `review/hits/`. - [x] Add manifest `hits` rows with onset, duration, cluster, representative flag, and artifact path. - [x] Add click-to-audition for waveform onset markers and detected hit rows. - [x] Add sample-row audition controls. - [x] Harden artifact path containment with `Path.relative_to()`. - [x] Add hit review/streaming documentation. ## Validation tasks - [x] Python compile check for active Python files. - [x] FastAPI smoke test for health/config/job flow. - [x] Pipeline smoke test on synthetic audio. - [x] API history/cache smoke test. - [x] SSE and review-hit artifact smoke test via `scripts/test_sse_and_review_hits.py`. - [x] Git status reviewed before packaging. - [x] Project archive excludes `.runs/`, `.cache/`, and dependency folders. ## Remaining high-value tasks - [ ] Add onset adjustment and rerun-from-onsets flow. - [ ] Add cluster merge/split/relabel workflow. - [ ] Add side-by-side run comparison. - [ ] Convert frontend to TypeScript with a small Vite build once UX stabilizes. - [ ] Add automated browser-level UI tests. ## Interactive UX continuation tasks | Task | Status | Evidence | |---|---:|---| | Add supplied interactive UX docs under `docs/interactive-ux/` | Done | `docs/interactive-ux/*.md`. | | Read and align UX docs with current implementation | Done | Status sections updated in every interactive UX document. | | Add persistent semantic job state | Done | `supervised_state.py`, `supervision_state.json`. | | Add event log and constraint store | Done | `supervised_state.py`; tested by `scripts/test_interactive_supervision.py`. | | Add hit/cluster confidence and review queue | Done/Partial | Heuristic confidence and review queue implemented; feature-margin confidence remains open. | | Add move hit to cluster | Done | `POST /api/jobs/{job_id}/hits/{hit_id}/move`. | | Add pull hit into new cluster | Done | `POST /api/jobs/{job_id}/hits/{hit_id}/pull-out`. | | Add cluster lock/unlock | Done | `POST /api/jobs/{job_id}/clusters/{cluster_id}/lock`. | | Add suppress hit as bleed/noise | Done | `POST /api/jobs/{job_id}/hits/{hit_id}/suppress`. | | Add accept/favorite hit action | Done | `POST /api/jobs/{job_id}/hits/{hit_id}/review`; supervised re-export honors pinned/favorite representatives. | | Add suggestion inbox | Done/Partial | UI/API supports accept/reject; exact diff preview still open. | | Add cluster explanation drawer | Done | `GET /api/jobs/{job_id}/explain/cluster/{cluster_id}` plus UI drawer. | | Add semantic undo | Done | `POST /api/jobs/{job_id}/undo`. | | Add supervised export from edited state | Done | `supervised_export.py`; `POST /api/jobs/{job_id}/export`; UI edited download links. | | Add click-to-add missed onset | Done | Add-onset waveform mode creates forced hits from `stem.wav`. | | Add suppressed-hit restore | Done | `POST /api/jobs/{job_id}/hits/{hit_id}/restore`; UI restore button. | | Add exact suggestion diff previews | Done | Suggestions expose `diff`; UI has `Diff` preview. | | Add true local feature-neighborhood reclustering | Todo | Requires cached feature vectors and constraint-aware assignment. | ## Visual simplification tasks | Task | Status | Notes | |---|---|---| | Restyle web UI to supplied minimal waveform-first reference | Done | Light theme, top-bar primary action, large waveform, compact right controls, sample-card grid, collapsible advanced/power panels. | | Close remaining reference-alignment gaps | Done | Removed waveform header, added one custom transport row, moved fast modes into Advanced, collapsed power tools into Review & edit, hid visible audition players. | ## Latest validation tasks - [x] `python3 -m py_compile app.py pipeline_runner.py sample_extractor.py supervised_state.py supervised_export.py scripts/*.py` - [x] `node --check web/app.js` - [x] `python3 scripts/test_api_job.py` ## Fixed workstation UI tasks | Task | Status | Notes | |---|---:|---| | Remove document-level page scrolling | Done | `html, body` and `.shell` are viewport-locked; long content uses panel-local overflow. | | Add left sidebar for secondary tools | Done | Source guidance, selection context, pipeline logs, and run history live in the left sidebar. | | Add right sidebar for controls | Done | Core extraction, exports, and advanced model/DSP settings live in the right sidebar. | | Add bottom bar for expandable editor panels | Done | Review/edit and raw tables live in `bottom-dock`. | | Add explicit upload button | Done | Top bar now has a visible `Upload audio` control. | | Make whole-app file dropping work | Done | Window-level drag/drop handlers select dropped files and prevent browser navigation. | | Add drag overlay | Done | `globalDropOverlay` appears while dragging files over the app. | ## Pass 9 tasks: reproduced audio and parameter hierarchy | Task | Status | Notes | |---|---:|---| | Export normalized source mix | Done | `source.wav` written per run. | | Export non-target context bed | Done | `context_bed.wav` is source minus target stem; silent for `stem=all`. | | Keep isolated target reconstruction | Done | `target_reconstruction.wav` written per run and per supervised export. | | Make reproduced audio incorporate context | Done | `reconstruction.wav` is context bed plus target reconstruction. | | Add full-context reproduction to ZIP | Done | `rendered_reproduction_full_mix.wav` plus compatibility alias. | | Add target-stem reconstruction to ZIP | Done | `rendered_reconstruction_target_stem.wav`. | | Update supervised export audio model | Done | Edited export writes full-context and target-only previews. | | Add Source/Stem/Reproduced transport modes | Done | Transport buttons added in `web/index.html` and wired in `web/app.js`. | | Separate common controls from advanced parameters | Done | Common controls: stem, sensitivity, sample groups, presets. | | Group advanced parameters by pipeline stage | Done | Stem separation, hit detection, grouping, export/cache. | Remaining follow-up tasks: - [ ] Add source-vs-reproduced waveform/error comparison. - [ ] Add LUFS loudness matching for long previews. - [ ] Optionally cache explicit Demucs non-target stem sums instead of residual subtraction. ## Pass 10 tasks: clean default UI | Task | Status | Notes | |---|---:|---| | Collapse secondary panels by default | Done | Source, selection, pipeline, history, exports, and review/edit no longer open on first load. | | Make bottom dock compact by default | Done | Bottom dock is a small tab bar until `Review & edit` or `Tables` is opened. | | Reduce top-bar visual weight | Done | Smaller brand mark, shorter upload control, compact backend status, smaller primary button. | | Give center workspace more room | Done | Reduced sidebars/gaps/padding and collapsed bottom dock. | | Hide long helper copy from common controls | Done | Common-control hint text is hidden; advanced descriptions remain in expandable sections. | | Preserve no-scroll workstation behavior | Done | Body remains viewport-locked; panel-local scrolling remains. | | Preserve all current features | Done | Existing DOM ids and API paths are preserved; changes are layout/CSS/default-open-state only. | ## Pass 11 tasks: immediate waveform and real progress flow | Task | Status | Notes | |---|---:|---| | Show uploaded waveform immediately | Done | Browser decodes selected/dropped files with Web Audio and renders a peak envelope before extraction. | | Preserve source preview playback before extraction | Done | Uploaded file object URL remains wired to the Source transport. | | Add explicit sequential start flow | Done | Left sidebar `Start here` panel shows Load → Controls → Extract → Review/export. | | Add top-level backend progress contract | Done | Job payloads include `progress` with fraction, stage, and work-unit fields. | | Add stage progress fields | Done | `StageTiming` includes `progress`, `work_done`, and `work_total`. | | Report Demucs chunk progress | Done | `extract_stem()` reports exact completed split chunks through `progress_cb`. | | Render extraction progress on waveform | Done | Running jobs draw the uploaded/extracted waveform in completed and remaining colors. | | Avoid guessed progress values | Done | UI consumes backend progress only; no ETA or timer interpolation is used. | | Add docs for progress semantics | Done | See `docs/IMMEDIATE_WAVEFORM_AND_REAL_PROGRESS.md`. | Follow-up tasks: - [ ] Add finer-grained callback progress inside onset detection. - [ ] Add finer-grained callback progress inside clustering pair computation. - [ ] Add browser-level tests for upload waveform rendering and progress tinting. ## Automatic card-flow task batch Completed: - [x] Start extraction automatically after file drop/upload. - [x] Keep immediate browser waveform rendering before backend work completes. - [x] Add automatic tuning stage after source/stem loading. - [x] Stream sample-card availability through `partial_samples`. - [x] Group cards by detected type. - [x] Add dismiss-card action. - [x] Add draw-another-candidate action for missing samples. - [x] Add simple trim/extend controls and save adjusted timing as forced hit. - [x] Add waveform zoom/pan interaction. - [x] Make MIDI export robust when `pretty_midi` is unavailable. Next: - [ ] Promote drawn candidate cards into backend representative choices. - [ ] Add immediate local reclustering after dismiss/draw constraints. - [ ] Add browser tests for the automatic card-flow path. ## Reference image UI alignment - [x] Match top bar structure: brand, beta badge, current file, export buttons. - [x] Match main layout: waveform left, settings right, sample columns below. - [x] Keep automatic upload/process flow. - [x] Keep advanced controls hidden behind a collapsed expert section. - [x] Preserve existing review/edit tools in a secondary drawer. - [ ] Implement true per-card selection and selected-only export artifacts. - [ ] Run browser screenshot comparison in an environment that allows localhost rendering. ## Selected cards and separation backends Completed: - [x] Add Spleeter backend option. - [x] Default new jobs to Spleeter `spleeter:4stems` + `drums`. - [x] Keep Demucs as explicit quality/fallback backend. - [x] Add `none` backend for full-mix preview. - [x] Add optional `requirements-spleeter.txt`. - [x] Add per-card checkbox selection. - [x] Add selected-only backend export. - [x] Persist draw-next representative overrides. - [x] Rewrite preview audio immediately for trim/extend edits. - [x] Add regression smoke test for selected export/card actions. Next: - [ ] Add card-column relabel/merge/split actions. - [ ] Add browser-level tests for card selection/export/edit flows. - [ ] Add localized high-quality separation refinement on short candidate windows. ## Upload/runtime fallback update (2026-05-12) - Added a visible top-bar `Choose audio` affordance in addition to whole-app drag/drop. - Fixed the default hidden state of the error banner so placeholder errors are not shown on page load. - API errors now surface request path/status/detail in the visible banner and pipeline logs. - `/api/config` now includes runtime diagnostics for optional separation backends. - If Spleeter is unavailable, the simple UI keeps the app usable by switching to full-mix mode; backend fallback also uses full-mix rather than silently launching Demucs.