Nothing happens when the agent acts
Determine three things first: did the model emit a tool call, did the call reach the executor, and did the page change. Reading only the chat text conflates three different failures.
Decision tree
No tool card in chat?
├─ yes: model configuration, prompt, or tool list
└─ no: inspect the tool result
├─ ACTION_NOT_FOUND → id or page snapshot
├─ ACTION_UNAVAILABLE → preconditions / visibility
├─ PERMISSION_DENIED → authorization
├─ EXPECTATION_FAILED → executed, result not observed
└─ success → page state or model continuation1. Confirm the model is ready
In the debug panel, inspect baseUrl, model name, and configuration diagnostics. NOT_CONFIGURED, MODEL_BASE_URL_MISSING, or MODEL_NAME_MISSING means no valid model request was sent. Do not put a provider key in the page; production should use a same-origin model gateway.
2. Confirm the capability is declared and visible
Inspect the request messages and tool list:
- is the target action present?
- does the model's id match exactly?
- is it in the active region?
- does
available()return false? - is the control disabled or covered by a modal?
Check the stable errors in Diagnostics and observability and Error codes and diagnostics.
3. Separate “not executed” from “no visible change”
If the result is success but the user sees nothing:
- did the expectation wait only for a toast while the list stayed stale?
- is the record outside the current filter, page, or scroll window?
- was the store updated without a declared state view?
- is an asynchronous job still running?
- is there a cached page or duplicate component instance?
EXPECTATION_FAILED means the handler may have run, but the declared result did not appear. Do not resend a write immediately; read business state and check for partial success.
4. Check approval and handoff
A high-risk action may be pending. Check for an approval item, another open window, or a rejection. The agent has no approval tool. A denied confirmation should produce an explicit state, not an infinite wait.
5. Check transport and limits
For an external agent, check:
- the page is still connected;
- the session is valid;
RATE_LIMITEDwas not returned;- a
request.idwas not reused; - the MCP facade returned the result as tool content.
REPLAY_DETECTED means no business action ran. Do not mint a new id for the same intent to bypass it; query the prior result first.
Minimal reproduction
Capture the user request, tool id, arguments, execution result, page snapshot, and timestamp. Replay with a deterministic scripted model. If replay works, the issue is model selection; if not, inspect declaration, availability, or transport.
Verify the fix
- Manual click and agent invocation produce the same business result.
- The success condition observes a real change.
- Unavailable actions explain why.
- Repeated calls do not write twice.
- Theme and locale do not change action ids.

