Skip to main content
Featured image for post: Action ⟶ Dispatch ⟶ Execute

Action ⟶ Dispatch ⟶ Execute

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