CI & Build / Python lint (push) Successful in 2s
CI & Build / Build now, or wait for Android? (push) Successful in 2s
Android / Build, or is the channel already serving this? (push) Successful in 3s
Desktop (Tauri) / Build, or is the channel already serving this? (push) Successful in 3s
CI & Build / Web typecheck and unit tests (push) Successful in 9s
CI & Build / Python tests (push) Successful in 11s
Android / Core and FFI clippy and tests (push) Successful in 1m0s
Desktop (Tauri) / Web tests, clippy, Rust tests and rustfmt (push) Successful in 2m16s
CI & Build / integration (push) Successful in 2m41s
CI & Build / Build & push image (push) Skipped
Desktop (Tauri) / Windows installer (cross-compiled) (push) Successful in 3m8s
Desktop (Tauri) / Tauri desktop (Linux) (push) Successful in 3m45s
Desktop (Tauri) / Update manifest (push) Successful in 4s
Android / Kotlin + Rust (APK) (push) Successful in 9m26s
Android / Build the server image (push) Successful in 1s
The web compared or keyed tag names with name.toLowerCase() at five sites: the labels store's merge check, LabelPicker's create check, NoteCard's colour map, and colors.ts twice. Android had three, plus TagsScreen's rename dialog using equals(ignoreCase = true). Each now calls foldTag(name), which says what the core's derive::fold and the server's labeling.named say. Android's rename dialog now predicts a merge the same way the core decides one. Per-character ignoreCase and full lowercasing disagree on letters like İ, whose lowercase is two characters. LabelPicker's search filter keeps its own lowercasing: that is search, not identity. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>