- **Exporting** (`playlist_export`, the playlist's own sheet and the shelf
  card's): the desktop's five profiles, in the desktop's order and its own
  words — M3U8, XSPF, PLS, CSV and the backup JSON. The file is built in
  Rust by `playlist_formats`, ABOVE the platform fork, so the phone never
  rebuilds a format and the two exports cannot drift. The doors differ
  because the answers do: `tauri-plugin-dialog` does open Android's
  create-document sheet, but it answers with a `content://` URI and
  `std::fs::write` cannot take one, so on the phone the bytes go to
  `tauri-plugin-storage`'s `create_document` and its Kotlin writes them
  through the ContentResolver (`openOutputStream(uri, "wt")`), wherever the
  sheet pointed. That is a plugin function called from Rust, not a command:
  the file never passes through the WebView, and nothing was added to the
  ACL. A dismissed sheet resolves nothing and the phone says nothing —
  which is the desktop's `Ok(None)`. A row with no local file exports
  exactly as it does on the desktop: named, with a comment where the
  location would be (M3U8), carried without a location (XSPF, CSV, the
  backup), or left out (PLS, which holds only real files). The locations
  that ARE written are this phone's own paths, inside the app's folder —
  the format behaving correctly, not a bug to rewrite.
