diff --git a/android/app/src/main/java/com/fabledsword/thoughtsync/ui/ComposeSheet.kt b/android/app/src/main/java/com/fabledsword/thoughtsync/ui/ComposeSheet.kt index 1894b32..545c794 100644 --- a/android/app/src/main/java/com/fabledsword/thoughtsync/ui/ComposeSheet.kt +++ b/android/app/src/main/java/com/fabledsword/thoughtsync/ui/ComposeSheet.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.FilterChip import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.material3.TextButton diff --git a/android/app/src/main/java/com/fabledsword/thoughtsync/ui/EditorChrome.kt b/android/app/src/main/java/com/fabledsword/thoughtsync/ui/EditorChrome.kt index 6f6c557..1dfc04f 100644 --- a/android/app/src/main/java/com/fabledsword/thoughtsync/ui/EditorChrome.kt +++ b/android/app/src/main/java/com/fabledsword/thoughtsync/ui/EditorChrome.kt @@ -14,7 +14,6 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.List import androidx.compose.material.icons.filled.Close -import androidx.compose.material.icons.filled.Create import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.Notifications import androidx.compose.material3.BottomAppBar diff --git a/ci-requirements.md b/ci-requirements.md index f356059..714bf28 100644 --- a/ci-requirements.md +++ b/ci-requirements.md @@ -305,6 +305,15 @@ matched CI run 3931's byte for byte. Same image, same lockfile, same units. take seconds (~30s for clippy). It is gitignored and reaches ~1.4 GB; delete it whenever the space is wanted. +**Run these on every Rust-touching push, not just the ones that feel risky.** Four +consecutive failures across M13's removals — a private `fn` deleted along with the +`pub fn` above it, an orphaned `#[serde]` attribute left where a field was removed, +and a test pinning a protocol version literal — were all caught by these three +commands in under a minute each, after CI had already found them the slow way. A +removal is exactly the kind of change that looks safe and isn't: nothing in the +Python or TypeScript lanes compiles Rust, so a break can travel several commits +before the first lane that does gets to it. + **Don't infer formatting from existing code.** Several lines in `local/store.rs` exceed 100 characters and survive only because rustfmt cannot break a string literal — copying that shape caused one of four consecutive fmt-only CI failures, diff --git a/core/src/sync/compat.rs b/core/src/sync/compat.rs index 8593448..42104e1 100644 --- a/core/src/sync/compat.rs +++ b/core/src/sync/compat.rs @@ -344,13 +344,17 @@ mod tests { fn server_info_tolerates_unknown_and_absent_fields() { // Forward compatibility: a NEWER server sending fields we've never heard of // must not break the handshake. - let info: ServerInfo = serde_json::from_str( - r#"{"site_name":"S","sync_protocol_version":1, - "min_client_protocol_version":1, + // Versions come from the constants, not literals: this test is about unknown + // FIELDS, and pinning the numbers made it fail the moment the protocol moved + // to v2 — for a reason that has nothing to do with what it checks. + let body = format!( + r#"{{"site_name":"S","sync_protocol_version":{v}, + "min_client_protocol_version":{v}, "sync_features":["notes","labels","attachments","tombstones","revisions"], - "some_future_field":{"nested":true}}"#, - ) - .expect("unknown fields are ignored"); + "some_future_field":{{"nested":true}}}}"#, + v = CLIENT_PROTOCOL_VERSION, + ); + let info: ServerInfo = serde_json::from_str(&body).expect("unknown fields are ignored"); assert_eq!(evaluate(&info), Compatibility::Ok); }