Skip to content
Suh Codes
Go back

Building Agentic Systems as Living Architectures

Building Agentic Systems as Living Architectures

Modern software is undergoing a quiet but profound shift. We are no longer just writing functions or wiring APIs β€” we are beginning to design systems that act. These systems reason, choose tools, adapt to context, and pursue goals. In other words, they behave less like static programs and more like living organisms.

To better understand and design these systems, it helps to adopt a mental model that blends atomic design with biological architecture. This perspective reveals agentic systems not as monolithic constructs, but as layered, evolving structures β€” built from fundamental units that scale into autonomous entities.

Code samples throughout this article are pseudocode β€” they illustrate logic and structure, not runnable implementations. The test examples in the Control vs Autonomy section are the only exception.


The Core Idea: From Code to Organism

Agentic systems can be understood as living architectures composed of distinct layers:

loop until goal is met:
  observe()
  plan()
  act with skills()
  reflect()

βš›οΈ Atoms: The Behavioral Genome (CLAUDE.md)

At the foundation of an agentic system lies a declarative file such as CLAUDE.md β€” the behavioral genome that governs how the system reasons, what constraints it respects, and how it approaches decisions.

# CLAUDE.md

## Principles

- Be concise and correct
- Prefer deterministic tools over guessing

## Constraints

- Never fabricate data
- Always cite sources when using web search

## Behavior

- Think step-by-step when planning
- Use tools before answering if uncertainty exists

πŸ§ͺ Molecules: Skills as Functional Units

Skills are modular, reusable units of execution β€” the building blocks agents use to interact with the world. Each skill does one thing well and can be composed with others.

skill search_docs(query):
  return database.search(query)

skill summarize(text):
  return llm("Summarize: " + text)

When solving a task, the pattern is consistent: identify the needed skills, call them explicitly, and combine their results.


🧠 Organisms: Agents as Coordinated Intelligence

An agent orchestrates skills under its behavioral genome to pursue a goal. Rather than executing a fixed sequence, it plans, acts, and adapts.

Goal: "Write a report on X"

Plan:
  1. search_docs("X overview")
  2. summarize(results)
  3. structure into sections
  4. refine tone

Execute step-by-step. Re-plan if output is insufficient.
plan = llm(goal)

for each step in plan:
  result = run_skill(step)
  memory.add(result)

🧩 Systems: Multi-Agent Workflows as Higher-Order Structures

Individual agents can be composed into pipelines where each agent owns a distinct responsibility, passing context forward through shared memory.

Agent A (Researcher)  β†’  gathers information
Agent B (Analyst)     β†’  extracts insights
Agent C (Writer)      β†’  produces final output

Shared memory:
  - context.json
  - goals.json

πŸ”„ Emergence, Not Assembly

One of the most compelling properties of agentic systems is emergence β€” behavior that arises from skill composition rather than explicit instruction.

Agent combines:
  - search_docs
  - summarize
  - translate

β†’ Produces a multilingual report without being explicitly told to

This isn’t a bug or a surprise β€” it’s the system doing exactly what well-designed skill composition enables.


βš–οΈ The Tension: Control vs Autonomy

The more capable an agent becomes, the more important its guardrails are. The behavioral genome anchors this balance β€” and TDD acts as an externalized immune system, catching behavioral drift before it compounds.

# Guardrail instruction

If unsure:

- Ask for clarification, OR
- Use the search skill
  Never guess.
// Behavioral test β€” hallucination guard
it("does not hallucinate unknown facts", async () => {
  const result = await agent("Who won the Mars World Cup?")
  expect(result).toContain("I don't know")
})

// Decision boundary test β€” tool usage
it("uses search when uncertain", async () => {
  const spy = mock(searchDocs)
  await agent("Latest GDP of Brazil?")
  expect(spy).toHaveBeenCalled()
})

🧬 Designing for Evolution

Agentic systems are not deployed and forgotten β€” they are iteratively refined. Evolution happens across four dimensions: improved behavioral definitions, expanded skill sets, feedback loops and memory mechanisms, and test-driven refinement that acts as a persistent immune layer.

# Prompt evolution over time

v1: "Summarize this"
v2: "Summarize with bullet points and key metrics"
v3: "Summarize with bullet points, key metrics, and open uncertainties"
// Regression suite grows alongside the system
tests = [
  "no hallucination",
  "uses tools correctly",
  "respects tone guidelines",
  "asks clarification when needed"
]

Conclusion: A New Mental Model for Software

LayerBiological Analogy
CLAUDE.mdDNA
SkillsMolecules
AgentsOrganisms
Multi-agent systemsEcosystems

Design principle: Define β†’ Enable β†’ Orchestrate β†’ Evolve

As software continues to evolve in this direction, the most effective builders will not just be engineers of code β€” but architects of behavior.


πŸ“£ Read the Experiment Logs

Curious how this all plays out in practice? The experiment logs cover a full weekend β€” from blank canvas to working app, one session at a time.

Every lesson in this article was learned the hard way so you don’t have to. Well β€” maybe just a little hard. It’s more fun that way.



Next Post
Captain's Log, Stardate 2026.074 - part 2