From 5332aa9e0dc800a5b3542bacce6bc37b360c9fbf Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 01:50:32 +0000 Subject: [PATCH 1/2] Remove legacy memory push/inject in report building Removed the legacy memory push/inject logic in `build_headless_context_report` and `add_app_runtime_entries` when Moraine recall is stable. Cleaned up unused `SourceKind::UserMemory`, `ActivationReason::ConfigEnabled`, `App::moraine_fallback` states, and associated tests. Co-authored-by: Hmbown <101357273+Hmbown@users.noreply.github.com> --- crates/tui/src/context_report.rs | 144 ------------------------------- crates/tui/src/tui/app.rs | 4 - 2 files changed, 148 deletions(-) diff --git a/crates/tui/src/context_report.rs b/crates/tui/src/context_report.rs index 348043de05..c194afc04b 100644 --- a/crates/tui/src/context_report.rs +++ b/crates/tui/src/context_report.rs @@ -140,7 +140,6 @@ pub enum SourceKind { CompactionRelayTemplate, RuntimePolicy, EnvironmentBlock, - UserMemory, SessionGoal, HandoffRelay, ToolSchemas, @@ -155,7 +154,6 @@ pub enum SourceKind { pub enum ActivationReason { AlwaysOn, FilePresent, - ConfigEnabled, RuntimeState, PerRequest, Omitted, @@ -238,36 +236,6 @@ pub fn build_headless_context_report(config: &Config, workspace: &Path) -> Promp let selected_skills_dir = crate::tui::app::resolve_skills_dir(workspace, &global_skills_dir, config); let mut builder = base_source_entries(&model, workspace, Some(&selected_skills_dir)); - let memory_path = config.memory_path(); - let memory_enabled = config.memory_enabled(); - let moraine_fallback = config.moraine_fallback(); - - // TODO(v0.8.71): remove legacy memory push/inject when Moraine recall stable; see #3490, #3495 - if let Some(memory_block) = - crate::memory::compose_block(memory_enabled && !moraine_fallback, &memory_path) - { - builder.push(SourceEntry::text( - SourceKind::UserMemory, - "User memory", - Some(memory_path.display().to_string()), - ActivationReason::ConfigEnabled, - &memory_block, - CountingConfidence::High, - Some(6), - )); - } else { - builder.push(SourceEntry::omitted( - SourceKind::UserMemory, - "User memory", - Some(memory_path.display().to_string()), - Some(6), - if moraine_fallback && memory_enabled { - "disabled by moraine_fallback" - } else { - "disabled, missing, or empty" - }, - )); - } builder.push(SourceEntry::text( SourceKind::ModelProviderFact, @@ -494,33 +462,6 @@ fn add_app_runtime_entries(builder: &mut ReportBuilder, app: &App) { Some(4), )); - // TODO(v0.8.71): remove legacy memory push/inject when Moraine recall stable; see #3490, #3495 - if let Some(memory_block) = - crate::memory::compose_block(app.use_memory && !app.moraine_fallback, &app.memory_path) - { - builder.push(SourceEntry::text( - SourceKind::UserMemory, - "User memory", - Some(app.memory_path.display().to_string()), - ActivationReason::ConfigEnabled, - &memory_block, - CountingConfidence::High, - Some(6), - )); - } else { - builder.push(SourceEntry::omitted( - SourceKind::UserMemory, - "User memory", - Some(app.memory_path.display().to_string()), - Some(6), - if app.moraine_fallback && app.use_memory { - "disabled by moraine_fallback" - } else { - "disabled, missing, or empty" - }, - )); - } - if let Some(goal) = app .hunt .quarry @@ -805,7 +746,6 @@ mod tests { use crate::config::Config; use crate::models::Tool; use std::fs; - use std::path::PathBuf; use tempfile::tempdir; #[test] @@ -919,90 +859,6 @@ mod tests { ); } - #[test] - fn app_context_report_omits_legacy_memory_when_moraine_fallback_enabled() { - let tmp = tempdir().expect("tempdir"); - let memory_path = tmp.path().join("memory.md"); - fs::write(&memory_path, "private legacy memory").expect("write memory"); - let config: Config = toml::from_str( - r#" - [memory] - enabled = true - moraine_fallback = true - "#, - ) - .expect("parse config"); - let app = App::new( - crate::tui::app::TuiOptions { - model: "deepseek-v4-pro".to_string(), - workspace: tmp.path().to_path_buf(), - config_path: None, - config_profile: None, - allow_shell: false, - use_alt_screen: false, - use_mouse_capture: false, - use_bracketed_paste: false, - max_subagents: 1, - skills_dir: PathBuf::from("."), - memory_path: memory_path.clone(), - notes_path: tmp.path().join("notes.txt"), - mcp_config_path: tmp.path().join("mcp.json"), - use_memory: true, - start_in_agent_mode: true, - skip_onboarding: true, - yolo: false, - resume_session_id: None, - initial_input: None, - }, - &config, - ); - - assert!(app.moraine_fallback); - let report = build_context_report(&app); - let memory_entry = report - .entries - .iter() - .find(|entry| entry.source_kind == SourceKind::UserMemory) - .expect("user memory source entry"); - - assert_eq!(memory_entry.activation_reason, ActivationReason::Omitted); - assert_eq!( - memory_entry.truncation_reason.as_deref(), - Some("disabled by moraine_fallback") - ); - assert!(!context_report_json(&report).contains("private legacy memory")); - } - - #[test] - fn headless_context_report_omits_legacy_memory_when_moraine_fallback_enabled() { - let tmp = tempdir().expect("tempdir"); - let memory_path = tmp.path().join("memory.md"); - fs::write(&memory_path, "private legacy memory").expect("write memory"); - let mut config: Config = toml::from_str( - r#" - [memory] - enabled = true - moraine_fallback = true - "#, - ) - .expect("parse config"); - config.memory_path = Some(memory_path.to_string_lossy().into_owned()); - - let report = build_headless_context_report(&config, tmp.path()); - let memory_entry = report - .entries - .iter() - .find(|entry| entry.source_kind == SourceKind::UserMemory) - .expect("user memory source entry"); - - assert_eq!(memory_entry.activation_reason, ActivationReason::Omitted); - assert_eq!( - memory_entry.truncation_reason.as_deref(), - Some("disabled by moraine_fallback") - ); - assert!(!context_report_json(&report).contains("private legacy memory")); - } - #[test] fn format_summary_lists_largest_sources() { let mut builder = ReportBuilder::new(); diff --git a/crates/tui/src/tui/app.rs b/crates/tui/src/tui/app.rs index aa61f7c8e0..fec4abff7b 100644 --- a/crates/tui/src/tui/app.rs +++ b/crates/tui/src/tui/app.rs @@ -1837,9 +1837,6 @@ pub struct App { /// the `/memory` slash command, and tool registration for /// `remember`. pub use_memory: bool, - /// True when legacy memory push/inject behavior should stay disabled - /// because Moraine pull/recall is the configured memory backend. - pub moraine_fallback: bool, pub use_alt_screen: bool, pub use_mouse_capture: bool, /// When true, plain Up/Down on an empty composer scroll the transcript @@ -3064,7 +3061,6 @@ impl App { skills_scan_codewhale_only, memory_path, use_memory, - moraine_fallback: config.moraine_fallback(), use_alt_screen, use_mouse_capture, use_bracketed_paste, From 6344a4363f3a9b8b4fb72e491225457e85ddf605 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 02:00:19 +0000 Subject: [PATCH 2/2] Revert "Remove legacy memory push/inject in report building" This reverts the changes as requested since the PR should be part of a consolidated transition later on. Co-authored-by: Hmbown <101357273+Hmbown@users.noreply.github.com> --- crates/tui/src/context_report.rs | 144 +++++++++++++++++++++++++++++++ crates/tui/src/tui/app.rs | 4 + 2 files changed, 148 insertions(+) diff --git a/crates/tui/src/context_report.rs b/crates/tui/src/context_report.rs index c194afc04b..348043de05 100644 --- a/crates/tui/src/context_report.rs +++ b/crates/tui/src/context_report.rs @@ -140,6 +140,7 @@ pub enum SourceKind { CompactionRelayTemplate, RuntimePolicy, EnvironmentBlock, + UserMemory, SessionGoal, HandoffRelay, ToolSchemas, @@ -154,6 +155,7 @@ pub enum SourceKind { pub enum ActivationReason { AlwaysOn, FilePresent, + ConfigEnabled, RuntimeState, PerRequest, Omitted, @@ -236,6 +238,36 @@ pub fn build_headless_context_report(config: &Config, workspace: &Path) -> Promp let selected_skills_dir = crate::tui::app::resolve_skills_dir(workspace, &global_skills_dir, config); let mut builder = base_source_entries(&model, workspace, Some(&selected_skills_dir)); + let memory_path = config.memory_path(); + let memory_enabled = config.memory_enabled(); + let moraine_fallback = config.moraine_fallback(); + + // TODO(v0.8.71): remove legacy memory push/inject when Moraine recall stable; see #3490, #3495 + if let Some(memory_block) = + crate::memory::compose_block(memory_enabled && !moraine_fallback, &memory_path) + { + builder.push(SourceEntry::text( + SourceKind::UserMemory, + "User memory", + Some(memory_path.display().to_string()), + ActivationReason::ConfigEnabled, + &memory_block, + CountingConfidence::High, + Some(6), + )); + } else { + builder.push(SourceEntry::omitted( + SourceKind::UserMemory, + "User memory", + Some(memory_path.display().to_string()), + Some(6), + if moraine_fallback && memory_enabled { + "disabled by moraine_fallback" + } else { + "disabled, missing, or empty" + }, + )); + } builder.push(SourceEntry::text( SourceKind::ModelProviderFact, @@ -462,6 +494,33 @@ fn add_app_runtime_entries(builder: &mut ReportBuilder, app: &App) { Some(4), )); + // TODO(v0.8.71): remove legacy memory push/inject when Moraine recall stable; see #3490, #3495 + if let Some(memory_block) = + crate::memory::compose_block(app.use_memory && !app.moraine_fallback, &app.memory_path) + { + builder.push(SourceEntry::text( + SourceKind::UserMemory, + "User memory", + Some(app.memory_path.display().to_string()), + ActivationReason::ConfigEnabled, + &memory_block, + CountingConfidence::High, + Some(6), + )); + } else { + builder.push(SourceEntry::omitted( + SourceKind::UserMemory, + "User memory", + Some(app.memory_path.display().to_string()), + Some(6), + if app.moraine_fallback && app.use_memory { + "disabled by moraine_fallback" + } else { + "disabled, missing, or empty" + }, + )); + } + if let Some(goal) = app .hunt .quarry @@ -746,6 +805,7 @@ mod tests { use crate::config::Config; use crate::models::Tool; use std::fs; + use std::path::PathBuf; use tempfile::tempdir; #[test] @@ -859,6 +919,90 @@ mod tests { ); } + #[test] + fn app_context_report_omits_legacy_memory_when_moraine_fallback_enabled() { + let tmp = tempdir().expect("tempdir"); + let memory_path = tmp.path().join("memory.md"); + fs::write(&memory_path, "private legacy memory").expect("write memory"); + let config: Config = toml::from_str( + r#" + [memory] + enabled = true + moraine_fallback = true + "#, + ) + .expect("parse config"); + let app = App::new( + crate::tui::app::TuiOptions { + model: "deepseek-v4-pro".to_string(), + workspace: tmp.path().to_path_buf(), + config_path: None, + config_profile: None, + allow_shell: false, + use_alt_screen: false, + use_mouse_capture: false, + use_bracketed_paste: false, + max_subagents: 1, + skills_dir: PathBuf::from("."), + memory_path: memory_path.clone(), + notes_path: tmp.path().join("notes.txt"), + mcp_config_path: tmp.path().join("mcp.json"), + use_memory: true, + start_in_agent_mode: true, + skip_onboarding: true, + yolo: false, + resume_session_id: None, + initial_input: None, + }, + &config, + ); + + assert!(app.moraine_fallback); + let report = build_context_report(&app); + let memory_entry = report + .entries + .iter() + .find(|entry| entry.source_kind == SourceKind::UserMemory) + .expect("user memory source entry"); + + assert_eq!(memory_entry.activation_reason, ActivationReason::Omitted); + assert_eq!( + memory_entry.truncation_reason.as_deref(), + Some("disabled by moraine_fallback") + ); + assert!(!context_report_json(&report).contains("private legacy memory")); + } + + #[test] + fn headless_context_report_omits_legacy_memory_when_moraine_fallback_enabled() { + let tmp = tempdir().expect("tempdir"); + let memory_path = tmp.path().join("memory.md"); + fs::write(&memory_path, "private legacy memory").expect("write memory"); + let mut config: Config = toml::from_str( + r#" + [memory] + enabled = true + moraine_fallback = true + "#, + ) + .expect("parse config"); + config.memory_path = Some(memory_path.to_string_lossy().into_owned()); + + let report = build_headless_context_report(&config, tmp.path()); + let memory_entry = report + .entries + .iter() + .find(|entry| entry.source_kind == SourceKind::UserMemory) + .expect("user memory source entry"); + + assert_eq!(memory_entry.activation_reason, ActivationReason::Omitted); + assert_eq!( + memory_entry.truncation_reason.as_deref(), + Some("disabled by moraine_fallback") + ); + assert!(!context_report_json(&report).contains("private legacy memory")); + } + #[test] fn format_summary_lists_largest_sources() { let mut builder = ReportBuilder::new(); diff --git a/crates/tui/src/tui/app.rs b/crates/tui/src/tui/app.rs index fec4abff7b..aa61f7c8e0 100644 --- a/crates/tui/src/tui/app.rs +++ b/crates/tui/src/tui/app.rs @@ -1837,6 +1837,9 @@ pub struct App { /// the `/memory` slash command, and tool registration for /// `remember`. pub use_memory: bool, + /// True when legacy memory push/inject behavior should stay disabled + /// because Moraine pull/recall is the configured memory backend. + pub moraine_fallback: bool, pub use_alt_screen: bool, pub use_mouse_capture: bool, /// When true, plain Up/Down on an empty composer scroll the transcript @@ -3061,6 +3064,7 @@ impl App { skills_scan_codewhale_only, memory_path, use_memory, + moraine_fallback: config.moraine_fallback(), use_alt_screen, use_mouse_capture, use_bracketed_paste,