Skip to main content

max / audiofiles

4.9 KB · 54 lines History Blame Raw
1 # audiofiles — Todo
2
3 **Last updated:** 2026-05-31 late evening (post-launch-eve fuzz pass).
4
5 ## Status
6
7 5 launch-blocker fixes landed in commit `c18d7e1` (unpushed). Compile clean; preferences (6/6) + export (56/56) targeted tests green. See commit message for the fix list.
8
9 ## Open before launch (Monday 2026-06-01)
10
11 - [ ] Push `main` to all remotes (commit `c18d7e1`)
12 - [ ] Build signed binaries per platform (macOS arm64 primary; iOS per launch-platforms policy; Win/Linux unsupported per policy)
13 - [ ] Notarize macOS DMG; verify with `spctl -a -vvv -t install`
14 - [ ] Cargo.toml version bump for launch release; CHANGELOG entry
15 - [ ] First-launch smoke test on a clean macOS account: activation → vault setup → drop a folder → see no emoji prefixes → open About (Cmd+I) → toggle update check off → confirm preferences.json written
16
17 ## Run #9 deferrals (Phase 4)
18
19 ### Trust / data integrity (creator-fuzz)
20 - [ ] **Export silently strips BWF / iXML / smpl / cue / ID3 chunks on conversion.** `encode.rs` / `encode_aiff.rs` write only fmt+data / COMM+SSND. At minimum, warn on the Configure step when format != Original. Long-term: round-trip BWF `bext`, `smpl` loop points, `cue ` markers in the WAV encoder.
21 - [ ] **Format support gaps.** `AUDIO_EXTENSIONS` (`crates/audiofiles-core/src/util.rs:6`) excludes `.m4a`/`.alac`, `.opus`, `.w64`, `.caf`, `.bwf`. Either expand or surface skip count on import with extension breakdown.
22 - [ ] **Export not atomic.** `runner.rs` writes directly to dest; partial files survive a mid-write kill. Switch to `dest.tmp` + `fs::rename` on success; cleanup tmp on error.
23 - [ ] **Edit-result import then `remove_file` not atomic across processes.** `state/import_workflow.rs:1288-1297` deletes temp before VFS link is confirmed.
24 - [ ] **`SampleStore::remove` deletes DB row first, then file — orphan blob on file-delete failure.** `store.rs:191`.
25
26 ### UX polish (use-fuzz)
27 - [ ] **Preserve form fields on signup-style error swaps.** (Not applicable to audiofiles per se, but the pattern — re-render the wizard step with user input — would apply if any wizard step ever fails inline.)
28 - [ ] **Sort-arrow glyphs U+25B2 / U+25BC** in `file_list.rs::draw_sort_header` are documented exceptions to the no-emoji rule. Get explicit user sign-off or replace with text ("asc" / "desc").
29 - [ ] **First-launch welcome cannot be dismissed inline** — only disappears after successful import or "Show welcome" toggle. Add a small "Dismiss" link near the bottom of `file_list.rs:44-96`.
30 - [ ] **Toolbar buttons have no visual hierarchy** — Import, Export, Sync, Settings, Help all render identically. When library is empty, paint Import with `widgets::primary_button` styling.
31 - [ ] **Error toast / status copy nits**: `activation.rs:119` "Activating..." should use U+2026 (``); `library.rs:100` "Locate failed: {e}" is terse — make it "Could not locate sample on disk — {e}".
32
33 ### Rust quality (rust-fuzz)
34 - [ ] **`Result<_, String>` leaks past the typed-error wall** in `crates/audiofiles-browser/src/state/playback.rs:9,20`, `crates/audiofiles-app/src/midi.rs:35`, `crates/audiofiles-app/src/license.rs:209`. Fold into `PreviewError` / `MidiError` / `LicenseError`.
35 - [ ] **`unwrap()` after `is_none()` check** at `crates/audiofiles-browser/src/backend/direct.rs:571, 595` — idiomatic refactor to `idx.get_or_insert_with(...)`.
36 - [ ] **Hand-rolled `synckit.toml` parser** at `crates/audiofiles-app/src/main.rs:134-149``toml` is already a workspace dep; replace with `toml::from_str::<HashMap<String, String>>()`.
37 - [ ] **Dependency duplication**`cargo tree -d` shows four `windows-core` versions (0.54/0.56/0.58/0.62) and two `objc2-foundation` (0.2.2/0.3.2). Bloats Win/macOS binaries; bump `tray-icon` / `objc2` callers in sync.
38
39 ### Repo hygiene (launchplan §2.3)
40 - [ ] Remove `crates/audiofiles-app/tests/harness/mod.rs.bak` if it ever reappears (deleted this session as part of the fix commit).
41 - [ ] Audit `docs/` for stale plans; either delete or mark complete.
42 - [ ] `CONTRIBUTING.md` walkthrough against current build commands.
43
44 ## Audit deltas to revisit
45
46 - [ ] **In-app updater toggle takes effect on next launch only.** Current implementation persists the pref + skips spawn at startup but doesn't tear down the already-spawned tokio task at runtime. Either accept (cheap, restart-required) or wire a `tokio::sync::watch` cancel signal into the check loop.
47
48 ## Future enhancements (not blocking)
49
50 - [ ] Move About modal trigger into a Help menu (toolbar Help button is already there but routes only to keyboard-shortcuts overlay; add a sub-action for About).
51 - [ ] `Cmd+,` for preferences as macOS users will expect (currently only Cmd/Ctrl+I → About → toggle).
52 - [ ] SyncKit upload contract audit — what exactly gets uploaded vs encrypted; verify E2E boundary; audit `crates/audiofiles-sync/src/service/upload.rs`.
53 - [ ] Database migration safety review — 12 inline migrations in `db.rs` not audited this pass.
54