Mainstream language abstractions predate AI instructions, tool-calling and agent loops. So all three arrive as libraries — each with its own conventions, versioning and orchestration model.
Every significant shift in what software does has eventually changed the programming model rather than being absorbed permanently into libraries. Concurrency did. Memory safety did. Our position is that agentic execution follows the same path.
We could be wrong. If agent frameworks mature into a stable, universal layer, the library approach wins and this bet does not pay off. We think the abstraction belongs lower down, and we have built accordingly.
// tools and agents are keywords, not imports @tool "Search the web" function search_web(query) return http get "https://example.org/search?q=" + query end agent researcher tools: search_web, summarize end run agent researcher with "Research NC and summarize"
| Design decision | Operational effect | Business effect |
|---|---|---|
| Agents in the grammar | Agent code is readable by anyone who reads the language | Review and handover stop depending on framework expertise |
| Provider-independent AI instruction | Switching model provider is configuration, not a rewrite | Reduced lock-in to any single AI vendor |
| Runtime owns the loop | One execution model instead of several | Fewer failure modes to understand and operate |
Tooling, hiring, ecosystem and institutional knowledge all start from zero. For most organisations that is the deciding factor, and it should be weighed honestly.
Agent frameworks improve quickly. The gap we are addressing may narrow. We think the abstraction level still matters; we do not claim the question is settled.
The agent example above is about fifteen lines. Compare it with the same thing in your current stack.