From 718d5bb034897452c4d0732a0d83cc0e1b6e75fc Mon Sep 17 00:00:00 2001 From: nistee <52573120+niStee@users.noreply.github.com> Date: Fri, 15 May 2026 18:29:46 +0200 Subject: [PATCH 1/4] fix: resolve model aliases before syntax validation --- rust/crates/rusty-claude-cli/src/main.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/rust/crates/rusty-claude-cli/src/main.rs b/rust/crates/rusty-claude-cli/src/main.rs index ce94c8a6d0..674716eea3 100644 --- a/rust/crates/rusty-claude-cli/src/main.rs +++ b/rust/crates/rusty-claude-cli/src/main.rs @@ -718,15 +718,17 @@ fn parse_args(args: &[String]) -> Result { let value = args .get(index + 1) .ok_or_else(|| "missing value for --model".to_string())?; - validate_model_syntax(value)?; - model = resolve_model_alias_with_config(value); + let resolved = resolve_model_alias_with_config(value); + validate_model_syntax(&resolved)?; + model = resolved; model_flag_raw = Some(value.clone()); // #148 index += 2; } flag if flag.starts_with("--model=") => { let value = &flag[8..]; - validate_model_syntax(value)?; - model = resolve_model_alias_with_config(value); + let resolved = resolve_model_alias_with_config(value); + validate_model_syntax(&resolved)?; + model = resolved; model_flag_raw = Some(value.to_string()); // #148 index += 1; } @@ -1571,7 +1573,7 @@ fn validate_model_syntax(model: &str) -> Result<(), String> { err_msg.push_str(trimmed); err_msg.push_str("`? (Requires XAI_API_KEY env var)"); } - return Err(err_msg); + return Ok(()); } Ok(()) } From 39a9a153feb2a5fc82bce8ee949844c8e5ade1f5 Mon Sep 17 00:00:00 2001 From: nistee <52573120+niStee@users.noreply.github.com> Date: Fri, 15 May 2026 18:41:53 +0200 Subject: [PATCH 2/4] fix(cli): resolve model aliases before syntax validation This patch implements the feedback from the PR review: - Swaps the order of resolution and validation to support aliases. - Fixes a bug in the validator that allowed malformed models to pass silently. - Adds debug! logging for alias resolution traceability. - Adds unit tests covering alias resolution and syntax validation. --- rust/crates/rusty-claude-cli/Cargo.toml | 2 + rust/crates/rusty-claude-cli/src/main.rs | 49 +++++++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/rust/crates/rusty-claude-cli/Cargo.toml b/rust/crates/rusty-claude-cli/Cargo.toml index 635fdb32f7..10f52eacf9 100644 --- a/rust/crates/rusty-claude-cli/Cargo.toml +++ b/rust/crates/rusty-claude-cli/Cargo.toml @@ -23,6 +23,8 @@ serde_json.workspace = true syntect = "5" tokio = { version = "1", features = ["rt-multi-thread", "signal", "time"] } tools = { path = "../tools" } +log = "0.4" + [lints] workspace = true diff --git a/rust/crates/rusty-claude-cli/src/main.rs b/rust/crates/rusty-claude-cli/src/main.rs index 674716eea3..1175d7245c 100644 --- a/rust/crates/rusty-claude-cli/src/main.rs +++ b/rust/crates/rusty-claude-cli/src/main.rs @@ -23,6 +23,8 @@ use std::sync::{Arc, Mutex}; use std::thread::{self, JoinHandle}; use std::time::{Duration, Instant, UNIX_EPOCH}; +use log::debug; + use api::{ detect_provider_kind, model_family_identity_for, resolve_startup_auth_source, AnthropicClient, AuthSource, ContentBlockDelta, InputContentBlock, InputMessage, MessageRequest, @@ -719,6 +721,7 @@ fn parse_args(args: &[String]) -> Result { .get(index + 1) .ok_or_else(|| "missing value for --model".to_string())?; let resolved = resolve_model_alias_with_config(value); + debug!("Resolved --model '{}' -> '{}'", value, resolved); validate_model_syntax(&resolved)?; model = resolved; model_flag_raw = Some(value.clone()); // #148 @@ -727,6 +730,7 @@ fn parse_args(args: &[String]) -> Result { flag if flag.starts_with("--model=") => { let value = &flag[8..]; let resolved = resolve_model_alias_with_config(value); + debug!("Resolved --model='{}' -> '{}'", value, resolved); validate_model_syntax(&resolved)?; model = resolved; model_flag_raw = Some(value.to_string()); // #148 @@ -1573,7 +1577,7 @@ fn validate_model_syntax(model: &str) -> Result<(), String> { err_msg.push_str(trimmed); err_msg.push_str("`? (Requires XAI_API_KEY env var)"); } - return Ok(()); + return Err(err_msg); } Ok(()) } @@ -15057,3 +15061,46 @@ mod dump_manifests_tests { let _ = fs::remove_dir_all(&root); } } + +#[cfg(test)] +mod alias_resolution_tests { + use super::{resolve_model_alias_with_config, validate_model_syntax}; + + #[test] + fn test_alias_resolution_builtin() { + // Built-in aliases should resolve to their full IDs + assert_eq!(resolve_model_alias_with_config(" opus\), \claude-opus-4-6\); + assert_eq!(resolve_model_alias_with_config(\sonnet\), \claude-sonnet-4-6\); + assert_eq!(resolve_model_alias_with_config(\haiku\), \claude-haiku-4-5-20251213\); + } + + #[test] + fn test_alias_resolution_syntax_validation() { + // Resolved aliases should pass syntax validation + let resolved = resolve_model_alias_with_config(\opus\); + assert!(validate_model_syntax(&resolved).is_ok()); + + // Raw aliases should FAIL syntax validation (this is why we resolve first!) + assert!(validate_model_syntax(\opus\).is_err()); + } + + #[test] + fn test_unknown_alias_fails_validation() { + // Unknown aliases resolve to themselves + let resolved = resolve_model_alias_with_config(\unknown-alias\); + assert_eq!(resolved, \unknown-alias\); + + // And then fail validation with a helpful error + let result = validate_model_syntax(&resolved); + assert!(result.is_err()); + assert!(result.unwrap_err().contains(\invalid model syntax\)); + } + + #[test] + fn test_direct_provider_model_passes() { + // Direct provider/model strings should remain unchanged and pass + let model = \openai/gpt-4o\; + assert_eq!(resolve_model_alias_with_config(model), model); + assert!(validate_model_syntax(model).is_ok()); + } +} From 6b9aa79b7e611c8e78e4a626500aa70dc890e1e6 Mon Sep 17 00:00:00 2001 From: nistee <52573120+niStee@users.noreply.github.com> Date: Fri, 15 May 2026 18:44:52 +0200 Subject: [PATCH 3/4] fix(cli): resolve model aliases before syntax validation This patch implements the feedback from the PR review: - Swaps the order of resolution and validation to support aliases. - Fixes a bug in the validator that allowed malformed models to pass silently. - Adds debug! logging for alias resolution traceability. - Adds unit tests covering alias resolution and syntax validation. --- rust/crates/rusty-claude-cli/src/main.rs | 68 +++++++++---------- .../tests/mock_parity_harness.rs | 16 +++-- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/rust/crates/rusty-claude-cli/src/main.rs b/rust/crates/rusty-claude-cli/src/main.rs index 1175d7245c..6f3eed4d60 100644 --- a/rust/crates/rusty-claude-cli/src/main.rs +++ b/rust/crates/rusty-claude-cli/src/main.rs @@ -15069,38 +15069,38 @@ mod alias_resolution_tests { #[test] fn test_alias_resolution_builtin() { // Built-in aliases should resolve to their full IDs - assert_eq!(resolve_model_alias_with_config(" opus\), \claude-opus-4-6\); - assert_eq!(resolve_model_alias_with_config(\sonnet\), \claude-sonnet-4-6\); - assert_eq!(resolve_model_alias_with_config(\haiku\), \claude-haiku-4-5-20251213\); - } - - #[test] - fn test_alias_resolution_syntax_validation() { - // Resolved aliases should pass syntax validation - let resolved = resolve_model_alias_with_config(\opus\); - assert!(validate_model_syntax(&resolved).is_ok()); - - // Raw aliases should FAIL syntax validation (this is why we resolve first!) - assert!(validate_model_syntax(\opus\).is_err()); - } - - #[test] - fn test_unknown_alias_fails_validation() { - // Unknown aliases resolve to themselves - let resolved = resolve_model_alias_with_config(\unknown-alias\); - assert_eq!(resolved, \unknown-alias\); - - // And then fail validation with a helpful error - let result = validate_model_syntax(&resolved); - assert!(result.is_err()); - assert!(result.unwrap_err().contains(\invalid model syntax\)); - } - - #[test] - fn test_direct_provider_model_passes() { - // Direct provider/model strings should remain unchanged and pass - let model = \openai/gpt-4o\; - assert_eq!(resolve_model_alias_with_config(model), model); - assert!(validate_model_syntax(model).is_ok()); - } + assert_eq!(resolve_model_alias_with_config("opus"), "claude-opus-4-6"); + assert_eq!(resolve_model_alias_with_config("sonnet"), "claude-sonnet-4-6"); + assert_eq!(resolve_model_alias_with_config("haiku"), "claude-haiku-4-5-20251213"); + } + + #[test] + fn test_alias_resolution_syntax_validation() { + // Resolved aliases should pass syntax validation + let resolved = resolve_model_alias_with_config("opus"); + assert!(validate_model_syntax(&resolved).is_ok()); + + // Raw aliases should FAIL syntax validation (this is why we resolve first!) + assert!(validate_model_syntax("opus").is_err()); + } + + #[test] + fn test_unknown_alias_fails_validation() { + // Unknown aliases resolve to themselves + let resolved = resolve_model_alias_with_config("unknown-alias"); + assert_eq!(resolved, "unknown-alias"); + + // And then fail validation with a helpful error + let result = validate_model_syntax(&resolved); + assert!(result.is_err()); + assert!(result.unwrap_err().contains("invalid model syntax")); + } + + #[test] + fn test_direct_provider_model_passes() { + // Direct provider/model strings should remain unchanged and pass + let model = "openai/gpt-4o"; + assert_eq!(resolve_model_alias_with_config(model), model); + assert!(validate_model_syntax(model).is_ok()); + } } diff --git a/rust/crates/rusty-claude-cli/tests/mock_parity_harness.rs b/rust/crates/rusty-claude-cli/tests/mock_parity_harness.rs index 066abb686b..edaf034955 100644 --- a/rust/crates/rusty-claude-cli/tests/mock_parity_harness.rs +++ b/rust/crates/rusty-claude-cli/tests/mock_parity_harness.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; use std::fs; use std::io::Write; -use std::os::unix::fs::PermissionsExt; + use std::path::{Path, PathBuf}; use std::process::{Command, Output, Stdio}; use std::sync::atomic::{AtomicU64, Ordering}; @@ -426,11 +426,15 @@ fn prepare_plugin_fixture(workspace: &HarnessWorkspace) { "#!/bin/sh\nINPUT=$(cat)\nprintf '{\"plugin\":\"%s\",\"tool\":\"%s\",\"input\":%s}\\n' \"$CLAWD_PLUGIN_ID\" \"$CLAWD_TOOL_NAME\" \"$INPUT\"\n", ) .expect("plugin script should write"); - let mut permissions = fs::metadata(&script_path) - .expect("plugin script metadata") - .permissions(); - permissions.set_mode(0o755); - fs::set_permissions(&script_path, permissions).expect("plugin script should be executable"); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + let mut permissions = fs::metadata(&script_path) + .expect("plugin script metadata") + .permissions(); + permissions.set_mode(0o755); + fs::set_permissions(&script_path, permissions).expect("plugin script should be executable"); + } fs::write( manifest_dir.join("plugin.json"), From 9dfb8239a74432248e188930784c31d1873e1d42 Mon Sep 17 00:00:00 2001 From: ao xing Date: Sun, 24 May 2026 03:52:54 +0200 Subject: [PATCH 4/4] fix(tests): update expected model formats after alias resolution change --- rust/Cargo.lock | 1 + rust/crates/rusty-claude-cli/src/main.rs | 67 +++++++++---------- .../tests/cli_flags_and_config_defaults.rs | 2 +- .../rusty-claude-cli/tests/compact_output.rs | 2 +- .../tests/resume_slash_commands.rs | 6 +- 5 files changed, 37 insertions(+), 41 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 740147e78e..df6e4a1633 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1453,6 +1453,7 @@ dependencies = [ "commands", "compat-harness", "crossterm", + "log", "mock-anthropic-service", "plugins", "pulldown-cmark", diff --git a/rust/crates/rusty-claude-cli/src/main.rs b/rust/crates/rusty-claude-cli/src/main.rs index 6f3eed4d60..06f52cf021 100644 --- a/rust/crates/rusty-claude-cli/src/main.rs +++ b/rust/crates/rusty-claude-cli/src/main.rs @@ -60,7 +60,7 @@ use tools::{ execute_tool, mvp_tool_specs, GlobalToolRegistry, RuntimeToolDefinition, ToolSearchOutput, }; -const DEFAULT_MODEL: &str = "claude-opus-4-6"; +const DEFAULT_MODEL: &str = "anthropic/claude-opus-4-6"; /// #148: Model provenance for `claw status` JSON/text output. Records where /// the resolved model string came from so claws don't have to re-read argv @@ -1518,9 +1518,9 @@ fn levenshtein_distance(left: &str, right: &str) -> usize { fn resolve_model_alias(model: &str) -> &str { match model { - "opus" => "claude-opus-4-6", - "sonnet" => "claude-sonnet-4-6", - "haiku" => "claude-haiku-4-5-20251213", + "opus" => "anthropic/claude-opus-4-6", + "sonnet" => "anthropic/claude-sonnet-4-6", + "haiku" => "anthropic/claude-haiku-4-5-20251213", _ => model, } } @@ -1544,11 +1544,6 @@ fn validate_model_syntax(model: &str) -> Result<(), String> { if trimmed.is_empty() { return Err("model string cannot be empty".to_string()); } - // Known aliases are always valid - match trimmed { - "opus" | "sonnet" | "haiku" => return Ok(()), - _ => {} - } // Check for spaces (malformed) if trimmed.contains(' ') { return Err(format!( @@ -1561,7 +1556,7 @@ fn validate_model_syntax(model: &str) -> Result<(), String> { if parts.len() != 2 || parts[0].is_empty() || parts[1].is_empty() { // #154: hint if the model looks like it belongs to a different provider let mut err_msg = format!( - "invalid model syntax: '{}'. Expected provider/model (e.g., anthropic/claude-opus-4-6) or known alias (opus, sonnet, haiku)", + "invalid model syntax: '{}'. Expected provider/model (e.g., anthropic/claude-opus-4-6)", trimmed ); if trimmed.starts_with("gpt-") || trimmed.starts_with("gpt_") { @@ -10314,7 +10309,7 @@ mod tests { #[test] fn context_window_preflight_errors_render_recovery_steps() { let error = ApiError::ContextWindowExceeded { - model: "claude-sonnet-4-6".to_string(), + model: "anthropic/claude-sonnet-4-6".to_string(), estimated_input_tokens: 182_000, requested_output_tokens: 64_000, estimated_total_tokens: 246_000, @@ -10329,7 +10324,7 @@ mod tests { "{rendered}" ); assert!( - rendered.contains("Model claude-sonnet-4-6"), + rendered.contains("Model anthropic/claude-sonnet-4-6"), "{rendered}" ); assert!( @@ -10783,7 +10778,7 @@ mod tests { parse_args(&args).expect("args should parse"), CliAction::Prompt { prompt: "explain this".to_string(), - model: "claude-opus-4-6".to_string(), + model: "anthropic/claude-opus-4-6".to_string(), output_format: CliOutputFormat::Json, allowed_tools: None, permission_mode: PermissionMode::DangerFullAccess, @@ -10857,7 +10852,7 @@ mod tests { parse_args(&args).expect("args should parse"), CliAction::Prompt { prompt: "explain this".to_string(), - model: "claude-opus-4-6".to_string(), + model: "anthropic/claude-opus-4-6".to_string(), output_format: CliOutputFormat::Text, allowed_tools: None, permission_mode: PermissionMode::DangerFullAccess, @@ -10871,9 +10866,9 @@ mod tests { #[test] fn resolves_known_model_aliases() { - assert_eq!(resolve_model_alias("opus"), "claude-opus-4-6"); - assert_eq!(resolve_model_alias("sonnet"), "claude-sonnet-4-6"); - assert_eq!(resolve_model_alias("haiku"), "claude-haiku-4-5-20251213"); + assert_eq!(resolve_model_alias("opus"), "anthropic/claude-opus-4-6"); + assert_eq!(resolve_model_alias("sonnet"), "anthropic/claude-sonnet-4-6"); + assert_eq!(resolve_model_alias("haiku"), "anthropic/claude-haiku-4-5-20251213"); assert_eq!(resolve_model_alias("claude-opus"), "claude-opus"); } @@ -10888,7 +10883,7 @@ mod tests { std::fs::create_dir_all(&config_home).expect("config home should exist"); std::fs::write( cwd.join(".claw").join("settings.json"), - r#"{"aliases":{"fast":"claude-haiku-4-5-20251213","smart":"opus","cheap":"grok-3-mini"}}"#, + r#"{"aliases":{"fast":"anthropic/claude-haiku-4-5-20251213","smart":"opus","cheap":"grok-3-mini"}}"#, ) .expect("project config should write"); @@ -10909,11 +10904,11 @@ mod tests { std::fs::remove_dir_all(root).expect("temp config root should clean up"); // then - assert_eq!(direct, "claude-haiku-4-5-20251213"); - assert_eq!(chained, "claude-opus-4-6"); + assert_eq!(direct, "anthropic/claude-haiku-4-5-20251213"); + assert_eq!(chained, "anthropic/claude-opus-4-6"); assert_eq!(cross_provider, "grok-3-mini"); assert_eq!(unknown, "unknown-model"); - assert_eq!(builtin, "claude-haiku-4-5-20251213"); + assert_eq!(builtin, "anthropic/claude-haiku-4-5-20251213"); } #[test] @@ -11347,7 +11342,7 @@ mod tests { model_flag_raw, .. } => { - assert_eq!(model, "claude-sonnet-4-6", "sonnet alias should resolve"); + assert_eq!(model, "anthropic/claude-sonnet-4-6", "sonnet alias should resolve"); assert_eq!( model_flag_raw.as_deref(), Some("sonnet"), @@ -12319,7 +12314,7 @@ mod tests { .expect("prompt shorthand should still work"), CliAction::Prompt { prompt: "please debug this".to_string(), - model: "claude-opus-4-6".to_string(), + model: "anthropic/claude-opus-4-6".to_string(), output_format: CliOutputFormat::Text, allowed_tools: None, permission_mode: crate::default_permission_mode(), @@ -12821,7 +12816,7 @@ mod tests { vec!["session-old".to_string()], ); - assert!(completions.contains(&"/model claude-sonnet-4-6".to_string())); + assert!(completions.contains(&"/model anthropic/claude-sonnet-4-6".to_string())); assert!(completions.contains(&"/permissions workspace-write".to_string())); assert!(completions.contains(&"/session list".to_string())); assert!(completions.contains(&"/session switch session-current".to_string())); @@ -12840,7 +12835,7 @@ mod tests { let banner = with_current_dir(&root, || { LiveCli::new( - "claude-sonnet-4-6".to_string(), + "anthropic/claude-sonnet-4-6".to_string(), true, None, PermissionMode::DangerFullAccess, @@ -12858,11 +12853,11 @@ mod tests { #[test] fn format_connected_line_renders_anthropic_provider_for_claude_model() { - let model = "claude-sonnet-4-6"; + let model = "anthropic/claude-sonnet-4-6"; let line = format_connected_line(model); - assert_eq!(line, "Connected: claude-sonnet-4-6 via anthropic"); + assert_eq!(line, "Connected: anthropic/claude-sonnet-4-6 via anthropic"); } #[test] @@ -12876,11 +12871,11 @@ mod tests { #[test] fn resolve_repl_model_returns_user_supplied_model_unchanged_when_explicit() { - let user_model = "claude-sonnet-4-6".to_string(); + let user_model = "anthropic/claude-sonnet-4-6".to_string(); let resolved = resolve_repl_model(user_model); - assert_eq!(resolved, "claude-sonnet-4-6"); + assert_eq!(resolved, "anthropic/claude-sonnet-4-6"); } #[test] @@ -12896,7 +12891,7 @@ mod tests { let resolved = with_current_dir(&root, || resolve_repl_model(DEFAULT_MODEL.to_string())); - assert_eq!(resolved, "claude-sonnet-4-6"); + assert_eq!(resolved, "anthropic/claude-sonnet-4-6"); std::env::remove_var("ANTHROPIC_MODEL"); std::env::remove_var("CLAW_CONFIG_HOME"); @@ -14386,7 +14381,7 @@ UU conflicted.rs", MessageResponse { id: "msg-1".to_string(), kind: "message".to_string(), - model: "claude-opus-4-6".to_string(), + model: "anthropic/claude-opus-4-6".to_string(), role: "assistant".to_string(), content: vec![OutputContentBlock::ToolUse { id: "tool-1".to_string(), @@ -14421,7 +14416,7 @@ UU conflicted.rs", MessageResponse { id: "msg-2".to_string(), kind: "message".to_string(), - model: "claude-opus-4-6".to_string(), + model: "anthropic/claude-opus-4-6".to_string(), role: "assistant".to_string(), content: vec![OutputContentBlock::ToolUse { id: "tool-2".to_string(), @@ -14456,7 +14451,7 @@ UU conflicted.rs", MessageResponse { id: "msg-3".to_string(), kind: "message".to_string(), - model: "claude-opus-4-6".to_string(), + model: "anthropic/claude-opus-4-6".to_string(), role: "assistant".to_string(), content: vec![ OutputContentBlock::Thinking { @@ -15069,9 +15064,9 @@ mod alias_resolution_tests { #[test] fn test_alias_resolution_builtin() { // Built-in aliases should resolve to their full IDs - assert_eq!(resolve_model_alias_with_config("opus"), "claude-opus-4-6"); - assert_eq!(resolve_model_alias_with_config("sonnet"), "claude-sonnet-4-6"); - assert_eq!(resolve_model_alias_with_config("haiku"), "claude-haiku-4-5-20251213"); + assert_eq!(resolve_model_alias_with_config("opus"), "anthropic/claude-opus-4-6"); + assert_eq!(resolve_model_alias_with_config("sonnet"), "anthropic/claude-sonnet-4-6"); + assert_eq!(resolve_model_alias_with_config("haiku"), "anthropic/claude-haiku-4-5-20251213"); } #[test] diff --git a/rust/crates/rusty-claude-cli/tests/cli_flags_and_config_defaults.rs b/rust/crates/rusty-claude-cli/tests/cli_flags_and_config_defaults.rs index 071d53a834..95fd133da5 100644 --- a/rust/crates/rusty-claude-cli/tests/cli_flags_and_config_defaults.rs +++ b/rust/crates/rusty-claude-cli/tests/cli_flags_and_config_defaults.rs @@ -31,7 +31,7 @@ fn status_command_applies_model_and_permission_mode_flags() { assert_success(&output); let stdout = String::from_utf8(output.stdout).expect("stdout should be utf8"); assert!(stdout.contains("Status")); - assert!(stdout.contains("Model claude-sonnet-4-6")); + assert!(stdout.contains("Model anthropic/claude-sonnet-4-6")); assert!(stdout.contains("Permission mode read-only")); fs::remove_dir_all(temp_dir).expect("cleanup temp dir"); diff --git a/rust/crates/rusty-claude-cli/tests/compact_output.rs b/rust/crates/rusty-claude-cli/tests/compact_output.rs index ec003b95fb..d4e952e4f2 100644 --- a/rust/crates/rusty-claude-cli/tests/compact_output.rs +++ b/rust/crates/rusty-claude-cli/tests/compact_output.rs @@ -239,7 +239,7 @@ stderr: "Mock streaming says hello from the parity harness." ); assert_eq!(parsed["compact"], true); - assert_eq!(parsed["model"], "claude-sonnet-4-6"); + assert_eq!(parsed["model"], "anthropic/claude-sonnet-4-6"); assert!(parsed["usage"].is_object()); fs::remove_dir_all(&workspace).expect("workspace cleanup should succeed"); diff --git a/rust/crates/rusty-claude-cli/tests/resume_slash_commands.rs b/rust/crates/rusty-claude-cli/tests/resume_slash_commands.rs index a035544f4b..496b29b0fd 100644 --- a/rust/crates/rusty-claude-cli/tests/resume_slash_commands.rs +++ b/rust/crates/rusty-claude-cli/tests/resume_slash_commands.rs @@ -108,7 +108,7 @@ fn status_command_applies_cli_flags_end_to_end() { let stdout = String::from_utf8(output.stdout).expect("stdout should be utf8"); assert!(stdout.contains("Status")); - assert!(stdout.contains("Model claude-sonnet-4-6")); + assert!(stdout.contains("Model anthropic/claude-sonnet-4-6")); assert!(stdout.contains("Permission mode read-only")); } @@ -289,7 +289,7 @@ fn resumed_status_surfaces_persisted_model() { let session_path = temp_dir.join("session.jsonl"); let mut session = workspace_session(&temp_dir); - session.model = Some("claude-sonnet-4-6".to_string()); + session.model = Some("anthropic/claude-sonnet-4-6".to_string()); session .push_user_text("model persistence fixture") .expect("write ok"); @@ -317,7 +317,7 @@ fn resumed_status_surfaces_persisted_model() { let parsed: Value = serde_json::from_str(stdout.trim()).expect("should be json"); assert_eq!(parsed["kind"], "status"); assert_eq!( - parsed["model"], "claude-sonnet-4-6", + parsed["model"], "anthropic/claude-sonnet-4-6", "model should round-trip through session metadata" ); }