From a4a4798b4deed085021149e45e20c5e014ee4de5 Mon Sep 17 00:00:00 2001 From: main Date: Mon, 23 Mar 2026 18:00:13 -0400 Subject: Remove consult turn limits --- assets/codex-skills/phone-opus/SKILL.md | 4 +--- crates/phone-opus/src/mcp/catalog.rs | 5 ----- crates/phone-opus/src/mcp/service.rs | 30 ------------------------------ crates/phone-opus/tests/mcp_hardening.rs | 4 +--- 4 files changed, 2 insertions(+), 41 deletions(-) diff --git a/assets/codex-skills/phone-opus/SKILL.md b/assets/codex-skills/phone-opus/SKILL.md index 7db836a..ff3c550 100644 --- a/assets/codex-skills/phone-opus/SKILL.md +++ b/assets/codex-skills/phone-opus/SKILL.md @@ -15,7 +15,6 @@ should be taken as authoritative or final. It is a pure consultant. - Ask for a second opinion on code, architecture, debugging, or design. - Point Claude at a specific repository with `cwd`. -- Cap the consultation with `max_turns` when needed. - Reuse `session_id` from an earlier call when you want Claude to continue the same conversation. - Set `background: true` when you want to launch a consult, keep working, and poll for the answer later. @@ -23,7 +22,7 @@ should be taken as authoritative or final. It is a pure consultant. - `consult` - required: `prompt` - - optional: `cwd`, `max_turns`, `session_id`, `background`, `render`, `detail` + - optional: `cwd`, `session_id`, `background`, `render`, `detail` - `consult_job` - required: `job_id` - `consult_jobs` @@ -47,6 +46,5 @@ Call `phone_opus.consult` with: - `prompt`: `Inspect the Rust workspace and tell me where the retry logic is brittle.` - `cwd`: `/absolute/path/to/repo` -- `max_turns`: `6` Expect a blocking response containing Claude's answer plus execution metadata such as duration, turn count, session id, and cost when available. diff --git a/crates/phone-opus/src/mcp/catalog.rs b/crates/phone-opus/src/mcp/catalog.rs index 839c477..f3f0925 100644 --- a/crates/phone-opus/src/mcp/catalog.rs +++ b/crates/phone-opus/src/mcp/catalog.rs @@ -102,11 +102,6 @@ fn tool_schema(name: &str) -> Value { "type": "string", "description": "Optional working directory for the Claude Code session. Relative paths resolve against the MCP host working directory." }, - "max_turns": { - "type": "integer", - "minimum": 1, - "description": "Optional maximum number of Claude agent turns before stopping." - }, "session_id": { "type": "string", "description": "Optional Claude session handle returned by a previous consult call. When set, phone_opus resumes that conversation instead of starting a fresh one." diff --git a/crates/phone-opus/src/mcp/service.rs b/crates/phone-opus/src/mcp/service.rs index bd9b31f..9fc1134 100644 --- a/crates/phone-opus/src/mcp/service.rs +++ b/crates/phone-opus/src/mcp/service.rs @@ -122,7 +122,6 @@ impl WorkerService { struct ConsultArgs { prompt: String, cwd: Option, - max_turns: Option, session_id: Option, background: Option, } @@ -141,7 +140,6 @@ struct ConsultJobsArgs { struct ConsultRequest { prompt: PromptText, cwd: WorkingDirectory, - max_turns: Option, session: Option, mode: ConsultMode, } @@ -151,7 +149,6 @@ impl ConsultRequest { Ok(Self { prompt: PromptText::parse(args.prompt)?, cwd: WorkingDirectory::resolve(args.cwd)?, - max_turns: args.max_turns.map(TurnLimit::parse).transpose()?, session: args.session_id.map(SessionHandle::parse).transpose()?, mode: ConsultMode::from_background(args.background), }) @@ -177,7 +174,6 @@ impl ConsultRequest { BackgroundConsultRequest { prompt: self.prompt.as_str().to_owned(), cwd: self.cwd.display(), - max_turns: self.max_turns.map(TurnLimit::get), session_id: self.requested_session_id(), } } @@ -269,22 +265,6 @@ impl WorkingDirectory { } } -#[derive(Debug, Clone, Copy)] -struct TurnLimit(u64); - -impl TurnLimit { - fn parse(raw: u64) -> Result { - if raw == 0 { - return Err(ConsultRequestError::InvalidTurnLimit); - } - Ok(Self(raw)) - } - - fn get(self) -> u64 { - self.0 - } -} - #[derive(Debug, Clone)] struct SessionHandle(Uuid); @@ -304,7 +284,6 @@ impl SessionHandle { struct BackgroundConsultRequest { prompt: String, cwd: String, - max_turns: Option, session_id: Option, } @@ -313,7 +292,6 @@ impl BackgroundConsultRequest { ConsultRequest::parse(ConsultArgs { prompt: self.prompt, cwd: Some(self.cwd), - max_turns: self.max_turns, session_id: self.session_id, background: Some(false), }) @@ -459,7 +437,6 @@ impl BackgroundConsultJobRecord { "finished_unix_ms": self.finished_unix_ms, "runner_pid": self.runner_pid, "cwd": self.request.cwd, - "max_turns": self.request.max_turns, "requested_session_id": self.request.session_id, "prompt_prefix_injected": self.prompt_prefix_injected, }) @@ -476,8 +453,6 @@ enum ConsultRequestError { Canonicalize { path: String, source: io::Error }, #[error("working directory `{0}` is not a directory")] NotDirectory(String), - #[error("max_turns must be greater than zero")] - InvalidTurnLimit, #[error("session_id must be a valid UUID, got `{0}`")] InvalidSessionHandle(String), #[error("job_id must be a valid UUID, got `{0}`")] @@ -866,7 +841,6 @@ fn submit_background_consult( "prompt": request.prompt.as_str(), "effective_prompt": request.prompt.rendered(), "cwd": request.cwd.display(), - "max_turns": request.max_turns.map(TurnLimit::get), "follow_up_tools": ["consult_job", "consult_jobs"], }); fallback_detailed_tool_output( @@ -1118,9 +1092,6 @@ fn invoke_claude(request: &ConsultRequest) -> Result