# audiofiles — Todo **Last updated:** 2026-05-31 late evening (post-launch-eve fuzz pass). ## Status 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. ## Open before launch (Monday 2026-06-01) - [ ] Push `main` to all remotes (commit `c18d7e1`) - [ ] Build signed binaries per platform (macOS arm64 primary; iOS per launch-platforms policy; Win/Linux unsupported per policy) - [ ] Notarize macOS DMG; verify with `spctl -a -vvv -t install` - [ ] Cargo.toml version bump for launch release; CHANGELOG entry - [ ] 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 ## Run #9 deferrals (Phase 4) ### Trust / data integrity (creator-fuzz) - [ ] **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. - [ ] **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. - [ ] **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. - [ ] **Edit-result import then `remove_file` not atomic across processes.** `state/import_workflow.rs:1288-1297` deletes temp before VFS link is confirmed. - [ ] **`SampleStore::remove` deletes DB row first, then file — orphan blob on file-delete failure.** `store.rs:191`. ### UX polish (use-fuzz) - [ ] **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.) - [ ] **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"). - [ ] **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`. - [ ] **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. - [ ] **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}". ### Rust quality (rust-fuzz) - [ ] **`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`. - [ ] **`unwrap()` after `is_none()` check** at `crates/audiofiles-browser/src/backend/direct.rs:571, 595` — idiomatic refactor to `idx.get_or_insert_with(...)`. - [ ] **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::>()`. - [ ] **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. ### Repo hygiene (launchplan §2.3) - [ ] Remove `crates/audiofiles-app/tests/harness/mod.rs.bak` if it ever reappears (deleted this session as part of the fix commit). - [ ] Audit `docs/` for stale plans; either delete or mark complete. - [ ] `CONTRIBUTING.md` walkthrough against current build commands. ## Audit deltas to revisit - [ ] **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. ## Future enhancements (not blocking) - [ ] 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). - [ ] `Cmd+,` for preferences as macOS users will expect (currently only Cmd/Ctrl+I → About → toggle). - [ ] SyncKit upload contract audit — what exactly gets uploaded vs encrypted; verify E2E boundary; audit `crates/audiofiles-sync/src/service/upload.rs`. - [ ] Database migration safety review — 12 inline migrations in `db.rs` not audited this pass.