From 8941b2a27de09186613fcff968c968956b9f979f Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 3 May 2026 08:07:25 +0000 Subject: [PATCH 01/13] chore: open auto-fix batch claude/friendly-maxwell-M5xB6 From 7f1164f7b76d7c147249532b9ffc841f5fc8955a Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 3 May 2026 08:11:55 +0000 Subject: [PATCH 02/13] chore(worker): replace println with tracing::info in identity Lib crates use tracing for observability per CLAUDE.md. Refs #551 --- crates/worker/src/identity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/worker/src/identity.rs b/crates/worker/src/identity.rs index 31f6887e..cacd43f4 100644 --- a/crates/worker/src/identity.rs +++ b/crates/worker/src/identity.rs @@ -27,7 +27,7 @@ pub fn load_or_generate(path: &str) -> Result { /// identify workers when granting permissions. pub fn print_peer_id(path: &str) -> Result<()> { let identity = load_or_generate(path)?; - println!("{}", identity.endpoint_id()); + tracing::info!(endpoint_id = %identity.endpoint_id(), "worker identity loaded"); Ok(()) } From 7e1ebd30832bcd3cce631b54379626d2d99e634c Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 3 May 2026 08:21:27 +0000 Subject: [PATCH 03/13] chore: link orphaned TODOs to trackers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Triage of audit F34 (#534): every spec.md-named TODO either cites a live issue / plan path or describes a closed gate. - traits.rs:161 — #119 closed before placeholder fixed; cite #561. - listeners.rs:396 — cite #382 (heads-based delta sync). - views.rs:95 — cite #563 (multi-grove members plumbing). - views.rs:600, message.rs:267 + 1125 — cite #562 (WhisperStart wire). - message.rs:1343 + 1406 — cite #564 (mobile sheet emoji recency + full-picker route, distinct from desktop #186). - views.rs:511 + 700, message.rs:857 + 866, mention.rs:44 — cite plan docs/plans/2026-04-21-ui-phase-2c-profile-card.md. - views.rs:481 + state.rs:142 — rewrite stale doc text; the sync-queue gate is closed by Phase 2b (docs/plans/2026-04-21-ui-phase-2b-sync-queue.md). Comment-only changes; no behaviour drift. cargo fmt / clippy -D warnings / wasm32 check on web + client all clean. Refs #534 --- crates/client/src/listeners.rs | 6 +-- crates/client/src/state.rs | 13 +++--- crates/client/src/views.rs | 41 +++++++++++-------- crates/network/src/traits.rs | 5 ++- crates/web/src/components/message.rs | 39 +++++++++--------- .../web/src/components/message_row/mention.rs | 3 +- 6 files changed, 58 insertions(+), 49 deletions(-) diff --git a/crates/client/src/listeners.rs b/crates/client/src/listeners.rs index dbea60d6..3ce6c771 100644 --- a/crates/client/src/listeners.rs +++ b/crates/client/src/listeners.rs @@ -393,9 +393,9 @@ async fn process_received_message( } crate::ops::WireMessage::SyncRequest { state_hash, .. } => { let _ = state_hash; // Legacy field — can't filter by state hash in DAG model. - // TODO: Migrate clients to worker's heads-based sync protocol - // (WorkerRequest::Sync { heads }) for efficient delta sync. - // For now, send the first 500 events from topological sort. + // TODO(#382): migrate clients to worker's heads-based sync + // protocol (WorkerRequest::Sync { heads }) for efficient delta + // sync. For now, send the first 500 events from topological sort. // Receiver will dedup via InsertError::Duplicate. let events: Vec = willow_actor::state::select(&ctx.dag, |ds| { ds.managed diff --git a/crates/client/src/state.rs b/crates/client/src/state.rs index 398d2bb2..72d19d0e 100644 --- a/crates/client/src/state.rs +++ b/crates/client/src/state.rs @@ -137,12 +137,13 @@ pub struct DisplayMessage { /// Queue-note state for this row (see [`QueueNote`]). /// /// Populated by the view projection in - /// `views::compute_messages_view`. Today the projection defers the - /// real detection to the sync-queue crate and always returns - /// `None` — see `TODO(sync-queue.md)` in `views.rs`. The renderer - /// is already wired for the full tri-state so the UX will light up - /// once detection lands. The grouping predicate in `chat.rs` - /// treats any non-`None` variant as a run-break per + /// `views::compute_messages_view`. Phase 2b (see + /// `docs/plans/2026-04-21-ui-phase-2b-sync-queue.md`) closed the + /// original `TODO(sync-queue.md)` gate: the projection now derives + /// real `Pending` / `LateArrival` values from `QueueMeta`. The + /// renderer is wired for the full tri-state. The grouping + /// predicate in `chat.rs` treats any non-`None` variant as a + /// run-break per /// `docs/specs/2026-04-19-ui-design/message-row.md` §Queue notes. pub queue_note: QueueNote, } diff --git a/crates/client/src/views.rs b/crates/client/src/views.rs index 0181e03a..2ca4d9c0 100644 --- a/crates/client/src/views.rs +++ b/crates/client/src/views.rs @@ -92,13 +92,13 @@ impl ServerRegistry { /// exposes its full membership — see the multi-grove TODO on /// `servers.rs`). pub fn shared_groves(&self, _local: &EndpointId, _other: &EndpointId) -> Vec { - // TODO(multi-grove): plumb `state.members` into `ServerEntry` - // so the intersection can walk every grove the local peer is - // in. Until then, the helper returns the active grove's name - // when we know both peers are members (check deferred to the - // UI which reads `MembersView` for the active server). Return - // an empty Vec rather than fabricating a match — the spec's - // edge case "no shared groves → omit section" covers this. + // TODO(#563): plumb `state.members` into `ServerEntry` so the + // intersection can walk every grove the local peer is in. Until + // then, the helper returns the active grove's name when we know + // both peers are members (check deferred to the UI which reads + // `MembersView` for the active server). Return an empty Vec rather + // than fabricating a match — the spec's edge case "no shared + // groves → omit section" covers this. Vec::new() } } @@ -477,8 +477,10 @@ impl ClientViewHandle { /// Phase 2b: accepts a `queue_meta` snapshot so the projection can /// derive real `QueueNote::Pending` / `QueueNote::LateArrival` values /// for each row via [`crate::queue::derive_pending`] + -/// [`crate::queue::derive_late_arrival`]. Closes the -/// `TODO(sync-queue.md)` gate in this function and in the Phase 2a +/// [`crate::queue::derive_late_arrival`]. Closes the original +/// sync-queue gate (see plan +/// `docs/plans/2026-04-21-ui-phase-2b-sync-queue.md`) in this function +/// and in the Phase 2a plan /// `docs/plans/2026-04-20-ui-phase-2a-message-row.md` at line 490. pub fn compute_messages_view( events: &Arc, @@ -508,8 +510,9 @@ pub fn compute_messages_view( // track a distinct `@handle` (see `profile-card.md` for the target // profile data model); as a stand-in we derive a handle from the // display name via `display_name.to_lowercase().replace(' ', '.')`. - // TODO(profile-card.md): replace the display-name-derived handle - // with the real handle field once profile data is plumbed. + // TODO(plan: docs/plans/2026-04-21-ui-phase-2c-profile-card.md): + // replace the display-name-derived handle with the real handle field + // once profile data is plumbed. let peer_refs: Vec = events .members .keys() @@ -597,11 +600,11 @@ pub fn compute_messages_view( } else { QueueNote::None }; - // TODO(whisper-mode.md): flip via WhisperStart event when - // that phase lands. Phase 2a Task 8 reserves the row - // styling surface (message--whisper class + whisper-badge) - // behind this always-false gate so later work only has to - // swap the projection lookup. + // TODO(#562): flip via WhisperStart event when that phase + // lands. Phase 2a Task 8 reserves the row styling surface + // (message--whisper class + whisper-badge) behind this + // always-false gate so later work only has to swap the + // projection lookup. let whisper = false; DisplayMessage { id: m.id.to_string(), @@ -697,8 +700,10 @@ pub fn compute_unread_view( let mute = event_state.mute_state.get(&local_peer_id).cloned(); // Build a PeerRef list once for the mention parser. Mirrors the - // build in `compute_messages_view`; TODO(profile-card.md) tracks - // swapping display-name-derived handles for real profile handles. + // build in `compute_messages_view`; the + // TODO(plan: docs/plans/2026-04-21-ui-phase-2c-profile-card.md) + // there tracks swapping display-name-derived handles for real + // profile handles. // // `resolve_display_name` needs a `ProfileState` — we only have the // event-state profiles here, so fall back to the event-state entry diff --git a/crates/network/src/traits.rs b/crates/network/src/traits.rs index 5147d9d8..89cd187b 100644 --- a/crates/network/src/traits.rs +++ b/crates/network/src/traits.rs @@ -158,9 +158,10 @@ pub trait Network: Send + Sync + 'static { /// Access the blob store. fn blobs(&self) -> &dyn BlobStore; - // TODO(#119): add connection_events() — stream relay up/down and direct + // TODO(#561): add connection_events() — stream relay up/down and direct // peer connect/disconnect events so the client can surface connectivity - // status in the UI. + // status in the UI. (#119 was the original tracker, closed before the + // placeholder `pending()` impls were replaced — #561 is the live followup.) /// Reachability of the configured relay, or [`RelayStatus::NotConfigured`] /// when none is set. Default impl returns `NotConfigured`; the real diff --git a/crates/web/src/components/message.rs b/crates/web/src/components/message.rs index 4da51fb2..c36d6b4d 100644 --- a/crates/web/src/components/message.rs +++ b/crates/web/src/components/message.rs @@ -264,9 +264,9 @@ pub fn MessageView( let has_queue_note = queue_note != QueueNote::None; // Phase 2a Task 8: reserve the whisper surface. `message.whisper` // is gated always-false in the projection today (see - // `client/src/views.rs` TODO(whisper-mode.md)); once that phase - // lands the projection will flip it and the class + badge below - // light up automatically. + // `client/src/views.rs` TODO(#562)); once that phase lands the + // projection will flip it and the class + badge below light up + // automatically. let is_whisper = message.whisper; let reply_preview = message.reply_preview.clone(); @@ -854,7 +854,8 @@ pub fn MessageView( // members registry so `@handle` resolves in the row. // The display-name → handle derivation mirrors // `views::compute_messages_view` (see there for the - // `profile-card.md` TODO). + // profile-card plan TODO — + // `docs/plans/2026-04-21-ui-phase-2c-profile-card.md`). use leptos::context::use_context; let app_state = use_context::(); let local_peer_str = app_state @@ -863,10 +864,10 @@ pub fn MessageView( .unwrap_or_default(); let local_peer: Option = local_peer_str.parse().ok(); - // TODO(profile-card.md): use real handles when profile - // data is plumbed. For now handle ≈ display-name - // lowercased with spaces → dots, matching the - // client-side projection. + // TODO(plan: docs/plans/2026-04-21-ui-phase-2c-profile-card.md): + // use real handles when profile data is plumbed. For + // now handle ≈ display-name lowercased with spaces → + // dots, matching the client-side projection. let peers_vec: Vec = app_state .as_ref() .map(|a| { @@ -1122,10 +1123,10 @@ pub fn MessageView( class="toolbar-btn" type="button" aria-label="whisper reply" - // TODO(whisper-mode.md): permission-gated; no-op - // until `WhisperStart` EventKind lands and the - // local peer has permission to send a whisper - // reply to this row's author. + // TODO(#562): permission-gated; no-op until + // `WhisperStart` EventKind lands and the local + // peer has permission to send a whisper reply + // to this row's author. on:click=move |ev| { ev.stop_propagation(); } > {icons::icon_ear()} @@ -1340,9 +1341,9 @@ pub fn MessageView( on:touchend=on_sheet_touchend > // Quick-emoji row — six hit targets from recency. - // TODO(reactions-pins.md): swap `REACTION_EMOJI` - // for the channel-scoped recency list once that - // spec lands. Rendered first so the sheet opens + // TODO(#564): swap `REACTION_EMOJI` for the + // channel-scoped recency list once that spec + // lands. Rendered first so the sheet opens // with the common case one tap away. {if has_react { let cb = react_cb2; @@ -1403,10 +1404,10 @@ pub fn MessageView( // will route there instead. {has_react.then(|| view! { })} diff --git a/crates/web/src/components/message_row/mention.rs b/crates/web/src/components/message_row/mention.rs index ad037414..595711c8 100644 --- a/crates/web/src/components/message_row/mention.rs +++ b/crates/web/src/components/message_row/mention.rs @@ -41,7 +41,8 @@ pub fn MentionPill( }; let title = full_label.unwrap_or_else(|| label.clone()); let aria = format!("mention {title}"); - // TODO(profile-card.md): open the profile popover on click. + // TODO(plan: docs/plans/2026-04-21-ui-phase-2c-profile-card.md): + // open the profile popover on click. view! {