Skip to content

Block generic tool input and document idle timeouts - #112

Merged
frantic-openai merged 2 commits into
mainfrom
codex/fix-app-server-input-timeout-contract
Jul 20, 2026
Merged

Block generic tool input and document idle timeouts#112
frantic-openai merged 2 commits into
mainfrom
codex/fix-app-server-input-timeout-contract

Conversation

@frantic-openai

@frantic-openai frantic-openai commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

Context

Docs called turn timeout a total cap, while runtime uses silence. Generic tool-input prompts also received fabricated answers, and approval-looking option labels alone are not enough to identify MCP approval prompts.

TL;DR

Document idle timeouts and block generic tool input.

Summary

  • Document turn_timeout_ms as a reset-on-update silence interval.
  • Add coverage for active stream updates and silent turns.
  • Keep auto-approval only for recognized MCP approval question IDs.
  • Block freeform and generic option-based tool input, including Allow/Deny choices.

Alternatives

  • A total-runtime deadline was rejected; healthy long turns should stay alive while updates continue.
  • Matching approval-looking labels alone was rejected because generic prompts can use the same words.

Test Plan

  • HEX_HOME=/private/tmp/symphony-hex mise exec -- make -C elixir all
  • mise exec -- mix test test/symphony_elixir/app_server_test.exs:619 test/symphony_elixir/app_server_test.exs:788
  • mise exec -- mix test test/symphony_elixir/app_server_test.exs

frantic-openai and others added 2 commits July 20, 2026 14:38
Summary:
- Keep turn timeout semantics tied to stream inactivity and document them.
- Add a regression for active stream updates versus silent turns.
- Auto-answer only recognized MCP approval prompts.
- Block freeform and option-based tool input instead of fabricating answers.
- Remove the orphaned auto-answered dashboard event path.

Rationale:
- Operators rely on silence timeout to catch stuck turns without capping
  healthy long-running work.
- Generic user-input answers can be interpreted as real operator intent;
  the existing blocked flow is safer and simpler.

Tests:
- focused app-server timeout, approval, and input-required cases
- mise exec -- mix test test/symphony_elixir/app_server_test.exs
- mise exec -- mix test test/symphony_elixir/orchestrator_status_test.exs
- HEX_HOME=/private/tmp/symphony-hex mise exec -- make -C elixir all

Co-authored-by: Codex <codex@openai.com>
Summary:
- Auto-answer only requestUserInput questions with the MCP approval ID marker.
- Keep generic Allow/Deny option prompts blocked for operator input.

Rationale:
- Option labels alone are not a safe approval discriminator; ordinary tool
  prompts can also offer an Allow choice.
- The existing Codex MCP approval question ID distinguishes the narrow prompt
  shape that Symphony may continue automatically.

Tests:
- red/green generic Allow/Deny tool-input regression
- recognized MCP approval prompt regression
- mise exec -- mix test test/symphony_elixir/app_server_test.exs
- HEX_HOME=/private/tmp/symphony-hex mise exec -- make -C elixir all

Co-authored-by: Codex <codex@openai.com>
@frantic-openai
frantic-openai merged commit 3c372fa into main Jul 20, 2026
3 checks passed
@frantic-openai
frantic-openai deleted the codex/fix-app-server-input-timeout-contract branch July 20, 2026 22:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant