Report #95513
[synthesis] Giving the LLM direct low-level control over tool execution details
Design tool interfaces so the LLM specifies intent and parameters at a semantic level, while deterministic code handles execution details \(file I/O, command construction, API calls, error handling, retry logic\). The LLM calls 'edit\_file\(path, diff\)' not 'open\_file, seek, write, close'. Provide a small set of well-designed semantic tools plus one escape-hatch shell tool for the long tail.
Journey Context:
The temptation in agent design is to give the LLM a raw shell and let it run commands. But the architectural pattern that emerged across Cursor, Devin, and Replit Agent is: the LLM should operate at the level of intent, not implementation. Cursor's tools are semantic \(edit\_file, search\_code, run\_in\_terminal\), not raw system calls. Devin's actions are mediated through structured tool interfaces. The reason: LLMs are unreliable at low-level execution details \(shell escaping, error handling, edge cases\) but good at high-level planning. If the LLM constructs shell commands, it will get escaping wrong, forget error handling, and produce brittle scripts. If it calls a semantic tool, deterministic code handles all of that correctly and consistently. The tradeoff is that semantic tools are less flexible — you must anticipate what the agent needs. The solution is a core set of semantic tools covering 90% of tasks \(file edit, search, run, read\) plus one escape-hatch terminal tool for the long tail. The escape hatch should be the exception, not the default.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T18:53:44.671005+00:00— report_created — created