From 6d778f26a7eb9e75a21359bfc085b9964c356d57 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sat, 22 Aug 2026 14:51:38 -0400 Subject: [PATCH] Fix the ktlint and compat-test failures, and start using the Rust gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two more from the step-2 removals: **Two unused Kotlin imports** — `FilterChip` (the Note/List switch) and `Icons.Filled.Create` (the "switch to a note" icon), both orphaned when their callers went. ktlint treats them as errors. **`server_info_tolerates_unknown_and_absent_fields`** pinned `sync_protocol_version: 1` as a literal, so bumping the protocol to v2 made it fail for a reason that has nothing to do with what it tests. It is about unknown FIELDS; the versions now come from `CLIENT_PROTOCOL_VERSION`, like every other test in that file already did. The bigger fix is the habit. `ci-requirements.md` has documented since 2026-08-18 that the operator authorised running fmt/clippy/test against the CI image locally, and I had not been doing it. All three now pass here — 116 tests, clippy clean, fmt clean — and every Rust failure in this milestone so far would have been caught by them in under a minute instead of by CI, several commits downstream. Noted in ci-requirements so the next session doesn't relearn it: a removal is exactly the change that looks too safe to check. --- .../fabledsword/thoughtsync/ui/ComposeSheet.kt | 1 - .../fabledsword/thoughtsync/ui/EditorChrome.kt | 1 - ci-requirements.md | 9 +++++++++ core/src/sync/compat.rs | 16 ++++++++++------ 4 files changed, 19 insertions(+), 8 deletions(-) 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); }