Action ⟶ Dispatch ⟶ Execute
• 2 min read 2 min
What I worked on
- Bendover authored its first commit over the weekend. Nothing fancy. A tiny edit, but real.
- As soon as I tried anything slightly non trivial, the loop broke down. It was behaving more like batch retries than an actual turn based agent
- Spent time digging into how different systems structure tool calls and where the control actually lives
What I noticed
- Every tool DSL feels messy. Either you invent your own and parse it, or the API invents one for you and you still parse it
- I tried to escape that by using a strongly typed scripting surface with a clean SDK. Let the model emit executable code and skip text/JSON/context block glue
- It is cleaner. The agent can call multiple tools sequentially without involving the orchestrator
- But now I’m effectively running a programmable DSL. That means guards, sandboxes, safety rails
- I’m also more dependant on the model behaving correctly. Otherwise errors will compound and I loose ability to inspect
Aha moment
- All tool calling reduces to a constrained action language
- If a model can choose external tools, there is always a dispatcher somewhere — for me it’s now the C# runtime
- Action ⟶ dispatch ⟶ execute. You can hide it, but you can’t remove it
What still feels messy
- If I allow my programmable DSL to make multiple calls but return the CSX do I really loose observability?
Next step
- Simplify the orchestrator & move to a strict single action turn based loop
- Make the tool surface smaller and more explicit and remove overcooked guards