From af647aba4bf54b2d911018b4a0f0041b54bf7fdb Mon Sep 17 00:00:00 2001 From: Release Repro Date: Fri, 24 Jul 2026 21:24:31 -0400 Subject: [PATCH] fix(cli): avoid duplicate compaction error prefix --- .../src/commands/run/run_progress/event.rs | 8 ++++++-- .../src/commands/run/run_progress/mod.rs | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/apps/fabro-cli/src/commands/run/run_progress/event.rs b/lib/apps/fabro-cli/src/commands/run/run_progress/event.rs index 31aa14b1c..317bfa449 100644 --- a/lib/apps/fabro-cli/src/commands/run/run_progress/event.rs +++ b/lib/apps/fabro-cli/src/commands/run/run_progress/event.rs @@ -1,6 +1,7 @@ use std::convert::TryFrom; use chrono::{DateTime, Utc}; +use fabro_agent::Error as AgentError; use fabro_types::{BilledModelUsage, EventBody, RunEvent}; use fabro_util::error; use fabro_workflow::event::RunNoticeLevel; @@ -433,8 +434,11 @@ pub(super) fn from_json_line(line: &str) -> Option { } fn display_compaction_error(value: &Value) -> Option { - let error = serde_json::from_value::(value.clone()).ok()?; - matches!(&error, fabro_agent::Error::Compaction(_)).then(|| error.to_string()) + let error = serde_json::from_value::(value.clone()).ok()?; + match error { + AgentError::Compaction(error) => Some(error.to_string()), + _ => None, + } } fn display_value(value: &Value) -> Option { diff --git a/lib/apps/fabro-cli/src/commands/run/run_progress/mod.rs b/lib/apps/fabro-cli/src/commands/run/run_progress/mod.rs index a1dd513ee..28e62c2b2 100644 --- a/lib/apps/fabro-cli/src/commands/run/run_progress/mod.rs +++ b/lib/apps/fabro-cli/src/commands/run/run_progress/mod.rs @@ -712,6 +712,22 @@ mod tests { assert!(ui.stage.active_stages["s1"].compaction_bar.is_none()); } + #[test] + fn plain_compaction_failure_snapshot() { + let (mut ui, buffer) = capture_ui(false); + + emit( + &mut ui, + agent_event("s1", AgentEvent::Error { + error: fabro_agent::Error::Compaction(fabro_agent::CompactionError::EmptySummary { + summarized_turn_count: 14, + }), + }), + ); + + insta::assert_snapshot!(rendered(&buffer), @" ✗ compaction failed: generated summary was empty after trimming; refused to replace 14 turns and left history intact"); + } + #[test] fn handle_json_line_ignores_invalid_json() { let (mut ui, buffer) = capture_ui(false);