Why Smart Systems Need a Domain Before They Need Tools

tfc

Hatched by tfc

Jun 20, 2026

9 min read

88%

0

The hidden trap in modern software

What if the fastest way to build a powerful system is also the fastest way to create a mess?

That is the uncomfortable paradox sitting underneath modern application design. We keep adding more capability, more automation, more tools, and more distributed components, then act surprised when the result becomes harder to understand, harder to govern, and harder to trust. The real issue is not that distributed systems are bad, or that tools are dangerous. The issue is that capability without a map creates chaos.

This is especially visible when teams adopt serverless or AI assistants with enthusiasm but little structural discipline. A system that can call multiple tools in parallel may feel intelligent. A system that can scale across domains may feel agile. But if the organization has not first defined what problem the system exists to solve, those capabilities multiply confusion instead of value.

The deeper question is not, “What can this system do?” It is, “What is this system for, and where should its intelligence stop?”


The real enemy is not complexity, it is uncontrolled complexity

There is a seductive logic in modern architecture: if we can decompose everything into small services or independent tools, the whole becomes easier to manage. In practice, this often only works when decomposition follows a domain model. Without that, the architecture becomes a pile of local optimizations that collectively make no sense.

In enterprise serverless adoption, this failure mode has a memorable name: a Ball of Serverless Mud. It is what happens when event-driven services proliferate faster than the organization’s ability to define boundaries, responsibilities, and governance. The problem is not serverless itself. The problem is using serverless as a starting point instead of a consequence of design.

The same trap appears in AI systems. An assistant with access to code execution, knowledge retrieval, and custom functions can be profoundly useful. It can query a database, run calculations, fetch documents, and orchestrate workflows in parallel. But if it has no clear domain boundaries, it becomes a clever middle layer that knows how to do many things and understand none of them.

Think of the difference between a well-run kitchen and a cluttered one. In both, many tools exist. Knives, ovens, mixers, pans, timers. Yet the useful kitchen is not defined by the number of tools. It is defined by workflow, station boundaries, and a shared understanding of the dish being prepared. Tools become force multipliers only when the recipe is clear.

That is the central tension: modern software systems are increasingly about orchestration, but orchestration is only as good as the conceptual map underneath it.

A system with many tools is not intelligent by default. It is only intelligent when its tools serve a bounded domain with explicit responsibility.


Domain first is not a philosophy, it is an operating constraint

It is tempting to treat domain-driven thinking as an abstract architectural preference. In reality, it is a survival mechanism.

A domain first approach forces a hard question before implementation begins: What business reality are we trying to shape? This matters because enterprises rarely operate in one clean, self-contained problem space. A company might sell hardware, run a cloud platform, manage retail logistics, and support partner ecosystems, all at once. Each area has different rules, data, risks, and latency requirements. A single generic architecture tends to collapse these distinctions until every team is coupled to every other team.

This is why first principles matter more than technology slogans. If you begin with serverless first, you optimize for a deployment model before you understand the shape of the work. If you begin with API first, you optimize for integration before knowing what the contract should represent. If you begin with event-driven first, you may create beautiful flows of messages that still fail to reflect the actual business boundaries.

The principle hierarchy should be more like this:

  1. Domain first: define the business problem and its boundaries.
  2. Team first: align ownership with the people who understand and operate the domain.
  3. API first: create explicit contracts where communication is necessary.
  4. Microservices first: split only where independent evolution is truly valuable.
  5. Event-driven first: use events where the business genuinely benefits from decoupling and replay.
  6. Serverless first: choose the deployment model that best fits the already well-formed system.

This sequence is not bureaucratic overhead. It is how you avoid encoding confusion into your architecture.

A useful mental model here is to think of architecture as a set of nested questions. The outer question is technical: How should this run? But the deeper questions come earlier: What is this system responsible for? What should be owned together? What must be consistent? What can be asynchronous? Only after those questions are answered does serverless become a smart choice instead of a fashionable one.


Parallel tools are powerful, but they also demand sharper boundaries

The ability for an assistant to use multiple tools in parallel feels like a leap in capability. One tool checks a knowledge base, another runs code, another calls an external function, all in the same turn. Done well, this creates a system that can move from question to action with impressive speed.

But parallelism also amplifies ambiguity. If a tool can retrieve knowledge from one source, transform data with another, and trigger a business process with a third, then the assistant becomes a de facto coordinator. And coordination is where hidden complexity accumulates fastest.

Consider a customer support assistant. On the surface, it may seem wonderful for the assistant to access a policy document, calculate a refund, verify an order, and create a ticket. But now ask: Which tool is authoritative for customer identity? Which tool owns refund policy interpretation? What happens when retrieved knowledge conflicts with a live policy service? Who is responsible when a parallel tool call returns inconsistent data? Without clear domain boundaries, the assistant will not merely answer questions. It will make decisions in the gaps between systems.

This is why tool-rich systems need stronger, not weaker, architectural discipline. A multi-tool assistant should be designed like a trained specialist with approved instruments, not like a magician with a box of unrelated gadgets. The assistant’s intelligence should be bounded by domain rules, and the tools should be mapped to responsibilities that already exist in the business.

A powerful way to think about this is to distinguish capability from authority.

  • Capability answers: What can the system technically do?
  • Authority answers: What is the system allowed to decide?

Most failures in distributed software begin when capability outpaces authority. An assistant can technically calculate a refund, but should it decide whether the refund is appropriate? A serverless function can technically react to any event, but should it own business logic that spans finance, operations, and support? The answer is usually no, unless the domain boundary is explicit and intentional.

This is not an argument against automation. It is an argument for making automation legible.

The more tools a system can use, the more important it becomes to know which decisions belong to the domain and which belong to the tool.


The architecture of intelligence is really the architecture of restraint

The deepest connection between serverless architecture and tool-using assistants is not speed. It is modularity under constraint.

Both systems promise agility by decomposing work. Serverless decomposes infrastructure and execution. Assistants decompose cognition into tool calls. In both cases, the promise is that smaller units can respond more flexibly than one large central system. But decomposition only works when the boundaries are meaningful. Otherwise, you get distributed sprawl: not a system of independent parts, but a network of dependencies that only looks modular from a distance.

This is where the concept of first principles becomes practical. First principles thinking is not about abstraction for its own sake. It is about refusing to let implementation pressure overwrite domain reality. In enterprise settings, that means asking: What are the natural seams in the business? Where do responsibilities genuinely separate? Which processes need strong consistency, and which can tolerate eventual consistency? Which actions should be automated, and which should remain human decisions?

The same questions apply to AI assistants. If a system can call a knowledge retrieval tool and a code interpreter in parallel, then it can also accidentally blend facts, heuristics, and actions into a single opaque response. To avoid that, the system needs a clear internal hierarchy:

  • Interpretation layer: What is the user trying to accomplish?
  • Domain layer: What business rules apply?
  • Tool layer: Which external capabilities can safely execute those rules?
  • Governance layer: What must be logged, audited, reviewed, or blocked?

This framework matters because intelligence is not just about producing outputs. It is about producing outputs in a way that preserves trust over time. Trust erodes when users cannot tell whether a response came from retrieved knowledge, generated reasoning, or an external function with side effects. Likewise, engineering trust erodes when a distributed system becomes impossible to reason about after the third or fourth abstraction layer.

A strong architecture makes decisions visible. A weak architecture hides them behind convenience.


Key Takeaways

  1. Start with the domain, not the deployment model. Before choosing serverless, events, or tool orchestration, define the business problem and its natural boundaries.

  2. Separate capability from authority. A system may be able to do many things, but it should only decide the things that belong to its domain.

  3. Use tools as instruments, not as architecture. Parallel tool access is powerful only when each tool maps to a clear responsibility.

  4. Beware of distributed sprawl disguised as modularity. Many small services or functions can still form one giant mess if ownership and contracts are unclear.

  5. Design for legibility. The best systems make it obvious where knowledge comes from, who owns a decision, and what happens next.


The future belongs to systems that know their limits

The temptation in both serverless and AI is to celebrate what a system can touch. More services, more functions, more tools, more autonomy. But maturity comes from a different question entirely: what should this system not do?

That is the paradox at the heart of modern architecture. The most advanced systems are not the ones with the most freedom. They are the ones with the clearest boundaries. They know which problems belong to them, which decisions require human judgment, and which capabilities are merely instruments in service of a larger domain.

A company does not become more intelligent by scattering logic across the cloud. An assistant does not become more trustworthy by calling more tools. In both cases, intelligence emerges when the system is organized around a real-world domain, then given the smallest possible set of capabilities needed to serve it well.

So the next time you are tempted to ask, “Can we make this serverless?” or “Can the assistant use this tool?”, ask the harder and more valuable question first: What business reality are we trying to preserve, and what architecture will keep it legible as we scale?

That question changes everything. It turns technology from a source of accidental complexity into a disciplined expression of purpose.

Sources

← Back to Library

Hatch New Ideas with Glasp AI 🐣

Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)

Start Hatching 🐣