Description
The Composio contract gate ([composio][contract-gate]) is meant to surface a tool's contract to the user before first execution. When the surface never reaches the user — which is what happens today — it counts "fresh instances surfaced without execution", and after a threshold auto-proceeds and executes the tool anyway. So a consent mechanism degrades, silently, into an execution mechanism.
Reported by: Alan (QA)
Build: v0.63.29
Reproducible: Yes — 14 occurrences in 8 minutes on GITHUB_LIST_REPOSITORY_ISSUES
Steps to reproduce
- Connect GitHub via Composio
- Ask the agent something that needs
GITHUB_LIST_REPOSITORY_ISSUES (e.g. "which of my open issues mention X")
- Observe:
14:45:53 WRN [composio][contract-gate] auto-proceeding after 4 fresh instances surfaced this contract without execution slug=GITHUB_LIST_REPOSITORY_ISSUES global_count=4
14:45:53 WRN [composio][contract-gate] auto-proceeding after threshold; executing without surfacing slug=GITHUB_LIST_REPOSITORY_ISSUES
14:46:12 WRN … after 5 fresh instances …
… through global_count=17 by 14:54:02
No contract card was ever shown in the UI.
Expected behaviour
- The contract is surfaced to the user once, and execution waits for acknowledgement (or the gate is explicitly configured to be advisory)
- If the surface cannot be reached, the gate fails closed with a clear reason — it does not execute
Actual behaviour
- Contract never rendered; after 4 attempts the gate executes without consent and keeps doing so on every subsequent call, incrementing a counter
- Read-only tool in this instance, but the same path applies to write tools
Impact
- Consent gate provides no consent: any late-bound Composio action can run after 4 silent misses
- Security-relevant for write actions (send email, create issue, post message)
- Log noise: 28 WRN lines for one user question
Acceptance criteria
Description
The Composio contract gate (
[composio][contract-gate]) is meant to surface a tool's contract to the user before first execution. When the surface never reaches the user — which is what happens today — it counts "fresh instances surfaced without execution", and after a threshold auto-proceeds and executes the tool anyway. So a consent mechanism degrades, silently, into an execution mechanism.Reported by: Alan (QA)
Build: v0.63.29
Reproducible: Yes — 14 occurrences in 8 minutes on
GITHUB_LIST_REPOSITORY_ISSUESSteps to reproduce
GITHUB_LIST_REPOSITORY_ISSUES(e.g. "which of my open issues mention X")No contract card was ever shown in the UI.
Expected behaviour
Actual behaviour
Impact
Acceptance criteria