merge dev/friel/spawn-mode-removal into collab stack

This commit is contained in:
Friel
2026-03-30 08:52:21 +00:00
8 changed files with 0 additions and 45 deletions
-1
View File
@@ -1552,7 +1552,6 @@ async fn spawn_thread_subagent_uses_role_specific_nickname_candidates() {
description: Some("Research role".to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: Some(vec!["Atlas".to_string()]),
fork_context: None,
-4
View File
@@ -373,7 +373,6 @@ mod built_in {
description: Some("Default agent.".to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: Some(true),
@@ -391,7 +390,6 @@ Rules:
- Reuse existing explorers for related questions."#.to_string()),
model: None,
config_file: Some("explorer.toml".to_string().parse().unwrap_or_default()),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: Some(true),
@@ -410,7 +408,6 @@ Rules:
- Always tell workers they are **not alone in the codebase**, and they should not revert the edits made by others, and they should adjust their implementation to accommodate the changes made by others. This is important because there may be multiple workers making changes in parallel, and they need to be aware of each other's work to avoid conflicts and ensure a cohesive final product."#.to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: Some(true),
@@ -427,7 +424,6 @@ Rules:
- Close the watchdog handle only when it is no longer needed or when replacing it with a new watchdog."#.to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: Some(crate::config::DEFAULT_WATCHDOG_INTERVAL_S),
nickname_candidates: None,
fork_context: Some(true),
-16
View File
@@ -96,7 +96,6 @@ async fn apply_role_returns_unavailable_for_missing_user_role_file() {
description: None,
model: None,
config_file: Some(PathBuf::from("/path/does/not/exist.toml")),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -120,7 +119,6 @@ async fn apply_role_returns_unavailable_for_invalid_user_role_toml() {
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -155,7 +153,6 @@ model = "role-model"
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -190,7 +187,6 @@ async fn apply_role_preserves_unspecified_keys() {
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -253,7 +249,6 @@ model_provider = "test-provider"
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -311,7 +306,6 @@ model_verbosity = "high"
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -381,7 +375,6 @@ model_provider = "role-provider"
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -443,7 +436,6 @@ model_provider = "base-provider"
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -511,7 +503,6 @@ model_reasoning_effort = "high"
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -559,7 +550,6 @@ writable_roots = ["./sandbox-root"]
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -625,7 +615,6 @@ async fn apply_role_takes_precedence_over_existing_session_flags_for_same_key()
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -672,7 +661,6 @@ enabled = false
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -721,7 +709,6 @@ fn spawn_tool_spec_build_deduplicates_user_defined_built_in_roles() {
description: Some("user override".to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -746,7 +733,6 @@ fn spawn_tool_spec_lists_user_defined_roles_before_built_ins() {
description: Some("first".to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -777,7 +763,6 @@ fn spawn_tool_spec_marks_role_locked_model_and_reasoning_effort() {
description: Some("Research carefully.".to_string()),
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -806,7 +791,6 @@ fn spawn_tool_spec_marks_role_locked_reasoning_effort_only() {
description: Some("Review carefully.".to_string()),
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
-1
View File
@@ -2370,7 +2370,6 @@ enabled = false
description: None,
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
-3
View File
@@ -154,7 +154,6 @@ fn merge_missing_role_fields(role: &mut AgentRoleConfig, fallback: &AgentRoleCon
role.description = role.description.clone().or(fallback.description.clone());
role.model = role.model.clone().or(fallback.model.clone());
role.config_file = role.config_file.clone().or(fallback.config_file.clone());
role.spawn_mode = role.spawn_mode.or(fallback.spawn_mode);
role.watchdog_interval_s = role.watchdog_interval_s.or(fallback.watchdog_interval_s);
role.nickname_candidates = role
.nickname_candidates
@@ -194,7 +193,6 @@ fn agent_role_config_from_toml(
description,
model: role.model.clone(),
config_file,
spawn_mode: role.spawn_mode,
watchdog_interval_s: role.watchdog_interval_s,
nickname_candidates,
fork_context: role.fork_context,
@@ -488,7 +486,6 @@ fn discover_agent_roles_in_dir(
description: parsed_file.description,
model: None,
config_file: Some(agent_file),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: parsed_file.nickname_candidates,
fork_context: None,
-5
View File
@@ -3262,7 +3262,6 @@ fn load_config_rejects_missing_agent_role_config_file() -> std::io::Result<()> {
description: Some("Research role".to_string()),
model: None,
config_file: Some(missing_path.abs()),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -4132,7 +4131,6 @@ fn load_config_normalizes_agent_role_nickname_candidates() -> std::io::Result<()
description: Some("Research role".to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: Some(vec![
" Hypatia ".to_string(),
@@ -4178,7 +4176,6 @@ fn load_config_rejects_empty_agent_role_nickname_candidates() -> std::io::Result
description: Some("Research role".to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: Some(Vec::new()),
fork_context: None,
@@ -4218,7 +4215,6 @@ fn load_config_rejects_duplicate_agent_role_nickname_candidates() -> std::io::Re
description: Some("Research role".to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: Some(vec!["Hypatia".to_string(), " Hypatia ".to_string()]),
fork_context: None,
@@ -4258,7 +4254,6 @@ fn load_config_rejects_unsafe_agent_role_nickname_candidates() -> std::io::Resul
description: Some("Research role".to_string()),
model: None,
config_file: None,
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: Some(vec!["Agent <One>".to_string()]),
fork_context: None,
-13
View File
@@ -1613,14 +1613,6 @@ pub struct AgentsToml {
pub roles: BTreeMap<String, AgentRoleToml>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, Default, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum AgentRoleSpawnMode {
#[default]
Spawn,
Fork,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct AgentRoleConfig {
/// Human-facing role documentation used in spawn tool guidance.
@@ -1630,8 +1622,6 @@ pub struct AgentRoleConfig {
pub model: Option<String>,
/// Path to a role-specific config layer.
pub config_file: Option<PathBuf>,
/// Optional default spawn mode when `spawn_agent` omits `spawn_mode`.
pub spawn_mode: Option<AgentRoleSpawnMode>,
/// Optional watchdog interval for roles that should spawn as idle-time watchdog handles.
pub watchdog_interval_s: Option<i64>,
/// Candidate nicknames for agents spawned with this role.
@@ -1654,9 +1644,6 @@ pub struct AgentRoleToml {
/// Relative paths are resolved relative to the `config.toml` that defines them.
pub config_file: Option<AbsolutePathBuf>,
/// Optional default spawn mode when `spawn_agent` omits `spawn_mode`.
pub spawn_mode: Option<AgentRoleSpawnMode>,
/// Optional watchdog interval in seconds for roles that should behave as watchdogs.
#[schemars(range(min = 1))]
pub watchdog_interval_s: Option<i64>,
@@ -478,7 +478,6 @@ async fn spawn_agent_role_overrides_requested_model_and_reasoning_settings() ->
description: Some("Custom role".to_string()),
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,
@@ -530,7 +529,6 @@ async fn spawn_agent_tool_description_mentions_role_locked_settings() -> Result<
description: Some("Custom role".to_string()),
model: None,
config_file: Some(role_path),
spawn_mode: None,
watchdog_interval_s: None,
nickname_candidates: None,
fork_context: None,