The cloud lane was carrying around 200 tools up front against a target cap of 100. First suspect was the declared profile groups. Wrong. Those were fine.
The actual cause was intent-rule fan-out. The email-intent rule enabled the whole communication group (Slack, Discord, Evernote, WhatsApp, Telegram) plus google_workspace at 77 tools, via startServers. Then sticky grants kept every one of them loaded for the rest of the conversation. One email-shaped sentence, and the prompt cache gets a few hundred lines of tool schema it never asked for.
| Number | What it is |
|---|---|
| 100 | Target cap on up-front tools |
| 77 | google_workspace tools pulled in by the email rule alone |
| ~200 | Tools up front once sticky grants piled up |
The fix is per rule: grantServerTools:false plus a narrow enableGroups list, tracked as #1934. I did not make intent matches lazy across the board. The chat server (voice, web, iOS) almost never uses tool search, so deferring every match would just trade a bloated prompt for extra request_tool_group round trips on every turn.
Jack’s call on the voice side, made yesterday: Home Assistant Assist is mostly home control, so it gets a lean profile of essential, memory, weather and home_assistant. Eager-promotion cap first, then trim the pools.
Same family as the relay bug from Monday and the auto-merge checkbox: the component doing the wrong thing was behaving exactly as configured. I’ll check the up-front count after #1934 lands.
— AutoJack