From 2d2db6d3e5cc158dd584ade0f439c89fbdafc6fc Mon Sep 17 00:00:00 2001 From: CodeWhale Bot Date: Wed, 23 Sep 2026 09:07:20 -0700 Subject: [PATCH] fix(copy): say "Making room" and "Permissions" in Engine messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CURRENT_DECISIONS §19 (ratified 2026-09-22) names the user-facing words: "Making room" for summarizing earlier conversation, not compaction/auto-compaction, and "Permissions" rather than posture. The Engine's compaction, preview, turn-loop and /compact messages still used the old words. Mined from the unreviewed 0.10.1 WIP branch (copy-only hunks in 16 files; its unrelated session-restore hunks in the same files are left for their own slice). Two corrections to the WIP: - The emergency failure "could not bring the request under the model limit" would have dropped from an Error to an Info toast, because toast severity is classified from the wording. It now reads "Making room failed: the request is still over the model limit …", which keeps the Error level. - test_compact_toggles_state still expected the old word; updated to the ratified copy (history: §19 decision, not a regression). Model-facing prompt text, config keys and the `/compact` command name are unchanged. Evidence: 1799 passed, 1 failed (the missed copy assertion above) across compaction, preview, core::engine::tests, commands::, session_acceptance, launch_resume_tests and app::status selections; after the fix 31/31 session_lifecycle_regression_tests passed. TUI all-target/all-feature Clippy with CI flags and fmt passed. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../src/commands/groups/session/compact.rs | 11 ++--- crates/tui/src/commands/mod.rs | 2 +- crates/tui/src/commands/session_acceptance.rs | 5 +- .../session_lifecycle_regression_tests.rs | 2 +- crates/tui/src/compaction.rs | 22 ++++----- crates/tui/src/compaction/last_round.rs | 16 +++--- crates/tui/src/compaction/tests.rs | 4 +- crates/tui/src/core/engine.rs | 4 +- crates/tui/src/core/engine/compaction.rs | 49 +++++++++---------- crates/tui/src/core/engine/preview.rs | 2 +- crates/tui/src/core/engine/preview/tests.rs | 6 +-- crates/tui/src/core/engine/tests.rs | 10 ++-- .../tui/src/core/engine/tests/compaction.rs | 2 +- crates/tui/src/core/engine/turn_loop.rs | 29 +++++------ crates/tui/src/tui/ui/compaction_flow.rs | 8 +-- crates/tui/src/tui/ui/session_state.rs | 2 +- 16 files changed, 82 insertions(+), 92 deletions(-) diff --git a/crates/tui/src/commands/groups/session/compact.rs b/crates/tui/src/commands/groups/session/compact.rs index 4ad08a7dde..7e905183b5 100644 --- a/crates/tui/src/commands/groups/session/compact.rs +++ b/crates/tui/src/commands/groups/session/compact.rs @@ -41,8 +41,8 @@ pub(in crate::commands) fn compact_pure(arg: Option<&str>) -> CommandResult { .filter(|focus| !focus.is_empty()) .map(str::to_string); let receipt = match focus.as_deref() { - Some(focus) => format!("Context compaction triggered (focus: {focus})..."), - None => "Context compaction triggered...".to_string(), + Some(focus) => format!("Making room (focus: {focus})…"), + None => "Making room…".to_string(), }; CommandResult::with_message_and_action(receipt, AppAction::CompactContext { focus }) } @@ -55,10 +55,7 @@ mod tests { #[test] fn pure_compact_matches_baseline_receipts() { let none = compact_pure(None); - assert_eq!( - none.message.as_deref(), - Some("Context compaction triggered...") - ); + assert_eq!(none.message.as_deref(), Some("Making room…")); assert!(matches!( none.action, Some(AppAction::CompactContext { focus: None }) @@ -74,7 +71,7 @@ mod tests { let focus = compact_pure(Some(" the auth refactor ")); assert_eq!( focus.message.as_deref(), - Some("Context compaction triggered (focus: the auth refactor)...") + Some("Making room (focus: the auth refactor)…") ); assert!(matches!( focus.action, diff --git a/crates/tui/src/commands/mod.rs b/crates/tui/src/commands/mod.rs index d67c922e98..23f832567b 100644 --- a/crates/tui/src/commands/mod.rs +++ b/crates/tui/src/commands/mod.rs @@ -2881,7 +2881,7 @@ mod tests { let compact = execute("/compact the auth refactor", &mut app); assert_eq!( compact.message.as_deref(), - Some("Context compaction triggered (focus: the auth refactor)...") + Some("Making room (focus: the auth refactor)…") ); assert!(matches!( compact.action, diff --git a/crates/tui/src/commands/session_acceptance.rs b/crates/tui/src/commands/session_acceptance.rs index 8877f12756..4575f94925 100644 --- a/crates/tui/src/commands/session_acceptance.rs +++ b/crates/tui/src/commands/session_acceptance.rs @@ -569,10 +569,7 @@ fn codewhale_triggers_context_compaction(world: &mut SessionCommandWorld) { world.last_action.as_ref(), Some(AppAction::CompactContext { .. }) )); - assert_eq!( - world.last_message.as_deref(), - Some("Context compaction triggered...") - ); + assert_eq!(world.last_message.as_deref(), Some("Making room…")); } #[then("CodeWhale should trigger context purge")] diff --git a/crates/tui/src/commands/session_lifecycle_regression_tests.rs b/crates/tui/src/commands/session_lifecycle_regression_tests.rs index d515b47c17..77e9e3f480 100644 --- a/crates/tui/src/commands/session_lifecycle_regression_tests.rs +++ b/crates/tui/src/commands/session_lifecycle_regression_tests.rs @@ -802,7 +802,7 @@ fn test_compact_toggles_state() { let result = compact(&mut app, None); assert!(result.message.is_some()); let msg = result.message.unwrap(); - assert!(msg.contains("compaction") || msg.contains("Compact")); + assert!(msg.contains("Making room"), "{msg}"); assert!(matches!( result.action, Some(AppAction::CompactContext { focus: None }) diff --git a/crates/tui/src/compaction.rs b/crates/tui/src/compaction.rs index 0530771cc5..5af81e75af 100644 --- a/crates/tui/src/compaction.rs +++ b/crates/tui/src/compaction.rs @@ -1056,7 +1056,7 @@ pub fn report_compaction_failure( .to_string() } Some(crate::llm_client::LlmError::RateLimited { .. }) => { - "provider rate limit blocked compaction — retry after the limit resets or switch provider/model" + "provider rate limit blocked making room — retry after the limit resets or switch provider/model" .to_string() } Some(crate::llm_client::LlmError::AuthenticationError(_)) => { @@ -1064,12 +1064,12 @@ pub fn report_compaction_failure( .to_string() } Some(crate::llm_client::LlmError::AuthorizationError(_)) => { - "provider authorization rejected compaction — verify account access or switch provider/model" + "provider authorization rejected making room — verify account access or switch provider/model" .to_string() } _ => match crate::error_taxonomy::classify_error_message(&raw) { crate::error_taxonomy::ErrorCategory::RateLimit => { - "provider rate limit blocked compaction — retry after the limit resets or switch provider/model" + "provider rate limit blocked making room — retry after the limit resets or switch provider/model" .to_string() } crate::error_taxonomy::ErrorCategory::Authentication => { @@ -1077,7 +1077,7 @@ pub fn report_compaction_failure( .to_string() } crate::error_taxonomy::ErrorCategory::Authorization => { - "provider authorization rejected compaction — verify account access or switch provider/model" + "provider authorization rejected making room — verify account access or switch provider/model" .to_string() } _ => safe_raw, @@ -1235,7 +1235,7 @@ pub async fn compact_messages_safe( >= estimate_input_tokens_for_pressure(messages, system_prompt) { anyhow::bail!( - "Compaction did not reduce context; original conversation was preserved." + "Making room did not shrink the context; the original conversation was preserved." ); } let keep: CompactionKeep = inspect_compaction_keep(&kept); @@ -1274,7 +1274,7 @@ pub async fn compact_messages_safe( } Err(last_error - .unwrap_or_else(|| anyhow::anyhow!("Compaction failed after {MAX_RETRIES} retries"))) + .unwrap_or_else(|| anyhow::anyhow!("Making room failed after {MAX_RETRIES} retries"))) } pub(crate) fn build_compaction_summary_block_text(summary: &str, anchors: &str) -> String { @@ -1516,7 +1516,7 @@ checkpoint machinery, or return a placeholder. {COMPACTION_LANGUAGE_CONTRACT}" fn validate_compaction_summary(summary: &str) -> Result<()> { let trimmed = summary.trim(); if trimmed.is_empty() { - anyhow::bail!("Compaction summary response was unusable: no text was returned."); + anyhow::bail!("The summary for making room was unusable: no text was returned."); } // Strip every non-word edge, not just ASCII punctuation. Providers can @@ -1529,7 +1529,7 @@ fn validate_compaction_summary(summary: &str) -> Result<()> { .to_ascii_lowercase(); if normalized.is_empty() { anyhow::bail!( - "Compaction summary response was unusable: only whitespace or punctuation was returned." + "The summary for making room was unusable: only whitespace or punctuation was returned." ); } if matches!( @@ -1544,7 +1544,7 @@ fn validate_compaction_summary(summary: &str) -> Result<()> { | "i can't provide a summary" | "unable to provide a summary" ) { - anyhow::bail!("Compaction summary response was unusable: a placeholder was returned."); + anyhow::bail!("The summary for making room was unusable: a placeholder was returned."); } Ok(()) } @@ -1673,7 +1673,7 @@ async fn create_summary( // with a fragment. if codewhale_models::is_incomplete_stop_reason(response.stop_reason.as_deref()) { anyhow::bail!( - "Compaction summary response incomplete: provider stop reason `{}`; the partial summary was not accepted.", + "The summary for making room was incomplete: provider stop reason `{}`; the partial summary was not accepted.", codewhale_models::stop_reason_detail(response.stop_reason.as_deref()) ); } @@ -1683,7 +1683,7 @@ async fn create_summary( .any(|block| matches!(block, ContentBlock::ToolUse { .. })) { anyhow::bail!( - "Compaction returned a tool call instead of a completed handoff; original conversation was preserved." + "Making room returned a tool call instead of a summary; the original conversation was preserved." ); } diff --git a/crates/tui/src/compaction/last_round.rs b/crates/tui/src/compaction/last_round.rs index 32db8ad897..7a024d19ff 100644 --- a/crates/tui/src/compaction/last_round.rs +++ b/crates/tui/src/compaction/last_round.rs @@ -369,7 +369,7 @@ pub(crate) fn validate_last_round_coverage( for text in last_round.iter().copied().filter_map(user_prompt_text_of) { if !survives(&text, replacement, user_prompt_text_of) { anyhow::bail!( - "Compaction coverage floor: a last-round user message was dropped; history was not replaced." + "Making room stopped: a last-round user message was dropped; history was not replaced." ); } } @@ -379,7 +379,7 @@ pub(crate) fn validate_last_round_coverage( .any(|message| has_tool_result_id(message, &id)) { anyhow::bail!( - "Compaction coverage floor: last-round tool result {id} was dropped; history was not replaced." + "Making room stopped: last-round tool result {id} was dropped; history was not replaced." ); } } @@ -391,7 +391,7 @@ pub(crate) fn validate_last_round_coverage( .any(|message| has_tool_use_id(message, &id)) { anyhow::bail!( - "Compaction coverage floor: last-round tool call {id} was dropped; history was not replaced." + "Making room stopped: last-round tool call {id} was dropped; history was not replaced." ); } } @@ -401,7 +401,7 @@ pub(crate) fn validate_last_round_coverage( for text in last_round.iter().copied().filter_map(assistant_text_of) { if !survives(&text, replacement, assistant_text_of) { anyhow::bail!( - "Compaction coverage floor: last-round assistant output was dropped; history was not replaced." + "Making room stopped: last-round assistant output was dropped; history was not replaced." ); } } @@ -413,7 +413,7 @@ pub(crate) fn validate_last_round_coverage( .any(|message| message.role.is_assistant_like()) { anyhow::bail!( - "Compaction coverage floor: last-round assistant output was dropped; history was not replaced." + "Making room stopped: last-round assistant output was dropped; history was not replaced." ); } Ok(()) @@ -436,7 +436,7 @@ pub(crate) fn require_text_survives( }) }); if !kept { - anyhow::bail!("Compaction coverage floor: {label} was dropped; history was not replaced."); + anyhow::bail!("Making room stopped: {label} was dropped; history was not replaced."); } Ok(()) } @@ -453,12 +453,12 @@ pub(crate) fn validate_survival_contract( .count(); if checkpoints == 0 { anyhow::bail!( - "Compaction coverage floor: checkpoint receipt was dropped; history was not replaced." + "Making room stopped: checkpoint receipt was dropped; history was not replaced." ); } if checkpoints > 1 { anyhow::bail!( - "Compaction coverage floor: prior summaries were duplicated; history was not replaced." + "Making room stopped: prior summaries were duplicated; history was not replaced." ); } if let Some(anchors) = anchors { diff --git a/crates/tui/src/compaction/tests.rs b/crates/tui/src/compaction/tests.rs index a1412085de..843f83ce96 100644 --- a/crates/tui/src/compaction/tests.rs +++ b/crates/tui/src/compaction/tests.rs @@ -109,7 +109,7 @@ fn untyped_usage_limit_text_never_becomes_quota_exhaustion() { "[auth] Authorization failed: You've reached your usage limit for this billing cycle" ); let message = report(&error); - assert!(message.contains("provider rate limit blocked compaction")); + assert!(message.contains("provider rate limit blocked making room")); assert!(!message.contains("quota exhausted")); } @@ -133,7 +133,7 @@ fn typed_rate_limit_stays_transient_and_does_not_become_quota() { message: "Too Many Requests".into(), retry_after: None, }); - assert!(report(&error).contains("provider rate limit blocked compaction")); + assert!(report(&error).contains("provider rate limit blocked making room")); assert!(is_transient_error(&error)); } diff --git a/crates/tui/src/core/engine.rs b/crates/tui/src/core/engine.rs index 236c8ca351..7abd0835b6 100644 --- a/crates/tui/src/core/engine.rs +++ b/crates/tui/src/core/engine.rs @@ -3152,8 +3152,8 @@ impl Engine { let _ = self .tx_event .send(Event::status(format!( - "Auto-compaction {}", - if enabled { "enabled" } else { "disabled" } + "Make room automatically: {}", + if enabled { "on" } else { "off" } ))) .await; } diff --git a/crates/tui/src/core/engine/compaction.rs b/crates/tui/src/core/engine/compaction.rs index 57e334b6bb..8fcfd82421 100644 --- a/crates/tui/src/core/engine/compaction.rs +++ b/crates/tui/src/core/engine/compaction.rs @@ -167,7 +167,7 @@ impl Engine { input_tokens, )?; context_pressure_message(budget.usage_percent()).map(|warning| format!( - "{warning}. Estimated input: {input_tokens} tokens ({:.1}% of route budget). Automatic compaction is explicitly disabled for this session. A manual /compact saves the original conversation and its model-written handoff before replacing context.", + "{warning}. Estimated input: {input_tokens} tokens ({:.1}% of route budget). Making room automatically is off for this session. /compact saves the original conversation and its model-written handoff before replacing context.", budget.usage_percent(), )) } @@ -192,14 +192,10 @@ impl Engine { route: ResolvedRuntimeRoute, compaction: CompactionConfig, ) { - self.emit_compaction_started( - id.clone(), - false, - "Manual context compaction started".to_string(), - ) - .await; + self.emit_compaction_started(id.clone(), false, "Making room…".to_string()) + .await; let Some(cancel_token) = self.claim_compaction(&id) else { - let message = "Context compaction canceled before it started".to_string(); + let message = "Making room stopped before it started".to_string(); self.emit_compaction_cancelled(id, false, message).await; let _ = self .tx_event @@ -257,7 +253,7 @@ impl Engine { ..Usage::default() }; let Some(client) = self.codewhale_client.clone() else { - let message = "Manual compaction unavailable: API client not configured".to_string(); + let message = "Can't make room: no model is connected".to_string(); self.finish_compaction(&id); self.emit_compaction_failed(id, false, message.clone()) .await; @@ -313,7 +309,7 @@ impl Engine { self.emit_compaction_cancelled( id, false, - "Context compaction canceled; conversation context was not changed".to_string(), + "Making room stopped; the conversation was not changed".to_string(), ) .await; let _ = self @@ -341,8 +337,7 @@ impl Engine { self.emit_compaction_cancelled( id, false, - "Context compaction canceled; conversation context was not changed" - .to_string(), + "Making room stopped; the conversation was not changed".to_string(), ) .await; let _ = self @@ -373,11 +368,11 @@ impl Engine { let tokens_after = self.estimated_input_tokens(); let message = if retries_used > 0 { format!( - "Compaction complete: {messages_before} → {messages_after} messages ({removed} removed, {retries_used} retries), ~{tokens_before} → ~{tokens_after} tokens ({coverage_clause})" + "Made room: {messages_before} → {messages_after} messages ({removed} removed, {retries_used} retries), ~{tokens_before} → ~{tokens_after} tokens ({coverage_clause})" ) } else { format!( - "Compaction complete: {messages_before} → {messages_after} messages ({removed} removed), ~{tokens_before} → ~{tokens_after} tokens ({coverage_clause})" + "Made room: {messages_before} → {messages_after} messages ({removed} removed), ~{tokens_before} → ~{tokens_after} tokens ({coverage_clause})" ) }; self.emit_compaction_completed( @@ -396,7 +391,7 @@ impl Engine { ) .await; } else { - let message = "Compaction skipped: produced empty result".to_string(); + let message = "Making room skipped: the summary came back empty".to_string(); self.emit_compaction_failed(id.clone(), false, message.clone()) .await; turn_status = TurnOutcomeStatus::Failed; @@ -405,7 +400,7 @@ impl Engine { } Err(err) => { let message = crate::compaction::report_compaction_failure( - "Manual context compaction failed", + "Making room failed", &id, false, &err, @@ -461,14 +456,14 @@ impl Engine { .stop_diagnostics .emergency_compaction_attempts .saturating_add(1); - let start_message = format!("Emergency context compaction started ({reason})"); + let start_message = format!("Making room now ({reason})"); self.emit_compaction_started(id.clone(), true, start_message) .await; let Some(compaction_cancel) = self.claim_compaction(&id) else { self.emit_compaction_cancelled( id, true, - "Emergency context compaction canceled before it started; conversation context was not changed" + "Making room stopped before it started; the conversation was not changed" .to_string(), ) .await; @@ -514,9 +509,9 @@ impl Engine { let Some(compaction_result) = compaction_result else { self.finish_compaction(&id); let message = if turn_was_canceled { - "Emergency context compaction canceled with the active turn; conversation context was not changed" + "Making room stopped with the turn; the conversation was not changed" } else { - "Emergency context compaction canceled; conversation context was not changed" + "Making room stopped; the conversation was not changed" } .to_string(); self.emit_compaction_cancelled(id, true, message).await; @@ -561,9 +556,9 @@ impl Engine { if turn_was_canceled || compaction_cancel.is_cancelled() { self.finish_compaction(&id); let message = if turn_was_canceled { - "Emergency context compaction canceled with the active turn; conversation context was not changed" + "Making room stopped with the turn; the conversation was not changed" } else { - "Emergency context compaction canceled; conversation context was not changed" + "Making room stopped; the conversation was not changed" } .to_string(); self.emit_compaction_cancelled(id, true, message).await; @@ -577,9 +572,9 @@ impl Engine { if turn_was_canceled || compaction_cancel.is_cancelled() { self.finish_compaction(&id); let message = if turn_was_canceled { - "Emergency context compaction canceled with the active turn; conversation context was not changed" + "Making room stopped with the turn; the conversation was not changed" } else { - "Emergency context compaction canceled; conversation context was not changed" + "Making room stopped; the conversation was not changed" } .to_string(); self.emit_compaction_cancelled(id, true, message).await; @@ -606,7 +601,7 @@ impl Engine { self.emit_session_updated().await; let removed = before_count.saturating_sub(after_count); let mut details = format!( - "Emergency compaction complete: {before_count} → {after_count} messages ({removed} removed), ~{before_tokens} → ~{after_tokens} tokens" + "Made room: {before_count} → {after_count} messages ({removed} removed), ~{before_tokens} → ~{after_tokens} tokens" ); if retries_used > 0 { details.push_str(&format!(" ({retries_used} retries)")); @@ -639,12 +634,12 @@ impl Engine { // reads as self-contradictory. Name the actual outcome instead. let message = if after_tokens > target_budget { format!( - "Emergency context compaction failed to reduce request below model limit \ + "Making room failed: the request is still over the model limit \ (estimate ~{after_tokens} tokens, budget ~{target_budget}). Original conversation was preserved." ) } else { format!( - "Emergency context compaction made no progress (estimate ~{after_tokens} tokens \ + "Making room made no progress (estimate ~{after_tokens} tokens \ is already within the ~{target_budget} budget; the provider may count the \ request differently). Original conversation was preserved." ) diff --git a/crates/tui/src/core/engine/preview.rs b/crates/tui/src/core/engine/preview.rs index 31820aba9c..83c15fc13d 100644 --- a/crates/tui/src/core/engine/preview.rs +++ b/crates/tui/src/core/engine/preview.rs @@ -631,7 +631,7 @@ impl Engine { if crate::compaction::compaction_pressure_reached(messages, system_prompt, compaction) { let prepared = self.prepare_compaction_envelope(compaction.clone()); if should_compact(messages, system_prompt, &prepared) { - reasons.push("auto-compaction would rewrite the conversation first"); + reasons.push("making room would summarize the conversation first"); } } diff --git a/crates/tui/src/core/engine/preview/tests.rs b/crates/tui/src/core/engine/preview/tests.rs index 51cdef2eff..d2d326a43c 100644 --- a/crates/tui/src/core/engine/preview/tests.rs +++ b/crates/tui/src/core/engine/preview/tests.rs @@ -301,7 +301,7 @@ fn turn_metadata_uses_planned_cross_route_limits_not_installed_limits() { .unwrap(); assert!(pressure.contains("Context pressure: critical")); assert!(pressure.contains("Estimated input:")); - assert!(pressure.contains("Automatic compaction is explicitly disabled")); + assert!(pressure.contains("Making room automatically is off")); let message = engine.user_text_message_from_snapshot( "cross-route budget".to_string(), &prompt_context.model, @@ -580,7 +580,7 @@ async fn compaction_preview_uses_the_planned_routes_system_prompt() { .preview_runtime_transforms(&messages, Some(&planned_prompt), &compaction) .await; assert!( - planned_reasons.contains(&"auto-compaction would rewrite the conversation first"), + planned_reasons.contains(&"making room would summarize the conversation first"), "the planned route prompt crosses the compaction threshold: {planned_reasons:?}" ); @@ -588,7 +588,7 @@ async fn compaction_preview_uses_the_planned_routes_system_prompt() { .preview_runtime_transforms(&messages, Some(&installed_prompt), &compaction) .await; assert!( - !installed_reasons.contains(&"auto-compaction would rewrite the conversation first"), + !installed_reasons.contains(&"making room would summarize the conversation first"), "the installed route prompt is the below-threshold control: {installed_reasons:?}" ); } diff --git a/crates/tui/src/core/engine/tests.rs b/crates/tui/src/core/engine/tests.rs index 08b8ab2107..ce472bc83e 100644 --- a/crates/tui/src/core/engine/tests.rs +++ b/crates/tui/src/core/engine/tests.rs @@ -13231,7 +13231,7 @@ async fn narrower_posture_patch_during_approval_wait_fails_the_call() { let err = result.expect_err("narrowed posture fails the call"); assert!( err.to_string() - .contains("posture changed before this tool call executed"), + .contains("Permissions changed before this tool call executed"), "{change_to:?}: {err}" ); assert!(!written, "{change_to:?}: the shell must not run"); @@ -16271,7 +16271,7 @@ async fn compaction_completed_reports_complete_post_input_tokens() { .emit_compaction_completed( "compact_test".to_string(), false, - "Compaction complete".to_string(), + "Made room".to_string(), Some(4), Some(1), super::compaction::CompactionPass { @@ -16424,9 +16424,9 @@ async fn unchanged_compaction_config_is_acknowledged_silently() { let mut changed = current; changed.enabled = !changed.enabled; let expected = if changed.enabled { - "Auto-compaction enabled" + "Make room automatically: on" } else { - "Auto-compaction disabled" + "Make room automatically: off" }; handle .send(Op::SetCompaction { config: changed }) @@ -18836,7 +18836,7 @@ fn turn_metadata_keeps_stable_fields_while_pressure_reports_live_estimates() { without_pressure(&second_meta) ); assert!(second_meta.contains("Estimated input:")); - assert!(second_meta.contains("Automatic compaction is explicitly disabled")); + assert!(second_meta.contains("Making room automatically is off")); } #[tokio::test] diff --git a/crates/tui/src/core/engine/tests/compaction.rs b/crates/tui/src/core/engine/tests/compaction.rs index b9f95f650b..ef793254b4 100644 --- a/crates/tui/src/core/engine/tests/compaction.rs +++ b/crates/tui/src/core/engine/tests/compaction.rs @@ -454,7 +454,7 @@ fn recovery_failures_from_the_provider_are_told_apart_from_budget_failures() { LlmError::ContextLengthError("prompt is too long".to_string()) ))); assert!(!is_provider_rejection(&anyhow::anyhow!( - "Compaction did not reduce context; original conversation was preserved." + "Making room did not shrink the context; the original conversation was preserved." ))); } diff --git a/crates/tui/src/core/engine/turn_loop.rs b/crates/tui/src/core/engine/turn_loop.rs index 0dc3367b14..17c49fc1a9 100644 --- a/crates/tui/src/core/engine/turn_loop.rs +++ b/crates/tui/src/core/engine/turn_loop.rs @@ -1013,14 +1013,14 @@ impl Engine { let message = match reason { crate::compaction::CompactionRefusal::TooFewMessages { count } => { format!( - "Context pressure is high but auto-compaction held: only {count} messages — nothing meaningful to summarize yet" + "Context is filling up, but there is nothing to make room from yet: only {count} messages" ) } crate::compaction::CompactionRefusal::RetainedFloor { floor, threshold, } => format!( - "Context pressure is high but auto-compaction held: retained context (~{}K tokens) cannot fall below the {}K trigger — /compact to force a pass, or trim pinned context", + "Context is filling up, but making room would not help: retained context (~{}K tokens) cannot fall below the {}K trigger — /compact to force a pass, or trim pinned context", floor / 1000, threshold / 1000 ), @@ -1051,7 +1051,7 @@ impl Engine { self.emit_compaction_started( compaction_id.clone(), true, - "Auto context compaction started".to_string(), + "Making room…".to_string(), ) .await; let auto_messages_before = self.session.messages.len(); @@ -1081,9 +1081,9 @@ impl Engine { auto_compaction_suppressed = true; self.finish_compaction(&compaction_id); let message = if turn_was_canceled { - "Auto-compaction canceled with the active turn; conversation context was not changed" + "Making room stopped with the turn; the conversation was not changed" } else { - "Auto-compaction canceled; conversation context was not changed" + "Making room stopped; the conversation was not changed" } .to_string(); self.emit_compaction_cancelled(compaction_id, true, message) @@ -1105,9 +1105,9 @@ impl Engine { auto_compaction_suppressed = true; self.finish_compaction(&compaction_id); let message = if turn_was_canceled { - "Auto-compaction canceled with the active turn; conversation context was not changed" + "Making room stopped with the turn; the conversation was not changed" } else { - "Auto-compaction canceled; conversation context was not changed" + "Making room stopped; the conversation was not changed" } .to_string(); self.emit_compaction_cancelled(compaction_id, true, message) @@ -1138,11 +1138,11 @@ impl Engine { let auto_tokens_after = self.estimated_input_tokens(); let status = if retries_used > 0 { format!( - "Auto-compaction complete: {auto_messages_before} → {auto_messages_after} messages ({removed} removed, {retries_used} retries), ~{auto_tokens_before} → ~{auto_tokens_after} tokens ({coverage_clause})" + "Made room: {auto_messages_before} → {auto_messages_after} messages ({removed} removed, {retries_used} retries), ~{auto_tokens_before} → ~{auto_tokens_after} tokens ({coverage_clause})" ) } else { format!( - "Auto-compaction complete: {auto_messages_before} → {auto_messages_after} messages ({removed} removed), ~{auto_tokens_before} → ~{auto_tokens_after} tokens ({coverage_clause})" + "Made room: {auto_messages_before} → {auto_messages_after} messages ({removed} removed), ~{auto_tokens_before} → ~{auto_tokens_after} tokens ({coverage_clause})" ) }; self.emit_compaction_completed( @@ -1162,7 +1162,8 @@ impl Engine { .await; } else { auto_compaction_suppressed = true; - let message = "Auto-compaction skipped: empty result".to_string(); + let message = + "Making room skipped: the summary came back empty".to_string(); self.emit_compaction_failed( compaction_id.clone(), true, @@ -1176,7 +1177,7 @@ impl Engine { auto_compaction_suppressed = true; // Log error but continue with original messages (never corrupt) let message = crate::compaction::report_compaction_failure( - "Auto-compaction failed", + "Making room failed", &compaction_id, true, &err, @@ -3751,7 +3752,7 @@ impl Engine { ); for plan in plans { let result = Err(ToolError::permission_denied( - "Runtime permission posture changed while this tool call was being planned; retry it under the current posture." + "Permissions changed while this tool call was being planned; retry it with the current permissions." .to_string(), )); let _ = self @@ -4366,7 +4367,7 @@ impl Engine { } else { result_override.or_else(|| { Some(Err(ToolError::permission_denied( - "Runtime permission posture changed before this tool call executed; retry it under the current posture." + "Permissions changed before this tool call executed; retry it with the current permissions." .to_string(), ))) }) @@ -4411,7 +4412,7 @@ impl Engine { { result_override.get_or_insert_with(|| { Err(ToolError::permission_denied( - "Runtime permission posture changed before this tool call executed; retry it under the current posture." + "Permissions changed before this tool call executed; retry it with the current permissions." .to_string(), )) }); diff --git a/crates/tui/src/tui/ui/compaction_flow.rs b/crates/tui/src/tui/ui/compaction_flow.rs index 2fbc580ec9..066379bb29 100644 --- a/crates/tui/src/tui/ui/compaction_flow.rs +++ b/crates/tui/src/tui/ui/compaction_flow.rs @@ -380,7 +380,7 @@ pub(crate) fn try_cancel_compaction(app: &mut App, engine_handle: &EngineHandle) if !app.is_compacting && app.deferred_manual_compaction.take().is_some() { app.manual_compaction_queued = false; app.manual_compaction_id = None; - let message = "Context compaction canceled before it started".to_string(); + let message = "Making room stopped before it started".to_string(); add_compaction_receipt(app, &message); set_explicit_compaction_status(app, message, StatusToastLevel::Info, false); return true; @@ -399,13 +399,13 @@ pub(crate) fn try_cancel_compaction(app: &mut App, engine_handle: &EngineHandle) Ok(()) => { set_explicit_compaction_status( app, - "Canceling context compaction…".to_string(), + "Stopping making room…".to_string(), StatusToastLevel::Info, false, ); } Err(error) => { - let message = format!("Could not cancel context compaction: {error}"); + let message = format!("Could not stop making room: {error}"); add_compaction_receipt(app, &message); set_explicit_compaction_status(app, message, StatusToastLevel::Error, true); } @@ -476,7 +476,7 @@ pub(crate) fn maybe_warn_context_pressure_for_config( ", unverified window" }; - let recommendation = "Automatic compaction is disabled. Enable auto_compact or use /compact."; + let recommendation = "Making room automatically is off. Turn on auto_compact or use /compact."; if percent >= CONTEXT_CRITICAL_THRESHOLD_PERCENT { set_context_pressure_status( diff --git a/crates/tui/src/tui/ui/session_state.rs b/crates/tui/src/tui/ui/session_state.rs index a9ebffe911..ae6824e983 100644 --- a/crates/tui/src/tui/ui/session_state.rs +++ b/crates/tui/src/tui/ui/session_state.rs @@ -1477,7 +1477,7 @@ mod launch_resume_tests { assert_eq!(app.onboarding, OnboardingState::Provider); assert!(app.onboarding_needs_api_key); - app.status_message = Some("Auto-compaction enabled".to_string()); + app.status_message = Some("Make room automatically: on".to_string()); let shown = app .active_status_toast(crate::tui::underwater::ShellPhase::Idle) .expect("footer notice");